Расмотрим настройку аналого-цифрового преобразователя на примере микроконтроллера Atmega8. Всю подробную информацию можно посмотреть в документации на микроконтроллер.
В микроконтроллера Atmega8 существует 10 битный АЦП. 10 бит означает что входное напряжение будет разбито на 210равных частей. МК будет оперировать числами от минимального 0 до максимального 1023. Минимальное будет соответствовать 0 В а максимальное 5 В.
МК имеет 6 каналов АЦП, напряжение на входе измеряется относительно определенного значения заданного на выводе Aref и записывается в 2 регистра ADCH и ADCL. Первый из них хранит старшие биты результата измерения а второй младшие. В процессе измерения микроконтроллер может работать в двух режимах, в режиме однократного преобразования и в режиме непрерывного преобразования. Как следует из названия режимов, непрерывное преобразование происходит постоянно не зависимо от нашего участия, а в режиме однократного мы сами говорим когда нам нужно измерить напряжение.
Номер | Название | Функция |
7 | REFS1 | выбор опорного напряжения |
6 | REFS0 | выбор опорного напряжения |
5 | ADLAR | способ записи значения в ADCL и ADCH |
4 | - | |
3 | MUX3 | бит выбора аналогового канала |
2 | MUX2 | бит выбора аналогового канала |
1 | MUX1 | бит выбора аналогового канала |
0 | MUX0 | бит выбора аналогового канала |
Биты REFS1 и REFS0
Бит ADLAR
При помощи этого бита мы выбираем способ записи измеренного нами значения в регистры ADCL и ADCH
ЕслиADLAR=0
ЕслиADLAR=1
Биты MUX
При помощи этого бита мы выбираем нужный нам канал АЦП.
Номер | Название | Функция |
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
Выбор тактовой частоты АЦП
Расмотрим пример настройки АЦП микрокнтроллера 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