前几天用STM32F103C8T6做了个多路电压采样的小东西,用到了ADC的多通道DMA方式传输。使用过程中发现问题,也就是网上都在说的通道间存在干扰的问题。
原理图如下:
这两个是旋钮式的电位器,分别通过一个1K的电阻接到单片机的AD管脚上,采样得到的电压值通过数码管实时显示。
ADC管脚是PA5和PA6,它们两个既属于ADC1也属于ADC2,我把它配置成了STM32的ADC1的通道5和通道6。
使用过程中的现象表现为:当两个电位器都不动,数码管显示两路的电压值时,值基本是固定的,没有问题。当快速选择一个旋钮,使相应通道的电压剧烈变化时,另一路电压值会受影响,跟随变大或变小。虽然变化幅度不大,但确实存在。
而且这种干扰不是瞬间的,就是说,即便另一路电压停止变化,但前一路受影响增加或减少的电压依然存在。
网上搜了一下,大致知道了问题引发的原因。知道原因之后,再去想办法解决就好说了。
首先明白一点,该单片机内部有两个AD转换器,ADC1和ADC2。每个AD转换器最多有16个通道。我这里使用的是ADC1的通道5和通道6.
其次,工作在DMA模式下,通道5和通道6是自动、快速切换的。AD转换器结构如下:
图有点模糊,网上找的,凑合看吧。多个通道是通过模拟多路开关自动切换的。这就导致,在切换的瞬间上一个通道的电压值干扰到下一个通道。切换速度越快,影响越大,切换之间的时间间隔越久,影响越小。
所以,看到这里,懂的人基本就懂了。解决这个问题,方法大致有几个:
1、精度要求不高的话,把采样周期设置的大一些,越大越好。当然,干扰还是会有,只是会低一些。
2、把通道5和通道6分别配置到ADC1和ADC2上面,彻底隔离。
3、DMA方式一次只配置一个通道,例如先让通道5采集500ms,再让通道6采集500ms,同时前100ms的数据丢掉不用。
4、前几天在网上又看到一个思路,大致意思是在AD管脚上并联一个100nf左右的电容,这种方法我没试过,有试过的童鞋可以说说~
大致就这几个思路,打完收工!