STM32F407关于ADC 性能问题讨论

        最近在开发一个产品,使用STM32F407的ADC功能,在调试前期,ADC极其不稳定,波动很大。就连原子哥也对其ADC性能提出质疑。结果果真如此吗?

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

        1、模数电源和地分离;

        2、提供独立VDDA稳压电源;

        3、相关滤波电容的选择;

        4、良好的布局

        5、输入阻抗的匹配等

        此类问题在网上讨论很多,就在此不详述。

       

       我这边设计的PCB基本按照上述要求,进行设计,可是在代码调试期间ADC波动很大,仅仅测量模拟地信号最大都有9LSB的波动,相比于STM32F103的只有1个LSB波动,的确就差远了。

 

      这边测量1000组数据分析的结果:

     

******************************** 微气压传感器**************************************
//===================================================================原始代码
//------------------------------------第一组
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%。当时也很绝望。

   通过STM32官网资料,进行FALSH 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

  后来发现ADC性能不仅受VDDA控制,VDDA越稳定越好,同时VDD的影响也是不容忽视,后来做了一个电路,去动态适配VDD,电路如下:

微信号:dingzj2000

    原理就是先测量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,去除最大,最小值,获取的微气压的数据),测量结果如下:

微信号:dingzj2000​​​​

测试数据没有波动,适当提高采样率,数据响应也很及时。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章