Оглавление
Модуль АЦП микроконтроллеров XMEGA™ - это высокопроизводительный аналого-цифровой преобразователь, способный выполнить до 2 миллионов выборок в секунду и имеющий разрешение 12 бит. Широкий диапазон настроек мультиплексора, интегрированный усилитель и четыре виртуальных канала делают этот модуль гибким и пригодным для широкого спектра применений, таких как сбор данных, самоконтроль и обработка сигналов.
В этой статье приводится описание основных функциональных возможностей АЦП XMEGA с примерами кода, позволяющими быстро начать работать с этим модулем. К статье так же приложен драйвер модуля АЦП, написанный на языке C.
Расширенное использование модуля АЦП, такое как совместное использование с контроллером прямого доступа к памяти (DMA) и системой событий XMEGA, выходит за рамки этого документа. Для получения информации по этим вопросам обратитесь к спецификации микроконтроллера и соответствующим статьям по применению.

Рисунок 1-1. Структура АЦП
Этот раздел содержит обзор функциональных возможностей и основных конфигурационных параметров АЦП. В разделе 3 рассмотрены базовые настройки и использование модуля АЦП на уровне регистров.
Модуль АЦП имеет 12-ступенчатую конвейерную архитектуру, позволяющую осуществлять выборку нескольких сигналов одновременно. Он снабжён четырьмя мультиплексорами, которые позволяют выбрать источник сигнала и имеют индивидуальные настройки. Индивидуальные настройки каждого из четырёх мультиплексоров позволяют рассматривать их как отдельные виртуальные каналы, имеющие одинаковый набор результирующих регистров и разделяющие между собой один блок преобразования АЦП. Это показано на рисунке 1-1.
Сигналы с выходов мультиплексоров захватываются один раз каждые четыре такта тактового сигнала модуля АЦП. Каждый захваченный сигнал проходит через весь конвейер (12 стадий), где на каждой стадии преобразуется один бит. Таким образом, АЦП способен осуществлять выборку одного сигнала каждые четыре такта тактового сигнала модуля АЦП даже несмотря на то, что каждый сигнал должен пройти все ступени конвейера до того, как результат преобразования будет помещен в регистр результата. Время преобразования конвейером АЦП одного сигнала при разрешении 12 бит составляет 7 тактов, а при разрешении 8 бит - 5 тактов. Если используется усилитель, время преобразования увеличивается на один такт. При полной загрузке АЦП способен формировать один результат каждый такт тактового сигнала АЦП. Отношение между частотой тактового сигнала периферийных модулей XMEGA и частотой тактового сигнала модуля АЦП описано в разделе 2.8.
На рисунке 2-1 показан упрощённый 4-ступенчатый конвейер, преобразующий два входных сигнала. На рисунке показано, что как только сигнал был захвачен конвейером, началась первая ступень преобразования, на которой обрабатывается самый старший бит первого сигнала. На второй ступени преобразования обрабатывается следующий бит первого сигнала, и одновременно с этим осуществляется первый этап конвертирования самого старшего бита второго сигнала.

Рисунок 2-1. Упрощенный конвейерный АЦП, преобразующий два сигнала
Стоит отметить, что таким же образом можно неоднократно преобразовывать сигналы, захваченные одним и тем же каналом. Конвейер может захватить и преобразовать сигнал из одного и того же канала даже в том случае, если он уже обрабатывает ранее захваченный на этом канале сигнал.
Каждый из четырёх виртуальных каналов имеет регистр управления мультиплексором (CHnMUXCTRL), регистр управления каналом (CHnCTRL) и пару регистров результата преобразования (CHnRESL/ChnRESH). Кроме этих регистров существует несколько управляющих битов, которые расположены в регистрах общего назначения.
АЦП имеет в своём составе усилитель, который можно настроить на усиление напряжения с целью измерения маленьких напряжений в дифференциальном режиме.
Этот каскад является разделяемым и может быть использован всеми каналами. Если канал настроен на использование усилителя, усиление происходит между мультиплексором и блоком преобразования АЦП. Доступны следующие коэффициенты усиления: 1x, 2x, 4x, 8x, 16x, 32x и 64x. Для микроконтроллеров Atmel® AVR® XMEGA® серии D так же доступен коэффициент 1/2 (деление на два). Коэффициент усиления настраивается битовым полем GAINFACT регистра управления каналом (CHnCTRL). Это позволяет настроить степень усиления напряжения индивидуально для каждого виртуального канала.
Для микроконтроллеров XMEGA семейства A использование каскада усиления увеличивает время распространения сигнала через АЦП на один такт. Для микроконтроллеров XMEGA подсемейства D дополнительная задержка зависит от настроенного коэффициента усиления:
При установке коэффициента усиления равным 1x усиление сигнала не происходит, но это может быть использовано для формирования такой же задержки распространения сигнала, как и для канала, использующего каскад усиления. Вместе с тем, чтобы свести к минимуму время обработки аналогового сигнала рекомендуется настроить канал АЦП вообще без усиления, если, конечно, Вам не требуется одинаковая задержка распространения сигнала через все каналы безотносительно к тому, включен ли на одном из каналов каскад усиления или нет.
Блок преобразования может работать в беззнаковом или знаковом режиме преобразования.
Знаковый режим может быть использован в качестве входного режима как для дифференциальных, так и для несимметричных входов. Беззнаковый режим доступен только для несимметричных и внутренних входов.
В беззнаковом режиме диапазон преобразований начинается от земли и заканчивается значением опорного напряжения. Чтобы иметь возможность определять переход через ноль, вычитается ΔV. ΔV приблизительно равна 0,05 * Vref, поэтому уровень земли будет соответствовать примерно 0,05 от общего диапазона значений (0,05 * 4095 с разрешением 12-бит). Это также ограничивает максимальное входное напряжение, которое становится меньше на 0,05 * Vref, то есть максимальное входное напряжение будет Vref - ΔV. Это проиллюстрировано на рисунке 2-2.

