Захват прерывания на обоих фронтах, когда он установлен на 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;
}

, 👍1

Обсуждение

Сколько времени между нарастающими и спадающими фронтами, и что вы обнаруживаете, прямоугольный фронт?, @MichaelT

ИК-датчик @MichaelT выдает цифровой высокий уровень, когда перед ним находится объект. Таким образом, это может быть любое время между нарастающими и спадающими фронтами. Как я указал в ответе, я нашел решение. Возможно, я не видел сигнал должным образом на осциллографе, и у сигнала была проблема с устранением дребезга., @Şener


1 ответ


1

Я решил проблему с ответом eventHandler на другой пост. Вот он;

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

Поясню, когда вы нажимаете кнопку, механический контакт иметь переходное состояние, в котором он будет колебаться ВКЛ-ВЫКЛ в течение короткого период времени. Тот же эффект может произойти, когда вы отпустите кнопка.

Одним из способов решения этой проблемы является использование конденсатора, нагрузка. Другой «более простой» способ — программное обеспечение. Идея состоит в том, чтобы установите фиксированное произвольное время, в течение которого вы не разрешаете новые прерывания. Вы можете использовать библиотеку millis() или micros(), чтобы установить это время. код будет выглядеть примерно так.

unsigned long lastInterrupt;

void ngt()
{

  if(millis() - lastInterrupt > 10) // мы устанавливаем окно без прерываний 10 мс
    {    

    state = !state;

    lastInterrupt = millis();

    }
}

Таким образом, вы не будете обрабатывать новые прерывания, пока не истечет 10 мс.

Примечание. Установите время в соответствии с вашими требованиями.

,