Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Ввод информации через аналоговый компаратор

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

Пользовательский ввод может быть также успешно реализован и с помощью аналогового компаратора. На рис.1 показан один из возможных вариантов реализации преобразователя сопротивление в цифровой код. Временная диаграмма работы приведена на рис.2. Перед началом преобразования линия PD6, являющаяся по совместительству неинвертирующим входом компаратора AIN0, настраивается на вывод, после чего на PD6 устанавливается уровень лог.0. Конденсатор C1 времязадающей цепи разряжается, схема переходит в исходное состояние. Затем PD6 переводится в высокоиммпеданстное состояние, и начинается цикл зарядки максимальной продолжительностью τ1 ≈ 3*T = 3*R3C1, где T = R3C1 - постоянная времени зарядной цепи.

Зависимость напряжения на выводе PD0 от времени
Рис.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 – наибольшее время преобразования.

Зависимость напряжения на выводах AIN0, AIN1 компаратора от времени при аналогово-цифровом преобразовании
Рис.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

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением МиниПК MK809V - 4 ядра, Android 4.4.2
вверх