Как подключить несколько кнопок к одному аналоговому входу?
Обновлено Редакция GAW
Кнопки, подключённые к аналоговому входу, работают как делитель напряжения. Верхнее плечо — подтягивающий резистор R0 = 10 кОм к питанию, нижнее — резистор нажатой кнопки Rn на общий провод. Если делитель питается от того же напряжения, что и опорное АЦП, код не зависит от питания:
Коды и пороги
У ATmega328P (Arduino UNO) АЦП 10-битный, код 0x3FF соответствует опорному напряжению минус один шаг. Для пяти кнопок и R0 = 10 кОм:
| Кнопка, Rn | Напряжение при 5 В | Код АЦП | Порог до следующей |
|---|---|---|---|
| 0 Ом | 0 В | 0 | 46 |
| 1 кОм | 0,45 В | 93 | 138 |
| 2,2 кОм | 0,90 В | 184 | 255 |
| 4,7 кОм | 1,60 В | 327 | 419 |
| 10 кОм | 2,50 В | 512 | 767 |
| не нажата | 5 В | 1023 | — |
Порог ставят посередине между соседними кодами: программа сравнивает результат с порогами по порядку и узнаёт кнопку. Номиналы берут из ряда E12 так, чтобы коды шли с запасом.
Хватит ли точности
Даташит обещает погрешность АЦП 2 младших разряда, а главный источник ошибки — допуск резисторов. Даже с резисторами ±5 % код кнопки 4,7 кОм остаётся в пределах 305–350, а кнопки 2,2 кОм — 170–200: до порогов далеко. Больше 6–8 кнопок на один вход ставить не стоит — коды сближаются, и допуск резисторов начинает решать.
Сопротивление такого источника — R0 и Rn параллельно, не больше 5 кОм, а даташит рекомендует для АЦП источник до 10 кОм, так что отдельный буфер не нужен. Дребезг контактов здесь тоже есть: значение читают несколько раз и принимают кнопку, когда код устойчиво попал в одно окно. Как подключать одиночную кнопку к цифровому входу, рассказано в ответе о резисторе для кнопки, а устройство АЦП — в статье «АЦП».
Похожие вопросы
Что будет, если нажать две кнопки сразу?
Их резисторы окажутся параллельно, и напряжение станет ниже, чем у каждой по отдельности. Параллельное сопротивление меньше обоих резисторов, поэтому код может попасть в окно совсем другой кнопки — той, чей резистор ещё меньше, — или между порогами. Если нужны одновременные нажатия, номиналы подбирают так, чтобы у каждой комбинации был свой код, или ставят расширитель портов.
Нужно ли стабилизированное питание для такой клавиатуры?
Нет, если делитель питается от того же напряжения, что служит опорным для АЦП, — у Arduino UNO это AVCC. Код зависит только от отношения сопротивлений, и колебания питания на него не влияют.
Сколько кнопок можно подключить к одному аналоговому входу?
Ограничение — расстояние между кодами. У пяти кнопок с резисторами от 0 до 10 кОм соседние коды отличаются на 90–185 единиц, и резисторы ±5 % их не путают. При 6–8 кнопках окна сужаются, и нужны резисторы 1 % и тщательный подбор номиналов.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 24.7 — результат 10-битного преобразования: 0x000 — общий провод, 0x3FF — опорное напряжение минус один шаг; 24.6.1 — АЦП рассчитан на источник с выходным сопротивлением около 10 кОм или меньше; табл. 29-15 — абсолютная погрешность 2 младших разряда
- Vishay. D/CRCW e3: Standard Thick Film Chip Resistors (Document Number 20035) — допуск сопротивления стандартных чип-резисторов ±5 % и ±1 %
Нашли ошибку?
Смотрите также
- Делитель напряженияВыход, ток, нагрузка, подбор пары резисторов
- АЦП AVR: ADPS и кодЧастота АЦП, время преобразования, код по напряжению, ADMUX и ADCSRA
- Какой резистор нужен для кнопки Arduino?INPUT_PULLUP или внешние 10 кОм: схема, ток и расчёт
- АЦПКвантование, формула кода, SAR, время выборки, погрешности, передискретизация