Читайте также:
|
|
31.07.2011 19:08 | Автор: Pashgan |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
AVR. Учебный курс. Использование аналогового компаратора
Опубликовано 13 Сентябрь 2008 автором DI HALT
Есть почти в каждой AVR ке, такая полезная приблуда как аналоговый компаратор. Это уже почти стандартное устройство и встречается очень часто во множестве разных контроллеров. Даже в древнем, как говно мамонта, АТ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 все очень и очень похоже, просто мне так удобней. Если будет затруднение спросишь в комментах.
Мега16 имеет на борту компаратор, со входами AIN0 (прямой вход) и AIN1 (инверсный вход) Чтобы компаратор заработал его выводы нужно подключить на вход (DDR =0) и отключить подтяжку до единицы (PORT =0).
Регистр конфигураций компаратора ACSR
Биты:
§ ACD включение компаратора 0 включен, 1 выключен. По дефолту там ноль, а значит при старте компаратор включен.
§ ACBG - подключение к прямому входу компаратора внутреннего источника опорного напряжения (ИОН) на 1.22+(-)0.05V. Если 0 то ИОН не подключен.
§ ACO — бит результата. Собственно, это и есть выход компаратора.
§ ACI — флаг прерывания. Я думаю, что ты уже привык к тому, что в AVR есть прерывание на каждый чих. Компаратор не исключение. Устанавливается по событию, сбрасывается после ухода на обработчик либо программно, как всегда, записью в него 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; Выход из прерывания. |
Или вот, второй пример. Попроще.
На компаратор подается два напряжения. Одно опорное, со стабилизатора 3.3 вольта демоплатыPinboard. Второе с потенциометра, то которое мы сравниваем. Подаются напрямую на выводы компаратора AIN0 и AIN1
Когда напряжение с потенциометра выше чем 3.3 вольта с стабилизатора, то в компараторе у нас на выходе 0 (бит ACO=0). И наоборот. Также настроено прерывание так, чтобы при попадании в него происходила инверсия бита PD4 — на нем висит светодиод LED1
Код
Обработчик прерывания:
COMP_OK: PUSHF; Сохранили флаги PUSH R17; Сохранили R17 INVB PORTD,4,R17,R16; Инвертировали бит PD4 POP R17; Достали все из стека POPF; И флаги тоже RETI; Вышли |
Инициализация периферии:
; Internal Hardware Init ======================================= ;Comparator Init OUTI ACSR,1<<ACIE|1<<ACIS1|1<<ACIS0; Разрешаем прерывание ; Ловим 0-1 переход. ; Ports Init SBI DDRD,4 SBI DDRD,7 SEI ; End Internal Hardware Init =================================== |
Главная программа:
; Main ========================================================= Main: IN R16,ACSR; Взяли состояние компаратора ANDI R16,1<<ACO; Оставили только бит состояния BST R16,ACO; Скопировали его в Т BLD R16,7; Выгрузили в 7й разряд R16 IN R17,PORTD; Взяли значение из PORTD ANDI R17,0b01111111; Подавили значение 7го разряда OR R17,R16; Наложили на него значение ACO OUT PORTD,R17; Вернули значение в порт. RJMP Main |
Светодиод LED3 показывает состояние бита ACO, а LED1 фиксирует заходы в обработчик прерывания компаратора. При этом наблюдается мерзкий эффект — когда сравниваемые напряжения на входах компаратора очень близки, то возникает дребезг. Т.е. мельчайшие помехи уже начинают играть роль и перевешивают чашу весов компаратора то в одну то в другую сторону. Возникает жуткий дребезг. Этот дребезг надо подавлять программно. Скажем игнорировать изменения сигнала если он чаще чем раз в несколько миллисекунд.
Наименование | Описание | Кол-во каналов | Время ответа (мкс) | Iпот. канал (мА) |
LM111 | Компаратор напряжения | 0.10 | 5.10 | |
LM119 | Быстродействующий сдвоенный компаратор | 0.08 | ||
LM139 | Счетверенный малопотребляющий компаратор с низким напряжением смещения | 0.50 | 0.20 | |
LM160 | Быстродействующий дифференциальный компаратор | 0.0130 | ||
LM161 | Быстродействующий дифференциальный компаратор | 0.0140 | ||
LM193 | Сдвоенный малопотребляющий компаратор с низким напряжением смещения | 0.40 | 0.20 | |
LM211 | Компаратор напряжения | 0.10 | 5.10 | |
LM219 | Сдвоенный быстродействующий компаратор | 0.08 | ||
LM239 | Счетверенный малопотребляющий компаратор с низким напряжением смещения | 0.50 | 0.20 | |
LM2901 | Счетверенный малопотребляющий компаратор с низким напряжением смещения | 0.50 | 0.20 | |
LM2903 | Сдвоенный малопотребляющий компаратор с низким напряжением смещения | 0.40 | 0.20 | |
LM293 | Сдвоенный малопотребляющий компаратор с низким напряжением смещения | 0.40 | 0.20 | |
LM311 | Компаратор напряжения | 0.10 | 5.10 | |
LM319 | Сдвоенный быстродействующий компаратор | 0.08 | ||
LM3302 | Счетверенный малопотребляющий компаратор с низким напряжением смещения | 0.50 | 0.20 | |
LM339 | Счетверенный малопотребляющий компаратор с низким напряжением смещения | 0.50 | 0.20 | |
LM360 | Быстродействующий дифференциальный компаратор | 0.0130 | ||
LM361 | Быстродействующий дифференциальный компаратор | 0.0140 | ||
LM392 | Малопотребляющий операционный усилитель/компаратор напряжения | 1.50 | 0.50 | |
LM393 | Сдвоенный малопотребляющий компаратор с низким напряжением смещения | 0.40 | 0.20 | |
LM397 | Компаратор напряжения общего назначения | 0.25 | 0.25 | |
LM613 | Сдвоенный операционный усилитель, сдвоенный компаратор | 0.75 | 0.1120 | |
LM6511 | 180нс 3В Компаратор | 0.18 | 2.70 | |
LMC6762 | Сдвоенный маломощный КМОП компаратор с Rail-to-Rail входом и двухтактным выходом | 0.0060 | ||
LMC6772 | LMC6772 - Сдвоенный маломощный КМОП компаратор с Rail-to-Rail входом и выходом открытый сток | 0.0060 | ||
LMC7211 | КМОП компаратор с Rail-to-Rail входом | 0.0070 | ||
LMC7215 | Маломощный КМОП компаратор с Rail-to-Rail входом и открытый сток/двухтактным выходом в TinyPak корпусе | 0.0007 | ||
LMC7221 | КМОП компаратор с Rail-to-Rail входом и выходом открытый сток | 0.0070 | ||
LMC7225 | Маломощный КМОП компаратор с Rail-to-Rail входом и открытый сток/двухтактным выходом в TinyPak корпусе | 0.0007 | ||
LMS33460 | Детектор напряжения < 3В | 0.0010 | ||
LMV331 | Низковольтный компаратор общего назначения в TinyPack корпусе | 0.60 | 0.06 | |
LMV339 | Счетверенный низковольтный компаратор общего назначения в TinyPack корпусе | 0.60 | 0.05 | |
LMV393 | Сдвоенный низковольтный компаратор общего назначения в TinyPack корпусе | 0.60 | 0.0425 | |
LMV7219 | 7нс, 2.7-5В компаратор с Rail-to-Rail выходом | 0.01 | 1.10 | |
LMV7235 | 45нс, низковольтный ультра-малопотребляющий компаратор с Rail-to-Rail входом и открытый сток/двухтактным выходом | 0.0450 | 0.0650 | |
LMV7239 | 45нс, низковольтный ультра-малопотребляющий компаратор с Rail-to-Rail входом и открытый сток/двухтактным выходом | 0.0450 | 0.0650 | |
LMV7255 | 1.8В низковольтный компаратор с Rail-to-Rail входом | 0.40 | 0.0120 | |
LMV761 | Низковольтный прецизионный компаратор с двухтактным выходом | 0.12 | 0.2750 | |
LMV762 | Низковольтный прецизионный компаратор с двухтактным выходом | 0.12 | 0.2750 | |
LP339 | Ультра-малопотребляющий счетверенный компаратор | 0.0213 | ||
Компаратор на транзисторе
Для сравнения двух напряжений не обязательно обращаться к операционному усилителю. С подобной задачей вполне может справиться простая и дешевая схема компаратора на транзисторе, которая представлена на рисунке.
Компаратор на транзисторе.
Транзистор p-n-p типа сравнивает опорное напряжение на эмиттере с частью контролируемого напряжения, поданной на базу через резистивный делитель R1R2. Когда напряжение на базе падает ниже опорного, транзистор открывается и выход компаратора (коллектор транзистора) переходит в состояние с высоким потенциалом. Такая схема может использоваться, например, для контроля напряжения батареи питания.
Сжатие
Сжатие – это любая процедура, уменьшающая потребности файла (или сообщения) в данных, серьёзно не ухудшающая целостность этого файла.
Сжатие является важной частью современной информационной технологии и широко используется для сокращения размера файла текста, музыки, графики, видео, а также больших наборов данных.
Существуют десятки методов сжатия, каждый из которых имеет свои преимущества и сферы применения.
Рассмотрим это явление с позиции теории информации.
Кодирование по алгоритму Хаффмена
Проблема отыскания моментальных кодов минимальной средней длины L. Как известно, H<=L<=H+ 1.
Для студента МТИ Хаффмена это была тема курсовой работы, выданная профессором Фэно. Работая над этой темой Хаффман (не зная, что Шеннон и Фэно сами уже предпринимали попытку решить эту проблему) открыл простой способ создания кода. С тех пор подобный подход к кодированию стал называться кодированием по алгоритму Хаффмена.
Алгоритм учитывает количество символов источника и их вероятности и создаёт код со средней длиной L, достаточно близкий к энтропии источника H.
Однако, следует отметить, что построенный по этой методике код может быть не уникальным, т.е. с одной и той же минимальной средней длиной можно создать несколько кодов (каждый из них будет называться кодом Хффмена).
Дата добавления: 2014-12-19; просмотров: 135 | Поможем написать вашу работу | Нарушение авторских прав |