АЦП в Xmega(ADC)


    В данном примере речь пойдет об особенностях использования аналого-цифрового преобразователя (АЦП) в микропроцессорах XMega А.
    Данное семейство микропроцессоров имеет встроенный 12-разрядный АЦП с максимальным быстродействием до 2 млн. преобразований в секунду. На входе АЦП предусмотрен мультиплексор, который дает возможность оцифровывать 4 внутренних (датчик температуры, выход ЦАП, деленное на 10 напряжение питания VCC и источник опорного напряжения) и до 16 внешних сигналов. Возможно измерение как несимметричных, так и дифференциальных сигналов. В дифференциальном режиме измерений доступен опциональный усилительный каскад, позволяющий расширить динамический диапазон. Результат преобразования АЦП может быть представлен в знаковом или беззнаковом формате.
    АЦП выполнен по конвейерной архитектуре (выборка нового аналогового напряжения и запуск нового преобразования АЦП могут быть выполнены еще во время выполнения текущих преобразований), позволяющей добиться высокой частоты преобразования при относительно низкой частоте синхронизации и снимает ограничения на частоту преобразования, вызванные влиянием задержки распространения.
    Запуск преобразования АЦП может быть инициирован либо программно, либо входящим событием. Предусмотрено четыре отдельных регистра результата с индивидуальным выбором входа (настройка мультиплексора), что упрощает работу с АЦП в применениях с отслеживанием данных. Каждая пара результата и настройки мультиплексора называется каналом АЦП. По завершении преобразования, может быть выполнена передача результата преобразования в память или на другое устройство посредством DMA.
    Диапазон преобразования задается внутренним или внешним источником опорного напряжения (ИОН). В XMega интегрирован достаточно высокоточный ИОН на напряжение 1 В. При его использовании диапазон преобразования лежит в пределах 0…(1-ΔV)В в беззнаковом режиме и -1…1В в знаковом дифференциальном режиме.
    Знаковый режим может быть использован в качестве входного режима как для дифференциальных, так и для несимметричных входов. Беззнаковый режим доступен только для несимметричных и внутренних входов.
    В беззнаковом режиме диапазон преобразований начинается от нуля и заканчивается значением опорного напряжения. Чтобы иметь возможность определять переход через ноль, вычитается ΔV. ΔV приблизительно равна 0,05 * Vref, поэтому уровень земли будет соответствовать примерно 0,05 от общего диапазона значений (0,05 * 4095 с разрешением 12-бит). Это также ограничивает максимальное входное напряжение, которое становится меньше на 0,05 * Vref, то есть максимальное входное напряжение будет Vref - ΔV.
Рис.1. Функциональная схема модуля ADC.
    Конвейерная архитектура и виртуальные каналы
    Модуль АЦП имеет 12-ступенчатую конвейерную архитектуру, позволяющую осуществлять выборку нескольких сигналов одновременно и имеет четыре мультиплексора, которые позволяют выбрать источник сигнала и имеют индивидуальные настройки. Индивидуальные настройки каждого из четырёх мультиплексоров позволяют рассматривать их как отдельные виртуальные каналы, имеющие одинаковый набор результирующих регистров и разделяющие между собой один блок преобразования АЦП.
    Сигналы с выходов мультиплексоров захватываются один раз в четыре такта тактового сигнала модуля АЦП. Каждый захваченный сигнал проходит через весь конвейер (12 стадий), где на каждой стадии преобразуется один бит. Таким образом, АЦП способен осуществлять выборку одного сигнала каждые четыре такта тактового сигнала модуля АЦП даже несмотря на то, что каждый сигнал должен пройти все ступени конвейера до того, как результат преобразования будет помещен в регистр результата. Время преобразования конвейером АЦП одного сигнала при разрешении 12 бит составляет 7 тактов, а при разрешении 8 бит - 5 тактов. Если используется усилитель, время преобразования увеличивается на один такт. При полной загрузке АЦП способен формировать один результат каждый такт тактового сигнала АЦП.
    Стоит отметить, что возможно неоднократно преобразовывать сигналы, захваченные одним и тем же каналом. Конвейер может захватить и преобразовать сигнал из одного и того же канала даже в том случае, если он уже обрабатывает ранее захваченный на этом канале сигнал.
    Каждый из четырёх виртуальных каналов имеет регистр управления мультиплексором (CHnMUXCTRL), регистр управления каналом (CHnCTRL) и пару регистров результата преобразования (CHnRESL/ChnRESH). Кроме этих регистров существует несколько управляющих битов, которые расположены в регистрах общего назначения.
    Каскад усиления
    АЦП имеет в своём составе усилитель, который можно настроить на усиление напряжения с целью измерения маленьких напряжений в дифференциальном режиме.
    Этот каскад является разделяемым и может быть использован всеми каналами. Если канал настроен на использование усилителя, усиление происходит между мультиплексором и блоком преобразования АЦП. Доступны следующие коэффициенты усиления: 1x, 2x, 4x, 8x, 16x, 32x и 64x. Коэффициент усиления настраивается битовым полем GAINFACT регистра управления каналом (CHnCTRL).
    Использование каскада усиления увеличивает время распространения сигнала через АЦП на один такт. При установке коэффициента усиления равным 1x усиление сигнала не происходит, но это может быть использовано для формирования такой же задержки распространения сигнала, как и для канала, использующего каскад усиления.
    Входные источники.
    АЦП поддерживается четыре выборочных типа измерений:
- дифференциальный вход
- дифференциальный вход с усилением
- несимметричный вход
- внутренний вход
    Положительные и отрицательные входы выбираются с помощью битовых полей MUXPOS и MUXNEG регистра управления мультиплексором канала (MUXCTRL). При измерении сигналов на внутренних входах для выбора положительного входа применяется альтернативное имя битового поля, определённое в заголовочном файле как MUXINT.
    В микроконтроллерах с двумя модулями АЦП в качестве входных линий могут быть использованы только линии соответствующего порта. Это означает, что АЦП A может быть подключен только к порту A, а АЦП B может быть подключен только к порту B. Положительный вход может быть подключен к любой из восьми входных линий соответствующего порта. Если используется дифференциальный вход без усиления, отрицательный вход может быть подключен к одной из первых четырех входных линий (PIN0 - PIN3) соответствующего порта, если же задействован каскад усиления, для отрицательного входа следует использовать линию из второй четверки входных линий (PIN4 - PIN7) соответствующего порта.
    В устройствах с одним АЦП и несколькими аналоговыми портами положительный вход может быть подключен к любой доступной входной линии порта A или порта В. Если используется дифференциальный вход без усиления, отрицательный вход может быть подключен к одной из первых четырёх входных линий (PIN0 - PIN3) соответствующего порта, если же задействован каскад усиления, для отрицательного входа следует использовать линию из второй четвёрки входных линий (PIN4 - PIN7) соответствующего порта.
    Стоит заметить, что несмотря на то, что разность уровней между двумя входами может быть отрицательной, напряжение на любой из линий ввода/вывода ни при каких обстоятельствах не должно быть ниже уровня GND или выше уровня VCC.
    Выводы аналоговых входов используются в качестве дифференциальных и несимметричных входов, а внутренние входы напрямую подключены к внутренним источникам сигналов.
    Четыре типа измерений и соответствующие им мультиплексоры показаны на рис.2...5. Сам по себе АЦП всегда остается дифференциальным, а при выполнении несимметричных измерений его инвертирующий вход подключается к фиксированному уровню напряжения.
    Дифференциальный вход без усиления
    В такой конфигурации входа компаратор измеряет разницу между двумя входными сигналами. При выборе дифференциального входа, любой из выводов аналоговых входов может быть выбран в качестве неинвертирующего (положительного) входа, а в качестве инвертирующего (отрицательного) входа могут быть выбраны только выводы аналоговых входов 0…3. При использовании дифференциального входа, АЦП необходимо перевести в знаковый режим. При использовании дифференциального режима можно довольно легко измерить смещение относительно нуля, если настроить в качестве положительного и отрицательного входов одну и ту же линию ввода/вывода. При этом будет измерено смещение, так как модулю АЦП не нужно знать уровень земли.
    Обратите внимание, что АЦП не может измерять уровни напряжения ниже уровня земли и выше уровня опорного напряжения.
