Вы находитесь на странице: 1из 43

Аналогово-цифровой преобразователь (ADC)

Отличительные особенности:

10-разрядное разрешение
Интегральная нелинейность 0.5 мл. разр.
Абсолютная погрешность ±2 мл. разр.
Время преобразования 13 - 260 мкс.
Частота преобразования до 15 тыс. преобр. в сек. при максимальном разрешении
8 мультиплексированных однополярных каналов (входов)
7 дифференциальных каналов (входов)
2 дифференциальных канала (входа) с подключаемым усилением на 10 и 200
Представление результата с левосторонним или правосторонним выравниванием в 16-разр. слове
Диапазон входного напряжения ADC 0…VCC
Выборочный внутренний ИОН (Reference Voltage) на 2.56 В
Режимы одиночного преобразования и автоматического перезапуска
Прерывание по завершении преобразования ADC
Механизм подавления шумов в режиме сна

Замечание: дифференциальные каналы не тестировались для микроконтроллеров в корпусе PDIP40. Работа в таком режиме гарантируется только для
микроконтроллеров в корпусах TQFP и QFN/MLF.

ATmega16 содержит 10-разр. ADC последовательного приближения. ADC связан с 8-канальным аналоговым мультиплексором, 8 однополярных
(недифференциальных) входов которого связаны с ножками порта A. Недифференциальные входы измеряют потенциал напряжения относительно
провода 0 В (т. е. связанного с GND).

ADC также поддерживает 16 вариантов конфигурации для дифференциальных входов. Два дифференциальных входа (ADC1, ADC0 и ADC3, ADC2)
содержат каскад со ступенчатым программируемым усилением: 0 дБ (1x), 20 дБ (10x), или 46 дБ (200x) – непосредственно перед аналого-цифровым
преобразованием. Семь дифференциальных аналоговых каналов используют общий инвертирующий вход (ADC1), а все остальные входы ADC
выполняют функцию неинвертирующих входов. Если выбрано усиление 1x или 10x, то можно ожидать 8-разр. разрешение, а если 200x, то 7-разрядное.

ADC содержит УВХ (Sample and Hold circuit, устройство выборки-хранения), которое поддерживает на постоянном уровне напряжение на входе ADC
во время преобразования. Функциональная схема ADC показана на рисунке 98.

ADC имеет отдельный вывод питания AVCC (аналоговое питание). AVCC не должен отличаться более чем на ±0.3В от VCC. См. параграф “Подавитель
шумов ADC (ADC Noise Canceler)”, где приведены рекомендации по подключению этого вывода.

В качестве внутреннего опорного напряжения может выступать напряжение от внутреннего ИОН (Reference Voltage) на 2.56В или напряжение AVCC. Для
уменьшения шума к выводу AREF может быть подключен внешний блокировочный конденсатор.
Рисунок 98. Блоковая схема ADC.

Принцип действия

ADC преобразовывает входное аналоговое напряжение в 10-разр. код методом последовательных приближений. Минимальное значение соответствует
уровню GND, а максимальное уровню AREF минус 1 мл. разр. К выводу AREF по выбору может быть подключено напряжение AVCC или внутренний ИОН
на 2.56В путем записи соответствующих значений в биты REFSn регистра ADMUX. Несмотря на то, что ИОН на 2.56В находится внутри
микроконтроллера, к его выходу может быть подключен блокировочный конденсатор для снижения чувствительности к шумам, т.к. он связан с выводом
AREF.

Канал аналогового ввода и каскад дифференциального усиления выбираются путем записи бит MUX в регистр ADMUX. В качестве однополярного
аналогового входа ADC может быть выбран один из входов ADC0…ADC7, а также GND и выход фиксированного источника напряжения (fixed bandgap
voltage reference). В режиме дифференциального ввода предусмотрена возможность выбора инвертирующих и неинвертирующих входов к
дифференциального усилителя.
Если выбран дифференциальный режим аналогового ввода, то дифференциальный усилитель будет усиливать разность напряжений между выбранной
парой входов на заданный коэффициент усиления. Усиленное таким образом значение поступает на аналоговый вход ADC. Если выбирается
однополярный режим аналогового ввода, то каскад усиления пропускается.

Работа ADC разрешается путем установки бита ADEN в регистре ADCSRA. Выбор опорного источника и канала преобразования не производят эффекта
до установки ADEN. Если ADEN = 0, то ADC не потребляет ток, поэтому, при переводе в экономичные режимы сна рекомендуется предварительно
отключить ADC.

ADC генерирует 10-разрядный результат, который помещается в пару регистров данных ADC ADCH и ADCL. По умолчанию результат преобразования
размещается в младших 10-ти разрядах 16-разр. слова (выравнивание справа), но может быть опционально размещен в старших 10-ти разрядах
(выравнивание слева) путем установки бита ADLAR в регистре ADMUX.

Практическая полезность представления результата с выравниванием слева существует, когда достаточно 8-разрядное разрешение, т.к. в этом случае
необходимо считать только регистр ADCH. В другом же случае необходимо первым считать содержимое регистра ADCL, а затем ADCH, чем
гарантируется, что оба байта являются результатом одного и того же преобразования. Как только выполнено чтение ADCL, блокируется доступ к регистрам
данных со стороны ADC. Это означает, что если считан ADCL и преобразование завершается перед чтением регистра ADCH, то ни один из регистров не
может модифицироваться и результат преобразования теряется. После чтения ADCH доступ к регистрам ADCH и ADCL со стороны ADC снова
разрешается.

ADC генерирует собственный запрос на прерывание по завершении преобразования. Если между чтением регистров ADCH и ADCL запрещен доступ к
данным для ADC, то прерывание возникнет, даже если результат преобразования будет потерян.

Запуск преобразования

Одиночное преобразование запускается путем записи лог. 1 в бит запуска преобразования ADC ADSC (регистр ADCSRA). Данный бит остается в высоком
состоянии в процессе преобразования и сбрасывается по завершении преобразования. Если в процессе преобразования переключается канал
аналогового ввода, то ADC автоматически завершит текущее преобразование прежде, чем переключит канал.

Другой вариант запуска преобразования – автоматический запуск по сигналу из различных источников. В режиме автоматического перезапуска ADC
непрерывно оцифровывает аналоговый сигнал и обновляет регистр данных ADC. Данный режим задается путем записи лог. 1 в бит ADATE регистра
ADCSRA. Можно также выбрать источник перезапуска битами ADTS регистра SFIOR (см.
описание битов ADTS для списка источников запуска). Когда происходит положительный перепад выбранного сигнала перезапуска ,
сбрасывается прескалер ADC и запускается преобразование. Это предоставляет метод запуска преобразования в фиксированные интервалы
времени. Если сигнал запуска все еще установлен, когда преобразование завершено, новое преобразование не запускается . Если
происходит положительный перепад выбранного сигнала перезапуска происходит во время преобразования , этот перепад будет
игнорирован. Внимание – флаг прерывания ADIF будет все равно установлен, даже если соответствующее прерывание запрещено или бит
глобального разрешения прерываний регистра SREG сброшен, при этом преобразование запустится без генерации прерывания. Однако
флаг прерывания ADIF должен быть очищен, чтобы запустилось новое преобразование при следующем событии прерывания .

