本帖最后由 灰色与青 于 2025-7-3 19:13 编辑
在一个使用STM32F103 的项目中,ADC 采样值波动很大,即使输入电压稳定,采样结果也会有 ±5 个 LSB 的跳动。
排查过程:
检查电源和地,发现 ADC 参考电压 VREF + 有轻微波动
查看 ADC 配置,发现采样时间设置过短 (55.5 周期)
检查 PCB 布局,发现模拟地和数字地没有分开
解决方案:
在 VREF + 和 GND 之间添加 10μF 和 0.1μF 去耦电容
增加 ADC 采样时间到 239.5 周期
改进 PCB 布局,将模拟地和数字地分开,最后单点连接
同时软件也增加滤波
// 原来的ADC初始化代码
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_55Cycles5;
// 修改后的ADC初始化代码
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_239Cycles5;
// 增加软件滤波
#define ADC_FILTER_N 8
uint16_t ADC_Filter(uint8_t channel)
{
uint32_t sum = 0;
uint8_t i;
for(i = 0; i < ADC_FILTER_N; i++)
{
sum += ADC_GetConversionValue(ADC1);
delay_ms(1);
}
return (uint16_t)(sum / ADC_FILTER_N);
}
|