Рисунок 2-2. Беззнаковый и знаковый режимы преобразования
Из рисунка становится ясно, что беззнаковый режим дает более высокое разрешение для положительных значений, чем знаковый режим, но в этом режиме не могут быть преобразованы отрицательные значения. В знаковом режиме могут быть преобразованы и отрицательные значения, но за счет более низкого разрешения.
Когда АЦП использует дифференциальные входы, должен использоваться знаковый режим. С входами других типов можно использовать оба режима, как знаковый, так и беззнаковый.
Обратите внимание на то, что режим преобразования устанавливается на весь АЦП, а не индивидуально для каждого канала. Это означает, что даже если только один из каналов использует дифференциальный вход, АЦП должен быть введен в знаковый режим.
Режим преобразования устанавливается с помощью бита CONVMODE управляющего регистра CTRLB.
Стоит заметить, что несмотря на то, что разность уровней между двумя входами может быть отрицательной, напряжение на любой из линий ввода/вывода ни при каких обстоятельствах не должно быть ниже уровня GND или выше уровня VCC.
Мультиплексоры используются для выбора источников входного сигнала для виртуальных каналов. Есть четыре различных варианта конфигурации, которые могут быть выбраны с помощью битового поля INPUTMODE регистра управления каналом (CHnCTRL):
Положительные и отрицательные входы выбираются с помощью битовых полей MUXPOS и MUXNEG регистра управления мультиплексором канала (MUXCTRL). При измерении сигналов на внутренних входах для выбора положительного входа применяется альтернативное имя битового поля, определённое в заголовочном файле как MUXINT.
В микроконтроллерах с двумя модулями АЦП в качестве входных линий могут быть использованы только линии соответствующего порта. Это означает, что АЦП A может быть подключен только к порту A, а АЦП B может быть подключен только к порту B. Положительный вход может быть подключен к любой из восьми входных линий соответствующего порта. Если используется дифференциальный вход без усиления, отрицательный вход может быть подключен к одной из первых четырех входных линий (PIN0 - PIN3) соответствующего порта, если же задействован каскад усиления, для отрицательного входа следует использовать линию из второй четверки входных линий (PIN4 - PIN7) соответствующего порта.
В устройствах с одним АЦП и несколькими аналоговыми портами положительный вход может быть подключен к любой доступной входной линии порта A или порта В. Если используется дифференциальный вход без усиления, отрицательный вход может быть подключен к одной из первых четырёх входных линий (PIN0 - PIN3) соответствующего порта, если же задействован каскад усиления, для отрицательного входа следует использовать линию из второй четвёрки входных линий (PIN4 - PIN7) соответствующего порта.
Узнать количество модулей АЦП и аналоговых портов можно из документации на микроконтроллер.
Стоит заметить, что несмотря на то, что разность уровней между двумя входами может быть отрицательной, напряжение на любой из линий ввода/вывода ни при каких обстоятельствах не должно быть ниже уровня GND или выше уровня VCC.
Обратите внимание на то, что конденсатор в цепи выборки разряжается после каждой выборками для входов во всех режимах, кроме дифференциального режима с усилением. В дифференциальном режиме с усилением заряд на конденсаторе между выборками сохраняется, и это может быть использовано для получения более высокой частоты дискретизации для медленно изменяющихся сигналов. Это может быть использовано для получения более высокой частоты дискретизации (в сравнении с каналами в несимметричном или дифференциальном режиме без усиления) для источников сигнала с высоким сопротивлением.
В такой конфигурации входа компаратор измеряет разницу между двумя входными сигналами. В дифференциальном режиме без усиления в качестве положительного входа АЦП может быть использован любой из входов АЦП, а вот в качестве отрицательного входа могут использоваться только последние 4 линии порта. При использовании дифференциального режима можно довольно легко измерить смещение относительно нуля, если настроить в качестве положительного и отрицательного входов одну и ту же линию ввода/вывода. При этом будет измерено смещение, так как модулю АЦП не нужно знать уровень земли.
Одним из распространённых заблуждений является то, что АЦП способен измерять отрицательные уровни напряжения. Дело в том, что АЦП не может измерять уровни напряжения ниже уровня земли и выше уровня опорного напряжения. Это фактически означает, что получаемые отрицательные результаты измерений свидетельствуют о том, что напряжение на отрицательном входе АЦП больше, чем на положительном.

Рисунок 2-3. Дифференциальный вход без усиления
В этом режиме вход ведёт себя практически так же, как и дифференциальный вход без усиления. Основное отличие заключается в активизации каскада усиления, который усиливает сигнал, проходящий через этот канал с коэффициентом усиления до 64. При использовании каскада усиления задержка распространения сигнала через блок АЦП увеличивается на 1 такт модуля АЦП.

