【STM32系列】提升ADC采样精度的方法
资料地址
兆易创新GigaDevice-资料下载兆易创新GD32 MCU

ADC简介
- ADC转换包括采样、保持、量化、编码四个步骤。
- 的采样电容上,即在采样开关 SW 关闭的过程中,外部输入信号通过外部的输入电阻 RAIN 和以及 ADC 采样电阻 RADC 对采样电容 CADC 充电。采样阶段需要在规定的采样时间内将外部信号的电压完整无误的采样到 ADC。Vref+需要在量化的过程中保持稳定。
- ADC的性能指标一般分为" 静态性能参数 "和" 动态性能参数 "
每次采样过程可以简化为:外部信号通过输入阻抗以及采样电阻对采样电容的充电电阻对采样电容的充电(即采样电容零状态的单位阶跃响应)。

误差
- 以下几种就是静态性能参数。
- 采样时间结束后,采样误差表示为采样电容上的电压与信号源上的电压差值。在一次理想的采样过程中,这个电压差值应该保持在0.5LSB以内(LSB为逐次逼近型ADC(SAR ADC)的最小电压分辨率,0.5LSB为SAR ADC的量化误差)。
偏置误差

增益误差

微分非线性误差

积分非线性误差

ADC采样信号FFT频谱图
以下就是ADC采样的动态性能参数。

信噪比(SNR)

信纳比(SNDR)

有效位数(ENOB)

总谐波系数(THD)

采样周期Ts与外部输入电阻Rain
此处仅说结论,推导过程可以在资料中找到!

故在设计SAR ADC的外围电路时,首先就要考虑其采样时间Ts和外部信号源内阻,如果忽略这些基本参数,那么采样结果很难达到理想的精度。
RC滤波与采样
此处仅说结论,推导过程可以在资料中找到!


提高精度的几种方法和注意事项
MUC供电电源
- 一般的的单片机内部都会有一个精准的内部参考源(典型电压2.5V),可以用作ADC工作时的电压,该内部参考电压可以连接到Vref引脚上,但是需要注意的是,其内部参考源带载能力不强,谨慎选择所带负载大小。
- 量化编码过程中,Vref+需要给转化电容网络充电在量化过程中,也会有对基准源抽 取电荷的作,因此,如果没有其他的去耦措施,一个稳健且干净的 Vref+基准会显著影响 ADC 量化的精度,建议对于这两个电源采用纹波噪声系数更小的 LDO 来供电。
- 对于 VREF+基准源,建议靠近引脚并联一个 uF 级以及一个 nF 级的去耦电容,一方面可以滤除来自外部低频与高频的电源噪声,另一方面,也可使 ADC 在量化编码过程的基准源更加稳定。
- 在 layout 过程中,相关电源线的走线上,推荐加宽电源迹线,以减小迹线的 ESR,在量化阶段,减小转化电容网络瞬间充电对输入基准源的影响。
引脚电容

参考电压设置

IO口引入超范围电压

信号源输入电阻的影响
当信号源输入电阻不满足要求
假设锂电池的电压为24V,用R1=9MΩ、R2=1MΩ的电阻分压,然后将分压结果送进ADC通道进行采样,其并联得到的输出阻抗为0.9MΩ。

改善方法
- 添加一个运放跟随电路,实现阻抗匹配。
- 如果对于采样率没有要求的情况下,我们可以降低 ADC 的采样时钟,变相提高采样时间来使 得采样电容充电到正确电位。
- 在功耗要求可以放宽时,我们可以同比例缩小 R1,R2 两个电阻,比如 R1=900k,R2=100k,此时该分压电路的输出阻抗变为90k,配置合适的采样周期,已经能够满足ADC的阻抗要求。
保证ADC采样精度的改善方法
- 对于极大输入阻抗,我们添加了一颗电容来限制单次采样时的电压跌落或上升毛刺的幅值,但是此种情形下,需要在每两次采样之间添加足够的时延给内部采样电容充电,以保证采样开关关闭时,采样电容上的电压与外部信号的电压差在量化误差范围一列。
- 当 ADC 工作在连续采样或者扫描采样时,如果由于输入阻抗过大,且未被及时修正时,输入阻抗过大通道的采样结果会受前一个采样通道信号的影响,通过增大采样时间以满足输入阻抗的影响会显著改善这个现象。
I/O引脚串扰

- 在引脚规划上,就需要提前规划将那些需要持续翻转的数字 I/O 在物理位置上远离 ADC 采样通道。
- 如果由于资源限制,频繁翻转的数字 I/O 无法远离模拟采样口,我们可以在后期 layout 上采取一些措施来减弱影响,比如我们可以通过在数字 I/O 与模拟通道之间加上一定面积的 GND 来隔离。
- 此外,减慢数字信号的边沿也会减弱串扰的影响,如对数字信号添加电容值适当的电容,减慢 MCU 数字 IO 口的驱动速度,也能显著减慢这个数字信号边沿。
- 在数字 I/O 口不翻转的时候进行一次 ADC 转换,当然前提是应用允许这么做。

软件提高ADC采样精度
- 使用ADC片上硬件过采样。

