Микроконтроллер ATmega16: использование аналогового компаратора
Метки atmel, avr, mega16, аналоговый компаратор
Есть почти в каждом микроконтроллере AVR компании Atmel такая полезная приблуда как аналоговый компаратор. Это уже почти стандартное устройство и встречается очень часто во множестве разных контроллеров. Даже в древнем АТ89С2051 он уже есть. Штучка прикольная, позволяет сравнивать два аналоговых сигнала и выносить свой вердикт: 0 - первый больше второго, 1 - второй больше первого.
Применить его можно, например, чтобы отслеживать уровень заряда аккумулятора по просадке напряжения. Схема простейшая - стабилитрон создает опорное напряжение, которое всегда одиннаково, а напряжение с резистивного делителя зависит от входного напряжения.
Например, на входе у нас 8 вольт. Со стабилитрона, рассчитанного на 3.3 вольта, выходит всегда одно и то же напряжение — 3.3 вольта. А с симметричного резистивного делителя выходит половина напряжения то есть 4 вольта. 4 это больше чем 3.3, (3.3 - 4 = -0.7 результат меньше нуля) с компаратора выходит 0
Теперь если просядет батарейка и напряжение снизится до 6 вольт, то с делителя будет уже 3 вольта, а с опорного как было 3.3 так и осталось. Зато теперь на компараторе ситуация в корне поменялась - 3 меньше чем 3.3 (3.3 - 3 = 0.3 результат больше нуля) , а значит на выходе у него будет 1
Вот так, например, можно легко и просто следить за питающим напряжением и выдавать сигнал тревоги, если батарейка сядет.
Настройка компаратора в контроллере AVR ATMega16.
Для других моделей AVR все очень и очень похоже, просто мне так удобней. ATMega16 имеет на борту компаратор, со входами AIN0(прямой вход) и AIN1(инверсный вход). Чтобы компаратор заработал его выводы нужно подключить на вход (DDR=0) и отключить подтяжку до единицы (PORT=0).
Регистр конфигураций компаратора ACSR
Биты:
Вот за что люблю АТМеги так это за фарш! Даже свой собственный источник опорного напряжения есть. Так что из схемы со стабилитроном можно смело выкинуть все, что касается стабилитрона Оставив только делитель, ну и подобрав плечи резисторного делителя так, чтобы получить напругу на выходе чуть выше чем 1.22V.
Мало того, если в контроллере есть АЦП, то на вывод AIN1 можно подключить ЛЮБОЙ вход АЦП. Нереально круто! Для того, чтобы это сделать нужно:
Пример:
Сварганив систему контроля за питанием. Напряжение с аккумулятора проходит через делитель 1.5:10 в результате на 12 вольтах у нас на выходе будет (1.5/(1.5+10))*12=1.56 и только при просадке напруги до 9.5 вольт на выходе делителя будет ниже 1.22 вольта. Задействуем пока неиспользованный вход PC5 (это вход ADC5).
Заправлю его через АЦП в компаратор, а в качестве опорного напряжения возьму встроенный ION который посажу на AIN0 изнутри. При просадке напряжения буду зажигать контрольную лампу.
Что нам нужно:
Для начала подключить ИОН - бит ACBG
Далее, бит прерывания - в обработчике прерываний я включу лампочку
Ну и выставить условие по которому будет прерывание с 0 на 1. Дело в том, что на плюс-вход компаратора идет 1.22 с ИОН, а на минус-вход пойдет 1.5 с делителя. В результате 1.22-1.5<0, следовательно на выходе 0. Ну, а как только ситуация поменяется будет 1.
; Инициализирую компаратор
LDI R16,(1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
OUT ACSR,R16 ; Забрасываем в регистр
IN R16,SFIOR ; Достаем SFIOR
ORI R16,(1<<ACME) ; Выставялем в нем бит ACME
OUT SFIOR,R16
; АЦП у меня по дефолту вырублен, поэтому пока не напрягаюсь с его отключением
LDI R16,5 ; подаю напругу на 5й вход АЦП
OUT ADMUX,R16
Ну и собственно все, осталось только добавить в программу переход по вектору
.ORG ACIaddr ; Analog Comparator
RJMP Battary_LOW
;И добавить где нибудь в программе обработчик прерывания
Battary_LOW: LIGHT_ON ; Вызов макроса зажжения огня.
RETI ; Выход из прерывания.
Материал с сайта easyelectronics.ru
Применить его можно, например, чтобы отслеживать уровень заряда аккумулятора по просадке напряжения. Схема простейшая - стабилитрон создает опорное напряжение, которое всегда одиннаково, а напряжение с резистивного делителя зависит от входного напряжения.
Например, на входе у нас 8 вольт. Со стабилитрона, рассчитанного на 3.3 вольта, выходит всегда одно и то же напряжение — 3.3 вольта. А с симметричного резистивного делителя выходит половина напряжения то есть 4 вольта. 4 это больше чем 3.3, (3.3 - 4 = -0.7 результат меньше нуля) с компаратора выходит 0
Теперь если просядет батарейка и напряжение снизится до 6 вольт, то с делителя будет уже 3 вольта, а с опорного как было 3.3 так и осталось. Зато теперь на компараторе ситуация в корне поменялась - 3 меньше чем 3.3 (3.3 - 3 = 0.3 результат больше нуля) , а значит на выходе у него будет 1
Вот так, например, можно легко и просто следить за питающим напряжением и выдавать сигнал тревоги, если батарейка сядет.
Настройка компаратора в контроллере AVR ATMega16.
Для других моделей AVR все очень и очень похоже, просто мне так удобней. ATMega16 имеет на борту компаратор, со входами AIN0(прямой вход) и AIN1(инверсный вход). Чтобы компаратор заработал его выводы нужно подключить на вход (DDR=0) и отключить подтяжку до единицы (PORT=0).
Регистр конфигураций компаратора ACSR
Биты:
- ACD включение компаратора 0 включен, 1 выключен. По дефолту там ноль, а значит при старте компаратор включен.
- ACBG - подключение к прямому входу компаратора внутреннего источника опорного напряжения (ИОН) на 1.22+(-)0.05V. Если 0 то ИОН не подключен.
- ACO - бит результата. Собственно, это и есть выход компаратора.
- ACI - флаг прерывания. Устанавливается по событию, сбрасывается после ухода на обработчик либо программно, как всегда, записью в него 1.
- ACIE - где есть прерывание там должен быть и бит разрешения. Это он и есть. Установив в 1 мы разрешаем прерывания от компаратора. По дефолту, естественно, нуль.
- ACIC - подключение компаратора к схеме захвата таймера1. При попадании сигнала на схему захвата текущее значение с таймера тут же тырится в специальный регистр захвата, а таймер продолжает считать дальше. А в привязке к компаратору это удобно когда нужно измерять длительности сигналов.
- Биты ACIS1:ACIS0 определяют условие возникновения прерывания от компаратора:
- 00 - любое изменение на входе.
- 01 - зарезервировано для следующих поколений
- 10 - переход с 1 на 0
- 11 - переход с 0 на 1
Вот за что люблю АТМеги так это за фарш! Даже свой собственный источник опорного напряжения есть. Так что из схемы со стабилитроном можно смело выкинуть все, что касается стабилитрона Оставив только делитель, ну и подобрав плечи резисторного делителя так, чтобы получить напругу на выходе чуть выше чем 1.22V.
Мало того, если в контроллере есть АЦП, то на вывод AIN1 можно подключить ЛЮБОЙ вход АЦП. Нереально круто! Для того, чтобы это сделать нужно:
- В регистре SFIOR (регистр специальных функций) выставить бит ACME (вроде бы так ракеты назывались в мультике про койота и страуса )
- Выключить АЦП, сбросив бит ADEN в регистре настроек АЦП (ADCSRA)
- В регистре ADMUX в разрядах MUX2:MUX1:MUX0 указать номер входа АЦП.
Пример:
Сварганив систему контроля за питанием. Напряжение с аккумулятора проходит через делитель 1.5:10 в результате на 12 вольтах у нас на выходе будет (1.5/(1.5+10))*12=1.56 и только при просадке напруги до 9.5 вольт на выходе делителя будет ниже 1.22 вольта. Задействуем пока неиспользованный вход PC5 (это вход ADC5).
Заправлю его через АЦП в компаратор, а в качестве опорного напряжения возьму встроенный ION который посажу на AIN0 изнутри. При просадке напряжения буду зажигать контрольную лампу.
Что нам нужно:
Для начала подключить ИОН - бит ACBG
Далее, бит прерывания - в обработчике прерываний я включу лампочку
Ну и выставить условие по которому будет прерывание с 0 на 1. Дело в том, что на плюс-вход компаратора идет 1.22 с ИОН, а на минус-вход пойдет 1.5 с делителя. В результате 1.22-1.5<0, следовательно на выходе 0. Ну, а как только ситуация поменяется будет 1.
; Инициализирую компаратор
LDI R16,(1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
OUT ACSR,R16 ; Забрасываем в регистр
IN R16,SFIOR ; Достаем SFIOR
ORI R16,(1<<ACME) ; Выставялем в нем бит ACME
OUT SFIOR,R16
; АЦП у меня по дефолту вырублен, поэтому пока не напрягаюсь с его отключением
LDI R16,5 ; подаю напругу на 5й вход АЦП
OUT ADMUX,R16
Ну и собственно все, осталось только добавить в программу переход по вектору
.ORG ACIaddr ; Analog Comparator
RJMP Battary_LOW
;И добавить где нибудь в программе обработчик прерывания
Battary_LOW: LIGHT_ON ; Вызов макроса зажжения огня.
RETI ; Выход из прерывания.
Материал с сайта easyelectronics.ru
Всего комментариев 2
Комментарии
-
Спасибо Vadzz. Ваша статья мне очень пригодилась.
Запись от схемопай размещена 15.01.2013 в 10:54 -
Исправьте в описании ACIS1 и ACIS0 00 - это любое изменение на выходе, а не входе..
Запись от Ishtaran размещена 03.06.2016 в 01:38