Рисунок 99. Логика автоматического запуска ADC.


Использование флага прерывания ADC (ADIF) как источника запуска преобразования запускает новое преобразование, как только текущее
преобразование завершается. Таким образом, ADC работает в режиме автозапуска - непрерывно оцифровывает аналоговый сигнал и обновляет
регистр данных ADC. Первое преобразование инициируется путем записи лог. 1 в бит ADSC регистра ADCSRA. В данном режиме ADC выполняет
последовательные преобразования, независимо от того - сброшен флаг прерывания ADC ADIF или нет.

Если разрешен автозапуск (установлен бит ADATE регистра ADCSRA), одиночные преобразования могут запускаться путем записи лог. 1 в
бит ADSC регистра ADCSRA. Бит ADSC может использоваться для определения, происходит или нет в настоящий момент преобразование .
Бит ADSC будет читаться как 1 во время выполнения преобразования, независимо от того, как оно было запущено.

Предделитель (прескалер) и временная диаграмма преобразования

Рисунок 100. Прескалер ADC.

Если требуется максимальная разрешающая способность (10 разрядов), то тактовая частота для ADC последовательного приближения должна быть в
диапазоне 50…200 кГц. Если достаточно разрешение менее 10 разрядов, то для получения более высокой частоты преобразования тактовая частота ADC
может быть установлена свыше 200 кГц.

Модуль ADC содержит предделитель, который формирует частоты тактов ADC из любых частот ядра микроконтроллера свыше 100 кГц. Коэффициент
деления устанавливается с помощью бит ADPS в регистре ADCSRA. Предделитель начинает счет с момента включения ADC установкой бита ADEN в
регистре ADCSRA. Предделитель работает, пока бит ADEN = 1, и постоянно сброшен, когда ADEN=0.

Если инициируется преобразование не в дифференциальном режиме установкой бита ADSC в регистре ADCSRA, то преобразование начинается со
следующего нарастающего фронта тактового сигнала ADC. Особенности временной диаграммы в режиме дифференциального преобразования
представлены в разделе “Каналы дифференциального усиления”.
Нормальное преобразование требует 13 тактов синхронизации ADC. Первое преобразование после включения ADC (установка ADEN в ADCSRA) требует
25 тактов синхронизации ADC за счет необходимости инициализации аналоговой схемы.

После начала нормального преобразования на выборку-хранение затрачивается 1.5 такта синхронизации ADC, а после начала первого преобразования –
13,5 тактов. По завершении преобразования результат помещается в регистры данных ADC и устанавливается флаг ADIF. В режиме одиночного
преобразования одновременно сбрасывается бит ADSC. Программно бит ADSC может быть снова установлен и новое преобразование будет
инициировано первым нарастающим фронтом тактового сигнала ADC.

В режиме автоматического перезапуска прескалер (предделитель) сбрасывается при каждом событии запуска. В этом режиме схема выборки-хранения
требует 2 такта ADC после нарастающего фронта сигнала запуска. 3 дополнительных цикла ядра микроконтроллера используется для логики
синхронизации. В дифференциальном режиме, если используется автозапуск от любого источника, кроме «завершение преобразования ADC», каждое
преобразование требует 25 тактов ADC. Это происходит из-за того, что ADC должен быть запрещен и снова разрешен для каждого преобразования.

В режиме постоянного преобразования (Free Running) новое преобразование начинается сразу по завершении предыдущего, пока бит ADSC остается в
высоком состоянии. Времена преобразования для различных режимов преобразования представлены в таблице 81.

Рисунок 101. ВременнАя диаграмма ADC, первое преобразование (режим одиночного преобразования).

Рисунок 102. ВременнАя диаграмма ADC, одиночное преобразование.


Рисунок 103. ВременнАя диаграмма ADC, преобразование с автозапуском.
Рисунок 104. ВременнАя диаграмма ADC, непрерывное преобразование (Free Running conversion).

Таблица 81. Время преобразования ADC.

Условие выборка и хранение (в время преобразования


циклах ADC относительно в циклах ADC
начала преобразования)
Первое преобразование 13.5 25
Недифференциальное обычное 1.5 13
преобразование
Преобразование с автозапуском 2 13.5
Дифференциальное обычное 1.5/2.5 13/14
преобразование

Каналы дифференциального усиления

Если используются каналы дифференциального усиления, то необходимо принять во внимание некоторые особенности.

Дифференциальные преобразования синхронизированы внутренней тактовой частотой CKADC2, частого которого равна половине частоты синхронизации
ADC. Данная синхронизация выполняется автоматически интерфейсом ADC таким образом, чтобы выборка-хранение инициировалась определенным
фазой CKADC2. Если преобразование (все одиночные преобразования и первое преобразование в режиме автоматического перезапуска) инициировалось
пользователем, когда CKADC2 находился в низком лог. состоянии, то его длительность будет эквивалента недифференциальному преобразованию (13
тактов синхронизации ADC относительно следующего такта). Если преобразование инициируется пользователем, когда CK ADC2 равен лог. 1 , оно будет
длиться 14 тактов синхронизации ADC вследствие работы механизма синхронизации. В режиме автоматического перезапуска (Free Running mode) новое
преобразование инициируется сразу по завершении предыдущего, а т.к. в этот момент CK ADC2 равен лог. 1, то все преобразования, которые были
автоматически перезапущены (т.е. все, кроме первого), будут длиться 14 тактов синхронизации ADC.

Усилительный каскад оптимизирован под частотный диапазон до 4 кГц для любых коэффициентов усиления. Усиление сигналов более высоких частот
будет нелинейным. Поэтому, если входной сигнал содержит частотные составляющие выше частотного диапазона усилительного каскада, то необходимо
установить внешний фильтр низких частот. Обратите внимание, что частота синхронизации ADC не связана с ограничением по частотному диапазону
усилительного каскада. Например, период синхронизации ADC может быть 6 мкс, при котором частота преобразования канала равна 12 тыс. преобр. в
секунду, независимо от частотного диапазона этого канала.
Если используются каналы дифференциального усиления и преобразование запущено автоматическим запуском, то ADC должен быть выключен между
преобразованиями. При использовании автоматического запуска прескалер ADC сброшен перед запуском преобразования. Поскольку каскад усиления
зависит от стабильной тактовой частоты ADC перед преобразованием, то это преобразование будет недействительным. Путем запрещения и разрешения
ADC между каждыми преобразованиями (с помощью записи 0 и 1 соответственно в бит ADEN регистра ADCSRA) выполняются только расширенные
преобразования. Результат расширенного преобразования будет действительным. См. подробнее раздел «Предделитель (прескалер) и временная
диаграмма преобразования».

