Может ли фотодатчик давать дребезг и отчего зависает плата DUE
- Войдите на сайт для отправки комментариев
Чт, 06/12/2018 - 20:06
В создаваемом проекте после появления светового импульса оценивается нажатие одной из четырех кнопок и записывается время срабатывания каждой от появления импульса
Время срабатывания в диапазоне от 150 до 200 миллисекунд, необходимая точность два знака после запятой
(к примеру 151.14 , 157.25 и.т.д.)
Пока испытываем устройство с одной кнопкой, выбрана плата DUO так как планируется использовать ее возможность работать с большим количеством прерываний. Нам нужно будет использовать пять прерываний (фотодатчик и четыре кнопки)
Следует сказать, что вначале схема была испытана имитатором фотодатчика и кнопок созданом на другой плате ардуино UNO - все срабатывало очень четко.
,
Для проведения основных испытаний собрана вот такая схема с стандартным модулем определения яркости, модуль без названия вот такой:
Схема вот такая:
Написан скетч (который уже испытывался в режиме иммитации):
volatile unsigned long Time0 = 0; //Время срабатывания оптического датчика volatile unsigned long Time1 = 0; //Время срабатывания первой кнопки volatile unsigned long Time2 = 0; //Время срабатывания второй кнопки volatile unsigned long Time3 = 0; //Время срабатывания третьей кнопки volatile unsigned long Time4 = 0; //Время срабатывания четвертой кнопки boolean flag1 = false; boolean flag2 = false; boolean flag3 = false; boolean flag4 = false; void setup() { attachInterrupt(6, Start, Rising); //Прерывание по нарастающему фронту на D6, фотодатчик attachInterrupt(2, End1, RISING); //Прерывание по нарастающему фронту на D2,кнопка1 //attachInterrupt(3, End2, RISING); //Прерывание по нарастающему фронту на D3,кнопка2 //attachInterrupt(4, End3, RISING); //Прерывание по нарастающему фронту на D4, кнопка3 //attachInterrupt(5, End4, RISING); //Прерывание по нарастающему фронту на D5, кнопка4 Serial.begin (9600); Serial.println("Start"); } void loop() { if (flag1 == true) { } /* if (flag2 == true) { } if (flag3 == true) { } */ } void Start() { Time0 = micros(); Serial.println("Датчик "); } void End1() { Time1 = micros(); flag1 = true; Serial.print("Time1 "); Serial.println(Time1 - Time0);//отправляем время срабатывания в компьютер //digitalWrite(8, LOW); } /* void End2() { Time2 = micros(); flag2 = true; Serial.print("Time2 "); Serial.println(Time2 - Time0);//отправляем время срабатывания в компьютер } void End3() { Time3 = micros(); flag3 = true; Serial.print("Time3 "); Serial.println(Time3 - Time0);//отправляем время срабатывания в компьютер } void End4() { Time4 = micros(); flag4 = true; Serial.print("Time4 "); Serial.println(Time4 - Time0);//отправляем время срабатывания в компьютер } */
Включаем, светим на датчик и жмем кнопку, смотрим монитор порта:
Происходит следущее - датчик срабатывает 2-3 раза (это что за дребезг такой), кнопка дребезжит (это ожидалось, позже буду эксперементировать с аппаратным устранением, фильтры или тригерры), после чего плата затыкается и до перезагрузки не реагирует ни фототодатчик не кнопку) Ну фотодатчик то же можно через фильтр подключить, но плата то, чего зависает ?
Куда копать ?
только через RS тригеры
Viblis, что б не висло уберите вызов serial из прерываний. Что б не было дребезга применяйте модуль компаратора с гистерезисом.
Viblis, что б не висло уберите вызов serial из прерываний. Что б не было дребезга применяйте модуль компаратора с гистерезисом.
А как тогда инфу в комп передать о времени срабатывания ?
Насчет компаратотора понятно, для кнопок он нужен, лучше триггер шмидта или RS элемент, но на выходе фотодиодного модуля уже есть компаратор, он дает четкую единицу или ноль
А как тогда инфу в комп передать о времени срабатывания ?
Запомнить время в прерывании, и вывести результат в Loop
Насчет компаратотора понятно, для кнопок он нужен, лучше триггер шмидта или RS элемент, но на выходе фотодиодного модуля уже есть компаратор, он дает четкую единицу или ноль
Ключевое слово с гистерезисом.
Запомнить время в прерывании, и вывести результат в Loop
Ключевое слово с гистерезисом.
Сейчас попробую
Тригерр Шмитта он и есть с гистерезисом, идеальный с прямоугольным
бестолку тут гистерезис сам по себе
бестолку тут гистерезис сам по себе
Насколько я понял, изучив тему, лучшие аппаратные результаты получаются на кнопках с тремя контактами плюс триггер
даже с 2-мя контактами без схемы бывает тяжело разобраться, а уж с 3-мяяяя ....
даже с 2-мя контактами без схемы бывает тяжело разобраться, а уж с 3-мяяяя ....
Я имел ввиду вот такую схему подключения кнопки:
это и есть RS тригер, правда с перепутанными именами входов.
Причем у тригеров такого вида есть одно интересное свойство, в данном случае это тригер с безусловной установкой 1,
т.е. если на верхнем входе 0, то на выходе всегда 1, независимо от состояния нижнего входа,
а если переставить выход, то будет наоборот.
Этот момент следует учитывать или можно иногда использовать с пользой.