Xmega: АЦП(ADC)

Posted by Reason89 | Posted in , ,

    В микроконтроллерах Xmega используется 12 разрядный АЦП, который позволяет делать нескольких сигналов одновременно. Так же в  АЦП есть усилитель, который можно использовать с целью измерения маленьких напряжений в дифференциальном режиме.
    Преобразование может производиться как в знаковом, так и без знаковом режиме.  Стоит помнить, что если АЦП использует дифференциальные входы, то должен использоваться знаковый режим, а с входами других типов можно использовать оба режима, как знаковый, так и без знаковый.
    Из таких явных неудобств, стоит обратить внимание на то, что режим преобразования устанавливается на весь АЦП, а не индивидуально для каждого канала. То есть когда один из каналов использует дифференциальный вход, АЦП должен быть введен в знаковый режим.
    На входе АЦП стоит мультиплексор, который позволяет нам оцифровывать 4 внутренних сигнала, таких как: датчик температуры, выход ЦАП, деленное на 10 напряжение питания VCC и источник опорного напряжения, плюс 16 внешних сигналов. В AVR такого и близко не было.
    Преобразование АЦП может быть запущено либо программно, запись в определенный регистр заданного значения, либо через систему событий.
    Можно использовать 4 режима измерения:
- дифференциальный вход
- дифференциальный вход с усилением
- несимметричный вход
- внутренний вход
     В качестве опорного напряжения АЦП (VREF) можно выбрать следующие напряжения:
- Точное внутреннее напряжение INT1V 1В.
- Внутреннее напряжение INTVCC VCC/1.6В.
- Внешнее напряжение, поданное на вывод AREF порта А.
- Внешнее напряжение, поданное на вывод AREF порта B.
     Описание всех регистров можно найти в документации на Xmega. Настроек на самом деле огромное количество. В сравнении с предыдущими поколениями, Xmega  позволяет настраивать все более тонко, соответственно и количество регистров здесь гораздо больше.
    Привожу функцию инициализации АЦП:

void ADC_init()
{
    ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;             // 12 бит дискретизация
    ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;  // CH0 настроен на внешний нессимметричный вход
    ADCA.PRESCALER =ADC_PRESCALER_DIV32_gc;           // Переферийная частота работы АЦП
    ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02;        // Опорное напряжение 1 В.
    ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;         // Настраиваем как положительный вывод порта для АЦП
    ADCA.CTRLA = ADC_ENABLE_bm;                       // Активирую АЦП
} 



Comments (0)

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