Аналоговый ввод с использованием линии ввода-вывода

Аналоговый ввод с использованием линии ввода-вывода

Рис.1 Преобразователь сопротивления в цифровой код

Любая линия ввода-вывода у AVR может использоваться для аналогового ввода информации. На рис.1, например, показан преобразователь величины сопротивления в цифровой код. Для такого интерфейса потребуется всего один вывод (PD0) и три дополнительных элемента. Резистор R2 необходим для ограничения тока PD0 для тех случаев, когда движок R1 находится в верхнем по схеме положении. Работу преобразователя можно разбить на два этапа (см. рис.2). Сначала на линии PD0, предварительно настроенной на вывод, выставляется высокий логический уровень до тех пор, пока конденсатор C1 не зарядится до максимального напряжения VCC*R1/(R1+R2). Для этого понадобится временной интервал

τ1 ≥ 3*T1 = 3*R1R2C1/(R1+R2), где T1 = R1R2C1/(R1+R2)- постоянная времени зарядной цепи.

Рис.2 Зависимость напряжения на выводе PD0 от времени

Далее линия переводится в высокоимпедансное состояние и начинается цикл разрядки продолжительностью τ2 ≈ 3*T2 = 3*R1C1, где T2 = R1C1 – постоянная времени цепи разрядки.

В течении промежутка времени τ напряжение на выводе PD0 снизится до уровня логического нуля, что у AVR составляет 0.2* VCC. Длительность этого интервала пропорциональна величине R1

τ = T2*|ln([VCC*R1/(R1+R2)]/0.2*VCC)| = R1C1*|ln(5*[R1/(R1+R2)])|.

Опрашивая N раз с периодом ∆t состояние линии, получим зависимость числового кода от сопротивления

N = τ/∆t.

Для обозначенных на схеме номиналов R1,R2,C1 получим τ ≈ 2426 мкс. Для N = 100 (диапазон изменения величины 0…100 единиц), опрос необходимо будет производить через каждые ∆t = 24.26 мкс. Подпрограмма, реализующая необходимую последовательность действий, приведена ниже. В качестве параметра DELAY в нее необходимо передать значение ∆t выраженное в машинных циклах.

.def code = R16 ;регистр с кодом положения движка .def temp = R17 ;регистр для промежуточных операций .equ DELAY = 24 ;задержка времени на частоте 1 МГЦ .equ RANGE = 100 .equ DI = PD0 ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp . rcall res_code . ; Подпрограмма преобразования сопротивления в цифровой код ; с использованием линии ввода-вывода ; R16 – регистр с кодом положения движка резистора ; на выходе из подпрограммы ; XH:XL – используется как 2-байтовый регистр для ; задержки времени ; DELAY – задержка времени τ в машинных циклах (20…65535) ; RANGE – диапазон изменения N (2…255) res_code: clr R16 ;обнуляем регистр с кодом положения движка sbi DDRD,DI ;настраиваем на вывод линию DI порта D sbi PORTD,DI;и устанавливаем высокий логический уровень ldi XH,high(DELAY*RANGE);формируем необходимую задержку ldi XL,low(DELAY*RANGE) ;времени для зарядки конденсатора rc1: sbiw XH:XL,1 brne rc1 cbi DDRD,DI ;настраиваем на ввод линию DI порта D cbi PORTD,DI;и отключаем подтягивающее сопротивление rc2: sbis PIND,DI ;опрашиваем состояние линии DI и если на ret ;ней низкий уровень, то завершаем процедуру ldi XH,high(DELAY/4-4) ;формируем задержку времени ∆t ldi XL,low(DELAY/4-4) rc3: sbiw XH:XL,1 brne rc3 inc R16 ;инкрементируем регистр R16 и если его cpi R16,RANGE ;содержимое достигло максимального значения brne rc2 ;RANGE, то досрочно завершаем процедуру ret

Из-за отклонения номиналов элементов R1,C1 а так же изменяющихся значениях логических уровней, возможно, потребуется корректировка параметр DELAY в небольших пределах.


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 3 + 4

Добавить изображение

Последние статьи