草庐IT

ADC相关电路的总结及提高ADC采样精度的方法(以STM32F系列为例)

粉色挖掘机 2023-04-28 原文

目录

ADC基本原理简介

ADC准确性指标

ADC经典结构图

 提高ADC采样精度的方法


ADC基本原理简介

逐次逼近寄存器型模数转换器(SAR ADC)占据着大部分的中等至高分辨率ADC市场。SAR ADC的采样速率最高可达5Msps,分辨率为8位至18位。SAR架构允许高性能、低功耗ADC采用小尺寸封装,适合对尺寸要求严格的系统。

 ADC转换包括采样、保持、量化、编码四个步骤。采样阶段需要在规定的采样时间内将外部信号的电压完整无误的采样到ADC的采样电容上,即在采样开关SW关闭的过程中,外部输入信号通过外部的输入电阻RAIN和以及ADC采样电阻RADC对采样电容CADC充电。如图下图所示。

 每次采样过程可以简化为外部信号通过输入阻抗以及采样电阻对采样电容的充电(即采样电容零状态的单位阶跃响应),ADC采样阶段单位阶跃响应如下图所示。

当采样时间结束后,采样误差表示为采样电容上的电压与信号源上的电压差值。在一次理想的采样过程中,这个电压差值应该保持在0.5LSB以内(LSB为SAR ADC的最小的电压分辨率,0.5LSB为SAR ADC的量化误差)。

量化阶段,将采样开关SW打开,然后由ADC时钟驱动,基于切换电容技术,将ADC采样电容上的电压逐次与不同权重的参考电压做比较,逐位确定N位数据每一位上的值(N为ADC的采样位数),然后编码输出数字码值。在量化过程中,参考电压VREF+需要对切换电容网络进行充电。VREF+基准需要在量化过程中保持稳定。

ADC准确性指标

ET(Total Unadjusted Error)总不可调整误差:实际转换曲线与理想转换曲线之间最大的偏离。在最糟糕的一点,通过ADC得到的电压,与实际电压的差值。通俗讲就是最不准的一点差多少。

EO(Offset Error)偏置误差: ADC的偏置误差定义为第一个码字转换(从0x00到0x01)所对应的实际电压偏离理想电压位置的差值。

EG(Gain Error)增益误差:ADC的增益误差是指最后一次码字转换中实际转换与理想转换点电压之间(对于12bit ADC来说,即从0xFFE到0xFFF)的差值。

ED(Differential Linearity Error)微分非线性误差:微分非线性误差定义为实际量化台阶宽度与对应于1LSB的理想电压值之间的差异。指每一个码字宽度偏离理想的1LSB的程度。计算方法为每个码字模拟量的宽度减去一个LSB的值,当码字宽度大于一个LSB宽度时,ED为正值,反之,ED为负值。

EL(Integral Linearity Error)积分非线性误差:积分非线性误差是指一个码字的实际输入点与传输函数线上理想输入之间的偏移。传输函数线可以定义为第一次实际转换与最后一次实际转换所连接的线,即ADC的偏置和增益误差点之间的一条直线。

ADC经典结构图

以STM32F10x为例的ADC经典结构图如上图所示。其中,IO引脚上下两个二极管的作用为防止引脚外部过高、过低的电压输入。当引脚电压高于VDD+0.6V时,上方二极管导通;当引脚电压低于-0.6V时,下方二极管导通,防止不正常电压引入芯片导致芯片烧毁。IL是指输入漏电流,即流入流出ADC输入端的直流电流,这个电流由器件内部的ESD保护和其他参数引入,通常为微安或纳安级别,图例中显示输入漏电流的范围为±1uA。外部输入信号通过外部的输入电阻RAIN和以及ADC采样电阻RADC对采样电容CADC充电,每次采样过程可以简化为外部信号通过输入阻抗以及采样电阻对采样电容的充电。

 提高ADC采样精度的方法

1.稳定参考电压

ADC转换结果为输入电压与参考电压的比值,如果参考电压不准确,转换结果也会不准确。

由于在量化编码的过程中,VREF+需要对转化电容网络充电,在量化过程中,也会有对基准源抽取电荷的动作,因此,如果没有其他的去耦措施,一个稳健且干净的VREF+基准会显著影响ADC量化的精度,我们建议对于这两个电源采用纹波噪声系数更小的LDO来供电。对于VREF+基准源,我们建议靠近引脚并联一个uF级以及一个nF级的去耦电容,一方面可以滤除来自外部低频与高频的电源噪声,另一方面,也可使ADC在量化编码过程的基准源更加稳定。