Рис.2. Дифференциальное измерение без усиления
    Дифференциальный вход с усилением
    При выборе дифференциального входа с усилением в качестве неинвертирующего входа может быть выбран любой из выводов аналоговых входов, а в качестве инвертирующего входа - выводы аналоговых входов 4…7. При использовании усилительного каскада, дифференциальный аналоговый вход вначале подвергается выборке и усилению, а затем подается в АЦП, при этом задержка на преобразование увеличивается на 1 такт. При работе с дифференциальным входом с усилением, АЦП необходимо перевести в знаковый режим. Доступны следующие коэффициенты усиления: 1, 2, 4, 8, 16, 32 и 64.
    Стоит отметить, что каскад усиления не нагружает вход и источник внешнего сигнала, так как сопротивление входа каналов с активированным каскадом усиления очень высоко. Это полезно для измерения сигнала от слабых источников.
    Уровень напряжения на любом из двух входов может быть в диапазоне между GND и Vref, но разность между ними не должна превышать Vref/GAIN, иначе это приведет к насыщению АЦП, а результатом преобразования будет значение, равное верхнему значению АЦП.
    Обратите внимание на то, что режим преобразования устанавливается на весь АЦП, а не индивидуально для каждого канала. Это означает, что даже если только один из каналов использует дифференциальный вход, АЦП должен быть введен в знаковый режим.
    Режим преобразования устанавливается с помощью бита CONVMODE управляющего регистра CTRLB.
Рис.3. Измерение дифференциального сигнала с усилением
    Несимметричный вход
    В такой конфигурации входа АЦП измеряет значение одного входного сигнала. Входной диапазон на неинвертирующем несимметричном входе от VREF до нуля. При выполнении несимметричных измерений в качестве входа могут использоваться любые выводы аналоговых входов. Несимметричные измерения можно выполнять как в знаковом, так и в беззнаковом режимах. В знаковом режиме инвертирующий вход АЦП подключается к внутренней общей цепи.
    В беззнаковом режиме помимо автоматического подключения отрицательного входа АЦП к земле автоматически увеличивается точность измерений. Диапазон значений результата составляет от 0 до 4096, в то время как для знакового режима диапазон результатов от -2048 до 2047.
Рис.4. Несимметричное измерение в знаковом режиме 
    В беззнаковом режиме инвертирующий вход АЦП соединен с напряжением, которое равно половине опорного напряжения (VREF) за вычетом фиксированного смещения ΔV, приблизительно равное 0,05*Vref. Это смещение можно измерить путем подключения положительного входа к земле (GND). Как правило, смещение соответствует значению около 200.
    Преимуществом применения напряжения смещения (ΔV) является то, что можно измерить отрицательное смещение напряжения в блоке АЦП, так как ΔV будет больше, чем любое другое смещение. ΔV позволяет приложениям, использующим АЦП XMEGA, вычислить и компенсировать ошибки, связанные со смещением напряжения в блоке АЦП (если это необходимо). Недостатком же является то, что некоторые значения из верхнего диапазона выпадают, так как любое измеренное значение напряжения выше Vref-ΔV насытит АЦП, а результатом измерения будет верхнее значение АЦП.  