Изменение канала или выбор источника опорного напряжения

Биты MUXn и REFS1:0 в регистре ADMUX поддерживают одноступенчатую буферизацию через временный регистр. Этим гарантируется, что новые
настройки канала преобразования и опорного источника вступят в силу в безопасный момент для преобразования. Любые изменения канала и опорного
источника постоянно вступаю в силу в момент начала преобразования. Как только начинается процесс преобразования доступ к изменению канала и
опорного источника блокируется, чем гарантируется достаточность времени на преобразование для ADC. Непрерывность модификации
восстанавливается на последнем такте ADC перед завершением преобразования (при установке флага ADIF в регистре ADCSRA). Обратите внимание,
что преобразование начинается следующим нарастающим фронтом тактового сигнала ADC после записи ADSC. Таким образом, пользователю не
рекомендуется записывать новое значение канала или опорного источника в ADMUX до завершения 1-го такта синхронизации ADC после записи ADSC.

Если используется автозапуск преобразования, то нельзя определить точное время события запуска. Необходимо внимательно обновлять регистр
ADMUX, чтобы определить, какое преобразование будет соответствовать новым установкам.

Если оба бита ADATE и ADEN установлены в лог. 1, событие прерывания может произойти в любой момент. Если регистр ADMUX был изменен в этот
период, то пользователь не может сказать, произошло это преобразование на основе старых или новых установок. В этом случае ADMUX должен
модифицироваться следующими способами:

1. Когда очищены бит ADATE или ADEN.


2. Во время преобразования, минимум один цикл ADC после события срабатывания преобразования.
3. После преобразования, перед тем как флаг прерывания ADIF очищен для использования как источник события запуска.

Когда регистр ADMUX обновляется с соблюдением этих условий, то новые установки начнут работать во время следующего преобразования ADC.

Особые меры необходимо предпринять при изменении дифференциальных каналов. Как только осуществлен выбор дифференциального канала,
усилительному каскаду требуется 125 мкс для стабилизации нового значения. Следовательно, после переключения дифференциального канала в течение
первых 125 мкс не должно стартовать преобразование. Если же в этот период преобразования все-таки выполнялись, то их результат необходимо
игнорировать.

Такую же задержку на установление необходимо ввести при первом дифференциальном преобразовании после изменения источника опорного
напряжения для ADC (путем изменения бит REFS1:0 в ADMUX).

Входные каналы ADC

При переключении входного канала необходимо учесть некоторые рекомендации, которые исключат некорректность переключения.
В режиме одиночного преобразования переключение канала необходимо выполнять перед началом преобразования. Переключение канала может
произойти только в течение одного такта синхронизации ADC после записи лог. 1 в ADSC. Однако самым простым методом является ожидание
завершения преобразования перед выбором нового канала.

В режиме автоматического перезапуска (Free Running mode) канал необходимо выбирать перед началом первого преобразования. Переключение
канала происходит аналогично - в течение одного такта синхронизации ADC после записи лог. 1 в ADSC. Но самым простым методом является ожидание
завершения первого преобразования, а затем переключение канала. Поскольку следующее преобразование уже запущено автоматически, то следующий
результат будет соответствовать предыдущему каналу. Последующие преобразования отражают результат для нового выбранного канала.

При переключении на дифференциальный канал первое преобразование будет характеризоваться плохой точностью из-за переходного процесса в схеме
автоматической регулировки смещения. Следовательно, первый результат такого преобразования рекомендуется игнорировать.

Источник опорного напряжения ADC

Источник опорного напряжения (ИОН) для ADC (VREF) определяет диапазон преобразования ADC. Если в недифференциальном режиме уровень сигнала
свыше VREF, то результатом преобразования будет 0x3FF. В качестве V REF могут выступать AVCC, внутренний ИОН 2,56В или внешний ИОН, подключенный
к выв. AREF.

AVCC подключается к ADC через пассивный ключ. Внутреннее опорное напряжение 2,56В генерируется внутренним эталонным источником ( Bandgap
Reference) VBG, буферизованного внутренним усилителем. В любом случае внешний вывод AREF связан непосредственно с ADC, и поэтому можно
снизить влияние шумов на опорный источник за счет подключения конденсатора между выводом AREF и общим проводом ( GND). Напряжение VREF также
может быть измерено на выводе AREF высокоомным вольтметром. Обратите внимание, что V REF является высокоомным источником, и поэтому внешне к
нему может быть подключена только емкостная нагрузка.

Если пользователь использует внешний опорный источник, подключенный к выв. AREF, то не допускается использование другой опции опорного
источника, т. к. это приведет к шунтированию внешнего опорного напряжения. Если к выв. AREF не приложено напряжение, то пользователь может
выбрать AVCC и 2.56В качестве опорного источника. Результат первого преобразования после переключения опорного источника может
характеризоваться плохой точностью и пользователю рекомендуется его игнорировать.

Если используются дифференциальные каналы, то выбранный опорный источник должен быть меньше уровня AVCC, что показано в табл. 122.

Часть таблицы 122. Уровень опорного напряжения ADC.

Символ Параметр Режим Min Номинал Max Единицы


VREF Опорное Недифференциальный 2.0 AVCC В
напряжение Дифференциальный 2.0 AVCC - В
0.2

Подавитель шумов ADC (ADC Noise Canceler)

ADC имеет встроенный подавитель шумов, который позволяет производить преобразование в режиме сна (sleep mode), что уменьшает влияние шумов,
вызванных работой ядра ЦПУ и периферийных устройств ввода-вывода. Подавитель шумов может быть использован совместно с режимами снижения
шумов ADC (ADC Noise Reduction) и в режиме холостого хода (Idle mode). При использовании данной функции необходимо придерживаться
следующей процедуры:

1. Убедитесь, что работа ADC разрешена и он не выполняет преобразования. Должен быть выбран режим одиночного преобразования и разрешено
прерывание по завершении преобразования.
2. Запустите режим уменьшения шумов ADC (ADC Noise Reduction mode) или режим холостого хода (Idle mode). ADC запустит
преобразование, как только остановится ЦПУ.
3. Если до завершения преобразования не возникает других прерываний, то по завершении преобразования прерывание ADC разбудит ЦПУ и
программа перейдет на вектор обработки прерывания (прерывание завершения преобразования, ADC Conversion Complete). Если до завершения
преобразования другое прерывание пробуждает микроконтроллер, то это прерывание обрабатывается, а по завершении преобразования
генерируется соответствующий запрос на прерывание. ADC остается в активном режиме пока не будет выполнена очередная команда sleep.

