Может ли фотодатчик давать дребезг и отчего зависает плата DUE

Viblis
Offline
Зарегистрирован: 04.11.2016
В создаваемом проекте после появления светового импульса оценивается нажатие одной из четырех кнопок и записывается время срабатывания каждой от появления импульса
Время срабатывания в диапазоне от 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 раза (это что за дребезг такой), кнопка дребезжит (это ожидалось, позже буду эксперементировать с аппаратным устранением, фильтры или тригерры), после чего плата затыкается и до перезагрузки не реагирует ни фототодатчик не кнопку) Ну фотодатчик то же можно через фильтр подключить, но плата то, чего зависает ?
Куда копать ?
ВН
Offline
Зарегистрирован: 25.02.2016

Viblis пишет:
Время срабатывания в диапазоне от 150 до 200 миллисекунд, необходимая точность два знака после запятой (к примеру 151.14 , 157.25 и.т.д.)

только через RS тригеры

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Viblis, что б не висло уберите вызов serial из прерываний. Что б не было дребезга применяйте модуль компаратора с гистерезисом.

Viblis
Offline
Зарегистрирован: 04.11.2016

dimax пишет:

Viblis, что б не висло уберите вызов serial из прерываний. Что б не было дребезга применяйте модуль компаратора с гистерезисом.

А как тогда инфу в комп передать о времени срабатывания ?

Насчет компаратотора понятно, для кнопок он нужен, лучше триггер шмидта или RS элемент, но на выходе фотодиодного модуля уже есть компаратор, он дает четкую единицу или ноль

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Viblis пишет:

А как тогда инфу в комп передать о времени срабатывания ?

Запомнить время в прерывании, и вывести результат в Loop

Viblis пишет:

Насчет компаратотора понятно, для кнопок он нужен, лучше триггер шмидта или RS элемент, но на выходе фотодиодного модуля уже есть компаратор, он дает четкую единицу или ноль

Ключевое слово с гистерезисом.

Viblis
Offline
Зарегистрирован: 04.11.2016

dimax пишет:

Запомнить время в прерывании, и вывести результат в Loop

Ключевое слово с гистерезисом.

Сейчас попробую

Тригерр Шмитта он и есть с гистерезисом, идеальный с прямоугольным

ВН
Offline
Зарегистрирован: 25.02.2016

бестолку тут гистерезис сам по себе

Viblis
Offline
Зарегистрирован: 04.11.2016

ВН пишет:

бестолку тут гистерезис сам по себе

Насколько я понял, изучив тему, лучшие аппаратные результаты получаются на кнопках с тремя контактами плюс триггер

ВН
Offline
Зарегистрирован: 25.02.2016

даже с 2-мя контактами без схемы бывает тяжело разобраться, а уж с 3-мяяяя ....

 

Viblis
Offline
Зарегистрирован: 04.11.2016

ВН пишет:

даже с 2-мя контактами без схемы бывает тяжело разобраться, а уж с 3-мяяяя ....

 

Я имел ввиду вот такую схему подключения кнопки:

ВН
Offline
Зарегистрирован: 25.02.2016

это и есть RS тригер, правда с перепутанными именами входов.

Причем у тригеров такого вида есть одно интересное свойство, в данном случае это тригер с безусловной установкой 1,

т.е. если на верхнем входе 0, то на выходе всегда 1, независимо от состояния нижнего входа,

а если переставить выход, то будет наоборот.

Этот момент следует учитывать или можно иногда использовать с пользой.