在layout过程中,相关电源线的走线上,我们推荐加宽电源迹线,以减小迹线的ESR,在量化阶段,减小转化电容网络瞬间充电对输入基准源的影响。

相同的情况,在一些场景中,VDD与VREF+来自同一颗LDO,然后在LDO与VREF+之间串联一颗磁珠,如下图VREF+串联磁珠图所示,以屏蔽外部电源对于VREF+的影响。

这里需要注意选择磁珠时,需要关注磁珠的RDC(直流电阻)参数,应当优先选取RDC小的型号,以减小在磁珠上造成的直流压降。直流电阻小,通常磁珠的高频处的阻抗也会小,因此这也是一个抗干扰与采样精度的权衡过程。另外,通常不建议在此处将磁珠换成电感,由于VREF+在量化编码过程中,会存在高频的脉冲电流,如果靠近VREF+引脚的去耦电容设置不合适,则比较容易引起VREF+电压的震荡,影响ADC的精度。

微控制器在执行指令时会在内部电源网络上产生一些不容忽视的噪声,降低系统噪声可关注一下几点:在即将开始ADC转换时,避免启动任何通信外设的数据传输,IO的切换可能会在供电电压中产生噪声;避免切换高灌电流IO,因为会在电源中产生噪声纹波;避免在同一IO端口上切换数字输出,因为A/D输入正在被转换,这会引入切换噪声。

2.合理设置ADC参考电压

根据ADC输入信号幅值范围设置合理的VREF+,或者根据配置完毕的VREF+设置合理的ADC信号输入范围。

举个例子:

当输入信号电压范围为0-2.6 V时,若设置VREF+为3.6 V,采样信号进入GD32 MCU 12bit ADC,在忽略采样误差的前提下,可以得出采样结果数字量范围为0-2958,采样结果能够分辨出0.9 mV的电压,然而对于2759-4095之间的采样码值均未出现;若改版硬件,使得VREF+为2.6 V,此时,采样结果数字量范围为0-4095,ADC能够分辨出的最小电压为0.6 mV。显然后者均有更高的采样精度。

因此在项目的硬件设计阶段,如果对于采样精度有要求的前提下,我们需要评估下ADC输入信号的电压范围,配置输入信号电压的最大值略小于VREF+,以提高采样精度。

3.合理设置输入阻抗与采样周期

从前文理论分析可知,SAR ADC采样对于信号的输入电阻是有明确要求的,对于一个具体的ADC,其采样电阻RADC与采样电容CADC已经不可更改,当ADC的采样时钟,采样周期等可配置参数配置完毕时,则外部信号的输入阻抗则是有一个范围要求,当要求误差范围小鱼0.5LSB时,即公式:

RAINmax<TSfADC*CADC*ln2N+1-RADC

配置的不同的采样周期所对应的最大输入电阻,在对应MCU型号datasheet中会给出。

例如,STM32F103系列datasheet中有:

4.软件提高ADC采样精度

取平均值有助于消除模拟输入上的噪声或错误转换的影响,当使用此方法时,采样数最好为2的倍数,这会使平均计算更有效率,因为对转换值之和求平均时的除法可通过右移做到,这样可以节省CPU时间和执行除法算法所需要的代码存储器(在Cortex-Mx内核中,右移操作仅需要1个CPU周期)。

有部分系列MCU中具有片上硬件过采样功能,硬件过采样单元执行数据预处理以减轻CPU负担。同样的,片上硬件过采样单元执行两个功能:求和和位右移。

有关ADC相关电路的总结及提高ADC采样精度的方法(以STM32F系列为例)的更多相关文章

  1. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  2. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  6. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  7. ruby - 使用指向 ruby​​ 可执行文件的符号链接(symbolic link)时查找相关库 - 2

    假设您有一个可执行文件foo.rb,其库bar.rb的布局如下:/bin/foo.rb/lib/bar.rb在foo.rb的header中放置以下要求以在bar.rb中引入功能:requireFile.dirname(__FILE__)+"../lib/bar.rb"只要对foo.rb的所有调用都是直接的,这就可以正常工作。如果你把$HOME/project和符号链接(symboliclink)foo.rb放入$HOME/usr/bin,然后__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rb关于foo.rb的目录名.我意识到像ruby​​gems这

  8. HarmonyOS原子化服务开发相关术语 - 2

    术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助

  9. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  10. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

随机推荐