Обратите внимание, что ADC не отключается автоматически при переводе во все другие режимы сна, кроме режима холостого хода ( Idle mode) и
режима снижения шумов ADC (ADC Noise Reduction mode). Поэтому пользователь должен предусмотреть запись лог. 0 в бит ADEN перед переводом
в такие режимы сна, во избежание чрезмерного энергопотребления. Если работа ADC была разрешена в таких режимах сна и пользователь желает
выполнить дифференциальное преобразование, то после пробуждения ADC нужно выключить, а затем включить для инициации расширенного
преобразования, чем будет гарантировано получение действительного результата.

Схема аналогового входа

Схема аналогового входа для недифференциальных каналов представлена на рисунке 105. Независимо от того, какой канал подключен к ADC,
аналоговый сигнал, подключенный к выв. ADCn, нагружается емкостью вывода и входным сопротивлением утечки. После подключения канала к ADC
входной аналоговый сигнал будет связан с конденсатором выборки-хранения через последовательный резистор, сопротивление которого эквивалентно
всей входной цепи.

ADC оптимизирован под аналоговые сигналы с выходным сопротивлением 10 кОм или меньше. Если используется такой источник сигнала, то время
выборки незначительно. Если же используется источник с более высоким входным сопротивлением, то время выборки будет определяться временем,
которое требуется для зарядки конденсатора выборки-хранения от источника аналогового сигнала. Рекомендуется использовать источники только с
малым выходным сопротивлением и медленно изменяющимися сигналами, т.к. в этом случае будет достаточно быстрым заряд конденсатора выборки-
хранения.

С каналами с дифференциальным усилением рекомендуется использовать сигналы с внутренним сопротивлением до нескольких сотен кОм.

Следует предусмотреть, чтобы в предварительных каскадах формирования аналогового сигнала ко входу ADC не вносились частоты выше f ADC/2, в
противном случае результат преобразования может быть некорректным (связано с условием Найквиста/Котельникова). Если вероятность проникновения
высоких частот существует, то рекомендуется перед ADC установить фильтр низких частот.

Рисунок 105. Схема аналогового входа


Рекомендации по снижению влияния шумов на результат преобразования

Работа цифровых узлов внутри и снаружи микроконтроллера связана с генерацией электромагнитных излучений и шумов, которые могут негативно
сказаться на точность измерения аналогового сигнала. Если точность преобразования является критическим параметром, то уровень шумов можно
снизить, придерживаясь следующих рекомендаций:

1. Выполняйте путь аналоговых сигналов как можно более коротким. Следите, чтобы аналоговые сигналы проходили над плоскостью (слоем) с
аналоговой землей (экраном) и далеко от проводников, передающих высокоскоростные цифровые сигналы.
2. Вывод AVCC необходимо связать с цифровым питанием VCC через LC-цепь в соответствии с рис. 106.
3. Используйте функцию подавления шумов ADC (ADC noise canceler) для уменьшения шумов, внесенных работой ядра ЦПУ.
4. Если какой-либо из выводов ADC используется как цифровой выход, то чрезвычайно важно не допустить переключение состояния этого выхода в
процессе преобразования.

Рисунок 106. Подключение питания к ADC

Схемы компенсации смещения


Усилительный каскад имеет встроенную схему компенсации смещения (offset cancellation circuit), которая стремится максимально приблизить к
нулю смещение дифференциального измерения. Оставшееся смещение можно измерить, если в качестве дифференциальных входов ADC выбрать один
и тот же вывод микроконтроллера. Измеренное таким образом остаточное смещение можно программно вычесть из результата преобразования.
Использование программного алгоритма коррекции смещения позволяет уменьшить смещение ниже одного мл. разр.

Определения погрешности (точности) аналогово-цифрового преобразования

n-разрядный однополярный ADC преобразовывает напряжение линейно между GND и V REF с количеством шагов 2n (мл. разрядов). Минимальный код =
0, максимальный = 2n-1. Основные погрешности преобразования являются отклонением реальной функции преобразования от идеальной. К ним
относятся:

Смещение – отклонение первого перехода (от кода 0x000 на код 0x001) по сравнению с идеальным переходом (т. е. при 0.5 мл. разр.). Идеальное
значение : 0 мл. разр.
Рисунок 107. Погрешность смещения.

Погрешность усиления. После корректировки смещения погрешность усиления представляет собой отклонение последнего перехода (с 0x3FE на 0x3FF)
от идеального перехода (т.е. отклонение при максимальном значении минус 1.5 мл. разр.). Идеальное значение: 0 мл. разр.

Рисунок 108. Погрешность усиления

Интегральная нелинейность (Integral Non-linearity, INL). После корректировки смещения и погрешности усиления INL представляет собой
максимальное отклонение реальной функции преобразования от идеальной для любого кода. Идеальное значение ИНЛ = 0 мл. разр.
Рисунок 109. Интегральная нелинейность (ИНЛ)

Дифференциальная нелинейность (DNL). Максимальное отклонение между шириной фактического кода (интервал между двумя смежными
переходами) от ширины идеального кода (1 мл. разр.). Идеальное значение: 0 мл. разр.

Рисунок 110. Дифференциальная нелинейность (DNL)

Погрешность квантования. Возникает из-за преобразования входного напряжения в конечное число кодов. Погрешность квантования - интервал
входного напряжения протяженностью 1 мл. разр. (шаг квантования по напряжению), который характеризуется одним и тем же кодом. Всегда равен ±0.5
мл. разр.
Абсолютная погрешность. Максимальное отклонение реальной (без подстройки) функции преобразования от реальной при любом коде. Является
результатом действия нескольких эффектов: смещение, погрешность усиления, дифференциальная погрешность, нелинейность и погрешность
квантования. Идеальное значение: ±0.5 мл. разр.
Результат преобразования ADC

По завершении преобразования (ADIF = 1) результат может быть считан из пары регистров результата преобразования ADC (ADCL, ADCH).

Для недифференциального преобразования:

где VIN – уровень напряжения на подключенном к ADC входе;

VREF – напряжение выбранного источника опорного напряжения (см. табл. 83 и табл. 84). Код 0x000 соответствует уровню аналоговой земли, а 0x3FF -
уровню напряжения ИОН минус 1 шаг квантования по напряжению.

При использовании дифференциального канала

Здесь VPOS напряжение на «плюсовом» дифференциальном входе, а VNEG – на «минусовом», GAIN – выбранный коэффициент усиления, V REF –
напряжение выбранного источника опорного напряжения. Результат представляется в коде двоичного дополнения, начиная с 0x200 (-512d) до 0x1FF
(+511d). Обратите внимание, что при необходимости быстро определить полярность результата достаточно опросить старший бит результата
преобразования (ADC9 в ADCH). Если данный бит равен лог. 1, то результат отрицательный, если же лог. 0, то положительный. На рисунке 111
представлена функция преобразования ADC в дифференциальном режиме.

