STM32应用实例十五:STM32的ADC通道间干扰的问题
最近我们在开发一个项目时,用到了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通道间干扰的问题的更多相关文章
- STM32应用实例十:简析STM32 I2C通讯死锁问题
I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...
- STM32应用实例十四:利用光敏二极管实现光度测量
最近我们在开发臭氧发生器时,需要监测生成的臭氧的浓度,于是想到使用光度计来测量.因为不同浓度的臭氧对管的吸收作用是不相同的,于是检测光照强度的变化就可以得到相应的浓度数据. 1.硬件设计 此次光照度检 ...
- android 学习随笔二十五(动画:补间动画)
补间动画(TweenAnimation) * 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画(为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果)* 位移.旋转.缩放.透 ...
- 【STM32】用DMA实现多路ADC通道数据采集
今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的 ...
- OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- Bootstrap<基础十五> 输入框组
Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...
- 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]
无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...
随机推荐
- 九、uboot 代码流程分析---relloc_code
执行完 board_init_f 后,重新跳转回 _main 中执行. 9.1 relloc_code 前 9.1.1 gd 设置 在调用board_init_f()完成板卡与全局结构体变量 gd 的 ...
- 【python小练】0000
第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 from PIL import Image, ImageDraw, Im ...
- class按传递时分析
class FEF{ public: int a; FEF(int a,int b){ this->a = a*b; } }; void mam(FEF a){ printf("%d ...
- bootstrap table 冻结列 ie 兼容
修改前: Chrome效果 Ie11效果 修改后: Ie11效果 修改bootstrap-table-fixed-columns.js文件 修改其中的initBody方法 修改为
- git详细介绍
Git管理我们的代码会经历三个不过程 1. 工作区:没有提交的代码就是存放的工作区 2. 暂存区:通过 git add 文件名 命令提交代码该文件就放在暂存区 3. 历史区:通过 git commit ...
- Python转义字符&字符串运算符
Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a ...
- KeyUp 和KeyDown 、KeyPress之间的区别
keydown:用户在键盘上按下某按键是发生.一直按着某按键则会不断触发(opera浏览器除外). keypress:用户按下一个按键,并产生一个字符时发生(也就是类似shift.alt.ctrl之类 ...
- 小程序开发-Step1
先申请一个小程序 https://mp.weixin.qq.com/wxopen/waregister?action=step1 根据以上链接步骤一步一步来,认识字就可以完成,没什么特殊的 申请成功之 ...
- 【blog】SpringMVC接收数组
页面 var idsArray = new Array(); idsArray.push(userId); SpringMVC @RequestParam(value = "ids[]&qu ...
- 委托(作用:解耦),lambda的演化
1.了解委托 MyDelegate类代码如下: using System; using System.Collections.Generic; using System.Linq; using Sys ...