Микроконтроллеры

Аналого-цифровой преобразователь на микроконтроллере Atmega8

Расмотрим настройку аналого-цифрового преобразователя на примере микроконтроллера Atmega8. Всю подробную информацию можно посмотреть в документации на микроконтроллер.

В микроконтроллера Atmega8 существует 10 битный АЦП. 10 бит означает что входное напряжение будет разбито на 210равных частей. МК будет оперировать числами от минимального 0 до максимального 1023. Минимальное будет соответствовать 0 В а максимальное 5 В.

МК имеет 6 каналов АЦП, напряжение на входе измеряется относительно определенного значения заданного на выводе Aref и записывается в 2 регистра ADCH и ADCL. Первый из них хранит старшие биты результата измерения а второй младшие. В процессе измерения микроконтроллер может работать в двух режимах, в режиме однократного преобразования и в режиме непрерывного преобразования. Как следует из названия режимов, непрерывное преобразование происходит постоянно не зависимо от нашего участия, а в режиме однократного мы сами говорим когда нам нужно измерить напряжение.

Основные регистры отвечающие за настройку АЦП микроконтроллера

ADMUX - регистр мультиплексора АЦП

Регистр мультиплесора АЦП admux

Номер Название Функция
7 REFS1 выбор опорного напряжения
6 REFS0 выбор опорного напряжения
5 ADLAR способ записи значения в ADCL и ADCH
4 -  
3 MUX3 бит выбора аналогового канала
2 MUX2 бит выбора аналогового канала
1 MUX1 бит выбора аналогового канала
0 MUX0 бит выбора аналогового канала

Биты REFS1 и REFS0

  • 00 - источник Aref;
  • 01 - AVcc c внешним коденсатором на Aref;
  • 10 - Резерв;
  • 11 - внутренний 2.56 В источник,c внешним коденсатором на Aref.

Бит ADLAR

При помощи этого бита мы выбираем способ записи измеренного нами значения в регистры ADCL и ADCH

ЕслиADLAR=0

adlar0

ЕслиADLAR=1

adlar1

Биты MUX

При помощи этого бита мы выбираем нужный нам канал АЦП.

  • 0000 - ADC0;
  • 0001 - ADC1;
  • 0010 -ADC2;
  • 0011-ADC3;
  • 0100-ADC4;
  • 0101-ADC5;
  • 0111-ADC6;
  • 0111-ADC7;

Регистр ADCSRA

adcsra

Номер Название Функция
7 ADEN разрешение АЦП ( 0 - АЦП выключен, 1 - АЦП включен)
6 ADSC запуск однократного преобразования ( 0 - преобразование закончено, 1 - старт преобразования)>
5 ADFR режим работы АЦП (0 - однократное, 1 - непрерывное)
4 ADIF флаг преобразования АЦП (выставляется в 1 если преобразование завершено)
3 ADIE разрешение прерывания от АЦП (0 - запрещено,1 - разрешено)
2 ADPS2 тактовая частота АЦП>
1 ADPS1 тактовая частота АЦП
0 ADPS0 тактовая частота АЦП>

Биты ADPS

Выбор тактовой частоты АЦП

  • 000 - CK/2;
  • 001- CK/2;
  • 010- CK/4;
  • 011- CK/8;
  • 100- CK/16;
  • 101- CK/32;
  • 110- CK/64;
  • 111- CK/128.

Расмотрим пример настройки АЦП микрокнтроллера Atmega8, если частота нашего МК равно 4,096 МГц. Нам нужно для хорошей точности измерения частоту АЦП меньше чем 200 кГц. Для этого нам нужно выставить преддедитель на CK/32, т.о. получим 4,096/32=128 кГц. Далее необходимо разрешить преобразование от АЦП (для этого записываем в ADEN значение 1), далее выбираем режим преобразования, пусть это будет однократное преобразование (ADFR = 0), и включаем АЦП (ADEN=1). Получается значение 10001101 или (0x8D)которое нам нужно записать в регистр ADCSRA.

Важно отметить одну особенность работы АЦП. Для более точного измерения частота должны быть менее 200 кГц, только при этом условии будет достигнута 10-ти битная точность измерения. А если точность не важна то к примеру на частоте 1 МГц будет 8-ми битная точность, а при 2 МГц 6-ти битная.

 

//функция инициализации
void ADC_init()
{
//воспользуемся значениями регистров, определенными ранее
         ADMUX = 0x00;
         ADCSRA = 0x8D;
}
//функция получает в качестве аргумента номер канала и
возвращает значение на входе 
unsigned int ADC_result(unsigned char adc_input)
{
         ADMUX=adc_input | (ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
         _delay_us(10);
//начинаем преобразование (ADSC = 1)
         ADCSRA | = 0x40;
         while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
        ADCSRA|=0x10;//устанавливаем ADIF
        return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}

Приведенная выше функция возвращает как было сказано ранее число от 0 до 1023 в случае 10-битного преобразования, для того чтобы получить значение в Вольтах нужно умножить полученое число на 5/1023=0,0049 .

Пример вывода измеренного напряжения на LCD

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа