STM32F407 ADC性能优化实战:从波动到稳定
STM32F407 ADC性能优化实战:从波动到稳定
在使用STM32F407开发产品时,遇到了ADC性能不稳定的问题。通过一系列硬件和软件优化措施,最终显著改善了ADC的稳定性。本文详细记录了优化过程和实验数据,为遇到类似问题的工程师提供参考。
最近在开发一个产品时,使用STM32F407的ADC功能,在调试前期发现ADC极其不稳定,波动很大。就连业内知名的原子哥也对其ADC性能提出质疑。那么,STM32F407的ADC性能真的像传闻中那么差吗?让我们一起来看看具体的优化过程。
硬件设计基础
在软件调试之前,一个良好的硬件设计是保证ADC性能优越的前提条件。比如:
- 模数电源和地分离
- 提供独立VDDA稳压电源
- 相关滤波电容的选择
- 良好的布局
- 输入阻抗的匹配等
这些基础设计问题在网上讨论很多,本文不再详述。我这边设计的PCB基本按照上述要求进行设计,但在代码调试期间ADC波动仍然很大,仅仅测量模拟地信号最大都有9LSB的波动,相比于STM32F103的只有1个LSB波动,的确差了不少。
初始测试结果
下面是测量1000组数据的分析结果:
(ps:一共测试3组数据,每一组采样1000个样本数据,采样周期200ms,耗时200s,下同。)
******************************** 微气压传感器**************************************
//===================================================================原始代码
//------------------------------------第一组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 10
标准差 = 3
LSB0 -> 157, 15.700%
LSB[±1,±3) -> 525, 52.500%
LSB[±3,±5) -> 156, 15.600%
LSB[±5,±8) -> 136, 13.600%
LSB[±8,±10] -> 26, 2.600%
LSB >±10 -> 0, 0.000%
//-----------------------------------第二组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 9
标准差 = 3
LSB0 -> 149, 14.900%
LSB[±1,±3) -> 535, 53.500%
LSB[±3,±5) -> 172, 17.200%
LSB[±5,±8) -> 116, 11.600%
LSB[±8,±10] -> 28, 2.800%
LSB >±10 -> 0, 0.000%
//-----------------------------------第三组
statistics analysis
测试样本数 = 1000
平均值 = 1934
方差 = 9
标准差 = 3
LSB0 -> 149, 14.900%
LSB[±1,±3) -> 471, 47.100%
LSB[±3,±5) -> 238, 23.800%
LSB[±5,±8) -> 120, 12.000%
LSB[±8,±10] -> 22, 2.200%
LSB >±10 -> 0, 0.000%
通过测试结果发现,方差在10左右,在[±8,±10]的波动占比高到2.8%。当时也很绝望!
第一步优化:FLASH ART配置
通过STM32官网资料,进行FLASH ART配置,测量结果如下:
//===================================================================FALSH ART 配置
//-----------------------------------第一组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 2
标准差 = 1
LSB0 -> 311, 31.100%
LSB[±1,±3) -> 611, 61.100%
LSB[±3,±5) -> 74, 7.400%
LSB[±5,±8) -> 4, 0.400%
LSB[±8,±10] -> 0, 0.000%
LSB >±10 -> 0, 0.000%
//-----------------------------------第二组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 2
标准差 = 1
LSB0 -> 341, 34.100%
LSB[±1,±3) -> 561, 56.100%
LSB[±3,±5) -> 94, 9.400%
LSB[±5,±8) -> 3, 0.300%
LSB[±8,±10] -> 1, 0.100%
LSB >±10 -> 0, 0.000%
//-----------------------------------第三组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 2
标准差 = 1
LSB0 -> 305, 30.500%
LSB[±1,±3) -> 602, 60.200%
LSB[±3,±5) -> 88, 8.800%
LSB[±5,±8) -> 5, 0.500%
LSB[±8,±10] -> 0, 0.000%
LSB >±10 -> 0, 0.000%
经过ART配置,一下子有了一个大的飞跃。方差也有10降低到了2,ADC值±2之内(包括±2)的数据集中度,由原来的66%搞到到目前的90%左右。心中那个暗喜啊,难道这就满足了吗,NO,NO,NO
第二步优化:VDD动态适配
后来发现ADC性能不仅受VDDA控制,VDDA越稳定越好,同时VDD(数字电源)的影响也是不容忽视,后来做了一个电路,去动态适配VDD,电路如下:
整个CPU数字电源去供电电压是2.5V(DVCC), 模拟电源VDDA是2.5V单独供电。
原理就是先测量VDD电压,查看是否有偏移2.5V,有偏离,在通过DAC进行电路调节,达到稳定VDD的目的。经过改造,测试结果如下:
//===================================================================FALSH ART 配置 + V2.5 ADJ
//-----------------------------------第一组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 1
标准差 = 1
LSB0 -> 317, 31.700%
LSB[±1,±3) -> 644, 64.400%
LSB[±3,±5) -> 35, 3.500%
LSB[±5,±8) -> 4, 0.400%
LSB[±8,±10] -> 0, 0.000%
LSB >±10 -> 0, 0.000%
//-----------------------------------第二组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 1
标准差 = 1
LSB0 -> 336, 33.600%
LSB[±1,±3) -> 615, 61.500%
LSB[±3,±5) -> 48, 4.800%
LSB[±5,±8) -> 1, 0.100%
LSB[±8,±10] -> 0, 0.000%
LSB >±10 -> 0, 0.000%
//-----------------------------------第三组
statistics analysis
测试样本数 = 1000
平均值 = 1933
方差 = 1
标准差 = 1
LSB0 -> 346, 34.600%
LSB[±1,±3) -> 610, 61.000%
LSB[±3,±5) -> 42, 4.200%
LSB[±5,±8) -> 2, 0.200%
LSB[±8,±10] -> 0, 0.000%
LSB >±10 -> 0, 0.000%
经过对比,方差已经降到1,ADC值±2之内(包括±2)的数据集中度,由原来的66%搞到到目前的95%;
达到了设计目的。
总结
通过以上优化措施,取得了以下显著效果:
- 1000组数据的方差由原来的10提高到1;
- ADC值的等于平均值的分布由原来的14%提高目前的31%;
- ADC值±2之内(包括±2)的数据集中度,由原来的66%搞到到目前的95%;
- ADC值在[±3,±4]的波动由原来的18%降低3%
- ADC值超过±5的波动,由原来的14%降低到0.3%
通过数据可以发现,采集的数据越来越接近平均值。对于超过±3的数据只占整个采样数据的3%,在通过软件滤波,去除最大、最小值,再取平均值,即可将这些离散大的点滤掉。这样软件滤波+硬件适配相兼容,结果更加优越。
使用微气压传感器(软件滤波,滤波深度为8,(去除最小值、最大值,在取平均值,获取的微气压的数据),测量结果如下:
测试数据没有波动,适当提高采样率,采用滑动滤波,数据响应也非常及时。
总体而言,STM32F407 ADC性能不像网上说的那么差劲,总体性能还是可以的!