Apтём (11.10.2010 20:42, просмотров: 5467) 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);
}
}
}