ЦАП в Xmega(DAC)

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

Рис.1. Функциональная схема модуля ЦАП 
    Начало преобразования
    Преобразование модулем ЦАП может быть инициировано двумя вариантами: записью значения в регистры данных или входящим событием полученным из системы событий. Когда преобразование инициируется записью данных, то преобразование начинается при обновлении старшего байта в регистре данных, а при инициировании от системы событий - при возникновении события, причем до возникновения события регистры данных могут быть многократно перезаписаны без преобразования в аналоговый сигнал. При появлении события будет преобразовано текущие значения записанное в регистрах данных. Хотя в документации указывается достаточно высокое быстродействие преобразования при записи в регистры данных рекомендуется использовать события по таймеру и DMA передачу для достижения еще более высокого быстродействия. Однако, для применений не требующих жестких временных тактирований или при выдаче на ЦАП постоянных значений не целесообразно применять столь быстродействующие способы преобразования.
    Режим инициирования (запуска) преобразования настраивается битами CHnTRIG в регистре управления В CTRLB. Режим инициирования может быть индивидуально выбран для каждого из 2 каналов. Например, канал 0 может быть настроен на преобразование по записи данных, а канал 1 - по событию.
    Запись в регистры данных можно выполнить как программно, так и с помощью контроллера DMA.
    Одиночный и двойной канал преобразования
    Модуль ЦАП содержит два канала с аналогичными регистрами данных, но только один блок преобразования. Пользователь может выбрать использовать канал 0 как непрерывный выход или использовать оба канала как два выхода с выборкой-хранением.
    Режим преобразования каналов настраивается битами выбор канала CHSEL в регистре управления В CTRLB.
    В одноканальном режиме работы, регистры данных канала 0 всегда соединяются с выходом блока преобразования ЦАП.
Рис.2. Одноканальный режим работы ЦАП 
    В двухканальном режиме работы, ЦАП поочередно преобразует значения каналов 0 и 1. Блоки выборки-хранения используются для хранения значения между преобразованиями (рис.3, где В/Х - блок выборки-хранения). Для корректной выдачи выходного значения на два выхода ЦАП необходимо регулярно обновлять каналы. В документации на процессор в разделе электрических характеристик содержится информация по минимальному времени обновления. Повышение частоты обновления приводит к повышению потребления электроэнергии, что тоже приводится в документации на процессор.
Рис.3. Двухканальный режим работы ЦАП 
    Система событий может использоваться для поддержания необходимой частоты обновления, но в большинстве случаев система событий используется для генерирования частоты выборки. Если частота выборки частота меньше, чем частота обновления, значит модуль ЦАП имеет качественный внутренний генератор обновлений. Автоматический интервал обновления настраивается битами управления временем обновления REFRESH в регистре управления временем TIMCTRL.
    Это означает, что каналы будут обновляться с постоянными интервалами времени, вне зависимости от преобразований между интервалами, вызванные например ручным обновлением регистров данных (см. рис.4.).
Рис.4. Обновление и запрос преобразования каналов
    - Одновременно с интервалом выборки и преобразования начинается интервал обновления канала 0. После окончания первого интервала выборки наступает интервал выборки и преобразования канала 1.
    - Запрос преобразования (обновление регистра данных или событие) для канала 0, инициирует выборку и преобразования только канала 0, даже если поступает в середине интервала обновлений.
    - Начало очередного интервала обновлений, аналогично п.1.
    - Запрос преобразования (обновление регистра данных или событие) для канала 1, инициирует выборку и преобразования только канала 1, даже если оба канала были только что обновлены.
    - Начало очередного интервала обновлений, аналогично п.1. Заметим, что запрос преобразования канала 0 откладывается до момента, описанного в п.6.
    - Отложенный запрос преобразования в п.5 инициирует очередное преобразование и выборку по каналу 0 сразу же после окончания преобразования и выборки канала 1.
    Заметим, что если частота новых запросов преобразования близка к частоте автоматического обновления, то время преобразования может быть не точным, т.к. новый запрос может прийти в момент обработки запроса вызванного периодом обновления. Новые запросы, поступившие во время обновления, откладываются до окончания обновления обоих каналов. Если поступило более одного нового запроса до момента выполнения первого, то все кроме первого будут игнорироваться.
    При использовании двухканального режима работы ЦАП возникает задержка, требуемая для преобразования канала 0, в течение которой начало преобразования канала 1 не возможно. Величина задержки составляет как минимум 1 мкс, тем самым, ограничивая частоту выборки на уровне 1 МГц.
    Интервал выборки настраивается битами управления выборкой канала CHSEP в регистре управления временем TIMCTRL.
    Левое и правое выравнивание данных
    12-битное входное значение ЦАП хранится в двух 8-битных регистрах, называемых старшим и младшим регистрами. По умолчанию 12-битное значение разделено так – 8 младших битов находятся в младшем регистре, а 4 старших бита в старшем регистре. Такое распределение удобно, когда значение 12-битного ЦАП хранится в 16-битном целочисленном формате, например unsigned short int.
    Однако для некоторых применений удобней использовать левое выравнивание, например 16-битное значение, где 4 младших бита являются дробной частью. Еще одним примером использования является хранение значения ЦАП в 8-битных переменных, например unsigned char, в этом случае 4 младшие бита 12-битного значения ЦАП равны нулю.
    Модуль ЦАП может быть настроен на левое выравнивание установкой бита LEFTADJ в регистре управления CTRLC.
