Пытаюсь вспомнить как программировать АЦП ATXMEGA.(дополнение) Работаю с ATXMEGA32A4U
Взял готовый пример из Интернета, подправил только номер вывода.
void InitADC(void)
{
PORTA.DIR &= ~(INPUT_V_PIN | INPUT_T_PIN);
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | ADC_FREERUN_bm; // непрерывное преобразование 12-битный результат с правым выравниванием
ADCA.REFCTRL = ADC_REFSEL_INTVCC2_gc; // VCC/2
ADCA.PRESCALER = ADC_PRESCALER_DIV16_gc; /* периферийная частота = clk/16 (2MHz/16)*/
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; /* канал 0 ADCA настроен на внешний несимметричных вход */
ADC_SELECT_VIN(); // измерение входного напряжения
ADCA.CTRLA |= ADC_ENABLE_bm; /* Разрешение работы АЦП */
}
При изменении напряжения на входе АЦП от 0 до примерно 0,98 вольт код считаннный с АЦП меняется. После стоит как вкопанный. Такое впечатление, что не переключается опорное с 1 вольт на VCC/2
//---------------------------------------
Дополнение:
Взялся перечитывать "XMEGA AU MANUAL". Самый свежий маркирован 13 годом "8331F–AVR–04/2013"
В тексте есть явные опечатки:
Table 28-12. Channel input modes, CONVMODE=1 (signed mode).
Table 28-13. Channel input modes, CONVMODE=1 (unsigned mode).
Не очень четко выписано по поводу выбора коэффициента усиления
See Table 28-10 on page 359. Gain is valid only with certain MUX settings. See “MUXCTRL – ADC Channel MUX Control registers” on page 360.
Я пробовал переключить на коэффициент усиления 1/2 но ничего не получилось.
Ну и накрутили, хоть бери переменый резистор и изучай поведение.
Затра буду пробовать в дифференциальном включении с коэффицентом усиления 1/2.