Как управлять Arduino UNO как счетчиком, запускаемым выходом таймера 555 (нестабильный режим)

У меня есть Arduino Uno и таймер 555, настроенный на нестабильный режим.

Что я пытаюсь сделать, так это запрограммировать мой Arduino на увеличение переменной «счетчик» (counter++) каждый раз, когда он срабатывает на выходе таймера 555 (через аналоговый вход).

Моя проблема в том, что Arduino воспринимает выход таймера 555 как непрерывный запуск и увеличивает мой счетчик, пока длится импульс в AnalogIN. Таким образом, вместо увеличения на 1 оно увеличивается примерно на 97 (иногда больше или меньше).

Мне нужно принимать аналоговый сигнал как "пакет", поэтому каждый раз, когда срабатывает аналоговый вход, независимо от того, как долго длится импульс, он будет рассматриваться как одиночное событие, а не как непрерывный триггер.

Что мне нужно изменить?

Мой код:

int counter = 0;

void setup() {
  Serial.begin(9600);


}

void loop() {
  if(analogRead(A0) > 250) {
    counter++;
    Serial.println(counter);
  }

}

Спасибо

, 👍0

Обсуждение

Пусть ваш код запоминает предыдущее значение и увеличивает его только тогда, когда предыдущее значение было ниже 250, а текущее значение выше 250., @Gerben

PS есть ли причина, по которой вы используете AnalogRead вместо DigitalRead?, @Gerben

вы проверяете «высокий», но предполагаете, что «низкий» также каким-то волшебным образом будет проверяться, @jsotola

Нет, даже когда я проверил низкий уровень, это не сработало должным образом., @BrainTrance


2 ответа


Лучший ответ:

0

Вам необходимо создать конечный автомат с двумя состояниями:

  1. Ожидание ввода от 555 до высокого уровня. Когда это произойдет, увеличьте счетчик & перейти к следующему состоянию.
  2. Ожидание снижения входного сигнала от 555. Когда это произойдет, перейдите к следующему состоянию. То есть первое состояние.

В следующем примере/руководстве Arduino "Обнаружение изменения состояния (обнаружение края) для кнопок" вы не нужен сложный код для устранения дребезга коммутатора. Однако часть кода, связанная с обнаружением границ и конечным автоматом, вероятно, может быть применена к вашему проекту.

,

Кажется, обнаружение краев — это то, что мне нужно. Спасибо!, @BrainTrance

Этот подход может привести к ненадежным показаниям, когда в цикле() выполняется множество и/или трудоемких задач. Это может быть подходящим решением для чтения медленных и одиночных событий, таких как активность кнопок, но я не рекомендую читать 555-импульсный сигнал., @Sim Son


0

Я рекомендую использовать один из модулей счетчика atmega. Таким образом, вы можете подсчитывать импульсы синхронно с вашей программой (настоящий параллелизм!), и вам также не нужно самостоятельно реализовывать какое-либо обнаружение фронта, поскольку модуль счетчика уже предоставляет эту функцию.

По запросу "счетчик пульса" вы найдете множество руководств о том, как это сделать.

,

Обнаружение краев, кажется, работает нормально. В чем разница между обнаружением краев и вашим решением? это быстрее? более надежный?, @BrainTrance

Да, это и быстрее, и надежнее, поскольку обрабатывается аппаратным модулем, оптимизированным для обнаружения границ и работающим параллельно с вашей программой. Кстати, модуль счетчика также участвует при генерации аппаратного ШИМ. Вместо подсчета фронта тактового сигнала он просто считает фронты входного сигнала., @Sim Son

@BrainTrance, аппаратное решение хорошее. Если вы новичок в Arduino или встроенном программировании, это может быть немного сложно. Но это должно привести к более надежному решению. Тем не менее, позаботьтесь о непосредственном использовании HW. Возможно, интересующий аппаратный ресурс уже используется другим программным обеспечением, таким как включенная библиотека последовательной связи Arduino или библиотека Arduino контроллера яркости светодиодов., @st2000