ATmega16 (32): аналого-цифровой преобразователь (ADC) Печать
Добавил(а) microsin   

Перевод даташита Atmel на микроконтроллер ATmega16, ATmega32, касающийся 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.

ATmega16-ADC-fig098.png

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

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. 

ATmega16-ADC-fig099.png

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

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

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

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

ATmega16-ADC-fig100.png

Если требуется максимальная разрешающая способность (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, первое преобразование (режим одиночного преобразования). 

ATmega16-ADC-fig101.png

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

ATmega16-ADC-fig102.png

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

ATmega16-ADC-fig103.png

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

ATmega16-ADC-fig104.png

Таблица 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 относительно следующего такта). Если преобразование инициируется пользователем, когда CKADC2 равен лог. 1 , оно будет длиться 14 тактов синхронизации ADC вследствие работы механизма синхронизации. В режиме автоматического перезапуска (Free Running mode) новое преобразование инициируется сразу по завершении предыдущего, а т.к. в этот момент CKADC2 равен лог. 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. В качестве VREF могут выступать AVCC, внутренний ИОН 2,56В или внешний ИОН, подключенный к выв. AREF.

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

Если пользователь использует внешний опорный источник, подключенный к выв. 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 не вносились частоты выше fADC/2, в противном случае результат преобразования может быть некорректным (связано с условием Найквиста/Котельникова). Если вероятность проникновения высоких частот существует, то рекомендуется перед ADC установить фильтр низких частот.

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

ATmega16-ADC-fig105.png

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

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

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

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

ATmega16-ADC-fig106.png

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

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

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

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

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

Рисунок 107. Погрешность смещения.

ATmega16-ADC-fig107.png

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

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

ATmega16-ADC-fig108.png

 

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

Рисунок 109. Интегральная нелинейность (ИНЛ) 

ATmega16-ADC-fig109.png

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

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

ATmega16-ADC-fig110.png

Погрешность квантования. Возникает из-за преобразования входного напряжения в конечное число кодов. Погрешность квантования - интервал входного напряжения протяженностью 1 мл. разр. (шаг квантования по напряжению), который характеризуется одним и тем же кодом. Всегда равен ±0.5 мл. разр.

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

[Результат преобразования ADC]

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

ATmega16-ADC-formula1-nodif.png

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

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

ATmega16-ADC-formula2-dif.png

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

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

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

ATmega16-ADC-fig111.png

Таблица 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]

Интерфейс работы с ADC микроконтроллеров ATmega16 (ATmega32) чрезвычайно прост - нужно знать только 5 регистров - ADMUX, ADCSRA, ADCL, ADCH, SFIOR.

Разряд 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).

Таблица 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
01011(1) ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
01110(1) 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.

Разряд 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

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 и от состояния битов MUXn в регистре ADMUX. Левосторонний формат представления результата удобно использовать, если достаточно 8 разрядов. В этом случае 8-разрядный результат хранится в регистре ADCH и, следовательно, чтение регистра ADCL можно не выполнять. При правостороннем формате необходимо сначала считать ADCL, а затем ADCH.

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

Разряд 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.

[Устранение проблем, FAQ]

Q001. Мне нужно, чтобы ADC выполнял преобразование максимально быстро. Почему когда я устанавливаю маленькое значение делителя битами ADPS2..0 (ADPS2:ADPS0=000 или ADPS2:ADPS0=001), то ADC у меня не работает?
A001. ADC имеет минимально допустимое время преобразования, поэтому если у Вас рабочая частота ядра CPU слишком большая (16 МГц и выше), то при маленьких коэффициентах деления прескалера тактовая частота для ADC может оказаться слишком высокой. Поэтому просто подберите минимальное значение делителя, при котором ADC начинает работать. Например, у меня с ATmega32A рабочее значение делителя оказалось не меньше 4 (ADPS2:ADPS0=010).

[Ссылки]

1. Содержимое этой статьи в формате doc.
2. Автомат управления освещением ledlight - рабочий проект AVR Studio как пример работы с ADC.
3. AVR-USB-MEGA16: замена GC7137AD (ICL7137) на ATmega32 и OP291.