MCU内部ADC模块误差如何校准

news2025/2/2 15:04:47

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。

一、ADC误差校准引言

MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调,增益误差,微分非线性误差 (DNL),积分非线性误差(INL),绝对精度误差) 和 5 个动态参数 (信噪比,信噪失真比,无杂 散动态范围,有效位,总谐波失真) 。其中, 静态失调和增益误差是可以利用微控制器 MCU 进行修正, 可以通过软件算法, 也可以通过硬件固化的方式进行补偿。本文提供一种两点法 ADC 模块误差校正并结合硬件计算的方式来完成 ADC 的误差补偿。 ADC 静态失调被定义为第一次理想编码跳变与第一次实际编码跳变之间的偏差。第一次理想编码跳变发生在 0.5 LSB 处。如果输入电压小于 0.5 LSB 时输出代码大于零,则 ADC 产生正失调误差。如果输入电压大于 0.5 LSB 时发生第一次输出编码跳变,则 ADC 产生负失调误差,参考如下

图1 ADC静态失调图

ADC增益误差被定义为补偿失调误差后理想 ADC 传输的最后一步中点与实际 ADC 的最后一步中点的偏差,参考如下图 2所示。

图2 ADC增益误差图

为理解ADC静态失调和ADC增益误差(文中将以Offset error和Gain error指代),通过下图3来进行说明。

图3 ADC模块Offset error(左图)和Gain error(右图)

如图3(左)所示,在理想的ADC转换中,数字输出为000时理想的模拟电压输入范围应为0~0.5LSB,而实际模拟输入在0~2LSB时数字输出均为000,那么此时的Offset error即为1.5LSB。如图3(右)可知,当输入模拟信号为8LSB时实际数字输出比理想输出小1LSB,即Gain error为1LSB并且是负向error。MCU的Datasheet中可以查找到如下图4 ADC误差电气参数特性,可以看到在使用内部电压参考时Gain error为±45LSB,这在精密应用场景可能会带来不小的影响。同时除了被重点关注的Gain error和offset error,ADC可能还会存在INL error(积分非线性误差)、DNL error(微分非线性误差)共同决定了实际采样转换的非线性度。

图4 ADC误差电气参数(摘自F2800137数据手册)

二、ADC模块误差校准方案

1. 传统单点法校准失调和增益误差的方案

单点ADC校准方案通常是外部提供一个固定的电压参考点(在全域输入电压范围内选取),使用一个采样通道定时对该参考点进行采样,计算出该点误差后直接同步校准到整个电压输入域。

该方案的劣势在于单点的误差无法完全反应全域的误差,单纯使用单点的误差状态推广到全域进行校准,会存在无法达到预期校准精度的可能,如下图5所示。

图 5. 单点ADC误差校准

2. 使用两点法校准失调和增益误差的方案

实际上ADC在全域输入模拟电压范围内每一个点的Offset error和Gain error是不尽相同的,并且是非线性的,但出于性价比考虑这边提出一种实现成本最优的ADC两点动态校准法,如下图6所示:

图6. 双点ADC误差校准

如上图 6 所示,两点校准法需要在全域模拟输入内选取两个点 AinA(Vref1)和 AinB(Vref2)进行曲线 拟合、校准。

具体实施过程:

1. 本案例在当 ADC 输入模拟电压大于 0.4432V 左右时执行误差校准程序(Note:在低电压 0~0.4432V 范围 ADC 转换误差较小);

2. 计算 Gain error 比(实质就是斜率之比)

3. 计算各点的 Offset error:

a) 计算 A 点的 Offset error: CalOffsetA = AoutA_idea − (AoutA_actual ∗ CalGain)

b) 计算 B 点的 Offset error: CalOffsetB = AoutB_idea − (AoutB_actual ∗ CalGain)

c) 计算两点的平均 Offset error: CalOffsetAve = (CalOffsetL + CalOffsetH)/ 2

4. 设定一个非线性的误差补偿比:

a) 计算当前点之于非线性起始点的偏移量:CalNonP = ADCOUT_actual / AoutA_idea (其中ADCOUT_actual 为当前采样输出的 AD 值,AoutA_idea为非线性补偿段的起始点,此处以 A 点代指,此值不固定、应以实际调试为准);

