最近我们在开发一个项目时,用到了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来做模拟量的输入输出。

欢迎关注:

STM32应用实例十五:STM32的ADC通道间干扰的问题的更多相关文章

  1. STM32应用实例十:简析STM32 I2C通讯死锁问题

    I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...

  2. STM32应用实例十四:利用光敏二极管实现光度测量

    最近我们在开发臭氧发生器时,需要监测生成的臭氧的浓度,于是想到使用光度计来测量.因为不同浓度的臭氧对管的吸收作用是不相同的,于是检测光照强度的变化就可以得到相应的浓度数据. 1.硬件设计 此次光照度检 ...

  3. android 学习随笔二十五(动画:补间动画)

    补间动画(TweenAnimation) * 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画(为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果)* 位移.旋转.缩放.透 ...

  4. 【STM32】用DMA实现多路ADC通道数据采集

    今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的 ...

  5. OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  6. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  7. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  8. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  9. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

随机推荐

  1. [译]Managing Vue.js State with Vuex

    原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...

  2. new和delete动态分配和撤销内存

    视频:C++引用及new和delete的使用 一.new用法 使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,动态分配失败,则返回 ...

  3. 对Tomcat部署web应用的方式总结

    对Tomcat部署web应用的方式总结,常见的有以下四种: 1.[使用控制台部署] 访问Http://localhost:8080,并通过Tomcat Manager登录,进入部署界面即可. 2.[利 ...

  4. springfox-swagger2

    简介 springfox是通过注解的形式自动生成API文档,利用它,可以很方便的书写restful API: swagger主要用于展示springfox生成的API文档: 依赖 <depend ...

  5. Shiro入门 - md5+salt测试

    算法分类 典型的散列算法包括 MD2.MD4.MD5 和 SHA-1 待更新... 代码 /** * md5散列算法测试 */ @Test public void testMD5(){ String ...

  6. mysql 与linux ~ 内存分析与调优

    一 简介:linux内存和mysql二 分类   1 用户空间和内核空间      用户空间内存,从低到高分别是五种不同的内存段      1 只读段 包含代码和常量等      2 数据段 包含全局 ...

  7. 二进制学习 wsample01a.exe

    有趣的二进制学习 wsample01a.exe 这是一个基础的入门小程序,点击运行后发现弹出小框,Hello! Windows 用ida静态分析程序,这一段是程序的主逻辑,也是全部逻辑:) 可以看到程 ...

  8. Django学习手册 - 如何安装django 和 python ?

    整体步骤阐述:(windows环境下) 步骤一,下载python安装包 (和 jiango 压缩包) 步骤二,安装python 配置python的环境变量 步骤三,安装djang 方式一:pip in ...

  9. Javascript - ExtJs - TabPanel组件

    示例 Ext.create('Ext.tab.Panel', {     width: "100%",     renderTo: "tabBox",      ...

  10. 51nod 1232 完美数

    题目思路:数位dp,若这个数能被每位的非0数整除,那么这个数一定可以被每一位数的lcm整除,lcm(1,2,3,4,5,6,7,8,9) = 2520,所以可以通过将这个数对2520取模来压缩空间,取 ...