Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Программное подавление дребезга

425  
  moose свой человек05.05.17 23:14
NEW 05.05.17 23:14 

Кто имеет опыт? Начитался и набаловался. Пишут, что "не привязывайтесь к прерываниям". Сперва не поверил, выглядит самым прямым путем, но оказалось, что там очень сложно что-то предпринять, получается картина (в с трудом полученном логе) примерно такая:


0 down 51965
1 up 3991
2 down 5826
3 down 3519
4 up 84
5 down 4869
6 up 4735
7 down 22
8 up 195
9 down 3870
10 up 4901
11 down 5584
12 up 3865
13 down 1
14 up 136
15 down 1
16 up 281
17 down 4435
18 up 4545
19 down 5227
20 up 6193
21 down 2
22 up 4
23 down 4223
24 up 4101
25 down 2
26 up 128
27 down 74
28 up 30
29 down 5002
30 up 5052
31 down 3967
32 down 5440
33 up 86
34 down 2
35 down 97


Из этого кошмара сложно выловить реальные нажатия/отпускания.

Если запускать таймер на равные промежутки, и опрашивать состояние, лучше получается.

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


#1 
AlexNek патриот05.05.17 23:51
AlexNek
05.05.17 23:51 
в ответ moose 05.05.17 23:14

А какой способ съёма информации и что за сигналы? Хоть бы лог как то описали.


Например через АЦП ловил цифровой 0/1 со светового барьера. Так установил пороги срабатывания и после считал количество непрерывного нахождения в пороге за определенное время. Так получался 0 или 1, а затем смотрел чтобы они не бултыхались.

Но для каждого случая свой индивидуальный подход. Просто для съема сигнала можно обычное усреднение делать. Можно различные интерполяции применять, есть такие где пики не учитываются. Но для реального времени они почти не годятся. Там можно различные интеграторы ставить в зависимости от требуемого времени отклика и оборудования.


Для начала можно просто осциллограф на кнопочку закинуть и глянуть что за сигнал идет. В нормальных моделях есть режимы синхронизации и записи по пику.

#2 
Murr патриот06.05.17 01:55
Murr
NEW 06.05.17 01:55 
в ответ moose 05.05.17 23:14

Начитался и набаловался.

-----

Схемку бы для начала.

Потом, код, чем обсчитывалось...

Ну и наконец что именно логировалось...

Тогда можно что-то сказать...


#3 
  moose свой человек06.05.17 11:01
NEW 06.05.17 11:01 
в ответ AlexNek 05.05.17 23:51

Извините, конечно, должен был появнить, что это за циферки.

Это пытался логить изменения состояния пина, к которому подключена кнопка (она садит его с высокого уровня на землю). По изменению состояния возникает прерывание, где я считываю уровень и "пишу в лог" состояние пина и время (в тиках реального времени), прошедшее после предыдущего изменения состояния. Как можно заметить, даже не все изменения состояния регистрируются, куда-то пропадают. В приведенном примере я десять раз нажал-отпустил с примерно одинаковым интервалом.

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

#4 
Murr патриот06.05.17 13:47
Murr
NEW 06.05.17 13:47 
в ответ moose 06.05.17 11:01

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

-----

Бессмысленное занятие.

1. У тебя уже естъ прерывание, указывающее изменение уровня.

2. Уровень, который ты считываешь, имеет очень малое отношение к тому, что вызвало прерывание - во время дребезга происходит до 10.000 переключений.

3. То, что ты "измеряешь" происходит с задержкой на выполнение мин. 3-12 команд процессора, количество переключений в аппаратной части за этот период несколько сотен.


Подавление дребезга - интеграционный процесс. Соответственно, ты либо имеешь аппаратный интегратор на входе - конденсаторы, триггеры Шмитта, либо делаешь тоже самое програмно - заводишь переменную для пина и +/- до пoроговых значений.

#5 
AlexNek патриот06.05.17 15:40
AlexNek
NEW 06.05.17 15:40 
в ответ moose 06.05.17 11:01
должен был пояснить, что это за циферки

А всё остальное значит не нужно, пояснять. миг


Видимо какой-то микроконтроллер и кпопка. Тогда непонятно. Проблема известная и везде достаточно подробно описанная.

http://robotosha.ru/arduino/connect-button-arduino.html

http://www.riuson.com/blog/post/keyboard-debounce-in-softw...

http://home.roboticlab.eu/ru/examples/digi/switch_debounce

#6 
Wanderer_ посетитель06.05.17 22:05
NEW 06.05.17 22:05 
в ответ moose 05.05.17 23:14, Последний раз изменено 06.05.17 22:05 (Wanderer_)

К ссылкам от AlexNek добавлю ещё ссылку на немецкий ресурс:

https://www.mikrocontroller.net/articles/Entprellung

Очень хорошо и подробно рассписано.

Если есть возможность, то я бы посоветовал решать проблему аппаратным способом и не загружать микроконтроллер.


#7 
  moose свой человек08.05.17 20:23
NEW 08.05.17 20:23 
в ответ Wanderer_ 06.05.17 22:05

Как и предполагал, позавчера сделал, и оно заработало. Теперь действительно кажется, что "ерундой занимался, и все давно известно". Но это всегда так и во всем. Вот человеку Ethernet/IP понадобился, тоже вопросы возникать будут, которые неделей позже глупыми покажутся.

#8