b) 计算补偿值:CalOffsetNonL=(CalNonP * CalOffsetAve)/x (其中 x 为常量, 手动调节的补偿放大比例);

由于 ADC 误差实际表现的非线性,为得到更为精确的补偿,本案例将校准分为两段式补偿:低区 误差补偿(AinS ~ AinA 段,如上图 6 所示)、高区误差补偿(AinA ~ AinB 段)。 将计算所得参数带入输出误差校准公式:

低区误差补偿公式:CaliAout = ADCOUT_actual ∗ CalGain + CaiOffsetA

高区误差补偿公式:CaliAout = ADCOUT_actual ∗ CalGain + CaiOffsetAve + CalOffsetNonL 注:实际应用中为提高动态特性,需在特定时间内调用一次误差补偿程序以实时更新补偿量。

图7. 两点校准实施实例

三、校准中常见的问题

如图 8 所示,C2000 产品 ADC 模块有不同静态误差特性,利用上述误差补偿的算法来实现 ADC 误差校准。针对单点方案, 无论是参考电压源或高精度电阻, 对参考器件特性要求很高。 针对两点方案, ADC 校准效果取决于参考点选择, 以及校准算法,要求实时性。然而, F28P65x 新一代 Type-4 ADC 模块硬件计算模块可以保证校准实时性, 同时减小 CPU 的带宽。

图8. 不同 C2000 产品系列 ADC 误差特性(左图-校准前;右图-校准后)

四、总结

本案例通过实验验证 ADC 两点校准的有效性,同时在 C2000 系列芯片中导入应用(包含但不限 于 F280013x/F28002x/F28003x/F28004x/F28P6x/F28P5x)。若进一步优化算法, ADC 高精度可 进一步提升,实际应用中可根据使用场景进行适配。但需注意的是确保两个输入参考点的稳定、 准确。此外,最新一代 C2000 F28P65 ADC 模块的全新特性(求和、平均、求最大/小值)在 ADC 误差校准过程中可以提供更高效的处理过程,使得 ADC 动态校准具备了实际可行的可能性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2290819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust自学】15.4. Drop trait:告别手动清理,释放即安全

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.4.1. Drop trait的意义 类型如果实现了Drop trait,就可以让程序员自定义当值离开作用域时发生的操作。例如文件、网络资源…

【Block总结】CPCA,通道优先卷积注意力|即插即用

论文信息 标题: Channel Prior Convolutional Attention for Medical Image Segmentation 论文链接: arxiv.org 代码链接: GitHub 创新点 本文提出了一种新的通道优先卷积注意力(CPCA)机制,旨在解决医学图像分割中存在的低对比度和显著…

信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2

【题目链接】 ybt 1607:【 例 2】任务安排 2 洛谷 P10979 任务安排 2 注:ybt1607中n最大达到 1 0 4 10^4 104,洛谷P10979中n最大达到 3 ∗ 1 0 5 3*10^5 3∗105,本题解统一认为n最大达到 3 ∗ 1 0 5 3*10^5 3∗105。 【题目考点…

OFDM系统仿真

1️⃣ OFDM的原理 1.1 介绍 OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。 1.2 OFDM的核心 多载波调制…

【Go语言圣经】第四节:复合数据类型

第四章:复合数据类型 本节主要讨论四种类型——数组、slice、map和结构体。 数组和结构体都是有固定内存大小的数据结构。相比之下,slice 和 map 则是动态的数据结构,它们可以根据需要动态增长。 4.1 数组 数组是一个定长的由特定类型元素…

完美还是完成?把握好度,辨证看待

完美还是完成? 如果说之前这个答案有争议,那么现在,答案毋庸置疑 ■为什么完美大于完成 ●时间成本: 做事不仅要考虑结果,还要考虑时间和精力,要说十年磨一剑的确质量更好,但是现实没有那么多…

Many Whelps! Handle It! (10 player) Many Whelps! Handle It! (25 player)

