最近我们在开发一个项目时,用到了MCU自带的ADC,在调试过程中发现通道之间村在相互干扰的问题。以前其实也用过好几次,但要求都不高所以没有太关注,此次因为物理量的量程较大,所以看到了变化。 首先来说明一下此次的软硬件环境,MCU采用的是STM32F103VET6,ADC采用自带的ADC1,使用通道6和7。在软件方面,我们使用版本为1.4的HAL库,使用DMA方式采集。 接下来,我们描述一下现象。在下边有两幅截图,左边是只给第二路输入为100%时输入显示99.962%。而右边的图是在第一路输入也添加100%输入时显示的结果,第一路输入为99.9643%而第二路输入变成了100.0418%。 这个影响在只需要显示数值时,没有特别的要求可以忽略,但在控制中有时可能会引起不必要的波动。正好我们此次要求较高,但因周期很急,硬件采用了原来项目中类式的电路,就出现了这一问题。修改硬件肯定是来不及的,只能是想其他办法尽量修正。 1、问题的分析 我们首先收集数据分析,在一路输入为0的情况下,另一路输入0-100%的输入观察第一路的信号变化。分别在55.5个时钟周期和239.5个时钟周期的采样频率下,获得一个通道对另一个通道的影响数据,如下图所示:
由以上两幅图我们可以发现,采样周期越长通道间的相互干扰就越小,反之则越大。一个同到的输入信号越强烈则在另一个通道上在成的干扰信号越强烈,反之则越小。如上图所示,我们对数据作曲线拟合,我们发现最多3次多项式姐可以很好的近似表示他们的关系。 2、相应的措施 有了上述对通道间相互干扰的数据关系的认识,一般来说本通道的输入与输出间应该是一个线性关系,但实际上总会有写偏差,我们测得数据的实际情况同样作曲线拟合。我们发现数据剧本是符合线性关系的,但为了更精确我们也可采用高次多项式,一般三次多项式完全就可满足,如下图所示: 经过上面的分析我们以2个通道为例来获得最终结果。两个同道的输入设为:[X1,X2],两个通道我们想得到的输出为:[Y1,Y2],而两输入对Y1的影响为:[A1,B1],两个输入对Y2的影响为:[A2,B2]。则其函数关系可表示为:Y1=A1*X1+B1*X2和Y2=A2*X2+B2*X1,其中各变量及系数均为向量,根据所想要采取的解析函数确定。 在本次项目中,我们采用三次多项式函数来拟合,所以根据三次多项式来确定上述量及解析目标量。 3、最终的结果 解析完成后,我们再做测试,量通道件的相互干扰可以减少到1%以下,想要完全消除有困难,毕竟只是软件处理。 最终的解决办法是在硬件电路上消除这干扰,如在要求较高时,尽量不要采用MCU自带的ADC和DAC来做模拟量的输入输出。
|