Пример для ATMega8, инициализация АЦП:
ADCSRA |= (1<<ADEN) // Разрешение использования АЦП
|(1<<ADSC)//Запуск преобразования
|(1<<ADFR)//Непрерывный режим работы АЦП
|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//Делитель 128, т.е. 8000000/128 = 62,5 кГц, т.е. меньше 200 кГц, точность нормальная
|(1<<ADIE);//Разрешение прерывания от АЦП
//ADMUX |= (1<<REFS1)|(1<<REFS0); //Внутренний источник опорного напряжения 2,56 Вольт
ADMUX |= (1<<REFS0); //Внешний источник опорного напряжения = Uпитания = 5 Вольт
ADMUX |= (1<<MUX2)|(1<<MUX0);// вход ADC5
| ADCSRA — управляющий и статусный регистр, биты: | ||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Описание и примеры |
| ADEN | ADCSRA |= (1<<ADEN); // лог. 1 разрешение использования АЦП | |||||||
| ADSC | ADCSRA |= (1<<ADSC); // лог. 1 заставляет АЦП начинать преобразование | |||||||
| ADFR | для ATMega8 и др. Используется в режиме с использованием прерываний. При установке в 1 включает круговой режим, при котором измерения автоматически следуют одно за другим. ADCSRA |= (1<<ADFR); | |||||||
| ADATE | для ATtiny13 и др. Лог 1 - по положительному фронту считает | |||||||
| ADIF | бит, также используемый только в режиме прерываний. Это флаг прерываний, который устанавливается в определённых условиях. | |||||||
| ADIE | ADCSRA |= (1<<ADIE); // бит, включающий режим прерываний. | |||||||
| ADPS2 | ADPS1 | ADPS0 | величина делителя частоты, чтобы частота работы АЦП была не больше 200 кГц, иначе точность измерений будет очень малой и мы просто растеряем самые младшие биты. | |||||
| 0 | 0 | 0 | 2 | |||||
| 0 | 0 | 1 | 2 | |||||
| 0 | 1 | 0 | 4 | |||||
| 0 | 1 | 1 | 8 | |||||
| 1 | 0 | 0 | 16 | |||||
| 1 | 0 | 1 | 32 | |||||
| 1 | 1 | 0 | 64 | |||||
| 1 | 1 | 1 | 128. ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Делитель 128, т.е. при частоте 8000000/128 = 62,5 кГц, т.е. меньше 200 кГц, точность нормальная | |||||
| ADMUX — регистр для управления каналами мультиплексора АЦП, биты: | ||||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Описание |
| REFS1 | REFS0 |
Режим использования опорного напряжения |
||||||
| 0 | 0 | откл | ||||||
| 0 | 1 | внутреннее опорное напряжение, равное напряжению питания | ||||||
| 1 | 0 | опорное напряжение подаётся на вход AREF извне | ||||||
| 1 | 1 | внутреннее 2,56 вольт с использованием внешнего конденсатора | ||||||
| ADLAR |
бит организации расположения измеренных 10 битов в двух байтах регистровой пары данных ADCH и ADCL |
|||||||
| - | ||||||||
| MUX3 | MUX2 | MUX1 | MUX0 | биты, включающие определённый канал мультиплексора: | ||||
| 0 | 0 | 0 | 0 | ADC0 | ||||
| 0 | 0 | 0 | 1 | ADC1 | ||||
| 0 | 0 | 1 | 0 | ADC2 | ||||
| 0 | 0 | 1 | 1 | ADC3 | ||||
| 0 | 1 | 0 | 0 | ADC4 | ||||
| 0 | 1 | 0 | 1 | ADC5 | ||||
| 0 | 1 | 1 | 0 | ADC6 | ||||
| 0 | 1 | 1 | 1 | ADC7 | ||||
| 1 | 1 | 1 | 0 | 1.30V(VBG) - для калибровки АЦП | ||||
| 1 | 1 | 1 | 1 | 0V (GND) - для калибровки АЦП | ||||
Регистровая пара ADCH и ADCL, состоящая из старшего и младшего байта в которую заносится измеряемый результат. А как именно он туда укладывается, этот результат, зависит от состояния бита ADLAR (регистр ADMUX). Если бит ADLAR=0, то младшие 8 бит результата находятся в младшем байте регистровой пары, а 2 старших бита — в младших битах старшего байта. Если же бит ADLAR у нас выставлен (=1), то 8 самых старших бит результата находятся в старшем байте, а 2 младших в 2 старших битах младшего байта регистровой пары.
| ADCH | ADCL | |||||||||||||||
| биты | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ADLAR=0 | - | - | - | - | - | - | ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC2 | ADC0 |
| ADLAR=1 | ||||||||||||||||
| ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 | - | - | - | - | - | - | |
. Если же бит ADLAR у нас выставлен, то 8 самых старших бит результата находятся в сатршем байте, а 2 младших в 2 старших битах младшего байта регистровой пары. Второй вариант нам интересен при исользовании 8-битного режима. В данном случае мы читаем только старший байт.