Есть ATxMega32D4, на начальном этапе пытаюсь просто измерить постоянное напряжение (~1.2В) которое подается к Pin2.
Ф-я ADC_GetValue() вызывается по требованию программы (необходимость измерения в данный момент)
Независимо от подключенного измеряемого напряжения выдает 0xC0...0xC3 в случае
UnsignedMode и 0x02...0x06 в случае SignedMode (ADC_CONMODE_bm)
CODE
void ADC_Init(void)
{
PORTA.DIRCLR = PIN6_bm; // Настраиваем нужный вход
// Устанавливаем разрядность и режим Signed Mode
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | ADC_CONMODE_bm;
ADCA.REFCTRL = ADC_REFSEL_AREFB_gc; // Внешний ИОН 2,36В, подключен к PB0 Pin4
// Настраиваем мультиплексор - Канал 0 ADCA настроен на внешний несимметричный вход
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
ADCA.CH0.MUXCTRL |= ADC_CH_MUXPOS_PIN6_gc; // Positive Input ADC6 PA6 Pin2
ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП
ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc; // Делитель частоты (32МГц/256=125кГц)
// Прерывание по завершению преобразования, уровень прерываний - средний
ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_MED_gc;
}
uint16_t ADC_GetValue(void)
{
uint16_t i, tmp, sum = 0;
for (i=0; i<16; i++) // Number of samples
{
ADCA.CTRLA |= ADC_CH0START_bm; // ADC Start Conversion
while(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm);
ADCA.CH0.INTFLAGS |= ADC_CH_CHIF_bm; // Clear interrupt flag
tmp = ADCA.CH0RES;
sum += tmp;
}
sum /= 16;
return sum;
}
{
PORTA.DIRCLR = PIN6_bm; // Настраиваем нужный вход
// Устанавливаем разрядность и режим Signed Mode
ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc | ADC_CONMODE_bm;
ADCA.REFCTRL = ADC_REFSEL_AREFB_gc; // Внешний ИОН 2,36В, подключен к PB0 Pin4
// Настраиваем мультиплексор - Канал 0 ADCA настроен на внешний несимметричный вход
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
ADCA.CH0.MUXCTRL |= ADC_CH_MUXPOS_PIN6_gc; // Positive Input ADC6 PA6 Pin2
ADCA.CTRLA |= ADC_ENABLE_bm; // Включаем АЦП
ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc; // Делитель частоты (32МГц/256=125кГц)
// Прерывание по завершению преобразования, уровень прерываний - средний
ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_MED_gc;
}
uint16_t ADC_GetValue(void)
{
uint16_t i, tmp, sum = 0;
for (i=0; i<16; i++) // Number of samples
{
ADCA.CTRLA |= ADC_CH0START_bm; // ADC Start Conversion
while(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm);
ADCA.CH0.INTFLAGS |= ADC_CH_CHIF_bm; // Clear interrupt flag
tmp = ADCA.CH0RES;
sum += tmp;
}
sum /= 16;
return sum;
}
в чем может быть проблема