Страница 1 из 1

Защита от дребезга

Добавлено: 19 авг 2020, 07:28
starmos
Не знаю правильно ли сюда писать, потому что речь идет о программировании STM32. Но я её программирую через FLProg 6.3.1.
У меня идут какие-то срабатывания по линии дискретного входа, идут случайным образом. Галка "защита от дребезга" на входе стоит. Я смотрю в исходник, программа генерирует такой код:

bool _bounceInputTmpD11 = (digitalRead (11));

if (_bounseInputD11S)
{
if (millis() >= (_bounseInputD11P + 40))
{_bounseInputD11O= _bounceInputTmpD11; _bounseInputD11S=0;}
}
else
{
if (_bounceInputTmpD11 != _bounseInputD11O )
{_bounseInputD11S=1; _bounseInputD11P = millis();}
Код понятен: система считывает текущее состояние входа, сравнивает с предыдущим и если поменялось, то запоминает время и ставит флаг (блок else нижний). При следующих проходах она проверяет флаг и если заданное время истекло, то присваивает выходу текущее состояние и флаг убирает. Только текущее состояние может быть уже новым, ведь система его сохраняет в самом начале этого участка кода. Т.е. после установки флага выдержки времени, она уже не проверяет на изменение сигнала, а разве защита от дребезга не в том, чтобы поймать уже стабильный сигнал?

Защита от дребезга

Добавлено: 19 авг 2020, 08:12
Naladchik
starmos писал(а): 19 авг 2020, 07:28 а разве защита от дребезга не в том, чтобы поймать уже стабильный сигнал
IMHO. Назначение данной защиты не в том, чтобы ловить стабильный сигнал (это работа фильтра), а в том, чтобы отсечь дребезг сигнала на входе контроллера, подключенного к механическому выключателю, кнопке и т.п. Подразумевается что за 40 мс или переключение уже произойдет или сигнал восстановится (случайное касание).
Если же Вам нужно поймать (отфильтровать) именно стабильный сигнал то просто поставьте блок Таймер, задержка на включение (TON).
Если нужно фильтровать оба уровня сигнала, то два таймера TON и TOF (включать или последовательно или параллельно - как больше нравится).

Защита от дребезга

Добавлено: 19 авг 2020, 10:57
ecoins
Naladchik писал(а): 19 авг 2020, 08:12 Назначение данной защиты не в том, чтобы ловить стабильный сигнал (это работа фильтра), а в том, чтобы отсечь дребезг сигнала на входе контроллера, подключенного к механическому выключателю, кнопке и т.п. Подразумевается что за 40 мс или переключение уже произойдет или сигнал восстановится (случайное касание).
Назначение защиты от дребезга от разработчика (сделано очень давно) не попадалось, потому думаю, что объяснение выше фиксация имеющегося функционала.
starmos писал(а): 19 авг 2020, 07:28 Т.е. после установки флага выдержки времени, она уже не проверяет на изменение сигнала, а разве защита от дребезга не в том, чтобы поймать уже стабильный сигнал?
Согласен, что так лучше. Это уже тема подымалась в форуме.
В блоке дискретного ввода от ecoins защита от дребезга выполнена именно таким образом - новое значение устанавливается при неизменном значении пеоиода дребезга (параметр, который устанавливается в мс).

Защита от дребезга

Добавлено: 19 авг 2020, 11:39
Naladchik
ecoins писал(а): 19 авг 2020, 10:57 потому думаю, что объяснение выше фиксация имеющегося функционала.
Именно поэтому и было указано
Naladchik писал(а): 19 авг 2020, 08:12IMHO ...
IMHO
ecoins писал(а): 19 авг 2020, 10:57 Согласен, что так лучше.
На вкус и цвет ...