Кнопковий введення за допомогою АЦП

  • Час 16-12-2014, 18:07
  • Автор admin
  • Коментарів 0 Комент.
  • Силка url

Кнопковий введення за допомогою АЦП

Рис.1 Опитування кнопок за допомогою АЦП

Якщо в мікроконтролері є АЦП, то його також можна використовувати для опитування кнопок. Схема підключення показана на рис.1. Як бачимо для групи кнопок SB1...SBN такий інтерфейс зажадає всього однієї аналогової лінії. Натискання кнопки визначається по зміні напруги U0. Якщо для простоти всі опору R дільника напруги вибрати однакового номіналу, то номер натиснутої кнопки N, буде пов'язаний з U0 наступним чином:
U0 = ((N-1)/N)*VCC, N = VCC/(VCC - U0),
де VCC - напруга живлення.

Якщо в якості опорного напруги VREF вибрати напруги живлення VCC, то отримаємо
N = 0x3FF/(0x3FF - ADCH:ADCL),
де ADCH:ADCL - регістр з 10-розрядним результатом вимірювання U0.

Для опитування кнопок цілком достатньо 8-розрядної точності вимірювання U0. Тому можна спокійно відкине 2 молодших розряду і працювати з однобайтовыми числами. Кінцева формула при цьому стане ще простіше:   
N = 0xFF /(0xFF - ADCH)
Старший байт результату опиниться в регістрі ADCH якщо в параметрах АЦП включений режим вирівнювання по лівому краю. При цьому 8 старших бітів результату заносяться в ADCH, а 2 молодших, які в даному випадку будуть відкинуті, в 6-й і 7-й розряди ADCL.

Підпрограма опитування кнопок:

..def temp = R16 ;регістр для проміжних операцій .def button = R18 ;регістр з кодом натиснутою кнопки ldi temp,high(RAMEND) ;ініціалізація стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp ; На початку ініціалізації АЦП необхідно провести включення ; і установку його тактової частоти. Включення виробляється ; установкою біта ADEN в регістрі ADCSR. Тактова частота надходить ; на АЦП від системного генератора через переддільник, коефіцієнт ; поділ якого визначається бітами ADPS2:ADPS0 в ADCSR і лежить ; в межах 2...128. Максимальна точність перетворення ; досягається при частоті 50...200 кГц. Якщо, припустимо, ; мікроконтролер працює від внутрішнього генератора 1МГц, ; то необхідно встановити коефіцієнт переддільника 8 (біти ; ADPS2:ADPS0 = 011). Тоді отримаємо прийнятну частоту ; 1000000/8 = 125 кГц як раз з цього діапазону. ldi temp,(1 lt;lt; ADEN)|(1 lt;lt; ADPS1)|(1 lt;lt; ADPS0) out ADCSR,temp ; На наступному етапі проводиться вибір аналогового входу ; до якого буде підключений АЦП. Він задається бітами MUX3:MUX0 ; регістрі ADMUX. У нашого випадку(використовується вхід ADC0) всі 4 ; біта повинні бути скинуті. Крім цього необхідно вибрати ; джерело опорного напруги (задається бітами REFS1, REFS0 ; в ADMUX) і режим вирівнювання результату (відповідає біт ADLAR ; ADMUX). Для даної схеми в якості опорного використовується ; напруга живлення, а результат вимірювання вирівнюється по лівому ; краю(необхідно встановити REFS0 і ADLAR). ldi temp,(1 lt;lt; ADLAR)|(1 lt;lt; REFS0) out ADMUX,temp ; Тепер необхідно запустити перетворення, встановивши біт ; ADSC керуючого регістру ADCSR, і дочекавшись її завершення ; викликати підпрограму опитування кнопок. Про завершення перетворення ; свідчить установка прапора ADIF в ADCSR (якщо крім цього, будуть встановлені ще біти ADIE в ADCSR та I в SREG, то станеться ; перехід на обробник переривання від АЦП), після чого прапор ; необхідно скинути будь-якою командою, записуючої в нього 1. Для того, щоб уникнути процедури постійного запуску перетворення ; і подальшого циклу очікування установки ADIF, можна використовувати ; режим безперервного перетворення установкою біта ADFR в регістрі ; ADCSR. У цьому разі наступне вимірювання буде запускатися ; автоматично після завершення попереднього. Звичайно, це можливо, тільки якщо в ході програми в режим роботи АЦП були внесені ; зміни. . sbi ADCSR,ADSC cnv: sbis ADCSR,ADIF rjmp cnv sbi ADCSR,ADIF rcall btn_adc . ; Підпрограма опитування кнопок за допомогою АЦП ; R18 - номер натиснутої кнопки при виході з підпрограми, ; якщо ні одна кнопка не натиснута, то R18=0 ; R16,R17 - регістри для проміжних операцій ; BUTTON - кількість кнопок btn_adc: in R16,ADCH ;отримуємо результат перетворення і ldi R17,0xFF ;знаходимо різницю R17 = 0xFF-ADCH sub R17,R16 ldi R16,0xFF ;заносимо в R16 0xFF clr R18 ;очищаємо R18 ba1: sub R16,R17 ;виконуємо ділення 0xFF/(0xFF-ADCH), inc R18 ;з допомогою послідовного віднімання brcc ba1 ;R16 = R16-R17 = 0xFF -(0xFF-ADCH) add R16,R17 ;враховуємо залишок після поділу lsl R16 ;якщо він менше половини дільника, sub R16,R17 ;то відкидаємо його brcc ba2 dec R18 ba2: cpi R18,BUTTON+1 ;порівнюємо номер натиснутої кнопки R18 brcs ba3 ;з числом кнопок BUTTON+1 і якщо R18 gt; BUTTON+1, clr R18 ;то ні одна кнопка не була натиснута і R18=0 ba3: ret

При такому підключенні краще всього використовувати 2-8 кнопок, а для збільшення їх кількості можна задіяти інші аналогові лінії. Платою за простоту є неможливість розпізнання комбінацій клавіш. При натисканні двох або більше кнопок завжди буде зчитана та, яка на схемі має менший номер. Кнопка SB1 буде завжди мати найвищий пріоритет. В деяких додатках ця особливість може бути навіть перевагою, коли, наприклад, необхідно видати сигнал відключення незалежно від інших команд, що надходять з клавіатури. 

Перейти до наступної частини: Аналоговий ввід з використанням лінії вводу-виводу

Tags

Коментарі до новини