Рис.5. Несимметричное измерение в беззнаковом режиме
    Внутренние входы
    К входу АЦП можно подключить один из четырех внутренних аналоговых сигналов:
    Выход датчика температуры
    Напряжение ИОН
    Поделенное на 10 напряжение VCC
    Выход ЦАП
    Разные каналы могут быть подключены к разным внутренним источникам напряжения.
    ИОН используется только модулем АЦП и включается с помощью бита BANDGAP регистра управления опорным напряжением (REFCTRL).
    То же самое касается датчика температуры, который не может использоваться никаким другим модулем. Опорное напряжение с датчика температуры включается установкой бита TEMPREF. Следует помнить, что на стабилизацию опорного напряжения прецизионного ИОН и датчика температуры требуется определенное время, поэтому активировать эти источники следует заблаговременно, до начала любых преобразований.
    Обратите внимание на то, что максимальная скорость выборки для внутренних входов может быть ниже, чем максимальная скорость преобразования модуля АЦП.
    Оцифровка напряжения встроенного датчика температуры дает возможность учитывать в программе информацию о текущей температуре внутри микроконтроллера.
    Зависимость напряжения от температуры встроенного датчика температуры носит линейный характер. В идеале, измеренное значение при 0°К будет равно «0» . Прямая линейной аппроксимации может быть построена через две точки, одна из которых соответствует значению при 0 °К, а вторая, это измеренное при изготовлении микроконтроллера значение. Это измеренное при изготовлении микроконтроллера значение хранится в массиве технологических значений и соответствует измерению, сделанному при 85 °C (358 °К) с погрешностью ±5 °C. Погрешность приводит к некоторому смещению результата при измерении температуры.
    Сохранённый в массиве технологических значений результат измерения получен в беззнаковом режиме работы АЦП с разрешением 12-бит и внутренним источником опорного напряжения 1 В. Сохранённое значение может быть использовано для 2-точечной калибровки, где второй точкой будет температура 0 °К (при этом результат АЦП равен 0).
    Лучший способ получить точный результат - это сделать 2-точечную калибровку, чтобы вычислить коэффициент кривой. Для 2-точечной калибровки необходимо выбрать две температуры, при которых Вы сможете сделать измерения, и при этом температура будет известная и точная. Сделать замер при обеих температурах с требуемыми настройками АЦП (режим, частота дискретизации, разрешение). Если Вы получили эти значения, можно вычислить коэффициент кривой, который Вы можете в дальнейшем использовать в своих приложениях. Приведенная ниже формула может быть использована для расчёта изменения температуры на один бит результата:
    Температура/бит=(Верхн.Т-Нижн.Т)/(Верхн.знач.бит-Нижн.знач.бит)
    На этапе производственных испытаний МК выполняется оцифровка напряжения внутреннего датчика температуры при фиксированной температуре. Результат оцифровки записывается в сигнатурный код производителя и может использоваться в дальнейшем для калибровки датчика температуры.
    Напряжение ИОН - точное опорное напряжение, которое доступно внутри микроконтроллера и используется для формирования других внутренних опорных напряжений.
    Напряжение прецизионного ИОН (равно 1,1 В) может быть использовано в качестве опорного при определении значения внешнего опорного напряжения, если это напряжение неизвестно.
    К входу АЦП также можно подключить выходное напряжение ЦАП. Это напряжение подается прямо с выхода ЦАП, а не с выходов схемы выборки-хранения, которые имеются у АЦП.
    При измерении внутренних сигналов в знаковом режиме, неинвертирующий вход подключается к внутренней общей цепи.