Рисунок 2-4. Дифференциальный вход с усилением
Стоит отметить, что каскад усиления не нагружает вход и источник внешнего сигнала, так как сопротивление входа каналов с активированным каскадом усиления очень высоко. Это полезно для измерения сигнала от слабых источников. Более подробные сведения можно найти в спецификации устройства.
Уровень напряжения на любом из двух входов может быть в диапазоне между GND и Vref, но разность между ними не должна превышать Vref/GAIN, иначе это приведет к насыщению АЦП, а результатом преобразования будет значение, равное верхнему значению АЦП.
В такой конфигурации входа АЦП измеряет значение одного входного сигнала. Разница между этим режимом и дифференциальным режимом входа заключается в том, что отрицательный вход всегда внутренне связан с определенным уровнем напряжения, который зависит от того, в каком режиме измерений работает АЦП - знаковом или беззнаковом. В знаковом режиме отрицательный вход привязан к земле, в то время как в беззнаковом режиме он связан с Vref/2 - ΔV.

Рисунок 2-5. Несимметричный вход в знаковом режиме измерений
ΔV это фиксированное внутренне генерируемое напряжение, равное приблизительно 0,05*Vref. Это смещение можно измерить путем подключения положительного входа к земле (GND). Как правило, смещение соответствует значению около 200.
Преимуществом применения напряжения смещения (ΔV) является то, что можно измерить отрицательное смещение напряжения в блоке АЦП, так как ΔV будет больше, чем любое другое смещение. ΔV позволяет приложениям, использующим АЦП XMEGA, вычислить и компенсировать ошибки, связанные со смещением напряжения в блоке АЦП (если это необходимо). Недостатком же является то, что некоторые значения из верхнего диапазона выпадают, так как любое измеренное значение напряжения выше Vref-ΔV насытит АЦП, а результатом измерения будет верхнее значение АЦП.
В беззнаковом режиме помимо автоматического подключения отрицательного входа АЦП к земле автоматически увеличивается точность измерений. Диапазон значений результата составляет от 0 до 4096, в то время как для знакового режима диапазон результатов от -2048 до 2047.

Рисунок 2-6. Несимметричный вход в беззнаковом режиме измерений
В такой конфигурации мультиплексора блоком АЦП измеряется один из нескольких внутренних сигналов. Отрицательный вход всегда связан с GND, в то время как положительный вход может быть подключен к одному из следующих внутренних источников: датчик температуры, внутренний выход ЦАП, VCC/10 (для измерения напряжения питания) или прецизионный ИОН. Разные каналы могут быть подключены к разным внутренним источникам напряжения.
Внутренний вход ЦАП может быть использован для калибровки ЦАП. Получить дополнительную информацию о настройке ЦАП Вы можете из статьи по применению «AVR1301: Использование ЦАП микроконтроллеров XMEGA».
Напряжение прецизионного ИОН может быть использовано в качестве опорного при определении значения внешнего опорного напряжения, если это напряжение неизвестно. При измерении известного напряжения (напряжение прецизионного источника опорного напряжения равно 1,1 В) с использованием неизвестного опорного напряжения фактическое значение внешнего опорного напряжения легко вычислить.

Рисунок 2-7. Внутренний вход в знаковом режиме

Рисунок 2-8. Внутренний вход в беззнаковом режиме
Стоит заметить, что нет других модулей, способных использовать прецизионный ИОН. Его следует включать с помощью бита BANDGAP регистра управления опорным напряжением (REFCTRL).
То же самое касается датчика температуры, который не может использоваться никаким другим модулем. Опорное напряжение с датчика температуры включается установкой бита TEMPREF. Следует помнить, что на стабилизацию опорного напряжения прецизионного ИОН и датчика температуры требуется определенное время, поэтому активировать эти источники следует заблаговременно, до начала любых преобразований.
Обратите внимание на то, что максимальная скорость выборки для внутренних входов может быть ниже, чем максимальная скорость преобразования модуля АЦП (например, 125 кбит/с против 2 мбит/с). Для получения дополнительной информации обратитесь к документации на микроконтроллер.
Зависимость напряжения от температуры встроенного датчика температуры носит линейный характер. В идеале, измеренное значение при 0°К будет равно «0» . Прямая линейной аппроксимации может быть построена через две точки, одна из которых соответствует значению при 0 °К, а вторая, это измеренное при изготовлении микроконтроллера значение. Это измеренное при изготовлении микроконтроллера значение хранится в массиве технологических значений и соответствует измерению, сделанному при 85 °C (358 °К) с погрешностью ±5 °C. Погрешность приводит к некоторому смещению результата при измерении температуры.
Сохранённый в массиве технологических значений результат измерения получен в беззнаковом режиме работы АЦП с разрешением 12-бит и внутренним источником опорного напряжения 1 В. Если это значение планируется использовать в приложении, параметры настройки АЦП должны быть такими же. Сохранённое значение может быть использовано для 2-точечной калибровки, где второй точкой будет температура 0 °К (при этом результат АЦП равен 0).
Лучший способ получить точный результат - это сделать 2-точечную калибровку, чтобы вычислить коэффициент кривой. Для 2-точечной калибровки необходимо выбрать две температуры, при которых Вы сможете сделать измерения, и при этом температура будет известная и точная. Сделать замер при обеих температурах с требуемыми настройками АЦП (режим, частота дискретизации, разрешение). Если Вы получили эти значения, можно вычислить коэффициент кривой, который Вы можете в дальнейшем использовать в своих приложениях. Приведенная ниже формула может быть использована для расчёта изменения температуры на один бит результата:

