最近我们在开发一个项目时,用到了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. 四十二、Linux 线程——线程同步之条件变量之线程状态转换

    42.1 线程状态转换 42.1.1 状态转换图 42.1.2 一个线程计算,多个线程获取的案例 #include <stdio.h> #include <stdlib.h> ...

  2. 二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  3. 获取当前div以外所有部分

    $("功能区域的id").click(function(e){ $(this).show(); e.stopPropagation();//阻止冒泡 }); $("父类区 ...

  4. Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection

    学习目标 Understand the challenges of Object Localization, Object Detection and Landmark Finding Underst ...

  5. Linux常用功能及实现命令

    1.设置node.npm.appium等命令全局访问 因为 /opt/node/bin这个目录是不在环境变量中的,所以只能到该目录下才能执行node命令,如果在任意目录下执行node命令的话 ,必须通 ...

  6. Python使用的技巧

    1. 给你一个字符串 a, 请你输出逆序之后的a. 例如:a=‘xydz’ 则输出:zdyx a=a[::-1] print(a) 扩展:Python切片操作. 2. 给你两个正整数a和b, 输出它们 ...

  7. 【mmall】递归查询子节点并排重

    代码 @Override public ServerResponse getSelfAndChildrenCategory(Integer categoryId) { if (categoryId ! ...

  8. Angular4

    1.安装node.js 官网下载安装 npm会跟着被自动安装 2.安装Angular工具(AngularCli) 1.使用npm安装 npm install -g @angular/cli 2使用cn ...

  9. NoClassDefFound Error: com/fasterxml/jackson/annotation/JsonAutoDetect

    少了 jackson-annotation https://blog.csdn.net/qq_36497454/article/details/80461676

  10. Latex 编辑数学公式——快速上手

    参考链接: https://blog.csdn.net/fansongy/article/details/45368915 特殊符号: https://blog.csdn.net/caiandyong ...