Задумал я как-то в одной из конструкций применить вот такую кнопку с индикацией состояния:
Внутри — пара замыкающих или переключающих контактов и светодиод (опционально — уже с гасящим резистором на выбор для питания от 5, 12, или 24 В). Все бы с ней хорошо, но разместить кнопку планировал на приборной панели автомобиля, а управляющий блок — в моторном отсеке. А тянуть отдельные провода для контакта и для индикации уж очень не хотелось.
Как это решить, и что для этого нужно — под катом
В итоге в голову пришло вот такое решение:
Работать будет с портами ВВ микроконтроллера, для которых есть:
a) двунаправленный режим
б) безопасное ограничение по выходному току (в STM32 ЕМНИП регулируется программно)
в) виртуальный порт, позволяющий считывать сигнал прямо с выводов (в AVR PINx)
Алгоритм такой:
1. периодически проверяем бит порта PIN, к которому подключена кнопка (например, раз в 20 мс)
1а. на время проверки, если выходной PORT был равен 0, ставим его в 1 (сама проверка — несколько микросекунд — глазом не заметно)
2. если на PIN обнаружили 0, значит кнопка нажата — запоминаем факт первичного обнаружения (для алгоритма антидребезга)
2a. если при этом на PORT был высокий уровень и мы обнаружили нажатие, снимаем его до тех пор, пока периодическая проверка п.1 не покажет устойчивое отжатие кнопки (3-5 проверок подряд) — так как светодиод и так не будет светиться из-за шунтирования контактами кнопки, а уменьшить выходной ток через порт, ограниченный при нажатии кнопки лишь выходным каскадом, очень полезно во всех смыслах
3. если подтвердили нажатие или отпускание в течение нескольких циклов проверки — обрабатываем его в программе, и зажигаем соответственно светодиод через PORT
Недостаток такого включения в том, что индикатор будет погашен в течение всего времени удержания кнопки человеком — то есть если пргораммно реализовывать toggle switch, то переход из вкл в выкл визуально произойдет в момент нажатия, а из выкл во вкл — в момент отпускания — это может быть не совсем удобно
Теперь для МК, которые не умеют отслеживать состояние непосредственно выводов порта, либо не имеют средств ограничения выходного тока (например, старые семейства 8051 и их клоны):
Здесь придется пожертвовать еще одной линией ВВ, настроенной на вход, и разделить гасящий резистор на две части. Алгоритм при этом остается прежним, разве что переводить выходной порт в 0 на все время, пока обнаружено нажатие кнопки, не обязательно (но по-прежнему желательно для автономных систем с точки зрения уменьшения потребляемого тока). Пропорцию значений резисторов можно выбрать и не такую экстремальную (сажать выход на землю через 39 Ом, даже на миллисекунды для некоторых МК может оказаться жестковато) — важно только, чтобы падение напряжения на светодиоде + его нижней половине ограничительного резистора при высоком уровне выходного порта было с запасом больше, чем Vcc/2
И наконец, вариант схемы для нескольких кнопок с индикацией — здесь можно использовать одну входную линию на всех, развязав диодами:
Pull-up входного порта (нарисован пунктиром справа) для исключения слабой засветки кнопок через развязывающие диоды можно включать только в момент сканирования состояния. Сканировать множественные кнопки, естественно, по очереди.
Вот такая идея — на практике правда пока проверить не успел, даже нарисовал только на бумажке
Внутри — пара замыкающих или переключающих контактов и светодиод (опционально — уже с гасящим резистором на выбор для питания от 5, 12, или 24 В). Все бы с ней хорошо, но разместить кнопку планировал на приборной панели автомобиля, а управляющий блок — в моторном отсеке. А тянуть отдельные провода для контакта и для индикации уж очень не хотелось.
Как это решить, и что для этого нужно — под катом
В итоге в голову пришло вот такое решение:
Работать будет с портами ВВ микроконтроллера, для которых есть:
a) двунаправленный режим
б) безопасное ограничение по выходному току (в STM32 ЕМНИП регулируется программно)
в) виртуальный порт, позволяющий считывать сигнал прямо с выводов (в AVR PINx)
Алгоритм такой:
1. периодически проверяем бит порта PIN, к которому подключена кнопка (например, раз в 20 мс)
1а. на время проверки, если выходной PORT был равен 0, ставим его в 1 (сама проверка — несколько микросекунд — глазом не заметно)
2. если на PIN обнаружили 0, значит кнопка нажата — запоминаем факт первичного обнаружения (для алгоритма антидребезга)
2a. если при этом на PORT был высокий уровень и мы обнаружили нажатие, снимаем его до тех пор, пока периодическая проверка п.1 не покажет устойчивое отжатие кнопки (3-5 проверок подряд) — так как светодиод и так не будет светиться из-за шунтирования контактами кнопки, а уменьшить выходной ток через порт, ограниченный при нажатии кнопки лишь выходным каскадом, очень полезно во всех смыслах
3. если подтвердили нажатие или отпускание в течение нескольких циклов проверки — обрабатываем его в программе, и зажигаем соответственно светодиод через PORT
Недостаток такого включения в том, что индикатор будет погашен в течение всего времени удержания кнопки человеком — то есть если пргораммно реализовывать toggle switch, то переход из вкл в выкл визуально произойдет в момент нажатия, а из выкл во вкл — в момент отпускания — это может быть не совсем удобно
Теперь для МК, которые не умеют отслеживать состояние непосредственно выводов порта, либо не имеют средств ограничения выходного тока (например, старые семейства 8051 и их клоны):
Здесь придется пожертвовать еще одной линией ВВ, настроенной на вход, и разделить гасящий резистор на две части. Алгоритм при этом остается прежним, разве что переводить выходной порт в 0 на все время, пока обнаружено нажатие кнопки, не обязательно (но по-прежнему желательно для автономных систем с точки зрения уменьшения потребляемого тока). Пропорцию значений резисторов можно выбрать и не такую экстремальную (сажать выход на землю через 39 Ом, даже на миллисекунды для некоторых МК может оказаться жестковато) — важно только, чтобы падение напряжения на светодиоде + его нижней половине ограничительного резистора при высоком уровне выходного порта было с запасом больше, чем Vcc/2
И наконец, вариант схемы для нескольких кнопок с индикацией — здесь можно использовать одну входную линию на всех, развязав диодами:
Pull-up входного порта (нарисован пунктиром справа) для исключения слабой засветки кнопок через развязывающие диоды можно включать только в момент сканирования состояния. Сканировать множественные кнопки, естественно, по очереди.
Вот такая идея — на практике правда пока проверить не успел, даже нарисовал только на бумажке