В таблице 82 представлены результирующие выходные коды для дифференциальной пары каналов (ADCn - ADCm) с коэффициентом усиления GAIN
(Ку) и опорным напряжением VREF (VИОН).

Рисунок 111. Функция преобразования ADC при измерении дифференциального сигнала


Таблица 82. Связь между входным напряжением и выходными кодами

VADC, разница напряжений входов (VADCn - VADCm) считываемый код соответствующее десятичное значение
+ VREF / GAIN 0x1FF 511
+ (511/512) VREF / GAIN 0x1FF 511
+ (510/512) VREF / GAIN 0x1FE 510
… ... ...
+ (1/512) VREF / GAIN 0x001 1
0 0x000 0
- (1/512) VREF / GAIN 0x3FF -1
… ... ...
- (511/512) VREF / GAIN 0x201 -511
– VREF / GAIN 0x200 -512

Пример: ADMUX = 0xED (дифференциальная пара входов ADC3 - ADC2, GAIN = 10, VREF =2.56В, результат с левосторонним выравниванием), напряжение
на входе ADC3 = 300 мВ, а на входе ADC2 = 500 мВ, тогда:

ADCR = 512 * 10 * (300 - 500) / 2560 = -400 = 0x270

С учетом выбранного формата размещения результата (левосторонний) ADCL = 0x00, а ADCH = 0x9C. Если же выбран правосторонний формат
(ADLAR=0), то ADCL = 0x70, ADCH = 0x02.
Регистр управления мультиплексором ADC - ADMUX

Разряд 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение 0 0 0 0 0 0 0 0

Разряд 7:6 – REFS1:0: Биты выбора источника опорного напряжения

Данные биты определяют какое напряжение будет использоваться в качестве опорного для ADC (см. табл. 83). Если изменить значения данных бит в
процессе преобразования, то новые установки вступят в силу только по завершении текущего преобразования (т.е. когда установится бит ADIF в регистре
ADCSRA). Внутренний ИОН можно не использовать, если к выводу AREF подключен внешний опорный источник.

Таблица 83. Выбор опорного источника ADC

REFS1 REFS0 Источник опорного напряжения ADC


0 0 Внешний источник, подключенный к AREF, внутренний VREF отключен
0 1 AVCC с внешним конденсатором на выводе AREF
1 0 Зарезервировано
1 1 Внутренний источник опорного напряжения 2.56В с внешним конденсатором на выводе AREF

Разряд 5 – ADLAR: Бит управления представлением результата преобразования

Бит ADLAR влияет на представление результата преобразования в паре регистров результата преобразования ADC. Если ADLAR = 1, то результат
преобразования будет иметь левосторонний формат, в противном случае - правосторонний. Действие бита ADLAR вступает в силу сразу после
изменения, независимо от выполняющегося параллельно преобразования. Полное описание действия данного бита представлено в разделе “Регистры
данных ADC – ADCL и ADCH”.

Разряды 4:0 – MUX4:0: Биты выбора аналогового канала и коэффициента усиления

Данные биты определяют какие из имеющихся аналоговых входов подключаются к ADC. Кроме того, с их помощью можно выбрать коэффициент усиления
для дифференциальных каналов (см. табл. 84). Если значения бит изменить в процессе преобразования, то новые установки вступя т в силу только
после завершения текущего преобразования (после установки бита ADIF в регистре ADCSRA).

MUX4..0 Недифференциальный вход


00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
Таблица 84. Выбор входного канала и коэффициента усиления

Недифференциальный Неинвертирующий
MUX4..0 Инвертирующий дифференциальный вход Коэффициент усиления, GAIN (Ку)
вход дифференциальный вход
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
Дифференциальных входов и усиления нет
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 Недифференциальных ADC0 ADC0 10x
входов нет
01001 ADC1 ADC0 10x
01010(1) ADC0 ADC0 200x
(1)
01011 ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
(1)
01110 ADC2 ADC2 200x
01111(1) ADC3 ADC2 200x
10000 ADC0 ADC1 1x
10001 ADC1 ADC1 1x
10010 ADC2 ADC1 1x
10011 ADC3 ADC1 1x
10100 ADC4 ADC1 1x
10101 ADC5 ADC1 1x
10110 ADC6 ADC1 1x
10111 ADC7 ADC1 1x
11000 ADC0 ADC2 1x
11001 ADC1 ADC2 1x
11010 ADC2 ADC2 1x
11011 ADC3 ADC2 1x
11100 ADC4 ADC2 1x
11101 ADC5 ADC2 1x
11110 1.22 В (VBG) Дифференциальных входов и усиления нет
11111 0 В (GND)

Примечание: 1. Дифференциальные каналы не тестировались для микроконтроллеров в корпусе PDIP40. Работа в таком режиме гарантируется только
для микроконтроллеров в корпусах TQFP и QFN/MLF.
Регистр А управления и статуса ADC – ADCSRA

Разряд 7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение 0 0 0 0 0 0 0 0

Разряд 7 – ADEN: Разрешение работы ADC

Запись в данный бит лог. 1 разрешает работу ADC. Если в данный бит записать лог. 0, то ADC отключается, даже если он находился в процессе
преобразования.

Разряд 6 – ADSC: Запуск преобразования ADC

В режиме одиночного преобразования установка данного бита инициирует старт каждого преобразования. В режиме автоматического перезапуска
установкой этого бита инициируется только первое преобразование, а все остальные выполняются автоматически. Первое преобразование после
разрешения работы ADC, инициированное битом ADSC (или если в ADSC записали 1 одновременно с разрешением работы ADC), выполняется за 25
тактов синхронизации ADC, вместо обычных 13 тактов. Это связано с необходимостью инициализации ADC при первом преобразовании.

В процессе преобразования при опросе бита ADSC возвращается лог. 1, а по завершении преобразования – лог. 0. Запись лог. 0 в данный бит возможно,
но не оказывает никакого действия.

Разряд 5 – ADATE: Включение режима автоматического запуска ADC

Если в данный бит записать лог. 1, то ADC перейдет в режим автоматического перезапуска. В этом режиме ADC автоматически запускает преобразование
по положительному фронту выбранного запускающего сигнала. Выбор источника запуска происходит битами ADTS регистра SFIOR.

Разряд 4 – ADIF: Флаг прерывания ADC