- 不具备片上硬件过采样单元的 MCU,软件算法上亦可采用常用的一些滤波算法来降低输入信号采样值的波动。例如最常见的平均算法,滤波过程中需要占用CPU的算力与一定的RAM空间。这种平均算法适用于输入信号变化慢,偶有脉冲型干扰的情形。如果信号变化频率已经大于这个平均滤波算法的执行频率,则会丢失信号变化的细节,平均后的采样结果不能重现信号的所有信息。此平均算法一般只用于采样直流小信号,不建议用于采样交流连续信号(例如正弦波等等)。
相关文章:
【STM32系列】提升ADC采样精度的方法
资料地址 兆易创新GigaDevice-资料下载兆易创新GD32 MCU ADC简介 ADC转换包括采样、保持、量化、编码四个步骤。的采样电容上,即在采样开关 SW 关闭的过程中,外部输入信号通过外部的输入电阻 RAIN 和以及 ADC 采样电阻 RADC 对采样电容 CADC 充电。采样…...
前端面试如何出彩
1、原型链和作用域链说不太清,主要表现在寄生组合继承和extends继承的区别和new做了什么。2、推荐我的两篇文章:若川:面试官问:能否模拟实现JS的new操作符、若川:面试官问:JS的继承 3、数组构造函数上有哪些…...
Linux 切换用户的两种方法
sudo -su user1 与 su - user1 都可以让当前用户切换到 user1 的身份执行命令或进入该用户的交互式 Shell。但它们在权限认证方式、环境变量继承和 Shell 初始化过程等方面存在一些差异。 权限认证方式 su - user1 su 是 “switch user” 的缩写,默认情况下需要你输…...
Spring Boot 3 中Bean的配置和实例化详解
一、引言 在Java企业级开发领域,Spring Boot凭借其简洁、快速、高效的特点,迅速成为了众多开发者的首选框架。Spring Boot通过自动配置、起步依赖等特性,极大地简化了Spring应用的搭建和开发过程。而在Spring Boot的众多核心特性中ÿ…...
Vue实现留言板(实现增删改查)注意:自己引入Vue.js哦
代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scri…...
IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】
1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址:https://start.spring.io/ 修改为阿里云Server URL地址:https://star…...
读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存
检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…...
HTML前端开发-- Iconfont 矢量图库使用简介
一、SVG 简介及基础语法 1. SVG 简介 SVG(Scalable Vector Graphics)是一种基于 XML 的矢量图形格式,用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真,非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
RocketMQ面试题合集
消费者获取消息是从Master Broker还是Slave Broker获取? Master Broker宕机,Slave Broker会自动切换为Master Broker吗? 这种Master-Slave模式不是彻底的高可用模式,他没法实现自动把Slave切换为Master。在RocketMQ 4.5之后&…...
Qt初识_对象树
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 什么是对象树 为什么要引…...
axios的get和post请求,关于携带参数相关的讲解一下
在使用 Axios 发送 HTTP 请求时,GET 和 POST 请求携带参数的方式有所不同。以下是关于这两种请求方法携带参数的详细讲解: GET 请求携带参数 对于 GET 请求,参数通常附加在 URL 之后,以查询字符串的形式传递。 直接在 URL 中拼接…...
Vue前端开发-路由其他配置
在路由文件中,除了跳转配置外,还可以进行路径重定向配置,如果没有找到对应的地址,还可以实现404的配置,同时,如果某个页面需要权限登录,还可以进行路由守卫配置,接下来,分…...
框架建设实战7——定时任务组件
在金融系统中,或者其他对账系统里,往往离不开分布式定时任务。用来做查证或者重试处理。 分布式job目前一般有如下三种: 1.elastic job 当当出品,比较老牌。新公司用的应该不多了。 2.xxl-job 个人开源项目。便于二开;有简洁的后管配置界面,方便接入。 3.powerjob …...
mybatis 整合 ehcache
pom.xml <!-- ehcache依赖 --><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.1.0</version></dependency>ehcache.xml <?xml version"1.0" en…...
【PlantUML系列】用例图(三)
目录 一、组成部分 二、典型案例 一、组成部分 参与者(Actors):使用关键字 actor 后跟参与者的名称。用例(Use Cases):使用关键字 usecase 后跟用例的名称和编号(可选)。系统边界…...
发送请求时遇到了数据库完整性约束错误 1048 Column ‘platform‘ cannot be null
可以这样解决 在 Vue 2 中封装接口请求时,确保每次请求都包含 platform Header 参数的最佳实践是通过创建一个全局的 Axios 实例,并为这个实例设置默认的 Header。这样可以确保所有通过该实例发送的请求都会自动包含 platform 参数。此外,你…...
三菱FX3U模拟量产品的介绍
FX3u可编程控制器模拟量产品包括:特殊适配器、特殊功能模块的连接 1、连接在FX3U可编程控制器的左侧。 2、连接特殊适配器时,需要功能扩展板。 3、最多可以连接4台模拟量特殊适配器。 4、使用高速输入输出特殊适配器时,请将模拟量特殊适配器连…...
pdf转图片
目录 pdf2image库 PyMuPDF库 python-office库 pdfplumber库 pdf2image库 安装:pip install pdf2image 使用时会报错:pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH? 需要安装 po…...
Go 协程上下文切换的代价
在 Go 语言中,协程(Goroutine)是一种非常轻量级的并发执行单元,设计之初就是为了简化并发编程并提高性能。协程的上下文切换被认为是非常高效的,但是它的真正性能优势需要我们深入了解其背后的机制。 本文将深入探讨 …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...