Рис.6. Измерение внутренних сигналов в знаковом режиме
    В беззнаковом режиме неинвертирующий вход подключается к фиксированному уровню напряжения, который равен половине опорного напряжения (VREF) минус фиксированное смещение, т.е. аналогично беззнаковому несимметричному измерению.
    Каналы АЦП
    Чтобы упростить использование модуля АЦП, у него предусмотрено четыре отдельных регистра управления мультиплексорами, каждому из которых соответствует свой регистр результата. Регистровая пара мультиплексора/результата называется каналом АЦП. Каждый канал АЦП раздельно настраивается на измерение различных входных источников, использует различные условия запуска преобразования, события и прерывания. Результат преобразования запоминается в разных регистрах результата.
    Все каналы АЦП для выполнения преобразования используют один и тот же АЦП, однако, благодаря его конвейерной архитектуре, новое преобразование можно запускать по каждому циклу синхронизации АЦП. Это означает, что одновременно и независимо, не требуя изменений настроек мультиплексора, могут прогрессировать несколько преобразований.
    Выбор опорного напряжения
    В качестве опорного напряжения АЦП (VREF) можно выбрать следующие напряжения:
    Точное внутреннее напряжение INT1V 1В.
    Внутреннее напряжение INTVCC VCC/1.6В.
    Внешнее напряжение, поданное на вывод AREF порта А.
    Внешнее напряжение, поданное на вывод AREF порта B.
    Внутренний источник опорного напряжения 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 В. Точность внешнего источника опорного напряжения зависит от его схемы, которая должна быть спроектирована в соответствии с требованиями к точности измерений модуля АЦП.
    Результат преобразования
    АЦП можно настроить на работу в знаковом или беззнаковом режиме. Данная настройка является глобальной и, таким образом, распространяется на весь модуль АЦП и на все его каналы.
    Результат преобразования сохраняется в регистре результата каждого канала. Для индикации завершения преобразования каждый канал имеет флаг. Если результат не будет прочитан до завершения следующего преобразования, он будет утерян.
    В знаковом режиме, возможно измерение как отрицательных, так и положительных напряжений на несимметричном или дифференциальном входе. При использовании 12-битной разрешающей способности, максимальным значением (TOP) знакового результата является 2048, а все значения результата лежат в пределах -2048…+2047 (0xF800…0x07FF). В беззнаковом режиме, максимальное значение равно 4095, а все значения результата принадлежат диапазону 0…4095 (0…0x0FFF).
    Если какой-либо из входов АЦП настроен на дифференциальное измерение, необходимо использовать знаковый режим. В беззнаковом режиме возможно измерение только внешних или внутренних несимметричных сигналов.
    Результат аналого-цифрового преобразования (RES) записывается в один из регистров результата. Передаточная функция АЦП имеет следующий вид:
    RES = (VINP - VINN)·GAIN·TOP/VREF,
    где VINP и VINN - напряжения на неинвертирующем и инвертирующих входах АЦП. GAIN всегда равно 1, если не используется дифференциальное измерение с усилением. TOP - это максимальное значение результата, определяемое установленным разрешением АЦП. Для разрешения 12 бит это значение равно 2048, для разрешения 8 бит - 128.
    Программно можно задать разрешающую способность результата 8 или 12 бит. Преобразование с более низкой разрешающей способностью выполняется быстрее.
    Регистры результата являются 16-битными. 8-битный результат всегда представляется в 16-битном регистре результата с правым выравниванием. 12-битный результат может быть представлен как с левым, так и с правым выравниванием. Левое выравнивание означает, что 8 старших бит результата помещаются в старший байт регистра результата. Разрешение АЦП настраивается с помощью битового поля RESOLUTION управляющего регистра B (CTRLB).
    Когда АЦП работает в знаковом режиме, старший бит результата является битом знака. В 12-битном режиме с правым выравниванием, бит знака (бит 11) копируется во все неиспользуемые старшие биты, т.е. биты 12…15. Это необходимо для того, чтобы хранящееся в регистре результата 16-битное значение автоматически воспринималось в программе, как 16-битное знаковое значение. Аналогичным образом, в 8-битном режиме бит знака (бит 7) копируется во все биты старшего байта.
    В беззнаковом режиме результат преобразования АЦП равен:
    RES = (VINP + ΔV)·GAIN·TOP/VREF,
    где TOP - это максимальное значение результата, определяемое установленным разрешением АЦП. Для разрешения 12 бит это значение равно 4096, для разрешения 8 бит - 256.
    Положительное смещение определяется значением ΔV. Как правило, оно равно 0,05 * VREF. Напряжение смещения можно измерить, соединив входной контакт с землей. Обычно результатом измерения этого напряжения является значение около 200. Для того чтобы измерить это смещение более точно, следует настроить модуль АЦП на тот режим, в котором он будет в дальнейшем работать (опорное напряжение, скорость и другие параметры) и подключить внешний входной контакт к земле.
    Это смещение не компенсируется автоматически. Программное обеспечение должно вычитать измеренное смещение из результатов преобразования.
    Функция сравнения
    Модуль АЦП поддерживает функцию 12-битного сравнения. Для хранения 12-битного значения с которым сравнивается аналоговый сигнал предусмотрен регистр сравнения. Каждый из каналов АЦП можно настроить на автоматическое выполнение сравнения результата преобразования с заданным 12-битным значением и генерацию прерывания или события в случае, если результат преобразования больше или меньше порога. Все четыре канала АЦП работают с одним и тем же регистром сравнения.
    Запуск преобразования
    Перед тем как запустить преобразование, необходимо выбрать входные источники для одного или более каналов АЦП. Запустить преобразование в канале АЦП можно либо программной записью единицы в бит запуска преобразования канала АЦП, либо событием системы событий. Допускается одновременная запись битов запуска преобразования нескольких каналов АЦП или использование одного и того же события для одновременного запуска преобразований в нескольких каналах АЦП.
    Синхронизация и временная диаграмма преобразования АЦП
    Модуль АЦП синхронизируется сигналом периферийной синхронизации, пропущенный через предварительный делитель. Предварительный делитель может быть настроен на следующие множители: 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256 и 1/512. Чтобы гарантировать правильную работу модуля АЦП, частоту тактового сигнала модуля следует выбирать с учетом минимальной и максимальной рекомендуемой скорости для модуля АЦП. Частота тактового сигнала модуля АЦП настраивается с помощью регистра PRESCALER. Результирующий сигнал - сигнал синхронизации АЦП (ClkADC).
    Следует отметить, что высокая частота тактового сигнала модуля АЦП сокращает время преобразования каждой выборки, но это не значит, что Вы не сможете захватывать сигнал на гораздо более низкой скорости. Например, приложение может захватывать сигнал со скоростью 10 кГц даже в том случае, когда частота тактового сигнала модуля АЦП составляет 2 МГц. При этом частота захвата не может быть выше, чем четверть частоты системного тактового сигнала, так как частота тактового сигнала модуля АЦП не может превышать 1/4 частоты периферийного тактового сигнала. Минимальная частота тактового сигнала модуля АЦП составляет 100 КГц.
    Обратите внимание то, что при захвате сигналов от внутренних источников частота тактового сигнала модуля АЦП должна быть равна 125 кГц.
