Я пытаюсь прочитать значение АЦП, которое соответствует температуре, и отправить по UART, если оно достигло очень горячего состояния

#c #embedded #stm32

#c #встроенный #stm32

Вопрос:

Таким образом, я могу прочитать значение АЦП для температуры, а также отправить строку, когда она достигла слишком горячего значения. Но моя проблема в том, что он отправляет строку много раз. Я пытаюсь отправить только один раз. Я пытался исправить это, используя задержку, но она работает недостаточно хорошо.

     if ( LM35_ADC_Value == 580 )
        {   
           USART_puts(USART2,"VERY_HOTn");
           delay(1680000000000);
                                                                                 
        }
 

Комментарии:

1. Похоже, вам нужно изменить свою реализацию с модели без состояния на модель с сохранением состояния. Например, сохраните предыдущее LM35_ADC_Value значение и распечатайте строку, только если оно увеличилось до 580 с ранее более низкого значения.

2. Кажется маловероятным, что delay оно принимает a uint64_t , поэтому, возможно, начните с двойной проверки предупреждений вашего компилятора.

3. Кроме того, как вы фильтруете показания АЦП?

Ответ №1:

Вам нужно реализовать состояние с возможным гистерезисом, что-то вроде этого:

    bool veryhotsent = false;

   ...

   if ( veryhotsent )
   {
     if ( LM35_ADC_Value < 578 )        // change that value to whatever is suitable
        veryhotsent = false;            // for your application
   }
   else if ( LM35_ADC_Value >= 580 )    // use >=, otherwise you might miss the raise
   {   
      USART_puts(USART2,"VERY_HOTn");
      veryhotsent = true;
   }
 
  • Как только температура поднимается выше 580, вы отправляете сообщение.
  • Получатель сообщения не будет отправлен, если температура не снизится до 578 и снова не повысится до более чем 580.

Также очень важно использовать >= 580 вместо == 580 , иначе сообщение не будет отправлено, если температура повысится, скажем, с 579 до 581 между двумя измерениями, что может быть абсолютно фатальным в зависимости от вашего приложения.