今天調試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官方庫的方式與直接操作寄存器的方式理論上效果應該是一致的,但實測發現,利用直接操作寄存器的方式仍存在干擾。這個問題未能發現原因。