问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F407 ADC性能优化实战:从波动到稳定

创作时间:
作者:
@小白创作中心

STM32F407 ADC性能优化实战:从波动到稳定

引用
CSDN
1.
https://blog.csdn.net/dingzj2000/article/details/106387412

在使用STM32F407开发产品时,遇到了ADC性能不稳定的问题。通过一系列硬件和软件优化措施,最终显著改善了ADC的稳定性。本文详细记录了优化过程和实验数据,为遇到类似问题的工程师提供参考。

最近在开发一个产品时,使用STM32F407的ADC功能,在调试前期发现ADC极其不稳定,波动很大。就连业内知名的原子哥也对其ADC性能提出质疑。那么,STM32F407的ADC性能真的像传闻中那么差吗?让我们一起来看看具体的优化过程。

硬件设计基础

在软件调试之前,一个良好的硬件设计是保证ADC性能优越的前提条件。比如:

  1. 模数电源和地分离
  2. 提供独立VDDA稳压电源
  3. 相关滤波电容的选择
  4. 良好的布局
  5. 输入阻抗的匹配等

这些基础设计问题在网上讨论很多,本文不再详述。我这边设计的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%;

达到了设计目的。

总结

通过以上优化措施,取得了以下显著效果:

  1. 1000组数据的方差由原来的10提高到1;
  2. ADC值的等于平均值的分布由原来的14%提高目前的31%;
  3. ADC值±2之内(包括±2)的数据集中度,由原来的66%搞到到目前的95%;
  4. ADC值在[±3,±4]的波动由原来的18%降低3%
  5. ADC值超过±5的波动,由原来的14%降低到0.3%

通过数据可以发现,采集的数据越来越接近平均值。对于超过±3的数据只占整个采样数据的3%,在通过软件滤波,去除最大、最小值,再取平均值,即可将这些离散大的点滤掉。这样软件滤波+硬件适配相兼容,结果更加优越。

使用微气压传感器(软件滤波,滤波深度为8,(去除最小值、最大值,在取平均值,获取的微气压的数据),测量结果如下:

测试数据没有波动,适当提高采样率,采用滑动滤波,数据响应也非常及时。

总体而言,STM32F407 ADC性能不像网上说的那么差劲,总体性能还是可以的!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号