PDA

Просмотр полной версии : Применение ADC микроконтроллера в качестве опроса кнопок



Mikola
18.01.2010, 23:59
Предлагается вариант применение ADC микроконтроллера в качестве опроса кнопок.
В данном примере расматривается возможность подключение до 15 кнопок на 1 вход ADC.
Эта конструкция используется в ряде конструкций, которые эксплуатируютрся на
протяжении нескольких лет и зарекомендовала себя с положительной стороны.
При таком подключении кнопок не кретично к изменениям напряжения и помехам.
Если кнопок не хватает можно включить вторую линию с кнопкми. Резисторы применялись 5%.

Схема подключения прилогается.

Genadi Zawidowski
19.01.2010, 02:20
Судя по таблице, предполагается использовать 16-ти битный АЦП?
Попробую оценить для более реального случая.
ATMrga32, тактовая частота АЦП 200 кГц - Absolute Accuracy 1.5 бита.
Итого, от десяти остаётся восемь точных.
То есть, около 20 миливольт на младшй разряд при 5 вольт опоре (для сопоставления с таблицей).
как мы все знаем, ошибка в измерении может быть +/- один от цены младшего разряда - т.е. +/- 60 миливольт (или 40?).
В таблице дискретность напряжений на входе АЦП 300 миливольт.
но вот насчёт 5% резисторов берёт сомнение...
Наибольшее влияние на ошибку будет, как мне кажется, в случаях когда сумма сопротивлений в цепочке резисторв у кнопок и резистора со входа АЦП на питание (3.6 килоом) примерно равны. Для этого случая, если один номинал ушёл в плюс на 5%, а сумма других - в минус на 5% - сразу имееем 5% ошибки в напряжении - а это 250 миливольт- что с учётом ошибки АЦП превышает "ворота" для напряжения одной кнопки.
Так что, для повторяемости лучше урезать желаемое количество кнопок до шести-семи.
Я так вообще перестраховался - четыре кнопки. Правда, все четыре делят диапазон напряжений примерно на четыре примерно равных части - очень сильно упрощается программа.

Mikola
19.01.2010, 13:43
Просто результат измерения смещается в старшие разряды и ипользуется только старшая тетрада ADCH, младшые разряды в данном случае не используются . Номинолы резисторов расчитаны как далитель напряжения, поэтому соотношение их сопртивлений будет равно как при 5V так и при 3V, тоесть при нажатии например кннопки "6", значение ADC будет всегда в пределах значения 0x60 -0x6F в ADCH а при нажатии кнопки 12 в пределах 0xB0 -0xBF. А в тоблице даны напряжения только для того, чтобы можно было проконтролировать правильность установки реисторов, если чтото не зароботает. Расматривался вариант на 31 кнопку, но его не пробовали.

Genadi Zawidowski
19.01.2010, 14:02
тоесть при нажатии например кннопки "6", значение ADC будет всегда в пределах значения 0x60 -0x6F в ADCH а при нажатии кнопки 12 в пределах 0xB0 -0xBF.
Речь о том, что в одном неприятном случае кнопка 6 может начать давать код 5F или 70.
"ворота" - 1/16 диапазона измерений - 6.2%. Резисторы - +/- 5%. Я бы поостерёгся. Запаса совсем нет.
до восьми ещё как-то...

Флудер
19.01.2010, 14:29
http://ve2zaz.net/Resfind/Resfind.htm

вот мне очень нравится программка.

Mikola
19.01.2010, 14:38
Запускаем ADC AREF = ADCC, ADLAR =1
ADC производит измерение по прерыванию.

Привожу часть кода
IN R17, ADCH ;
Scan_KBD_ADC: ;
CPI R17, 0xFF ;
BREQ No_Key ; Переход если кн. не нажаты
SWAP R17 ; Преобразование значения ADC в СканКод
ANDI R17, 0x0F ; Очистить ст. тет регистра
INC R17 ; +1 В R17 зачение Сканкода в мл.тет R17
; У менмя в программе, усли Сканкод равен 0
; кнопко не нажаты
Дальше идет устранение дребизг контактов
No_Key:

Правда при таком вклечении кнопок нет возможности отрабатывать нажатие одновременно двух кнопок.

RU3XN
19.01.2010, 15:22
ATMrga32, тактовая частота АЦП 200 кГц - Absolute Accuracy 1.5 бита.
Итого, от десяти остаётся восемь точных.
То есть, около 20 миливольт на младшй разряд при 5 вольт опоре

А я читал про ADUC841, что там 1LSB=Vref/2^12. По аналогии для данного случая 1LSB=5/2^10=4.8 mV. Итого 4.8*1.5=7.2 mV. Так-что у автора темы все нормально.

Mikola
19.01.2010, 17:18
Реально получается 4bit ADC, 4bit =16 значений, реально на 1 значение 1 кнопка.