|
Предыдущий
<< 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,
то не сработает и прерывание АЦП, и МК
заснет до сброса). В общем, это
режим для продвинутых пользователей...
|