ADC采集时间与通道记忆
一句话总结
即使传感器输出了正确的电压,如果 ADC 的采样电容没有足够的时间移动到该电压,新通道上就会留下上一个通道的痕迹。
为什么需要它
轮流读取太空温室的两个传感器。第一个传感器是 1.8V,第二个传感器是 0.3V。程序明明选择了第二个通道,数字却相当于约 0.764V。是传感器地址写错了,还是缓存残留了?这些都是可能的假设,但在这个模型中,原因是模拟输入的采集时间。在修改代码之前,必须分清哪种状态残留在什么地方。
前一个模块中的 RC 电路一直连接着输入。这里只有在开关闭合时,采样电容才与输入一侧连通。如果把开关断开的时间也算进充电时间,就等于把实际上没有得到的时间算了进去。周期是 1µs,并不意味着电容在 1µs 内都在跟随输入。
工作原理
这次的教学电路由理想电压源、源电阻 Rs、导通电阻为 100Ω 的开关,以及接地的 20pF 采样电容构成。电容的初始电压是 0V。先对第一通道的 1.8V 采集两次,再把输入改为 0.3V,再采集两次。这并不是连接了真实传感器、多路复用 IC 或转换器的厂商模型,而是单独抽取出输入记忆现象的电路。
闭合区间的时间常数是 τ=(Rs+Ron)C。当 Rs=10kΩ、Ron=100Ω、C=20pF 时,τ=202ns。如果上一个电压是 Vold,当前输入是 Vtarget,闭合时间是 T,则下一个电压是 Vtarget+(Vold−Vtarget)exp(−T/τ)。第一次时 Vold=0,但在下一次采集时必须使用紧接着上一次的结果。每次都初始化为 0 的计算,会抹掉通道的记忆。
开关断开时,模型的电阻也不是无穷大,而是 10¹²Ω。因此存在微小的泄漏。在解析公式中,忽略断开区间的泄漏,与仿真比较时允许存在微小的差异。这就是为什么不主张两种计算在数学上完全相同。如果在保持区间内电压发生了很大的变化,应当先确认开关是否真的断开了,以及是否选错了观测时间。
200ns 这个数字也有边界
控制电压在 100ns 之后开始上升,上升和下降各需要 1ns。高电平宽度为 200ns,重复周期为 1µs,开关阈值为 0.5V。开关在上升的中途导通,在下降的中途断开。因此实际的连接时间是 201ns。如果把高电平宽度与实际连接时间用作同一个变量,就会到程序之外去寻找微小误差的原因。
观测在控制电压完全降下来之后的 25ns 时刻进行。第 k 次采集的观测时刻是 100ns+k×1µs+高电平宽度+27ns。这里的 27ns 包括上升 1ns、下降 1ns 和等待 25ns。而解析公式的连接时间,则以阈值为基准使用宽度+1ns。它们并不是同一个时间数字,这就是本实验的关键。
| 采集顺序 | 当前输入 | 标称模型采集后的电压 | 解释 |
|---|---|---|---|
| 第一次 | 1.8V | 约 1.135V | 从 0V 出发,尚未充满 |
| 第二次 | 1.8V | 约 1.554V | 在上一次电压的基础上继续充电 |
| 第三次 | 0.3V | 约 0.764V | 上一个通道的高电压残留 |
| 第四次 | 0.3V | 约 0.471V | 接近新输入,但仍有差距 |
这些数字并不是代替后面课题的标准答案文件。一旦改变输入、电阻、电容和采集宽度,就必须重新计算并读取真实波形。特别是 high_v 和 low_v 这两个字段名,只表示第一个和第二个通道,并不存在前一个值总是更高的约束。还要处理向相反方向切换的输入,才不会把原因硬编码到数值的大小上。
仅仅生成了波形文件是不够的
ngspice 计算这个电路电压随时间的变化。输出中有 time、v(vin)、v(gate)、v(hold) 四列。第一列是秒,其余是伏特。原始输入与保持电压是不同的节点。如果分析器把两列读反,所有误差都会趋近于 0,就会造成非常像样的虚假成功。
读取时要检查表头、四列、有限数值、严格递增的时间,以及起始和最后的时刻。不要仅凭退出码为 0 或文件存在就开始分析。在准备这个课程时,实际上有一次把数值设置收得过紧的运行,虽然波形没有走到终点,进程却以 0 退出。没有数据,与要求条件失败,必须是不同的结果。
如果所需的时刻位于两行之间,就做线性插值。如果直接取下一行,在电压快速变化的区间就会产生时间偏差。反过来,如果波形在 2µs 处结束,却请求 3.327µs 的值,就不能用最后的电压去填充。这不是插值,而是没有依据的外推。如果中间存在重复的时间,分母可能为 0,所以不能让解析器放行。
这次的实现,可以把整个波形读取一次,并在寻找观测时刻时使用二分查找。与对每个采样点都从头扫描全部的方式相比,可以降低重复分析的开销。提供的辅助程序会把仿真器日志、电路、配置和波形一起保存到新文件夹中。为了不让下一次运行覆盖之前的证据,会拒绝已有的输出文件夹。
误差、模型、收敛是三个问题
第一个问题是,采样电压与目标输入相差多少。教学用的码宽是 Vref/2ⁿ。对于 3.3V、12 位,一个 LSB 约为 805.664µV,一半约为 402.832µV。这里不生成真实的转换码,而是把电压误差除以这个宽度。4095 是最大值的编号,并不是这个约定中的状态个数。
第二个问题是,观测是否与我们所计算的电路模型吻合。求出真实波形与沿用上一个电压的解析公式之间的最大差值,并确认是否在 100µV 以内。如果不吻合,就先检查电路、初始条件、节点选择和时间轴。即使把输入电压原样复制为结果,使目标误差变为 0,也必须无法通过模型一致性检查。
第三个问题是,改变数值分析的间隔后,结论是否依然成立。以 5ps 和 2.5ps 的最大时间间隔运行同一个条件,比较四个采样点的最大差值是否在 10µV 以内。收敛比较与解析公式的对照,作用是不同的。因为即使两次运行使用了同一个错误的电路,它们彼此之间也可能一致。反过来,也可能电路是对的,但数值间隔太粗,导致要汇报的位数不稳定。
最终判定设置 10µV 的判断余量区间。绝对误差加上 10µV 之后仍不超过半个 LSB,则为 pass;误差减去 10µV 之后仍大于半个 LSB,则为 fail;介于两者之间,则为 borderline。模型不一致时,四个采样点都标为 invalid_model。不要把 borderline 四舍五入成 pass。这个余量值是本实验的运行约定,并不是所有数值误差的严格上界,也不是实际测量不确定度的认证值。
在现场相遇的样子
在条件比较中,必须说明为什么固定了其他变量。在相同的输入和电容下,把源电阻降到 100Ω 的理想模型,通过了这次半个 LSB 的标准。把采集宽度增加到 350ns 的 10kΩ 模型,误差减小了,但仍没有达到标准。这是一个区分“有所改善”与“已经足够”的简单案例。即使在多个条件中出现了通过的候选,也不意味着选出了可用于真实产品的元件。
如果设计真实的缓冲器,还需要额外验证输出驱动能力、噪声、稳定性、输入范围和电源条件。这次的模型中既没有那个缓冲器本身,也没有 ADC 的电荷注入、保护二极管、非线性和温度偏差。因此,要汇报为“在采样电路中通过的条件”,而不保证实物精度或安全性。这也不是向真实设备施加电压,或连接激光、功率电路的课题。
NXP 的模拟验证岗位公告,要求理解建立时间与 ADC、Python 自动化、基于数据手册的验证计划和结果分析。本课程是为了练习其中一个小的验证周期而设计的,并不能代替真实的芯片验证经验或该岗位的全部要求。
下一项实验要做什么
依次实现配置验证、波形读取、插值、观测、递推预测、误差判定、单次报告、条件比较与 CLI。在最终报告中,同时保留原始配置与观测值、模型差异、是否收敛、有条件的候选。如果只留下候选编号,就无法再说明为什么选择它。请至少实际运行两个条件,并且在输入方向不同的情形下,也核验一下结果。
官方资料与确认范围
- Analog Devices 的 SAR 输入设计说明:可以进一步阅读采集时间、开关电容输入和多路复用信号的建立。不要把正文中特定 ADC 的示例值与这次的教学模型混在一起。
- ngspice 官方基础教程:确认电压源和时域分析的运行方法。本实验中经过运行验证的版本是 42。
- NXP 模拟验证公告 R-10062167:在 2026-09-13 的官方页面搜索索引中确认了要求的能力。教学目标是根据公告内容构成的,并不保证录用。