Рис.5. Левое и правое выравнивание данных
    Источники опорного напряжения
Можно выбрать один из следующих источников опорного напряжения для преобразования:
- Точный источник опорного напряжения (1.1 В)
- Аналоговое напряжения питания (VDD)
- Внешний источник напряжения (VREF +)
    Отметим, что внешний источник напряжения может быть использован совместно с модулем АЦП. Источник опорного напряжения выбирается битами REFSEL в регистре контроля CTRLC.
   Выходное напряжение канала ЦАП можно описать следующим выражением:
    VDACx = CHnDATA · VREF / 0xFFF
    Нагрузочная способность
    Независимо от выбранного режима, выходы ЦАП способны выдержать внешней резистивную нагрузку до 1 кОм или емкостную нагрузку до 100 пФ. Более подробные характеристики указаны в документации на ваш процессор.
    Экономичный режим работы
    При необходимости снижения потребляемого тока во время преобразований модулем ЦАП, его можно перевести в экономичный режим работы. В этом режиме, между выполнением преобразований модуль переходит в отключенное состояние. Работа в этом режиме сопровождается увеличением времени преобразования при запуске нового преобразования.
    Калибровка
    Для достижения оптимальной точности на выходе ЦАП, имеются возможности встроенной калибровки, позволяющие тонкую настройку путем смещения и усиления ошибки. Для этих целей используются два регистра: усиления калибровки GAINCAL и калибровки смещения OFFSETCAL. Оба калибровочных регистра используют 7 бит, где старший (бит 6) определяет направление калибровки, а 6 младших (бит 5 .. 0) определяют амплитуду.
    При калибровке ЦАП необходимо измерить выходное значение любым возможным способом. Для этого может быть использована возможность внутреннего соединения ЦАП с каналами АЦП или внешнее оборудование. Использование модуля АЦП XMEGA позволяет автоматически калибровать ЦАП, но использование внешнего оборудования может дать большую точность.
    При калибровке, сначала настраивается значение смещения, до того пока величина 0x800 не будет выдавать ровно половину опорного напряжения. Затем настраивается усиление до тех пор, пока значение 0xFFF не даст полную величину опорного напряжения. Отметим, что усиление не возможно настроить использованием значения 0x000, так как блок преобразования не может выдать 0 В.
    С учетом погрешностей передаточная функция ЦАП можно записать следующим образом:
    VDACxX = offset + gain · CHnDATA / 0xFFF
    У идеального ЦАП коэффициент усиления (gain) равен 1, а смещения (offset) - 0.
    Калибровка не зависит от выбора одно- или двухканального режима, так как блок ЦАП только один и используется для обоих режимов.
Рис.6. Калибровка ЦАП с использованием АЦП
   Алгоритм работы в одноканальном режиме
    Задача: Установить постоянное значение на канал 0 ЦАП в одноканальном режиме работы с использованием аналогового напряжения питания в качестве опорного для ЦАП.
    Установить битами выбора канала CHSEL в регистре управления CTRLB одноканального режима работы записью 0x00.
    Обнулить бит инициализации события по каналу 0 CH0TRIG в регистре управления CTRLB, для запуска преобразования по записи в регистр данных, а не по событию.
    Установить битами выбора опорного напряжения REFSEL в регистре управления CTRLC аналогового источника опорного напряжения записью 0x01.
    Установить бит разрешения работы канала 0 CH0EN в регистре управления CTRLA.
    Установить бит ENABLE в регистре управления CTRLA, для разрешения работы модуля ЦАП.
    Записать 12-битное значение (с правым выравниванием) в регистр данных канала 0 CH0DATA для запуска преобразования. Отметим, что младшие байт должен быть записан в первую очередь.
    Напомним, что регистры данных имеют правое выравнивание по умолчанию.
    Алгоритм работы в двухканальном режиме
    Задача: Установить постоянное значение на обоих каналах ЦАП при двухканальном режиме работы с использованием аналогового напряжения питания в качестве опорного для ЦАП.
    Установить битами выбора канала CHSEL в регистре управления CTRLB двухканального режима работы записью 0x02.
    Обнулить биты инициализации события по каналу 0 CH0TRIG и по каналу 1 CH1TRIG в регистре управления CTRLB, для запуска преобразования по записи в регистр данных, а не по событию.
    Установить битами выбора опорного напряжения REFSEL в регистре управления CTRLC аналогового источника опорного напряжения записью 0x01.
    Установить биты разрешения работы канала 0 CH0EN канала 1 CH1EN в регистре управления CTRLA для разрешения работы обоих каналов ЦАП.
    Установить биты выборки канала CHSEP в регистре управления временем TIMCTRL равными 0x04 для установки интервала выборки величиной в 16 циклов, что составит 2 мкс при периферийной частоте 8 МГц.
    Установить биты времени обновления REFRESH в регистре управления временем TIMCTRL равными 0x06 для установки интервала обновления величиной в 128 циклов, что составит 16 мкс при периферийной частоте 8 МГц.
    Установить бит ENABLE в регистре управления CTRLA, для разрешения работы модуля ЦАП.
   Записать 12-битное значение (с правым выравниванием) в регистр данных соответствующего канала для запуска преобразования. При отсутствии изменения регистров данных выходы будут обновляться каждые 16 мкс.
    Пример
    Задача: Написать программу работы АЦП с преобразованием в автоматическом режиме, в беззнаковом 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; // если пуст - запись в ЦАП данных полученных с АЦП
}
    Blogger Comment
    Facebook Comment

0 коммент.:

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