最近在开发一个产品,使用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,电路如下:
原理就是先测量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性能不像网上说的那么差劲,总体性能还是可以的!