Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
Я пытался зафиксировать нарастающий фронт выходного сигнала ИК-датчика. Vcc этого датчика подключен к Arduino 5V и имеет цифровой выходной контакт. Я наблюдал цифровой выходной контакт на осциллографе. Не шумно.
Когда я прикрепляю прерывание по переднему фронту к цифровому контакту 2, оно каким-то образом захватывает как нарастающий, так и спадающий фронты. Этот ответ одинаков, когда он установлен для FALLING или CHANGE.
Я пробовал код ниже как на Arduino Uno, так и на
volatile bool caughtAnInterrupt = false;
void setup() {
Serial.begin (19200);
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), test, RISING);
}
void loop() {
if (caughtAnInterrupt){
Serial.println("Rising edge detected");
caughtAnInterrupt = false;
}
}
void test() {
caughtAnInterrupt = true;
}
@Şener, 👍1
Обсуждение1 ответ
Я решил проблему с ответом eventHandler на другой пост. Вот он;
Проблема, с которой вы столкнулись, связана с тем, что производя много прерываний на каждое нажатие кнопки. Вы можете найти хороший описание и способ решения с помощью аппаратного обеспечения здесь.
Поясню, когда вы нажимаете кнопку, механический контакт иметь переходное состояние, в котором он будет колебаться ВКЛ-ВЫКЛ в течение короткого период времени. Тот же эффект может произойти, когда вы отпустите кнопка.
Одним из способов решения этой проблемы является использование конденсатора, нагрузка. Другой «более простой» способ — программное обеспечение. Идея состоит в том, чтобы установите фиксированное произвольное время, в течение которого вы не разрешаете новые прерывания. Вы можете использовать библиотеку millis() или micros(), чтобы установить это время. код будет выглядеть примерно так.
unsigned long lastInterrupt; void ngt() { if(millis() - lastInterrupt > 10) // мы устанавливаем окно без прерываний 10 мс { state = !state; lastInterrupt = millis(); } }
Таким образом, вы не будете обрабатывать новые прерывания, пока не истечет 10 мс.
Примечание. Установите время в соответствии с вашими требованиями.
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Точность синхронизации Arduino nano
- Проблема с использованием Arduino Mega Timer2 с прерыванием PinChange
- DS3231 с Arduino Nano для точной синхронизации
- От Uno до Mega, и где ошибка необъявленного прерывания?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
Сколько времени между нарастающими и спадающими фронтами, и что вы обнаруживаете, прямоугольный фронт?, @MichaelT
ИК-датчик @MichaelT выдает цифровой высокий уровень, когда перед ним находится объект. Таким образом, это может быть любое время между нарастающими и спадающими фронтами. Как я указал в ответе, я нашел решение. Возможно, я не видел сигнал должным образом на осциллографе, и у сигнала была проблема с устранением дребезга., @Şener