车载ADC避坑:为什么ADC采集值偏低?

车载MCU的ADC采集,ADC采集值不准时有发生,很多时候经过滤波处理后就解决了,**但是有一类ADC采集值偏低的问题,不管软件怎么平均,怎么滤波,都解决不了。本质的原因是外部电路RC滤波电路参数与MCU内部的ADC的采样参数没有匹配上,采样时间不足,内部采样电容没有充满,导致采集值低。**本文基于多个项目踩坑教训,尝试说明白为什么会采样偏低,以及如何进行匹配估算。

为了说明白这个问题,前面铺垫了两篇SAR-ADC的架构、转换流程和如何实现逐次逼近的电压比对转换的。

SAR ADC 入门:特点、硬件架构与完整转换流程梳理_s32k314 adc的采样速率-CSDN博客

SAR‑ADC底层逻辑:如何通过开关控制切换电容值实现逐次逼近过程_sar adc电容阵列-CSDN博客

感兴趣可以简单了解。切回本文正题。

一 为什么ADC采样电压会偏低

以下是典型的ADC采样电路的简化等效示意图,回顾下这个转换过程。

最左侧是需要采样的电压源VIN,中间是电容RC滤波电路,右侧是ADC内部等效电路。

包括外围电路在内的完整的充电过程。

  1. VIN 通过RIN(认为是信号源内阻+滤波串阻) 电容CIN充电。
  2. 采样开关闭合,输入电容CIN 通过采样开关SW和Rsh给采样电容Csh充电。

很显然,当RIN(信号源内阻+滤波串阻)增大时,给CIN和Csh充电时间都会增长,当这个时间大于软件配置所决定的采样充电时间时,Csh就会未被充满就采样,就会导致采样电压偏低。

所以,在NXP的官方文档《模数转换器指南------规格与配置》中,有如下明确描述:

不过文章说的Rs在ds中有描述,在S32K3系列DS和RM中没找到,如果有人找到,帮我贴在评论区。

这样仅仅定性起来理解似乎就很容易解释ADC采集电压偏低了。

那么如果要定量计算呢?到底如何评估需要多大的RC,内部的采样充电时间又改如何计算呢?

二 如何定量评估电路与ADC配置是否适配,会不会存在上述偏低风险

我们先来定义两个时间量:

电路建立时间:t_settle

字面含义,这部分是外围电路纯硬件固有决定的,有信号源内阻+滤波串阻+线束寄生+ADC内部线组、开关阻抗等电阻形成R,和输入电容CIN+采样电容Csh,形成RC电路。不随软件配置变化。

总得建立时间t_settle=RIN*(CIN+Csh)

2.ADC配置的采样充电时间:t_samp

看完前两篇,就能了解,这里指的是采样电容充电时间。这部分是软件灵活配置的,有ADC时钟和寄存器参数共同决定。

t_settle比较简单,这里先不展开了。

先解决比较难搞得t_samp是如何通过配置信息来估算的。

以NXP S32K3XX系列单片机为例,t_samp=ST(ctr0/1/2寄存器配置)*T_ADCclk

为什么是这样呢?看看寄存器描述。

以标准输入ADC input的采样时间配置寄存器CTR1为例,RM中明确说明了功能描述为:定义了采样(sampling)阶段需要多少个转换时钟。该寄存器仅配置采样保持阶段占用多少个 ADC_CLK。

所以这个寄存器参数乘以ADC_clk就是采样时间。

具体是下面这几个Bit。可以看到这个寄存器最小值是8个clk。

另外,在Self-Test Configuration 1 (STCR1)寄存器的对应位中,也有相应的检测,检测要求是这个采样周期的时间要大于8。

在下面这个转换框图里也有对应体现,STCR1是selftest寄存器控制会进行配置比较,然后才会输出INPSAMP到转换模块。

(那么这个寄存器要叫"conversion timing for XX input"呢,为啥不叫Sample timinig(SPTR)?要造成采样和转换这么关键阶段的混淆呢?这地方我也很疑惑,欢迎评论区讨论。)

看到这里,可以明确:CTRxINPSAMP这个寄存器是用来配置采样充电阶段占用几个ADC_clk周期的寄存器。刚知道周期个数也不行,还得知道每个clk是多久。

说完采样周期数,我们来看看CLK如何通过配置确定。

在MCRADCLKSEL中设定,这里可以设定针对Module clock的分频参数。

那么Modeule clock是个什么玩意从哪来呢?

这里可以看到,module clk来自于COER CLK,即内核时钟。RFG_INTF_CLK是用于寄存器读写的CLK。

再从系统时钟树上可以找到这个CORE CLK的来源。截图看不清,大家可以搜索源文件S32K3xx RM 相关章节。

小结汇总下关于ADC CLK描述:

1)在 S32K3 RM中 ADC 时钟框图中,MODULE_CLK``作为 ADC 模块输入时钟,直接来源于 CORE_CLK

2)CORE_CLK 由系统时钟树生成,根据时钟树示意,可选择 FIRC 或者 PLL 作为时钟源并完成预分频得到CORE_CLK。

3)CORE_CLK 送入 ADC 模块后,一方面作为寄存器接口时钟REG_INTF_CLK;另一方面送入 ADC 内部分频器,由ADC.MCR[ADCLKSEL]配置 1/2/4/8 分频,最终输出ADC_CLK,作为 SAR 转换内核的工作时钟。INPSAMP 采样时间、逐次逼近转换时序都基于 ADC_CLK 周期计算。

