Рис.1 Преобразователь сопротивления в цифровой код на основе компаратора
Пользовательский ввод может быть также успешно реализован и с помощью аналогового компаратора. На рис.1 показан один из возможных вариантов реализации преобразователя сопротивление в цифровой код. Временная диаграмма работы приведена на рис.2. Перед началом преобразования линия PD6, являющаяся по совместительству неинвертирующим входом компаратора AIN0, настраивается на вывод, после чего на PD6 устанавливается уровень лог.0. Конденсатор C1 времязадающей цепи разряжается, схема переходит в исходное состояние. Затем PD6 переводится в высокоиммпеданстное состояние, и начинается цикл зарядки максимальной продолжительностью τ1 ≈ 3*T = 3*R3C1, где T = R3C1 - постоянная времени зарядной цепи.
Рис.2 Зависимость напряжения на выводах AIN0, AIN1 компаратора от времени
В течение промежутка времени τ напряжение UAIN0 на выводе AIN0 микроконтроллера сравняется с опорным напряжением UAIN1 на инвертирующим выводе AIN1. Длительность этого интервала зависит от величины R2
τ = T*|ln(R1/(R1+R2))| = R3C1*|ln(R1/(R1+R2))|.
Опрашивая N раз с периодом ∆t состояние линии, получим зависимость числового кода от сопротивления N = τ/∆t.
Таким образом, алгоритм преобразования сопротивление в цифровой код будет подобный тому, который используется в предыдущем разделе. Но преобразователь на основе компаратора позволяет достичь намного более высокой линейности. При использовании номиналов R1, R2, R3, C1 на схеме получим τ ≈ 1769 мкс. Для N = 100 (диапазон изменения величины 0…100 единиц), опрос необходимо будет производить через каждые ∆t = 17.69 мкс. Подпрограмма преобразователя:
.def code = R16 ;регистр с кодом положения движка .def temp = R17 ;регистр для промежуточных операций .equ DELAY = 24 ;задержка времени на частоте 1 МГЦ .equ RANGE = 100 .equ AIN0 = PD6 ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp ; За управление аналоговым компаратором отвечает РВВ ACSR. ; Перед использованием компаратор необходимо включить сбросом ; бита ACD. Выбор источника опорного напряжения производится, ; через ACBG. При ACBG=1 внутренний ИОН 1.23В, подключен к AIN0. ; В нашем случае ACBG=0 (ИОН не используется). В любой момент ; времени логическое значение состояние выхода может быть ; считано через бит ACO. Компаратор может генерировать ; прерывания. Для этого необходимо установить флаг разрешения ; прерываний ACIE в ACSR совместно с флагом I из SREG. Признаком ; возникновения прерывания служит флаг ACI. Условие ; возникновения прерывания определяет комбинация битов ; ACIS1:ACIS0 (ACIS1:ACIS0=00-любое изменение состояния выхода, ; ACIS1:ACIS0=10-изменение с 1 на 0, ACIS1:ACIS0=10-изменение с ; 0 на 1). clr temp out ACSR,temp . rcall ana_code . ; Подпрограмма преобразования сопротивления в цифровой код ; с помощью аналогового компаратора ; R16 – регистр с кодом положения движка резистора ; на выходе из подпрограммы ; XH:XL – используется как 2-байтовый регистр для ; задержки времени ; DELAY – задержка времени τ в машинных циклах (20…65535) ; RANGE – диапазон изменения N (2…255) acom_code: clr R16 ;обнуляем регистр с кодом положения движка cbi PORTD,AIN0;устанавливаем низкий логический уровень sbi DDRD,AIN0 ;и настраиваем на вывод линию AIN0 порта D rjmp PC+1 ;формируем небольшую задержку rjmp PC+1 ;для разрядки конденсатора cbi DDRD,AIN0 ;настраиваем на ввод линию AIN0 порта D rjmp PC+1 ac1: sbic ACSR,ACO ;опрашиваем состояние выхода компаратора и ret ;если на нем высокий уровень, то завершаем процедуру ldi XH,high(DELAY/4-4) ;формируем задержку времени ∆t ldi XL,low(DELAY/4-4) ac2: sbiw XH:XL,1 brne rc3 inc R16 ;инкрементируем регистр R16 и если его cpi R16,RANGE ;содержимое достигло максимального значения brne ac1 ;RANGE, то досрочно завершаем процедуру ret
Рис.3 Аналоговый ввод с помощью компаратора
В некоторых случаях компаратор можно также использовать в качестве простого АЦП с разрешением примерно до 8 бит. Схема такого преобразователя приведена на рис.3. По сравнению со схемой на рис.1, в нее добавлен генератор стабильного тока на транзисторе VT1, благодаря чему функция роста UAIN0 от времени носит линейный характер. Из временной диаграммы на рис.4 видно, что
UAIN0 = (UM/TM)*t,
где UM – установленный верхний предел, измеряемого напряжения, TM – наибольшее время преобразования.
Рис.4 Зависимость напряжения на выводах AIN0, AIN1 компаратора от времени
при аналогово-цифровом преобразовании
Для момента переключения компаратора, когда UAIN0 = UAIN1, получим
U0 = (UM/TM)*τ,
где U0 – измеряемое на входе AIN1 напряжение, τ – длительность преобразования.
Очевидно, что задача измерения напряжения, как и в предыдущем примере, будет сводиться к измерению длительности τ, а время преобразования существенным образом зависеть от U0. Однако у AVR имеется возможность избавить процессор от холостого цикла ожидания завершения преобразования. Для этого нужно использовать схему захвата, встроенную в 16-разрядный таймер-счетчик 1.
Сущность схемы захвата заключается в возможности по заданному условию копировать содержимое 16-разрядного счетного регистра TCNT1H:TCNT1L в специально предназначенный для этого регистр ICR1H:ICR1L. Фиксация содержимого TCNT1H:TCNT1L происходит либо при изменении состояния линии ICP1 (внешний сигнал), либо в момент изменения состояния выхода компаратора (внутренний сигнал). Если подать тактовые импульсы на модуль таймер-счетчика 1, установив при этом начальное значение TCNT1H:TCNT1L=0, то после захвата в ICR1H:ICR1L окажется длительность процесса, выраженная в машинных циклах. А абсолютный временной интервал
T = (ICR1H:ICR1L*N)/Fclk,
где Fclk – частота тактового генератора, N-коэффициент деления предделителя частоты таймера-счетчика 1.
Ниже показан пример использования захвата для реализации АЦП на основе компаратора. Для оповещения программы о завершении преобразования используется прерывание от схемы захвата. Обратите внимание на порядок обращения к двухбайтовым регистрам 16-разрядного таймера-счетчика 1 TCNT1H:TCNT1L, ICR1H:ICR1L. При выполнении цикла чтения первым должен быть считан младший байт регистра, а при записи первым загружается старший байт. Только при соблюдении такой последовательности действий можно гарантировать их достоверное значения.
.def temp = R16 ;регистр для промежуточных операций .def dello = R24 ;младший байт измеренного времени .def delhi = R25 ;старший байт измеренного времени .equ AIN0 = PD6 ; Для активизации функции захвата нужно запустить таймер- ; счетчик 1 в режиме Normal. Дополнительно в регистре TCCR1B ; находятся биты ICNC1, ICES1, управляющие схемой подавления ; помех и выбором уровня сигнала захвата соответственно. ; Установка ICNC1 включает схему подавления помех. В этом случае ; захват будет происходить только после четырех выборок ; соответствующих активному сигналу запуска. При ICES=1 захват ; производится в момент изменения уровня сигнала с 1 на 0, при ; ICES=0 – захват в момент изменения уровня с 0 на 1. Для того ; чтобы сигнал захвата подавался с выхода аналогового ; компаратора, а не с вывода ICP1, в регистре ACSR нужно ; установить бит ACIC. В момент захвата устанавливается флаг ; ICF1 в регистре TIFR. Для разрешения прерывания от схемы ; захвата необходимо установить бит TIСIE1 в TIMSK и флаг I из ; SREG. .cseg .org 0 rjmp initial ;старт программы .org 0x0005 ;обработчика прерывания по rjmp service_ICP1 ;сигналу от схемы захвата .org 0x0020 initial: ldi temp,low(RAMEND) ;инициализация стека out SPL,temp ldi temp,high(RAMEND) out SPH,temp ldi temp,1 << ACIC out ACSR,temp ldi temp,(1 << CS11)|(1 << CS10);настраиваем таймер-счетчик 1 out TCCR1B,temp ;на работу с предделителем F/64 . ;(выбран произвольно) в режиме Normal rcall start_conv ;запускаем преобразование . service_ICP1: . in delhi,ICR1L ;считываем содержимое ICR1H:ICR1L для in dello,ICR1H ;дальнейшей обработки результата . reti ; Подпрограмма запуска преобразования аналогового компаратора ; R16 – регистр для промежуточных операций start_conv: cbi PORTD,AIN0 ;устанавливаем низкий логический уровень sbi DDRD,AIN0 ;и настраиваем на вывод линию AIN0 порта D clr R16 ;обнуляем счетные регистры таймера-счетчика 0 out TCNT1H,R16 out TCNT1L,R16 cbi DDRD,AIN0 ret
Перейти к следующей части: Вывод информации - Светодиодный индикатор
Комментарии (0) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация