STM32的ADC采样DMA方式通道间有干扰-解决思路

前几天用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的数据丢掉不用。

大致就这几个思路,打完收工!

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据