今天调试STM32F103的ADC,使用ADC1单次转换模式进行两通道AD采样,发现两路通道存在烦扰问题。相关AD操作代码如下:
void adc_start_convert(uint8_t ch) { ADC1->SMPR2 = (ADC1->SMPR2 & 0XFFFFFFF8) | 7; ADC1->SQR3 = (ADC1->SQR3 & 0XFFFFFFE0) | ch; ADC_SoftwareStartConvCmd(ADC1, ENABLE); } uint8_t adc_is_convert_finish(void) { if((ADC1->SR&0x02) == 0) return 0; else return 1; } uint16_t adc_get_value(void) { return ADC1 -> DR; }
进过多次调试,最终的解决方式如下:
1.修改ADC时钟频率
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
2.修改ADC启动转换函数
void adc_start_convert(uint8_t ch) { ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_13Cycles5); // ADC1->SMPR2 = (ADC1->SMPR2 & 0XFFFFFFF8) | 7; // ADC1->SQR3 = (ADC1->SQR3 & 0XFFFFFFE0) | ch; ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
对于解决步骤(2),利用STM32官方库的方式与直接操作寄存器的方式理论上效果应该是一致的,但实测发现,利用直接操作寄存器的方式仍存在干扰。这个问题未能发现原因。