Данный флаг устанавливается после завершения преобразования ADC и обновления регистров выходных данных (ADCH:ADCL). Если установлены биты
ADIE и I (регистр SREG), то происходит вызов обработчика прерывания по завершении преобразования. Флаг ADIF сбрасывается аппаратно при переходе
на соответствующий вектор прерывания. Альтернативно флаг ADIF сбрасывается путем записи лог. 1 в него. Обратите внимание, что при выполнении
команды "чтение-модификация-запись" с регистром ADCSRA ожидаемое прерывание может быть запрещено. Сказанное также действительно, если
используются инструкции SBI и CBI.

Разряд 3 – ADIE: Разрешение прерывания ADC

Когда этот бит установлен в лог. 1, и установлен бит I в регистре SREG, разрешается прерывание по завершении преобразования ADC.

Разряды 2:0 – ADPS2:0: Биты управления предделителем ADC


Данные биты определяют на какое значение тактовая частота ЦПУ будет отличаться от частоты входной синхронизации ADC.
Таблица 85. Управление предделителем (прескалером) ADC

ADPS2 ADPS1 ADPS0 Коэффициент деления


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

Регистры данных ADC – ADCL и ADCH

ADLAR = 0:

Разряд 15 14 13 12 11 10 9 8
- - - - - - ADC9 ADC8 ADCH
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
7 6 5 4 3 2 1 0
Чтение/запись R R R R R R R R
R R R R R R R R
Исх. значение 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

ADLAR = 1:

Разряд 15 14 13 12 11 10 9 8
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
ADC1 ADC0 - - - - - - ADCL
7 6 5 4 3 2 1 0
Чтение/запись R R R R R R R R
R R R R R R R R
Исх. значение 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

По завершении преобразования результат помещается в этих двух регистрах. При использовании дифференциального режима преобразования результат
представляется в коде двоичного дополнения.

Если выполнено чтение ADCL, то доступ к этим регистрам для ADC будет заблокирован (т.е. ADC не сможет в дальнейшем модифицировать результат
преобразования), пока не будет считан регистр ADCH.

Формат представления результата (левостороннее выравнивание или правостороннее выравнивание) зависит от состояния бита ADLAR в регистре
ADMUX. Левосторонний формат представления результата удобно использовать, если достаточно 8 разрядов. В этом случае 8-разрядный результат
хранится в регистре ADCH и, следовательно, чтение регистра ADCL можно не выполнять. При правостороннем формате необходимо сначала считать
ADCL, а затем ADCH.

ADC9:0: Результат преобразования ADC

Данные биты представляют результат преобразования. Подробнее см. раздел «Результат преобразования ADC».

Регистр специальных функций ввода-вывода SFIOR

Разряд 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10 SFIOR
Чтение/запись R/W R/W R/W R R/W R/W R/W R/W
Исх. значение 0 0 0 0 0 0 0 0

Разряды 7:5 – ADTS2:0: Биты выбора источника автоматического запуска ADC

Если ADATE в регистре ADCSRA записан в лог. 1, значения бит ADTS определяют, какой будет использоваться источник для запуска преобразования.
Если ADATE в регистре ADCSRA записан в лог. 0, значения бит ADTS никакого значения не имеют. Преобразование будет запускаться по положительному
фронту (нарастание сигнала) выбранного сигнала. Внимание – событие переключения от очищенного источника запуска к источнику запуска, который
установлен, будет генерировать положительный фронт сигнала запуска, и если бит ADEN в регистре ADCSRA установлен, то запустится преобразование.
Переключение в режим постоянного преобразования (Free Running mode, ADTS[2:0]=0) не генерирует событие запуска, даже если установлен флаг
прерывания ADC (ADC Interrupt Flag).

ADTS2 ADTS1 ADTS0 Источник запуска преобразования ADC


0 0 0 Постоянное преобразование (Free Running
mode)
0 0 1 Аналоговый компаратор
0 1 0 Внешний запрос на прерывание 0
0 1 1 Timer/Counter0 Compare Match
1 0 0 Timer/Counter0 Overflow
1 0 1 Timer/Counter1 Compare Match B
1 1 0 Timer/Counter1 Overflow
1 1 1 Timer/Counter1 Capture Event

Разряд 4 – Res: Зарезервированный бит

Этот бит зарезервирован для использования в будущем. Для обеспечения совместимости с микроконтроллерами, которые будут разработаны в будущем,
при записи в регистр SFIOR этот бит должен быть установлен в лог. 0.
Описание работы Аналого-цифрового преобразователя.
Прерывания от АЦП

ATMega16 содержит в себе 10-битовый АЦП, вход которого может быть соединён с одним из восьми выводов Port A. АЦП Mega16, как и любому другому АЦП, нужно
опорное напряжение для целей сравнения со входным ( если измеряемое равно опорному, то получаем максимальный код в двоичном виде). Опорное напряжение
подаётся на вывод ADRef или может использоваться внутренний генератор с фиксированным напряжением 2,65 В. Полученный результат можно представить в таком
виде:

АЦП включается установкой бита ADEN в регистре ADCSRA. После преобразования, 10-битный результат оказывается в 8-битных регистрах ADCL и ADCH. По
умолчанию, младший бит результата находится справа (то есть в bit 0 регистра ADCL, так называемое правое ориентирование). Но порядок следования битов на левое
ориентирование можно сменить установив бит ADLAR в регистре ADMUX. Это удобно, если требуется получить 8-битовый результат. В таком случае требуется
прочитать только регистр ADCH. В противном случае, Вы должны сначала прочитать регистр ADCL первым, а ADCH вторым, чтобы быть уверенным в том, что чтение
этих двух регистров относится к результату одного преобразования.

Одиночное преобразование может быть вызвано записью бита ADSC в регистр ADCSRA. Этот бит остаётся установленным всё время, занимаемое преобразованием.
Когда преобразование закончено, бит автоматически устанавливается в 0. Можно также начинать преобразования по событиям из разных источников. Модуль АЦП также
может работать в режиме "свободного полёта". В таком случае АЦП постоянно производит преобразование и обновляет регистры ADCH и ADCL новыми значениями.

Для выполнения преобразования модулю АЦП необходима тактовая частота. Чем выше эта частота, тем быстрее будет происходить преобразование (оно, обычно,
занимает 13 тактов, первое преобразование занимает 25 тактов). Но чем выше частота (и выше скорость преобразования), тем менее точным получается результат. Для
получения максимально точного результата, модуль АЦП должен тактироваться частотой в пределах от 50 до 200 КГц. Если необходим результат с точностью менее 10
бит, то можно использовать частоту больше 200 КГц. Модуль АЦП содержит делитель частоты, чтобы получать нужную тактовую частоту для преобразования из частоты
процессора.