4)ADC 的 MODULE_CLK 复用 CORE_CLK,不是直接来自外设时钟。CORE_CLK频率改变会直接改变 ADC的MODULE_CLK,进而改变 AD_CLK。这地方应用时也需要适当注意。

三 举例说明ADC配置和外部电路的估算关系

ADC寄存器配置及电路参数

|----|---------------------|----------------------|---------|----------------------------------|
| 序号 | 参数 | 对应寄存器/电路参数 | 配置示例 | 备注 |
| 1 | CORE_CLK | / | 120M | MCU配置的主频率 |
| 2 | ADC分频参数 | ADC.MCR ADCLKSEL | 设置4分频 | ADC在core clk的基础上分频 |
| 3 | 采样充电时间设置 | CTR1INPSAMP | 16 | 采样时间是16*ADC CLK 标准采样通道 |
| 4 | 外部电路参数-滤波电路Rin | Rin | 4.7K | RC组合得到时间常数г |
| 5 | 外部电路参数-滤波电路Cin | Cin | NC | RC组合得到时间常数г |
| 6 | 工程保守建立时间要求 | 9г | 9г | 工程应用需要满足9г才能基本认为电容充满,满足对应采样分辨率要求 |
| 7 | MCU ADC内部硬件电路参数RS | RS | 20Ω | MCU内部 ADC采样线上阻抗 |
| 8 | MCU ADC内部硬件电路参数RAD | RAD | 520Ω | MCU内部 采样开关阻抗 |
| 9 | MCU ADC内部硬件电路参数RSW1 | RSW1 | 1410Ω | MCU内部 通道选择开关阻抗 |
| 10 | MCU ADC内部硬件电路参数CP1 | CP1 | 5.3Pf | PIN脚寄生电容 |
| 11 | MCU ADC内部硬件电路参数CP2 | CP2 | 4.18 Pf | Analog Bus Capacitance |

另外手册也给了一个RAD_INPUT,最大值4.6K,看描述包含采样链路内部所有阻抗,直接用这个带入计算也行,数值应该更偏保守。我这里为了方便了解内部存在哪些阻抗,一一列出带入计算。

(这地方其实不是很确定,另一种理解可能是包含外部信号源内部在内的阻抗要小于4.6K,这样的话实际是对外部电路参数要求了)

第一步:t_samp 软件配置的采样时间计算

CORE_CLK*ADC分频参数=ADC_CLK=30M

T_ADCclk=1/ADC_CLK=33nS

根据采样充电时间设置周期,那么充电时间t_samp= T_ADCclk*16=528nS

第二步:t_settle硬件建立时间计算

г=Rtotal*C=(Rin+Rs+RAD+RSW1)*(CIN+CS+CP1+CP2)=(4.7K+20Ω+520Ω+

1410Ω)*(0+8.32pF+5.3 pF +4.18 pF)=6650Ω*17.8Pf=118.37Ns

工程保守建立时间要求t_settle=9г=119nS*9=1.065uS

第三步:比较这两个值大小

t_samp= 528nS

t_settle=1.065uS

软件采样时间小于硬件电路的建立时间,存在采集偏低风险。

解决措施:

  1. 减小外部硬件电路的串阻;
  2. 软件增大采样数时间配置(调时钟ADC.MCR ADCLKSEL或者采样周期数CTR1INPSAMP

总结:

  1. ADC 采集值偏低的问题,原因是外部电路RC滤波电路参数与MCU内部的ADC的采样参数没有匹配上,采样时间不足,内部采样电容没有充满,导致采集值低。
  2. 定量评估:可以通过电路建立时间t_settle和t_samp来进行评估;
  3. t_settle 是硬件决定的建立时间,与外部RC电路、内部ADC硬件参数有关,,t_samp是软件配置决定的采样充电时间,与采样时钟个数和ADC_clk配置有关。

参考文档:

  1. NXP S32K3XXRM_Rev 5
  2. NXP AN13413 模数转换器指南--规格与配置
  3. NXP S32K3xx - Hardware Design Guidelines -- Rev_D3
相关推荐
jianqiang.xue1 小时前
ESP-IDF保姆级入门39|固件安全与安全启动全解:签名校验/Flash加密/防回滚/OTP密钥/知识产权保护,掌握工业级固件安全防护体系
单片机·物联网·esp32
llilian_161 小时前
时间统一系统 高精度时统设备选购避坑指南 授时系统
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
en.en..1 小时前
sizeof与strlen的区别(附UDP网络编程实战坑点)
单片机·嵌入式硬件
AOI小白新手上路1 小时前
韦东山IMX6ULL快速入门路线
嵌入式硬件
糖糖单片机设计2 小时前
基于 STM32 的智能净水器系统
stm32·单片机·嵌入式硬件
zcmodeltech2 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
llilian_162 小时前
标准时间间隔发生器应用解决方案 脉冲发生器 时间测量仪
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
桀人2 小时前
STM32之GPIO四种输出模式——P-MOS和N-MOS管的工作原理——双二极管钳位保护电路——上拉电阻
stm32·单片机·嵌入式硬件
HRTOS2 小时前
HRTOS 4.0 DEBUG:面向 8051 实时系统运行状态的轻量级调试组件
单片机·嵌入式硬件·51单片机