APM32F030中12 位精度的 ADC,共 18 个通道, 16 个外部通道和 2 个内部通道, 各通道 A/D转换模式有单次、连续和断续, ADC 转换结果可以左对齐或右对齐存储在 16 位数据寄存器中。stm32F030的程序可以用在APM32F030上。
因需要要采集PC0和PC1两个引脚的AD值,对应于ADC_CHANNEL_10和ADC_CHANNEL_11,再调试过程中发现单独采集一个通道的值都是好的,然而采集两个通道时两个通道的值每次都差不多,将一个引脚直接拉低,采集到的两个通道值都为0,显然这是不对的,在网上查看一下资料后,发现要在获取值的时要加入ADC->CHSEL = (uint32_t)ch; //这个非常重要,没有这句无法正常获取多通道的AD值。在此记录一下
void ADCInit(void)
{
GPIO_Config_T gpioConfig;
ADC_Config_T adcConfig;
/** RCM Enable*/
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOC);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
/** GPIO Configuration */
gpioConfig.pin = GPIO_PIN_0;
gpioConfig.mode = GPIO_MODE_AN;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIOC, &gpioConfig);
gpioConfig.pin = GPIO_PIN_1;
gpioConfig.mode = GPIO_MODE_AN;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIOC, &gpioConfig);
/** ADC Configuration */
ADC_Reset();
ADC_ConfigStructInit(&adcConfig);
/** Set resolution*/
adcConfig.resolution = ADC_RESOLUTION_12B;
/** Set dataAlign*/
adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
/** Set scanDir*/
adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
/** Set convMode continous*/
adcConfig.convMode = ADC_CONVERSION_SINGLE;
/** Set extTrigConv*/
// adcConfig.extTrigConv = ADC_EXT_TRIG_CONV_TRG0;
/** Set TrigEdge*/
adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;
ADC_Config(&adcConfig);
// ADC_ConfigChannel(ADC_CHANNEL_10, ADC_SAMPLE_TIME_239_5);
// ADC_ConfigChannel(ADC_CHANNEL_11, ADC_SAMPLE_TIME_239_5);
/** Calibration*/
ADC_ReadCalibrationFactor();
/** Enable ADC*/
ADC_Enable();
}
//获取ADC通道的值
//ch 通道值0-16
//获取转换结果
uint32_t Get_Adc(uint32_t ch)
{
uint32_t adc_index = 0;
unsigned char retry=0;
ADC_ConfigChannel(ch, ADC_SAMPLE_TIME_239_5);
ADC->CHSEL = (uint32_t)ch; //这个非常重要,没有这句无法正常获取多通道的AD值
while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY)){
retry++;
if(retry>200)return 0;
};
ADC_StartConversion();
retry = 0;
while(ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET){
retry++;
if(retry>200)return 0;
};
/** Read ADC Conversion value*/
adc_index = ADC_ReadConversionValue();
ADC_StopConversion();
return adc_index;
}
再次提醒ADC->CHSEL = (uint32_t)ch; //这个非常重要,没有这句无法正常获取多通道的AD值