Регистр ADMUX задаёт входной контакт порта A для подключения АЦП, ориентирование результата и выбор опорной частоты. Если установлен бит ADLAR, то
результат лево-ориентирован. Опорная частота от внутреннего генератора задаётся выставленными в 1 битами REFS1 и REFS0. Если оба бита сброшены, то опорная
частота берётся от контакта AREF. В случае, если REFS1=0 а REFS0=1, опорная частота берётся от AVCC с внешним конденсатором, подключенным к AREF. Выбор
контакта ввода выполняется следующим образом:
Регистр контроля и статуса АЦП ADCSRA:

Бит ADEN=1 включает модуль АЦП.


Запись единицы в ADSC запускает цикл преобразования. В режиме "свободного полёта" запись единицы запускает первое преобразование, последующие запускаются
автоматически.
ADIF - флаг прерывания АЦП. Этот бит устанавливается в 1 когда АЦП завершено преобразование и в регистрах ADCL и ADCH находятся актуальные данные. Этот
флаг устанавливается даже в том случае, если прерывания запрещены. Это необходимо для случая программного опроса АЦП. Если используются прерывания, то флаг
сбрасывается автоматически. Если используется программный опрос, то флаг может быть сброшен записью лог.1 в этот бит.
ADIE - Если в этом бите установлена единица, и прерывания разрешены глобально, то при окончании преобразования будет выполнен переход по вектору прерывания от
АЦП.
Биты ADPS2..0 задают коэффициенты предделителя частоты:
SPI-ИНТЕРФЕЙС

В состав всех AVR-входит модуль SPI-интерфейса. Он предназначен для подключения различного периферийного
оборудования (АЦП, ЦАП, микросхемы flash-памяти) в данной статье описывается программирование этого модуля а также
приведены примеры односторонней и двусторонней предачи данных между двумя микроконтроллерами.
Рис.1 блок-схема модуля интерфейса SPI
Для настройки интерфейса необходимо сконфигурировать три регистра
– SPI STATUS REGISTER (SPSR), SPI CONTROL REGISTER (SPCR), и SPI Data Register (SPDR).

SPI CONTROL REGISTER (SPCR):

Бит 7 – SPIE: SPI Interrupt Enable,


Этот бит разрешает прерывания от SPI, если будет установлен SPIF в регистре SPSR, и бит I в регистре SREG (общее
разрешение прерываний), будет вызвана продпрограмма обработки прерывание SPI_STC .
-0 прерывания запрещены
-1 – разрешение прерывания.
Бит 6 – SPE: SPI Enable
Этот бит разрешает работу SPI,
-0 в этом разряде означает запрет любых операций в SPI
-1 в этом разряде – разрешение работы.
Бит 5 – DORD: DORD: Data Order
Этот бит определяет порядок передачи данных,
-0 в этом разряде – сначала будет передаваться младший разряд
-1 в этом разряде – сначала будет передаваться старший разряд.
Бит 4 – MSTR: Master/Slave Select
Этот бит определяет режим работы модуля,
-1 в этом разряде – режим ведущего
-0 в этом разряде – режим ведомого.
Следующие 4 разряда определяют параметры тактового сигнала
Бит 3 – CPOL: Clock Polarity
Полярность сигнала синхронизации,
-1 в этом разряде – тактовый сигнал в состоянии ожидания - 1
-0 в этом разряде – тактовый сигнал в состоянии ожидания - 0
CPOL Передний фронт Задний фронт
0 Нарастающий Спадающий
1 Спадающий Нарастающий

Бит2 - CPHA: Clock Phase


Фаза сигнала синхронизации – определяет, по какому фронту будет производиться установка (выборка) - по переднему или
заднему,
-1 в этом разряде – установка (выборка) по переднему фронту
-0 в этом разряде – установка (выборка) по заднему фронту
CPHA Передний фронт Задний фронт
0 Выборка Установка
1 Установка Выборка
Биты 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0
Соместно с битом SPI2x в регистре SPSR задают скорость передачи данных

SPI2X SPR1 SPR0 Частота SCK


0 0 0 fosc /4
0 0 1 fosc /16
0 1 0 fosc /64
0 1 1 fosc /128
1 0 0 fosc /2
1 0 1 fosc /8
1 1 0 fosc /32
1 1 1 fosc /64

SPI STATUS REGISTER (SPSR).

Бит 7 – SPIF: SPI Interrupt Flag


Флаг завершения передачи - устанавливается после завершения передачи (приема) и вызывает прерывание (как у
ведущего, так и у ведомого). В вызванном прерывании можно считывать и записывать новые данные для передачи.
Сбрасывается автоматически при входе в подпрограмму обработки прерывания.
Бит6 – WCOL: Write COLlision flag
Флаг наложения записи – устанавливается при чтении либо записи данных при незавершенной передаче. Автоматически
сбрасывается чтением регистра SPSR а также при чтении (записи) в регистр данных (SPDR).
Бит0 – SPI2X: Double SPI Speed Bit
Соместно с битами SPR1 и SPR0 в регистре SPСR задает скорость передачи данных, при его установки скорость
работы SPI (частотаSCK) удвоится, если SPI находится в режиме ведущего. Это означает, что минимальный
период SCK будет равен двум периодам fosc. Если SPI работает как ведомый, то работа SPI гарантирована только на
частоте fosc /4 или менее.
SPI Data Register – SPDR

Регистр данных SPI, запись в данный регистр инициирует передачу данных. При чтении данного регистра фактически
считывается содержимое приемного буфера сдвигового регистра.

Режимы передачи данных

Комбинация бит CPHA и CPOL задает четыре возможных режима последовательной передачи данных. Форматы передачи данных
для SPI представлены в таблице 73, а их временные диаграммы показаны на рис. 77 и 78. Биты данных выводятся сдвигом и фиксируются на входе
противоположными фронтами синхросигнала SCK, тем самым гарантируя достаточное время на установление сигналов данных. Таким образом, можно
обобщить информацию из табл. 70 и 71 и представить ее в следующем виде:

Передний фронт Задний фронт Режим SPI

Установка данных падающим


CPOL = 0, CPHA = 0 Выборка нарастающим фронтом 0
фронтом

Установка данных нарастающим


CPOL = 0, CPHA = 1 Выборка падающим фронтом 1
фронтом

Установка данных нарастающим


CPOL = 1, CPHA = 0 Выборка падающим фронтом 2
фронтом

CPOL = 1, CPHA = 1 Установка данных падающим Выборка нарастающим фронтом 3


фронтом
Для нормального подключения необходимо:
Для ведущего настроить MOSI, SCL, SS на выход, MISO на вход.
Для ведомого настроить MOSI, SCL, SS на выход, MISO на выход.
При соединении одноименные выводы подключаются друг к другу

1. Примеры программ для обмена данными по SPI.