В знаковом режиме результат преобразования АЦП равен:

VINP это напряжение на положительном входе, а VINN напряжение на отрицательном входе АЦП. GAIN - это используемый коэффициент усиления. Если каскад усиления не используется, значение GAIN равно 1. TOP - это максимальное значение результата, определяемое установленным разрешением АЦП. Для разрешения 12 бит это значение равно 2048, для разрешения 8 бит - 128.
В знаковом режиме результат представлен в виде знакового числа, представленного в дополнительном коде (дополнение до двух), где самый старший бит определяет знак числа. Для непосредственного получения 16-разрядного числа при разрешении АЦП 12 бит знаковый бит (бит 11) также отражается на биты 12-15. При разрешении 8 бит знаковый бит (бит 7) отражается (заполняет) на весь старший байт.
При разрешении 12 бит при измерении напряжения от -VREF до +VREF результат преобразования будет от -2048 до +2047 (0xF800 - 0x07FF).
В беззнаковом режиме результат преобразования АЦП равен:

VINP это напряжение на несимметричном входе АЦП. GAIN - это используемый коэффициент усиления. Если каскад усиления не используется, значение GAIN равно 1. TOP - это максимальное значение результата, определяемое установленным разрешением АЦП. Для разрешения 12 бит это значение равно 4096, для разрешения 8 бит - 256.
Положительное смещение определяется значением ΔV. Как правило, оно равно 0,05 * VREF. Напряжение смещения можно измерить, соединив входной контакт с землей. Обычно результатом измерения этого напряжения является значение около 200. Для того чтобы измерить это смещение более точно, следует настроить модуль АЦП на тот режим, в котором он будет в дальнейшем работать (опорное напряжение, скорость и другие параметры) и подключить внешний входной контакт к земле.
Это смещение не компенсируется автоматически. Программное обеспечение должно вычитать измеренное смещение из результатов преобразования.
При разрешении 12 бит при измерении напряжения в диапазоне от GND до VREF - ΔV результат преобразования будет от ≈200 до +4095 (0x00C8 - 0x0FFF).
АЦП может быть настроен на формирование результатов измерений в следующих форматах:
Обратите внимание на то, что при более низком разрешении преобразование занимает меньше времени, так как сигнал проходит меньшее количество ступеней конвейера. Поэтому, выбирая формат результата преобразования следует искать компромисс между разрешением и скоростью преобразования.
Разрешение АЦП настраивается с помощью битового поля RESOLUTION управляющего регистра B (CTRLB).
Результат преобразования сохраняется в регистре результата каждого канала. Для индикации завершения преобразования каждый канал имеет флаг. Если результат не будет прочитан до завершения следующего преобразования, он будет утерян.
Контроллер DMA может быть настроен на копирование результата из регистра результата в SRAM по завершению преобразования. Это можно настроить для всех каналов по завершению развёртки, что позволит сохранять результаты преобразования всех четырёх каналов за одну транзакцию.
Приложение может выбрать один из следующих источников опорного напряжения (VREF):
Внутренний источник опорного напряжения INT1V имеет напряжение 1,00 В, которое формируется из напряжения прецизионного ИОН. Напряжение прецизионного ИОН составляет 1,10 В, а напряжение внутреннего источника INT1V определяется как 10/11 от напряжения ИОН, что и даёт значение опорного напряжения 1,00 В. Точность источника INT1V зависит от точности ИОН. Точность ИОН приведена в документации на микроконтроллер.
Напряжение источника опорного напряжения INTVCC определяется как напряжение питания микроконтроллера VCC, поделённое на 1,6. Точность источника INTVCC зависит от точности и стабильности напряжения питания аналоговой части микроконтроллера (AVCC). Если контакты AVCC подключены к питанию цифровой части (VCC), требуется фильтрация питания аналоговой части.
Обратите внимание на то, что внешние контакты для подключения источников опорного напряжения (AREFA и AREFB) используются модулями АЦП и ЦАП совместно. Выбор источника опорного напряжения осуществляется с помощью битового поля REFSEL регистра REFCTRL. Внешний источник опорного напряжения подключается к линиям 0 (AREFA и AREFB) соответствующих аналоговых портов (PORTA и PORTB) .
Заметим, что напряжение внешнего источника опорного напряжения не должно превышать VСС - 0,6 В и не должно быть менее 1 В. Точность внешнего источника опорного напряжения зависит от его схемы, которая должна быть спроектирована в соответствии с требованиями к точности измерений модуля АЦП.
В качестве тактового сигнала модуля АЦП служит периферийный тактовый сигнал, пропущенный через предварительный делитель. Предварительный делитель может быть настроен на следующие множители: 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256 и 1/512. Чтобы гарантировать правильную работу модуля АЦП, частоту тактового сигнала модуля следует выбирать с учетом минимальной и максимальной рекомендуемой скорости для модуля АЦП. Частота тактового сигнала модуля АЦП настраивается с помощью регистра PRESCALER.
Значения рекомендуемой минимальной и максимальной частоты тактового сигнала модуля АЦП можно уточнить в документации на микроконтроллер.
Следует отметить, что высокая частота тактового сигнала модуля АЦП сокращает время преобразования каждой выборки, но это не значит, что Вы не сможете захватывать сигнал на гораздо более низкой скорости. Например, приложение может захватывать сигнал со скоростью 10 кГц даже в том случае, когда частота тактового сигнала модуля АЦП составляет 2 МГц. При этом частота захвата не может быть выше, чем четверть частоты системного тактового сигнала, так как частота тактового сигнала модуля АЦП не может превышать 1/4 частоты периферийного тактового сигнала. Для микроконтроллеров XMEGA A максимальная частота тактового сигнала модуля АЦП не должна превышать 2 МГц. Для микроконтроллеров XMEGA D это значение составляет 1,4 МГц. Минимальная частота тактового сигнала модуля АЦП для обоих семейств микроконтроллеров составляет 100 КГц. Для получения дополнительной информации обратитесь к документации на микроконтроллер.
Обратите внимание то, что при захвате сигналов от внутренних источников частота тактового сигнала модуля АЦП должна быть равна 125 кГц.
Скорость преобразования должна выбираться исходя из сопротивления источника сигнала. Если частота дискретизации слишком высока по сравнению с той, что рекомендуется для источника с таким сопротивлением, результаты преобразований будут неточными. Важно, чтобы скорость захвата была такой, чтобы уровень напряжения в цепи выборки успевал стать таким же, как уровень захватываемого сигнала. Максимальная частота дискретизации определяется по формуле:

Значения Csample, Rchannel и Rswitch следует брать из документации на микроконтроллер. N - это разрядность результата преобразования, которая может быть 8 или 12 бит. Rsource - это сопротивление аналогового источника сигнала, которое может быть рассчитано исходя из его схемы или, если это встроенный датчик, найдено в документации на микроконтроллер.
Чтобы показать на примере, как влияет сопротивление источника сигнала на частоту дискретизации, мы возьмём наихудший случай для значений Rchannel, Rsource и Csample. Это 5 кОм для значений Rchannel и Rsource, и 4,4 пФ для Csample. Взаимосвязь между сопротивлением источника сигнала и максимальной частотой дискретизации показана на рисунке 2-9.

Рисунок 2-9. Взаимосвязь между сопротивлением источника сигнала и максимальной частотой дискретизации
Вместо того, чтобы запускать преобразование вручную (путём установки одного или нескольких бит CHnSTART регистра CTRLA) или по событию, АЦП можно настроить на работу в автономном режиме. Это означает, что сигналы с одного или нескольких каналов будут захватываться и преобразовываться в цикле до тех пор, пока активен этот режим.
Выбрать, какие каналы должны работать в автономном режиме, можно с помощью битового поля SWEEP регистра EVCTRL. Вы можете выбрать один из следующих вариантов: только канал 0, каналы 0 и 1, каналы от 0 до 2, или все четыре канала.
Обратите внимание на то, что те же самые биты используются для выбора каналов, включенных в развертку преобразований, инициируемую по событию. Но обсуждение этого вопроса выходит за рамки данного документа.
При работе канала в автономном режиме следует избегать изменения любых настроек, связанных с мультиплексором, так как это приводит к получению некорректных результатов преобразования.
Модуль АЦП можно настроить таким образом, чтобы он генерировал запрос на прерывание при завершении преобразования сигнала. Такой подход позволяет избежать постоянного опроса регистров с целью определения завершения преобразования. Этот механизм может быть использован для обработки результатов преобразований с использованием обработчика прерывания, при этом процессор способен большую часть времени выполнять другие задачи.
Для получения более подробной информации о прерываниях и их обработке обратитесь к статье «AVR1305: Использование прерываний и программируемого многоуровнего контроллера прерываний микроконтроллеров XMEGA».
Вместо того чтобы просто преобразовывать входное напряжение, модуль АЦП может быть сконфигурирован на сравнение результата с определенным значением и генерировать запрос на прерывание или событие только в том случае, если результат преобразования выше или ниже этого значения. Прерывания по совпадению (выше/ниже) могут быть настроены индивидуально для каждого канала, но регистр сравнения один на все четыре виртуальных канала.
Типичный пример использования этой функции - разрешить одному или нескольким каналам АЦП работать в автономном режиме и настроить модуль АЦП на генерацию запроса на прерывание в том случае, когда один из входных сигналов достигнет определенного порога.
Модули АЦП калибруются при производстве микроконтроллера. Калибровочное значение хранится в массиве технологических сигнатур устройства. Калибровочное значение компенсирует разброс параметров отдельных ступеней конвейера АЦП и улучшает линейность АЦП.
Калибровочное значение не загружается автоматически. Для улучшения характеристик АЦП это значение требуется загрузить из массива технологических сигнатур (ADCxCAL0/1) и записать в соответствующий калибровочный регистр АЦП (CALL/CALH) до включения модуля АЦП.
На рисунке 2-10 показана блок-схема процедуры загрузки сохраненного калибровочного значения.