Рис. 7. Предделитель АЦП.
    Максимальная частота преобразований АЦП равна частоте его синхронизации (fADC). АЦП может инициировать новое преобразование по каждому циклу синхронизации АЦП.
    Задержка на преобразование АЦП определяется выражением:
    Задержка преобразования = (1 + 0.5·RES + GAIN) / fADC,
    где RES - разрешающая способность АЦП (8 или 12 бит). Задержка преобразования возрастает на один дополнительный цикл синхронизации АЦП после активизации усилительного каскада (GAIN).
    Несмотря на то, что задержка преобразования составляет более одного цикла синхронизации АЦП, конвейерная архитектура исключает любые ограничения на соотношение частоты преобразования и задержки распространения.
    Автономный режим
    Вместо того, чтобы запускать преобразование вручную (путём установки одного или нескольких бит CHnSTART регистра CTRLA) или по событию, АЦП можно настроить на работу в автономном режиме. Это означает, что сигналы с одного или нескольких каналов будут захватываться и преобразовываться в цикле до тех пор, пока активен этот режим.
    Выбрать, какие каналы должны работать в автономном режиме, можно с помощью битового поля SWEEP регистра EVCTRL. Вы можете выбрать один из следующих вариантов: только канал 0, каналы 0 и 1, каналы от 0 до 2, или все четыре канала.
    Обратите внимание на то, что те же самые биты используются для выбора каналов, включенных в развертку преобразований, инициируемую по событию.
    При работе канала в автономном режиме следует избегать изменения любых настроек, связанных с мультиплексором, так как это приводит к получению некорректных результатов преобразования.
    Прерывания и события
    АЦП может генерировать как прерывания, так и события. Каналы АЦП предусматривают раздельную настройку прерываний. Запросы прерываний и события генерируются либо при завершении преобразования АЦП, либо если результат преобразования АЦП больше или меньше значения в регистре сравнения АЦП.
    Калибровка
    Модуль АЦП оснащен механизмом калибровки. Для выполнения калибровки АЦП необходимо сосчитать соответствующее калибровочное значение из сигнатурного кода производителя (определяется на фазе производственных испытаний производителем) и записать его в регистр калибровки АЦП. Такая калибровка позволяет добиться 12-битной точности преобразования.
    Калибровочное значение не загружается автоматически. Для улучшения характеристик АЦП это значение требуется загрузить из массива технологических сигнатур (ADCxCAL0/1) и записать в соответствующий калибровочный регистр АЦП (CALL/CALH) до включения модуля АЦП.
    Алгоритм одиночного преобразования
    Задача: Выполнить одиночное преобразование сигнала с несимметричного входа 1 модуля АЦП, используя виртуальный канал 2.
    Установить несимметричный режим для входа. Для этого необходимо присвоить значение 0x01 битовому поля INPUTMODE регистра управления каналом 2 (CH2CTRL).
    Выбрать вход 1 для виртуального канала 2. Для этого необходимо присвоить значение 0x01 битовому полю MUXPOS регистра управления мультиплексором канала 2 (CH2MUXCTRL).
    Активировать модуль АЦП. Для этого необходимо установить бит ENABLE регистра управления A (CTRLA).
    Запустить одиночное преобразование. Для этого надо установить бит запуска процесса преобразования для канала 2 (CH2START) регистра управления A (CTRLA).
    Алгоритм преобразования несколько каналов
    Задача: Выполнить одиночное преобразование сигнала с несимметричных входов 3 и 6 модуля АЦП, используя виртуальные каналы 1 и 3.
    Установить несимметричный режим работы обоих входов. Для этого надо присвоить битовому полю INPUTMODE регистра управления каналом 1 (CH1CTRL) и регистра управления каналом 3 (CH3CTRL) значение 0x01.
   Выбрать входы для каналов 1 и 3. Для этого надо присвоить битовому полю MUXPOS регистров управления мультиплексорами каналов 1 и 3 (CH1MUXCTRL и CH3MUXCTRL) значения 0x03 и 0x06 соответственно.
   Включить модуль АЦП (без калибровки). Для этого надо установить бит ENABLE регистра CTRLA.
    Запустить преобразование на обоих каналах. Для этого надо установить биты старта процесса преобразования каналов 1 и 3 (CH1START и CH3START) регистра CTRLA.
   Дождаться завершения процесса преобразования. Для этого необходимо дождаться установки флага прерывания каналов 1 и 3 (CH1IF и CH3IF) регистра INTFLAGS.
   Получить 12-разрядные значения результатов преобразования в виде двух 2-байтовых значений. Для этого надо прочитать данные из регистровых пар результатов преобразований для каналов 1 и 3 (CH1RESL/CH1RESH и CH3RESL/CH3RESH).
   Алгоритм преобразования в автономном режиме
   Задача: Запустить дифференциальные преобразования в автономном режиме на канале 0, используя линии ADC0 и ADC3 как положительный и отрицательный входы соответственно.
    Выбрать пару дифференциальных входов. Для этого необходимо присвоить битовым полям MUXPOS MUXNEG регистра управления каналом 0 (CH0MUXCTRL) значения 0x00 и 0x03 соответственно.
    Для активации автономного режима необходимо установить бит FREERUN регистра управления B (CTRLB).
    Запустить АЦП (без калибровки). Для этого необходимо установить бит ENABLE регистра управления A (CTRLA).
    При необходимости можно дождаться завершения преобразования, для чего следует дождаться установки флага прерывания по завершению преобразования для канала 0 (CH0IF) регистра флагов прерываний (INTFLAGS). Если этот флаг планируется использовать в дальнейшем, его следует очистить путём записи в него единицы.
    Остается только прочитать результат, который хранится в регистровой паре результата преобразования канала 0 (CH0RESL/CH0RESH).
    Отметим, что ждать установки флага прерывания в автономном режиме не обязательно. Тем не менее, если Вам требуется знать, что у Вас есть свежие результаты преобразования, Вы должны дождаться установки этого флага, очистить его, а затем прочитать результат. Также отметим, что использовать автономный режим рекомендуется совместно с контроллером DMA, чтобы разгрузить процессор.
    Пример 1.
    Задача: Написать программу работы АЦП с преобразованием в автоматическом режиме, в беззнаковом 12-битном формате с компенсацией смещения, при этом результат преобразования должен выводиться на ЦАП. Т.е., то что имеем на входе АЦП должно быть на выходе ЦАП с коэффициентом усиления 1.
    Сигнал будем подавать на ножку 3 порта А (т.е. 3 ножка ADCA), а в качестве выхода ЦАП используем ножку 3 порта В (т.е. 1 канал DACB). Скажу сразу, что как Я не пытался считать с сигнатуры процессора калибровочное значения ЦАП в процессе выполнения программы, у меня ничего не получилось. Считать его получилось только в AVR с помощью программатора, поэтому в программе регистру калибровки присваивается данное значение (ADCA.CAL=0xff). Также процессор категорически отказывается автоматически вычитать калибровочное значение из регистра результата преобразования АЦП (если у Вас получилось настроить прошу поделится опытом), поэтому пришлось вычитать программным путем.