В данных примерах рассмотрен примеры одностороннего и двустороннего обмена данными .
Работа программ смоделирована в программе PROTEUS 7.5.
Таймер-счетчик является одним из самых ходовых ресурсов AVR микроконтроллера. Его основное назначение - отсчитывать заданные
временные интервалы. Кроме того, таймеры-счетчики могут выполнять ряд дополнительных функций, как то - формирование ШИМ сигналов,
подсчет длительности и количества входящих импульсов. Для этого существуют специальные режимы работы таймера -счетчика .

В зависимости от модели микроконтроллера количество таймеров и набор их функций может отличаться . Например , у микроконтроллера
Atmega16 три таймера-счетчика - два 8-ми разрядных таймера-счетчика Т0 и Т2, и один 16-ти разрядный - Т1. В этой статье, на примере
ATmega16, мы разберем как использовать таймер-счетчик Т0.

Используемые выводы
Таймер-счетчик Т0 использует два вывода микроконтроллера ATmega16. Вывод T0 (PB0) - это вход внешнего тактового сигнала. Он
может применяться, например, для подсчета импульсов. Вывод OC0 (PB3) - это выход схемы сравнения таймера-счетчика. На этом выводе с
помощью таймера может формировать меандр или ШИМ сигнал. Также он может просто менять свое состояние при срабатывании схемы
сравнения, но об этом поговорим позже.
Выводы T0 и OC0 задействуются только при соответствующих настройках таймера, в обычном состоянии это выводы общего
назначения.

Регистры таймера-счетчика Т0
Хоть это и скучно, но регистры - это то, без чего невозможно программировать микроконтроллеры, конечно, если вы не сидите плотно на
Arduino. Так вот, таймер Т0 имеет в своем составе три регистра:

- счетный регистр TCNT0,


- регистр сравнения OCR0,
- конфигурационный регистр TCCR0.

Кроме того, есть еще три регистра, относящиеся ко всем трем таймерам ATmega16:

- конфигурационный регистр TIMSK,


- статусный регистр TIFR.
- регистр специальных функций SFIOR

Начнем с самого простого.

TCNT0

Это 8-ми разрядный счетный регистр. Когда таймер работает, по каждому импульсу тактового сигнала значение TCNT0 изменяется на
единицу. В зависимости от режима работы таймера, счетный регистр может или увеличиваться, или уменьшаться .
Регистр TCNT0 можно как читать, так и записывать. Последнее используется когда требуется задать его начальное значение . Когда
таймер работает, изменять его содержимое TCNT0 не рекомендуется, так как это блокирует схему сравнения на один такт.

OCR0
Это 8-ми разрядный регистр сравнения. Его значение постоянно сравнивается со счетным регистром TCNT0, и в случае совпадения таймер
может выполнять какие-то действия - вызывать прерывание, менять состояние вывода OC0 и т.д. в зависимости от режима работы.

Значение OCR0 можно как читать, так и записывать.

TCCR0 (Timer/Counter Control Register)

Это конфигурационный регистр таймера-счетчика Т0, он определяет источник тактирования таймера, коэффициент предделителя , режим
работы таймера-счетчика Т0 и поведение вывода OC0. По сути, самый важный регистр.

Биты CS02, CS01, CS00 (Clock Select) - определяют источник тактовой частоты для таймера Т0 и задают коэффициент предделителя.
Все возможные состояния описаны в таблице ниже.
Как видите, таймер-счетчик может быть остановлен, может тактироваться от внутренней частоты и также может тактироваться от сигнала на
выводе Т0.

Биты WGM10, WGM00 (Wave Generator Mode) - определяют режим работы таймера-счетчика Т0. Всего их может быть четыре -
нормальный режим (normal), сброс таймера при совпадении (CTC), и два режима широтно-импульсной модуляции (FastPWM и Phase
Correct PWM). Все возможные значения описаны в таблице ниже.

Более подробно будем разбирать режимы в коде. Сейчас все нюансы все равно не запомнятся.

Биты COM01, COM00 (Compare Match Output Mode) - определяют поведение вывода OC0. Если хоть один из этих битов установлен в 1,
то вывод OC0 перестает функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счетчика Т 0.
Однако при этом он должен быть еще настроен как выход.
Поведение вывода OC0 зависит от режима работы таймера-счетчика Т0. В режимах normal и СTC вывод OC0 ведет себя одинаково, а вот
в режимах широтно-импульсной модуляции его поведение отличается. Не будем сейчас забивать себе голову всеми этими вариантами и
разбирать таблицы для каждого режима, оставим это на практическую часть.

И последний бит регистра TCCR0 - это бит FOC0 (Force Output Compare). Этот бит предназначен для принудительного изменения
состояния вывода OC0. Он работает только для режимов Normal и CTC. При установки бита FOC0 в единицу состояние вывода меняется
соответственно значениям битов COM01, COM00. FOC0 бит не вызывает прерывания и не сбрасывает таймер в CTC режиме.

TIMSK (Timer/Counter Interrupt Mask Register)

Общий регистр для всех трех таймеров ATmega16, он содержит флаги разрешения прерываний. Таймер Т0 может вызывать прерывания
при переполнении счетного регистра TCNT0 и при совпадении счетного регистра с регистром сравнения OCR0. Соответственно для таймера
Т0 в регистре TIMSK зарезервированы два бита - это TOIE0 и OCIE0. Остальные биты относятся к другим таймерам.
TOIE0 - 0-е значение бита запрещает прерывание по событию переполнение, 1 - разрешает.
OCIE0 - 0-е значение запрещает прерывания по событию совпадение, а 1 разрешает.

Естественно прерывания будут вызываться, только если установлен бит глобального разрешения прерываний - бит I регистра SREG.

TIFR (Timer/Counter0 Interrupt Flag Register)

Общий для всех трех таймеров-счетчиков регистр. Содержит статусные флаги, которые устанавливаются при возникновении событий . Для
таймера Т0 - это переполнение счетного регистра TCNT0 и совпадение счетного регистра с регистром сравнения OCR0.

Если в эти моменты в регистре TIMSK разрешены прерывания и установлен бит I, то микроконтроллер вызовет соответствующий
обработчик.
Флаги автоматически очищаются при запуске обработчика прерывания. Также это можно сделать программно, записав 1 в
соответствующий флаг.

TOV0 - устанавливается в 1 при переполнении счетного регистра.


OCF0 - устанавливается в 1 при совпадении счетного регистра с регистром сравнения

SFIOR (Special Function IO Register)

Начинающему про этот регистр в принципе можно и не знать, один из его разрядов сбросывает 10-ти разрядный двоичный счетчик,
который делит входную частоту для таймера Т0 и таймера Т1.

Сброс осуществляется при установке бита PSR10 (Prescaler Reset Timer/Counter1 и Timer/Counter0) в единицу.

Заключение
Нудная часть закончена. Далее разберем как настроить таймер на определенную частоту, как таймер ведет себя в разных режимах , как
генерировать ШИМ сигнал.

Оценить