Четверг, 25.04.2024, 02:28
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Изучаем AVR

Аналоговый компаратор в avr
Есть в микроконтроллерах такая полезная штука как аналоговый компаратор. Суть аналогового компаратора заключается в сравнении двух напряжений. У компаратора есть два входа и один выход.
Входы: (прямой - AIN0, инверсный - AIN1), на которые подается напряжение и если напряжение на входе AIN0 больше чем на AIN1 он выдает на выходе 1, иначе 0 (выходом служит флаг регистра компаратора). На отдельную ножку МК выход компаратора не выведен, только входы.

 

Работу встроенного аналогового компаратора можно понять взглянув на временную диаграмму. На которой видно что на инвертирующий вход подано опорное напряжение лежащее в диапазоне (0-5)V. Если напряжение на не инверсном входе меньше опорного то в бите АС0 - 0, а если больше
то в бите AC0 — 1. Этот бит находится в регистре  ACSR.
 


Регистр управления компаратором — это ACSR



Бит 7 — ACD: бит выключения компаратора. Если этот бит установлен в «1″ — компаратор выключен.
Бит 6 — ACBG: выбор опорного напряжения аналогового компаратора. Если бит установлен, то на ножку AIN0 подается фиксированное опорное напряжение от внутреннего источника(значение опорного напряжения необходимо уточнять в datasheet)(2.56V-ATmega32).
Бит 5 — ACO: выход компаратора.Результат сравнения хранится в этом бите.
Если ACO равен «1″ — напряжение AIN0>AIN1, если -»0″ AIN0<AIN1.
Бит 4 — ACI: флаг прерывания компаратора. «1″ — прерывание было, «0″ — прерывания не было.
Бит 3 — ACIE: разрешение прерывания от компаратора. «1″ — разрешено, «0″ — запрещено.
Бит 2 —  ACIC: подключение выхода компаратора к схеме захвата Таймера/Счетчика1.
«1″ — подключен, «0″ — отключен.
Бит 1:0 — ACIS1:ACIS0:эти биты определяют событие, по которому будет вызываться прерывание компаратора. Все варианты перечислены в таблице.



Если инвертирующий выход компаратора нужно подключить к выходу мультиплексора АЦП. То нам необходимо сделать следующее:
1)  ADCSRA&=~(1<<ADEN); //Выключить АЦП cбросив бит ADEN
2) SFIOR|=(1<<ACME); //  Подключаем AINT1  вход компаратора  к выходу мультиплексора АЦП
3) ADMUX битами [ MUX0 MUX1 MUX2 ]  //определяем к какому  выходу АЦП подключить вход компаратора




Код 1 :
Простой пример работы  компаратора

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRC=0xFF; //порт на выход
ACSR|=(1<<ADC); //включение компаратора
while(1)
PORTC=(ACSR&(1<<ACO)); //выводим значение результата сравнения
}

Код 2 :
Пример работы компаратора с использованием прерывания

#include <avr/io.h>
#include <avr/interrupt.h>

ISR (ANA_COMP_vect)
{ PORTC^=1;}

int main (void)
{
DDRC=0xFF; //порт на выход
sei(); //глобальное разрешение прерываний
ACSR|=(1<<ADC); //включение компаратора
ACSR|=(1<<ACIE); //разрешение прерываний
ACSR|=(1<<ACIS0)|(1<<ACIS1); //прерывание по нарастающему фронту
while(1);
}

Код 3 :
Пример подключение входа компаратора к мультиплексору АЦП

#include <avr/io.h>
#include <avr/interrupt.h>

int main (void)
{
DDRC=0xFF; //порт на выход

ACSR|=(1<<ADC); //включение компаратора
SFIOR|=(1<<ACME); // Подключаем AINT1 вход компаратора к выходу мультиплексора АЦП
ADMUX|=(1<<MUX0)|(0<<MUX1)|(0<<MUX2); //определяем конкретную ножку МК
while(1)
PORTC=(ACSR&(1<<ACO)); //выводим значение результата сравнения
}

Код 4 :
Пример подключения выхода компаратора с блоком захвата Т1

#include <avr/io.h>
#include <avr/interrupt.h>

void timer_init (void) //инициализация таймера в режиме «normal»
{
TIMSK|=(1<<TICIE1); // разрешаем прерывания по захвату
TCCR1B |=(1<<CS10)|(0<<CS11)|(1<<CS12); //запуск таймера c предделителем
}

ISR (TIMER1_CAPT_vect)
{
PORTC=ICR1;
PORTD=(ICR1>>8);
TCNT1=0;
}

int main (void)
{
DDRD=0xFF; //порт на выход
DDRC=0xFF; //порт на выход
timer_init();

ACSR|=(1<<ADC); //включение компаратора
ACSR|=(1<<ACIC); //подключение выхода компаратора к схеме захвата Таймера/Счетчика1.
sei(); //глобальное разрешение прерываний
while(1);
}
Категория: Изучаем AVR | Добавил: Alex (20.01.2014)
Просмотров: 9226 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024