一个关于STM32F207 AD采集正弦信号不稳定的话题
扫描二维码
随时随地手机看文章
前言
客户W在使用STM32F207VET6做一款电源监控产品,STM32通过ADC采集一路正弦波信号。发现ADC采集的数据总会不定时的出现异常波动。采集完成后即使对数据进行处理,最后还是有会有一些异常数据无法消除。
硬件环境:STM32F207VET6 ST-Link仿真器
软件环境:MDK Matlab
ADC数据的处理
ADC采集完的数据一般都需要有滤波算法进行处理。因为单次的数据采集,有很多的随机因素导致采集数据不准,常见的干扰源由以下几点:
高斯白噪声:这是一种正态分布的随机噪声,功率谱密度服从均匀分布,幅值分布服从高斯分布。对于此种噪声,我们可以通过取算术平均值的方式将其噪声去掉。
固定频率的噪声:比如在被采集的信号源有一个固定频率的噪声会周期性的影响被采集信号。对此种噪声,我们可以通过提高采集频率,软件中实现数字滤波的方式进行去除。
随机噪声:这种噪声是没有规律的噪声,有可能是数据采集错误,或者是意外的参考电压波动引起的。一般可以适用中值平均滤波算法来降低这种随机信号对数据的影响。对于水位、液压、温度等缓慢变化的信号有很好的滤波效果,但是对于数据变化较快的信号并不适用。
针对STM系列的MCU如何提高采集信号的精度,有对应的应用文档来进行介绍:
AN4073(针对STM32F2/F4xx)
AN2834(针对STM32F10x)
AN3137(针对STM8Lxx)
在AN4073中,一些通用的方式来降低系统噪声的办法有如下几种。
现场检查
在仔细查看了客户的原理图与硬件PCB布线后,并没有发现硬件中有什么问题。但是在数据的采集中,的确会发现有一些数据明显高于其他测试点的值,类似下图:
首先,建议客户修改滤波算法。客户以前在时域不做任何滤波工作的,而是直接将采集到的数据进行频域转换,在频域中进行滤波操作。建议客户在采集数据之后,马上进行滤波(因为在时域上已经可以明显的看到异常数据了)。
增加上滤波算法后是可以减少一些‘毛刺’的出现,但是因为噪声的随机性和客户的真实数据就是正弦波,客户最后还需要将时域的数据转换到频域进行计算,在最后的结果中还有‘不和谐’的因素在里边。
其次,通过查看勘误手册,关于系统限制的说明中有关于噪声的说明。所以修改MCU的系统配置参数进行尝试。
注意,这个问题并不是写在ADC部分,而是写在了勘误手册的系统设计限制中。
这里说的很清楚,MCU的内部会产生噪声对ADC的精度造成影响。解决的办法就是关闭ART加速器的预取功能并通过取平均值的滤波算法来实现降低这个干扰。
于是请客户按照我们的参考文档AN4073中所描述的方式进行操作。
最后,发现此方法对于降低异常数据有更好的效果,采集到的数据的稳定性能够进一步的提高。但因为这个部分的噪声来源于MCU内部(MCU只要工作,这个噪声就是存在的),也无法做到100%消除这种异常值。且此计算需要时间(一次计算大概需要2ms),客户的对于时间的要求很严格,需要有大量的应用功能需要计算。异常值对于在频域的功率因数等参数的影响又较大,故此种方式并不适用客户的实际应用场合。但客户也肯定了我们这样的ADC对于采集直流信号,噪声为高斯白噪声的情况下是适用的。采集速度也比较快。
小结: 对于不同的场合,根据不同的噪声类型,我们可能需要对ADC采集到的信号进行处理。具体到STM32F2和STM32F4,因为系统设计的限制,MCU 内部的噪声会对ADC的采集精度造成一定的影响,所以必须将ART加速器的预取功能关闭(数据缓存 指令缓存 打开)。对于采集交流信号源,并需要在频域做相关处理的领域不太合适,主要是对于功率因数的计算产生影响较大。但是对于一般的直流信号的采集还是非常不错的。