#define ENABLE_BIT_DEFINITIONS     // разрешение использования групповых битовых имен

/* Объявление используемых библиотек */
#include <ioxm128a1.h>
#include <ina90.h>
/* Объявление переменных и функций */
long int DataA; // Данные принятые с модуля АЦП
void InitADC(void)
{
/* значение смещения считанное из сигнатуры процессора */
ADCA.CAL=0xff;
/* беззнаковый режим, автоматический режим, 12-битный результат с правым выравниванием */
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | 0x08;
/* разрешение работы бэндгап-элемента, внутреннее опорное напряжение 1В */
ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02;
/* периферийная частота = clk/16 (2MHz/16)*/
ADCA.PRESCALER = ADC_PRESCALER_DIV16_gc;
/* канал 0 ADCA настроен на внешний несимметричных вход */
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
/* Ножка 3 порта А настроена как положительный вход */
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;
/* Разрешение работы АЦП */
ADCA.CTRLA|=ADC_ENABLE_bm;
}
void InitDAC(void)
{
DACB.CTRLB = 0x40; // двухканальная работа каналов 0 и 1
DACB.TIMCTRL = 0x50; // минимум 48 CLK между преобразованиями
DACB.CTRLA = 0x0D; // Разрешение работы DACB и каналов 0 и 1
DACB.CH0DATA = 2047; // Выдача на канал 0 в нулевое значение
}
void main(void)
{
__disable_interrupt(); // Отключение прерываний
/* Настройка таймера С0 */
TCC0.CTRLA=0x04; // N=8;
TCC0.PER=125-1; // частота таймера 2кГц при частоте процессора 2МГц
TCC0.INTCTRLA=1; // уровень прерываний таймера low
PMIC.CTRL = 1; // приоритет прерываний уровня low
InitADC(); // Запуск процедуры инициализации АЦП
InitDAC(); // Запуск процедуры инициализации ЦАП
__enable_interrupt(); // Разрешение прерываний
while(1){} // пустой бесконечный цикл
}
#pragma vector=TCC0_OVF_vect // обработка прерываний по переполнению таймера С0
__interrupt void irqTCC1_OVF_vect(void)
{
DataA = ADCA.CH0RES-ADCA.CAL; // Сохранение данных с учетом смещения
if (DACB.STATUS & 2) // проверка пустоты регистра канала 1
DACB.CH1DATA = DataA; // если пуст - запись в ЦАП данных полученных с АЦП
}
    Пример 2.
    Задача: Написать программу работы АЦП с преобразованием дифференциального сигнала в знаковом 12-битном формате, при этом результат преобразования должен выводиться на ЦАП. Т.е., то что имеем на входе АЦП должно быть на выходе ЦАП с коэффициентом усиления 1.
    Положительный сигнал будем подавать на ножку 3 порта А (3 ножка ADCA), а отрицательный на ножку 2 порта А (2 ножка ADCA) в качестве выхода ЦАП используем ножку 3 порта В (т.е. 1 канал DACB).
