ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
215160
Apтём (11.10.2010 20:42, просмотров: 5377) MBedder
АЦП в Atxmega256A3. Не получается запускать несколько каналов АЦП паралельно: на вход PA4 подаётся постоянное напряжение 0,2 В от стабильного источника, на входы PA3, PA6, PA7 подаётся 0 В. После завершения преобразования результаты измерения оказаваются на входе PA4 вместо ожидаемых ~950 в диапазоне 970-1024. При запуске по одному каналу проблем с раcбросом результата нет. Код: #include "avr_compiler.h" #include "clksys_driver.h" #include "adc_driver.h" unsigned short ADC[4]; // массив для результов измерения int main(void) { ////////////////////////////////////////////////////////////////////////// // Fcpu=8 MHz - 32 МГц RC-генератор делённый на 4 CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc); CLKSYS_Enable( OSC_XOSCEN_bm ); do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 ); CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc ); CLKSYS_Prescalers_Config( CLK_PSADIV_4_gc, CLK_PSBCDIV_1_1_gc); CLKSYS_Disable( OSC_RC32MEN_bm ); ////////////////////////////////////////////////////////////////////////// //// ADC Config ///* Move stored calibration values to ADC A. */ ADC_CalibrationValues_Load(&ADCA); ///* Set up ADC A to have signed conversion mode and 12 bit resolution. */ ADC_ConvMode_and_Resolution_Config(&ADCA, ADC_ConvMode_Unsigned, ADC_RESOLUTION_12BIT_gc); ///* Set sample rate. */ ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV256_gc); ///* Set reference voltage on ADC A*/ ADC_Reference_Config(&ADCA, ADC_REFSEL_INT1V_gc); ///* Setup channel 0 */ ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ///* Enable ADC A .*/ ADC_Enable(&ADCA); ADC_Wait_8MHz(&ADCA); while (1) { { ADCA.INTFLAGS=15; ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN3_gc, 0); ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN4_gc, 0); ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN6_gc, 0); ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN7_gc, 0); // запуск преобразования ADC_Ch_Conversion_Start(&ADCA.CH0); ADC_Ch_Conversion_Start(&ADCA.CH1); ADC_Ch_Conversion_Start(&ADCA.CH2); ADC_Ch_Conversion_Start(&ADCA.CH3); while (ADCA.INTFLAGS!=0x0F); ADC[0]=ADC_ResultCh_GetWord_Unsigned(&ADCA.CH0, 0); ADC[1]=ADC_ResultCh_GetWord_Unsigned(&ADCA.CH1, 0); ADC[2]=ADC_ResultCh_GetWord_Unsigned(&ADCA.CH2, 0); ADC[3]=ADC_ResultCh_GetWord_Unsigned(&ADCA.CH3, 0); } } }