http://db.nfuwow.com/80/?achievement4403 http://db.nfuwow.com/80/?achievement4406 最少扣你50DKP! 第二阶段 当奥妮克希亚升空后,在10秒内引出50只奥妮克希亚雏龙,随后击败奥妮克希亚。 World of Warcraft [CLASSIC][80猎人][Grandel][最少扣你5…

【React】PureComponent 和 Component 的区别

前言 在 React 中,PureComponent 和 Component 都是用于创建组件的基类,但它们有一个主要的区别:PureComponent 会给类组件默认加一个shouldComponentUpdate周期函数。在此周期函数中,它对props 和 state (新老的属性/状态)会做一…

MongoDb user自定义 role 添加 action(collStats, EstimateDocumentCount)

使用 mongosh cd mongsh_bin_path mongosh “mongodb://user:passip:port/db”这样就直接进入了对应的db 直接输入: 这样 role “read_only_role" 就获得了3个 action, 分别是 查询,列举集合,集合元数据查询 P.S: 如果没有 …

蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组

闪耀的灯光 📌 题目描述 蓝桥公园是一个适合夜间散步的好地方,公园可以被视为由 n m 个矩形区域构成。每个区域都有一盏灯,初始亮度为 a[i][j]。 小蓝可以选择一个大的矩形区域,并按下开关一次,这将使得该区域内每盏…

C++初阶 -- 手撕string类(模拟实现string类)

目录 一、string类的成员变量 二、构造函数 2.1 无参版本 2.2 有参版本 2.3 缺省值版本 三、析构函数 四、拷贝构造函数 五、c_str函数 六、operator重载 七、size函数 八、迭代器iterator 8.1 正常版本 8.2 const版本 九、operator[] 9.1 正常版本 9.2 const版…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心:这是一个Unity粒子系统自带的一种功能,可将粒子生成控制在一个Texture图片网格范围内,并且粒子颜色会自动采样图片的像素点颜色,之后则是粒子编辑出消散效果。 Particle System1物体(爆发式随机速度扩散10000个粒…

85.[1] 攻防世界 WEB easyphp

进入靶场 属于代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;常用于调试或展示代码 highlight_file(__FILE__);// 初始化两个标志变量&#xff0c;用于后续条件判断 $key1 0; $key2 0;// 从 GET 请求中获取参数 a 和 b $a $_GET[a]; $b $_GET[b];// 检…

pytorch图神经网络处理图结构数据

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类能够处理图结构数据的深度学习模型。图结构数据由节点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&a…

海外问卷调查,最常用到的渠道查有什么特殊之处

市场调研&#xff0c;包含市场调查和市场研究两个步骤&#xff0c;是企业和机构根据经营方向而做出的决策问题&#xff0c;最终通过海外问卷调查中的渠道查&#xff0c;来系统地设计、收集、记录、整理、分析、研究市场反馈的工作流程。 市场调研的工作流程包括&#xff1a;确…

【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题

我们在使用uni-popup时&#xff0c;如果想要给弹出内容添加一个背景颜色&#xff0c;我们会发现在安全区域是不显示该背景颜色的。 首先根据如下的目录结构找到uni-popup.vue文件 在该文件中找到bottom配置&#xff0c;将红箭头所指代码注释掉 下面的安全区域就没有了&#xff…

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…

核心集:DeepCore: A Comprehensive Library for CoresetSelection in Deep Learning

目录 一、TL&#xff1b;DR 二、为什么研究核心集&#xff1f; 三、问题定义和如何做 3.1 问题定义 3.2 业界方法 3.2.1 基于几何的方法 3.2.2 基于不确定性的方法 3.2.3 基于误差/损失的方法 3.2.5 GraNd 和 EL2N 分数 3.2.6 重要性采样 3.2.7 基于决策边界的办法 …

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…

可视化相机pose colmap形式的相机内参外参

目录 内参外参转换 可视化相机pose colmap形式的相机内参外参 内参外参转换 def visualize_cameras(cameras, images):fig plt.figure()ax fig.add_subplot(111, projection3d)for image_id, image_data in images.items():qvec image_data[qvec]tvec image_data[tvec]#…