Рисунок 2-10. Блок-схема процедуры загрузки калибровочного значения
Калибровочное значение подбирается на фабрике при производстве микроконтроллера для получения точности преобразований, заявленной в документации. Этот механизм не предназначен для пользовательской калибровки модуля.
Статья по применению «AVR120: Характеристики и калибровка модуля АЦП» содержит дополнительную информацию о характеристиках АЦП и методах компенсации ошибок усиления и смещения.
Ошибка смещения определяется как отклонение фактической передаточной функции модуля АЦП от идеальной прямой при нулевом входном напряжении.
Если при входном значении ½ LSB переход выходного значения из 0 в 1 не происходит, то можно говорить о наличии ошибки смещения. Если при входном напряжении менее ½ LSB выходное значение больше нуля, мы имеем положительную ошибку смещения. Если первый переход выходного значения происходит при входном напряжении более ½ LSB, мы имеем отрицательную ошибку смещения. Другими словами, если фактическая передаточная функция лежит ниже идеальной прямой, присутствует отрицательное смещение, и наоборот. Отрицательные и положительные ошибки смещения показаны на рисунке 2-11.

Рисунок 2-11. Примеры положительной (A) и отрицательной (B) ошибок смещения
Так как при использовании каналов в несимметричном режиме результатом преобразования может быть только положительное значение, процедуры определения смещения для несимметричных и дифференциальных каналов различны.
Для измерения ошибки смещения следует повышать входное напряжение от GND до тех пор, пока не произойдет первое изменение значения результата. Далее следует вычислить разницу между входным напряжением, при котором идеальный АЦП должен совершить этот переход и входным напряжением, присутствующим на входе реального АЦП. Эта разность, приведенная к LSB, и равна ошибке смещения.
На рисунке 2-12A первый переход происходит при 1 LSB. Результат переходит из значения 2 в 3, что соответствует входному напряжению 2½ LSB для идеального АЦП. Разница составляет +1½ LSB, это значение и является ошибкой смещения. Двухконечная стрелка на рисунке показывает эту разность.
Тоже самое можно проделать и для рисунка 2-12B. Первый переход происходит при 2 LSB. Результат переходит из значения 0 в 1, что соответствует входному напряжению ½ LSB для идеального АЦП. Разница составляет -1½ LSB, это значение и является ошибкой смещения.

Рисунок 2-12. Положительная и отрицательная ошибки смещения в несимметричном режиме
Чтобы компенсировать ошибку смещения при использовании каналов в несимметричном режиме нужно вычитать значение ошибки смещения из каждого измеренного значения. Помните, что ошибка смещения ограничивает доступный диапазон измеряемых модулем АЦП напряжений. Большое значение положительной ошибки смещения является причиной насыщения выходного значения до того, как входное напряжение достигает максимально допустимого. Большое значение отрицательной ошибки смещения дает выходное значение 0 для небольших (а не только для нулевого) значений входного напряжения.
Измерение смещения для дифференциальных каналов можно выполнить гораздо легче, так как для этого не требуется никаких внешних входных напряжений. Нужно оба дифференциальных входа подключить к одному внутреннему источнику напряжения, а значение результата измерения и будет ошибкой смещения. Данный метод дает погрешность от ½ до 1 LSB (в худшем случае), так как используя его невозможно получить точную информацию о том, при каком уровне напряжения происходит первый переход.
Чтобы при использовании дифференциальных каналов компенсировать ошибку смещения, следует вычитать ошибку смещения из каждого результата преобразования.
В знаковом режиме с помощью двух каналов можно легко компенсировать погрешность смещения в результате колебаний температуры, напряжения питания или дрейфа опорного напряжения. Для этого подключите положительный вход канала 0 к контакту 0, а отрицательный к контакту 1. Для канала 1 сделайте наоборот, то есть подключите положительный вход к контакту 1, а отрицательный к контакту 0. Канал 0 должен вернуть вам положительное значение, а канал 1 отрицательное. Для получения компенсированного результата измерения в режиме реального времени Вам необходимо воспользоваться этой формулой: (CH0 + CH1 - 1) / 2. Номера контактов даны для примера.
Ошибка усиления определяется как отклонение середины последнего шага на выходе от идеально прямой линии после компенсации ошибки смещения.
После компенсации ошибки смещения при входном напряжении с уровнем 0 выходное значение всегда будет равно 0. Однако под воздействием ошибки усиления наклон фактической передаточной функции несколько отличается от наклона идеальной. Эта ошибка усиления может быть измерена и компенсирована за счет масштабирования выходных значений.
Для компенсации во время выполнения часто используется целочисленная арифметика, так как расчеты с плавающей точкой занимают слишком много времени. Поэтому, чтобы получить наилучшую точность, отклонение должно быть измерено для выходного значения настолько далекого от 0, насколько это возможно. Чем больше значение будет использовано, тем более высокую точность Вы получите. Далее это описано более подробно.
На рисунке 2-13 показан пример передаточной функций 3-разрядного АЦП с ошибкой усиления. Ниже следующее описание справедливо как для несимметричного, так и для дифференцированного режима.

