车载MCU的ADC采集,ADC采集值不准时有发生,很多时候经过滤波处理后就解决了,**但是有一类ADC采集值偏低的问题,不管软件怎么平均,怎么滤波,都解决不了。本质的原因是外部电路RC滤波电路参数与MCU内部的ADC的采样参数没有匹配上,采样时间不足,内部采样电容没有充满,导致采集值低。**本文基于多个项目踩坑教训,尝试说明白为什么会采样偏低,以及如何进行匹配估算。
为了说明白这个问题,前面铺垫了两篇SAR-ADC的架构、转换流程和如何实现逐次逼近的电压比对转换的。
SAR ADC 入门:特点、硬件架构与完整转换流程梳理_s32k314 adc的采样速率-CSDN博客
SAR‑ADC底层逻辑:如何通过开关控制切换电容值实现逐次逼近过程_sar adc电容阵列-CSDN博客
感兴趣可以简单了解。切回本文正题。
一 为什么ADC采样电压会偏低
以下是典型的ADC采样电路的简化等效示意图,回顾下这个转换过程。

最左侧是需要采样的电压源VIN,中间是电容RC滤波电路,右侧是ADC内部等效电路。
包括外围电路在内的完整的充电过程。
- VIN 通过RIN(认为是信号源内阻+滤波串阻) 电容CIN充电。
- 采样开关闭合,输入电容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
软件采样时间小于硬件电路的建立时间,存在采集偏低风险。
解决措施:
- 减小外部硬件电路的串阻;
- 软件增大采样数时间配置(调时钟ADC.MCR ADCLKSEL或者采样周期数CTR1INPSAMP)
总结:
- ADC 采集值偏低的问题,原因是外部电路RC滤波电路参数与MCU内部的ADC的采样参数没有匹配上,采样时间不足,内部采样电容没有充满,导致采集值低。
- 定量评估:可以通过电路建立时间t_settle和t_samp来进行评估;
- t_settle 是硬件决定的建立时间,与外部RC电路、内部ADC硬件参数有关,,t_samp是软件配置决定的采样充电时间,与采样时钟个数和ADC_clk配置有关。
参考文档:
- NXP S32K3XXRM_Rev 5
- NXP AN13413 模数转换器指南--规格与配置
- NXP S32K3xx - Hardware Design Guidelines -- Rev_D3