| Next revision | Previous revision |
| ru:examples:digi:switch_debounce [2010/09/29 16:57] – создано eduardtlmk | ru:examples:digi:switch_debounce [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ====== Фильтрация дребезга переключателя ====== | ====== Фильтрация дребезга контактов переключателя ====== |
| |
| //Необходимые знания: [HW] [[et:hardware:homelab:digi]], [AVR] [[et:avr:io]], [LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:delay]], [PRT] [[et:examples:digi:switch]]// | //Необходимые знания: [HW] [[et:hardware:homelab:digi]], [AVR] [[et:avr:io]], [LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:delay]], [PRT] [[et:examples:digi:switch]]// |
| [{{ :examples:digi:switch:switch_input_rc_filter.png?200|RC-фильтр переключателя}}] | [{{ :examples:digi:switch:switch_input_rc_filter.png?200|RC-фильтр переключателя}}] |
| |
| Основной метод избежания ложного срабатывания, возникщего в связи с дребезгом контактов, это фильтрация. Фильтровать можно как электрически, так и программно. При электрической фильтрации нужно соединить переключатель через фильтр нижних частот – к примеру, RC-фильтр – который сглаживает изменения напряжения и благодаря этому вывод микроконтроллера не обретает кратковременных значений. Программная фильтрация происходит по принципу, что значение вывода, куда подключается переключатель, считывается несколько раз и если все разы значение одинаково, тo делается вывод, что переключатель имеет постоянное положение и дребезга контактов не происходит. При любой фильтрации следует считаться с задержкой, которая происходит при определении состояния. | Основной метод избежания ложного срабатывания, возникшего в связи с дребезгом контактов, это фильтрация. Фильтровать можно как электрически, так и программно. При электрической фильтрации нужно соединить переключатель через фильтр нижних частот – к примеру, RC-фильтр – который сглаживает изменения напряжения и благодаря этому вывод микроконтроллера не обретает кратковременных значений. Программная фильтрация происходит по принципу, что значение вывода, куда подключается переключатель, считывается несколько раз и если все разы значение одинаково, тo делается вывод, что переключатель имеет постоянное положение и дребезга контактов не происходит. При любой фильтрации следует считаться с задержкой, которая происходит при определении состояния. |
| | |
| ===== Практика ===== | ===== Практика ===== |
| У программной фильтрации существует несколько методов. Это можно делать просто и сложно, у обоих вариантов свои преимущества и недостатки. Если программа такова, что нажатие на кнопку ожидается редко, то можно после регистрации нажатия кнопки добавить длинную паузу, что исключает реакцию на дополнительные включения, возникшие при дребезге. Так же при подобном решении следует учитывать, что если пользователь держит кнопку долго нажатой, то при отжатии кнопки, программа реагирует на возникшее ложное срабатывание. | У программной фильтрации существует несколько методов. Это можно делать просто и сложно, у обоих вариантов свои преимущества и недостатки. Если программа такова, что нажатие на кнопку ожидается редко, то можно после регистрации нажатия кнопки добавить длинную паузу, что исключает реакцию на дополнительные включения, возникшие при дребезге. Так же при подобном решении следует учитывать, что если пользователь держит кнопку долго нажатой, то при отжатии кнопки, программа реагирует на возникшее ложное срабатывание. |
| |
| ~~PB~~ | <pagebreak> |
| |
| Надежней программа, которая контролирует состояние кнопки в течении определённого времени несколько раз (чем больше и длиннее время, тем надежней). Далее преведено чтение фильтрованного значения функции кнопки Дигитального входного-выходного модуля: | Надежней программа, которая контролирует состояние кнопки в течении определённого времени несколько раз (чем больше и длиннее время, тем надежней). Далее преведено чтение фильтрованного значения функции кнопки Дигитального входного-выходного модуля: |
| unsigned char timeout = 100; | unsigned char timeout = 100; |
| |
| // Ждем, пока состояние кнопки станет ясным или закончится выяснение состояния | // Ждем, пока состояние кнопки станет ясным или закончится выяснение |
| | // состояния |
| while (timeout-- > 0) | while (timeout-- > 0) |
| { | { |
| Данная функция использует функцию образования задержки, о чём подробнее рассказывает соответсвующее задание. Здесь не нужно много знать о функциях задержки кроме того, что создается 1 миллисекундная задержка для каждого состояния кнопки в конце цикла. Если кнопка в течении восьми раз находится в одном положении, это возвращает посчитанное состояние. Вся процедура может в случае нестабильности кнопки длиться до 100 миллисекунд. Функция уже содержится в библиотеке выводов, так что для прохождения примера не нужно добавлять это в свою программу. Для испытания этого придется первую часть задания немного изменить - привлечь в программу для создания задержки библиотеку и в месте, где значение кнопки было прочитано прямо, использовать функцию с фильтром. Результат следующий: | Данная функция использует функцию образования задержки, о чём подробнее рассказывает соответсвующее задание. Здесь не нужно много знать о функциях задержки кроме того, что создается 1 миллисекундная задержка для каждого состояния кнопки в конце цикла. Если кнопка в течении восьми раз находится в одном положении, это возвращает посчитанное состояние. Вся процедура может в случае нестабильности кнопки длиться до 100 миллисекунд. Функция уже содержится в библиотеке выводов, так что для прохождения примера не нужно добавлять это в свою программу. Для испытания этого придется первую часть задания немного изменить - привлечь в программу для создания задержки библиотеку и в месте, где значение кнопки было прочитано прямо, использовать функцию с фильтром. Результат следующий: |
| |
| ~~PB~~ | <pagebreak> |
| |
| <code c> | <code c> |