Рисунок 2-13. Пример положительной (A) и отрицательной (B) ошибок усиления
Для измерения ошибки усиления уровень входного напряжения увеличивают от 0 до достижения последнего шага на выходе АЦП. Коэффициент масштабирования для компенсации ошибки усиления равен отношению идеального значения на выходе для середины последнего шага к фактическому значению шага.
После того, как будут компенсированы ошибки смещения и усиления, фактическая передаточная функция должна максимально приблизится к передаточной функции идеального АЦП. Однако, нелинейность АЦП может привести к фактической кривой, несколько отличающейся от идеальной кривой, даже если две кривые совпадают в точке нуля и в точке, где была измерена ошибка усиления. Есть два метода измерения нелинейности, описание которых будет приведено далее. На рисунке 2-14 показаны примеры обоих методом измерения нелинейности.

Рисунок 2-14. Примеры измерения нелинейности АЦП
Дифференциальная нелинейность определяется как максимальная и минимальная разница между реальной и идеальной шириной любого шага квантования (1 LSB).
Последствием нелинейности является разная ширина шагов квантования. В идеале все шаги должны быть шириной 1 LSB, однако в реальности некоторые из них могут быть уже или шире.
Для измерения дифференциальной нелинейности на вход модуля АЦП подают линейно нарастающее напряжение, при этом непрерывно выполняются преобразования и сохраняются их результаты. Длинны шагов определяются расстояниями между изменениями значения результата. Самое положительное и отрицательное отклонение от 1 LSB используют в качестве значений максимальной и минимальной дифференциальной нелинейности.
Интегральная нелинейность определяется как максимальная вертикальная разница между фактической и идеальной кривой.
Интегральная нелинейность может быть интерпретирована как суммарная дифференциальная нелинейность. Например, сумма отрицательных значений дифференциальной нелинейности идущих подряд шагов квантования возвышает фактическую кривую над идеальной (показано на рисунке 2-14). Отрицательная интегральная нелинейность означает, что фактическая кривая находится ниже идеальной кривой.
Как и в случае с измерением дифференциальной нелинейности, максимальное и минимальное значения интегральной нелинейности измеряют с помощью того же линейно нарастающего напряжения на входе модуля АЦП. Так же, как и в предыдущем случае, сохраняются значения отклонения для каждого преобразования, после чего выбираются самое положительное и отрицательное отклонения, которые и являются максимальным и минимальным значениями интегральной нелинейности.
Важно, чтобы значения дифференциальной и интегральной нелинейности измерялись после компенсации ошибок смещения и усиления. В противном случае эти ошибки будут подмешаны в результат измерения нелинейности, что не позволит получить истинные значения дифференциальной и интегральной нелинейности.
Нелинейность нельзя компенсировать простыми вычислениями. Для этой цели могут быть использованы полиномиальные приближения или таблицы. Однако, типичное значение дифференциальной и интегральной нелинейности составляет менее ±2 LSB при работе АЦП XMEGA в 12-разрядном режиме и не представляет проблему в реальных рабочих приложениях.
Для получения стабильных результатов необходима развязка. Она необходима как для цепей измерения аналоговых сигналов, так и для цепей источников опорного напряжения.
Чтобы опорное напряжение для всех измерений в течение длительного времени было одинаковым, источник опорного напряжения должен быть точным. Для достижения этой цели опорное напряжение должно быть развязано с помощью конденсатора большой ёмкости. Для внутренних источников опорного напряжения это не возможно, но AVCC и Vcc должны быть хорошо развязаны. Развязка и фильтрация должны быть сделаны и для контактов AVCC, и для контактов внешних источников напряжений AVREF. Применение индуктивных фильтров и конденсаторов большой ёмкости сделает опорное напряжение более стабильным. Чем больше ёмкость, тем выше стабильность. Рекомендуется использовать конденсаторы ёмкостью 1 мкФ или больше. При использовании АЦП перед измерением Вы должны дождаться полной зарядки и стабилизации уровня напряжения на конденсаторе в цепи захвата. Время стабилизации напряжения должно быть рассчитано как время нарастания напряжения на RC-цепочке.
Для аналоговых сигналов так же необходима развязка. При работе с несимметричными сигналами развязывающий конденсатор необходимо устанавливать между сигнальной линией и землей. Для дифференциальных сигналов развязывающие конденсаторы необходимо устанавливать между положительными и отрицательными входами. Следует иметь ввиду, что развязывание сигналов - это более сложная ситуация, нежели развязывание опорного напряжения. Если сигнал быстро меняется (малый период фронтов), следует устанавливать развязывающий конденсатор меньшей ёмкости. Следует выбирать развязывающий конденсатор с максимальной ёмкостью, при которой он не будет оказывать влияние на форму сигнала. Именно поэтому трудно рекомендовать конкретное значение ёмкости развязывающего конденсатора, её следует рассчитать (так же, как рассчитывается RC-цепь).
Это очень распространенная проблема при создании схем АЦП. Сопротивление источника определяет скорость заряда внутреннего конденсатора в цепи выборки. Если внутренний конденсатор не успеет зарядится до того же уровня, что и аналоговый сигнал, результат измерения будет неправильным.
При прямом подключении к АЦП микросхем-датчиков их сопротивление, как правило, указано в документации. В этом случае подобрать скорость выборки для источника сигнала с соответствующим сопротивлением не составит труда.
Чтобы найти фактическое сопротивление схемы источника сигнала, составленной из пассивных компонентов, необходимо провести соответствующие расчеты. Например, массив резистивных делителей, применяемый для снижения напряжения до напряжения, которое может быть обработано микроконтроллером, может иметь очень высокое сопротивление за счет использования в нём резисторов с большим сопротивлением для получения большого падения напряжения. Чтобы при измерении получить правильный результат, необходимо либо уменьшить частоту дискретизации, либо снизить сопротивление источника сигнала. Снижение сопротивления вызовет больший ток утечки, но это можно решить путем добавления транзисторного ключа для включения и отключения источника аналогового сигнала. Пример такой схемы представлен на рисунке ниже.
Другой параметр, который нужно знать при реализации таких приложений, это время, в течении которого стабилизируется уровень напряжения источника сигнала. Стабилизация уровня напряжения источника сигнала после его включения занимает некоторое время, так как ко входу модуля АЦП подключен (во всяком случае, должен быть подключен) развязывающий конденсатор.

