Предыдущий << ADCL $04 ($24), ADCH  $05, ADCSR $06, ADMUX $07

Эти четыре регистра относятся к десятиразрядному АЦП (думаю, не надо расшифровывать, что это есть Аналого - Цифровой Преобразователь... впрочем, все равно расшифровалось) :-)

ADCL и ADCH - образуют 16-ти (реально - 10-ти) разрядный регистр, в котором вы получите собственно числовое значение напряжения на входе, определенном регистром ADMUX.  В регистре ADMUX ничего интересного, в общем-то, и нет - туда надо записать число от 0 до 7, которое и определит, с какого входа (пина) будет браться отсчет (PA0 - PA7).

Теперь надо упомянуть еще три вывода МК, имеющих отношение к АЦП. Это AGND,AVCC и  AREF

AGND и AVCC достаточно подключить к GND и VCC соответственно. С АREF немного сложнее. Напряжение на AREF - это напряжение, которое будет соответствовать максимальному отсчету (0x3FF или 1023.) и не должно превышать напряжения питания VCC.  Например, если вы подадите на AREF напряжение 3В, а на вход АЦП 1,5В - то значение отсчета АЦП будет 512

Теперь перейдем к более сложному - как это все работает. И тут лучше иметь перед глазами регистр статуса и управления ADCSR

 7  ADEN  Включение АЦП.
 6  ADSC  Старт преобразования. Сюда записать "1" и ждать "1" на ADFR
 5  ADFR  Вот с этим никогда не работал. По описанию, будучи установленным в "1", включит режим непрерывного преобразования - как только готово одно, сразу запускается следующее.
 4  ADIF  Флаг "готов отсчет". Если ADIE=1 - вызовет прерывание
 3  ADIE  Разрешение прерывания "готов отсчет". Если =0, прерывания нет
 2  ADPS2  ADPS2:1:0 Tацп

Эти три бита определяют предделитель АЦП. Для нормальной работы АЦП требует тактовой частоты в пределах 50 - 200 кГц. Следовательно, необходимо подобрать такое значение, чтобы тактовая частота МК после делителя попадала в эти пределы. Время преобразования при этом будет от 70 - 280 мкс (в режиме одиночного отсчета)

Иногда для повышения быстродействия АЦП надо уменьшать тактовую частоту МК!

0:0:0 T ck
0:0:1 T ck / 2
 1 ADPS1
0:1:0  T ck / 4
0:1:1  T ck / 8
1:0:0  T ck / 16
 0  ADPS0
1:0:1  T ck / 32
1:1:0  T ck / 64
1:1:1  T ck / 128

Ну вот, вроде и все. В заключение надо упомянуть, что расположение АЦП на одном кристалле с процессором далеко не лучшим образом действует на его (АЦП) точность. Поэтому для получения "чистых" отсчетов предусмотрен режим, когда преобразование ведется в режиме спячки процессора.

Для этого нужно всего лишь:

 - разрешить прерывание от АЦП (и предусмотреть его обработку!)
- разрешить МК входить в спячку, режим IDLE (периферия работает, процессор остановлен)
- произвести необходимую настройку АЦП (ADEN=1, мультиплексор на необходимый канал, ADFR=0)

и после этого перевести МК в спячку командой SLEEP - МК уснет, а АЦП включится. По окончании преобразования МК проснется по прерыванию АЦП. Вот и все. 

Естественно, надо иметь в виду, что какое-либо другое прерывание, будучи разрешенным, также разбудит процессор и вся чистота эксперимента будет утрачена. Поэтому при подготовке к такому режиму другие прерывания лучше запретить (но не все вместе! если дадите команду CLI,  то не сработает и прерывание АЦП, и МК заснет до  сброса). В общем, это режим для продвинутых пользователей...


гнб снипы ·· заказ и доставку цветов можно оформить ·· логистика склада

nml 11-Jul-2009