#define ENABLE_BIT_DEFINITIONS     // разрешение использования групповых битовых имен
/* Объявление используемых библиотек */
#include <ioxm128a1.h>
#include <ina90.h>
/* Объявление переменных и функций */
long int DataA; // Данные принятые с модуля АЦП
void InitADC(void)
{
/* знаковый режим, 12-битный результат с правым выравниванием */
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | 0x10;
/* разрешение работы бэндгап-элемента, внутреннее опорное напряжение 1В */
ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02;
/* периферийная частота = clk/16 (2MHz/16)*/
ADCA.PRESCALER = ADC_PRESCALER_DIV16_gc;
/* канал 0 ADCA настроен на внешний несимметричных вход */
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_DIFF_gc;
/* Ножка 3 порта А настроена как положительный вход, а ножка 2 как отрицательный */
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc | ADC_CH_MUXNEG_PIN2_gc;
/* Разрешение работы АЦП */
ADCA.CTRLA|=ADC_ENABLE_bm;
}
void InitDAC(void)
{
DACB.CTRLB = 0x40; // двухканальная работа каналов 0 и 1
DACB.TIMCTRL = 0x50; // минимум 48 CLK между преобразованиями
DACB.CTRLA = 0x0D; // Разрешение работы DACB и каналов 0 и 1
DACB.CH0DATA = 2047; // Выдача на канал 0 в нулевое значение
}
void main(void)
{
__disable_interrupt(); // Отключение прерываний
/* Настройка таймера С0 */
TCC0.CTRLA=0x04; // N=8;
TCC0.PER=125-1; // частота таймера 2кГц при частоте процессора 2МГц
TCC0.INTCTRLA=1; // уровень прерываний таймера low
PMIC.CTRL = 1; // приоритет прерываний уровня low
InitADC(); // Запуск процедуры инициализации АЦП
InitDAC(); // Запуск процедуры инициализации ЦАП
__enable_interrupt(); // Разрешение прерываний
while(1){} // пустой бесконечный цикл
}
#pragma vector=TCC0_OVF_vect // обработка прерываний по переполнению таймера С0
__interrupt void irqTCC1_OVF_vect(void)
{
ADCA.CTRLA |= 0x04; // запуск преобразования канала 0
while(!ADCA.CH0.INTFLAGS); // ожидание установки флага конца прерываний канала 0
ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm; // очищение флага
DataA=ADCA.CH0RES; // Сохранение значения с АЦП
if (DACB.STATUS & 2) // проверка пустоты регистра канала 1
DACB.CH1DATA = DataA*2+2048; // если пуст - запись в ЦАП данных полученных с АЦП с преобразованием в беззнаковый формат
}
    Blogger Comment
    Facebook Comment

0 коммент.:

Отправить комментарий