Точность модуля АЦП XMEGA зависит от качества входного сигнала и его питания. Для обеспечения наилучшей точности измерений АЦП следует принять во внимание следующие требования:
Применение передискретизации в случае случайно распределенных шумов способствует снижению шума и повышению точности результата. Применение восьмикратной передискретизации увеличивает разрешение результата на 2 бита, а время конвертирования, благодаря конвейерной архитектуре модуля АЦП, увеличивается всего на 8 тактов тактового сигнала модуля АЦП.
Для получения дополнительной информации о передискретизации обратитесь к статье «AVR121: Увеличение разрешения АЦП с помощью передискретизации».
В этом разделе Вы познакомитесь с основными шагами, которые необходимо проделать для запуска и дальнейшей работы модуля АЦП в режиме простого преобразования, а так же для экспериментирования с настройками мультиплексора. Необходимые регистры описаны вместе с соответствующими конфигурационными битами.
Обратите внимание на то, что в этом разделе рассматриваются примеры, работающие только в режиме опроса битов состояния. Примеры на основе прерываний здесь не рассматриваются, однако после изучения статьи «AVR1305: Использование прерываний и программируемого многоуровневого контроллера прерываний микроконтроллеров XMEGA» Вы сможете с легкостью использовать прерывания в своих приложениях.
Задача: Выполнить одиночное преобразование сигнала с несимметричного входа 1 модуля АЦП, используя виртуальный канал 2.
Задача: Выполнить одиночное преобразование сигнала с несимметричных входов 3 и 6 модуля АЦП, используя виртуальные каналы 1 и 3.
Задача: Запустить дифференциальные преобразования в автономном режиме на канале 0, используя линии ADC0 и ADC3 как положительный и отрицательный входы соответственно.
Отметим, что ждать установки флага прерывания в автономном режиме не обязательно. Тем не менее, если Вам требуется знать, что у Вас есть свежие результаты преобразования, Вы должны дождаться установки этого флага, очистить его, а затем прочитать результат. Также отметим, что использовать автономный режим рекомендуется совместно с контроллером DMA, чтобы разгрузить процессор.
В данном разделе кратко описаны более сложные функции и возможности модуля АЦП. Глубокое изучение расширенных функций выходит за рамки данной статьи. Для получения более подробной информации об этих функциях пользователю рекомендуется изучить документацию на микроконтроллер и соответствующие статьи по применению.
Вместо того чтобы использовать обработчики прерываний для чтения и обработки результатов преобразований, для копирования данных из одного или нескольких регистров результата в буфер в памяти или другой периферийный модуль можно использовать контроллер DMA микроконтроллеров XMEGA. При использовании контроллера DMA копирование данных производится без участия процессора, то есть освобождается процессорное время для выполнения других задач.
Узнать подробности о работе контроллера DMA можно из документации на микроконтроллер и из статьи «AVR1304: Использование контроллера DMA микроконтроллеров XMEGA».
Задействовав совместно с модулем АЦП систему событий можно уменьшить время преобразования и еще больше разгрузить центральный процессор. Система событий позволяет использовать события для запуска одиночного преобразования или преобразования на нескольких каналах одновременно. Условие завершения преобразования модулем АЦП также может служить источником событий для других периферийных модулей, подключенных к системе событий.
Получить дополнительную информацию о системе событий можно из документации на микроконтроллер или из статьи «AVR1001: Начинаем работать с системой обработки событий микроконтроллеров XMEGA».
В приложенном к этой статье архиве Вы найдете исходный код драйвера модуля АЦП, основанного на ASF 2.0 (Application Software Framework). Код предназначен для компиляции в среде Atmel® AVR Studio®.
Обратите внимание на то, что этот драйвер не предназначен для использования в приложениях, критичных к скорости выполнения кода. Он выполнен в виде библиотеки и предназначен для начала работы с АЦП. Код, критичный ко времени выполнения и размеру, должен работать с регистрами модуля АЦП напрямую. Для получения более подробной информации обратитесь к исходному коду драйвера и документации на микроконтроллер.
Полный обзор доступных интерфейсных функций драйвера и их использование приведено в документации к исходному коду.
Весь исходный код подготовлен для автоматического генерирования документации с помощью программы Doxygen. Doxygen это утилита, предназначенная для генерирования документации из исходных кодов путем анализа исходного кода и специальных ключевых слов. Более подробно про утилиту Doxygen можно узнать на сайте http://www.doxygen.org. Скомпилированная средствами Doxygen документация также поставляется с исходным кодом, прилагаемом к этому документу и доступна из файла readme.html, расположенного в папке с исходным кодом.