TT Lab
开始
学习 学习路径 课程

电子电路入门 — 传感器输入验证

温室传感器记住了上一个通道

在 TT Lab 中继续学习

目标

用真实的 ngspice 波形,分析太空温室的 ADC 记住上一个通道值的现象,并制作区分误差、模型和收敛的比较报告。

为什么重要

请在学完前面的 DC 负载、RC、ADC 单元之后再进行。会用到 Python 函数、list、dict、异常、文件读取和指数函数。不会向真实设备施加电压。预计需要 120 分钟,所以请在到期之前用“+时间”延长。最多 180 分钟,会话结束时文件会消失。请另行保存需要的代码和报告。

环境与产出物

产出物是 /root/adc-acquisition/analyze.py。镜像中带有 Python3 和 ngspice42。不需要外部下载,也不需要增加权限。提供的 /opt/lab/fixtures/adc_acquisition/simulator.py 中的 capture(cfg,新文件夹),会真正运行固定的电路,并返回 新文件夹/trace.tsv 的路径。同一个文件夹中还会留下 input.cir、config.json、solver.log,并且不会覆盖已有的文件夹。不提供分析与判定的标准答案。

生成波形的辅助程序使用与理论中电路相同的输入开关模型。第一个输入是 high_v,从 1.8µs 到 1.801µs 之间,线性切换为 low_v。控制脉冲从 100ns 开始,上升/下降 1ns,高电平宽度为 acq_s,周期为 1µs。Ron 为 100Ω,Roff 为 10¹²Ω,阈值为 0.5V,初始采样电压为 0V。high_v 只是表示第一个通道的名称,即使比 low_v 低也可以。

配置契约

config 必须是严格的 dict,只接受下面 8 个键。所有数值都拒绝 bool、字符串、NaN、无穷大。bits 必须是严格的 int,其余接受 int 或 float,并以 float 返回。

键 单位与允许范围
rs_ohm Ω,100 到 10000(含)
cap_f F,10e-12 到 40e-12(含)
acq_s s,100e-9 到 350e-9(含)
dt_s s,5e-12 或 2.5e-12
high_v·low_v V,各自在 0 到 vref_v(含),两个值互不相同
vref_v V,1 到 5(含);用于码宽换算,不是电路电源模型
bits 严格的 int,8 到 16(含);用于码宽换算

波形与观测契约

read_trace 接收普通文件,最大 256MiB,除空行外的数据为 2 到 2,000,000 行。表头是以空白分隔、按 time v(vin) v(gate) v(hold) 顺序排列。每行是 4 个有限 float,时间必须不小于 0 且严格递增,第一个时间在 1ns 以下,最后一个时间必须与 3.5µs 在绝对 1e-15 秒以内相同。错误的内容为 ValueError,操作系统的文件错误可以原样传递。对已验证的 points 调用 sample 时,不需要每次调用都重复整个验证。

observe 的观测时刻,对 k=0..3 是 100e-9+k*1e-6+acq_s+27e-9 秒。目标列表是 high_v,high_v,low_v,low_v。每个 hold 的末尾是 min((k+1)*1e-6+50e-9,3.5e-6) 秒。返回的键有:times_s(四个时刻)、targets_v(四个目标)、samples_v(四个保持电压)、hold_drift_v(从每次观测到 hold 末尾的绝对变化的最大值)。如果偏离输入、gate、hold 的条件,则为 ValueError。不要修改波形和配置。

预测与判定契约

predict 按 Vnew=Vtarget+(Vold−Vtarget)*exp(−(acq_s+1e-9)/((rs_ohm+100)*cap_f)) 沿用上一次的结果。起始 Vold=0,目标是上面的 4 个。在这个解析公式中,忽略断开期间有限的泄漏。

assess 只使用 observed 的 samples_v 和 targets_v。请检查长度为 4、非 bool 的有限数值,以及配置中的目标列表。返回的键有 max_model_error_v、model_consistent、error_lsb、decision、all_pass。model_error 是观测与 predict 的最大绝对差,model_consistent 是是否在 100µV 以内的 bool。error_lsb 是把每个 |观测−目标| 除以 vref_v/(2**bits) 得到的 4 个值。

如果模型不一致,则 decision 的 4 项都是 invalid_model。如果一致,则对每个绝对电压误差 e,当 e+10µV≤0.5LSB 时为 pass,当 e−10µV>0.5LSB 时为 fail,其余为 borderline。只有四个都是 pass 时,all_pass 才为 True。10µV 是本实验的判断余量区间,并不是实物测量不确定度的认证值。

条件比较与 CLI 契约

campaign 接收 2 到 6 个配置组成的严格 list,全部验证之后再运行。所有输入的 dt_s 必须是 5e-12。runner(cfg) 是返回波形文件路径的提供调用。对每个条件,先用原配置的副本执行 runner→analyze,接着用只把 dt_s 改为 2.5e-12 的副本执行 runner→analyze。一个条件的两次运行结束后,再运行下一个条件,并且不修改原输入。运行异常要传递给调用方。

返回的是 schema=1、runs、candidate_indices、scope='ideal-switched-rc-only'。runs 按输入顺序,每一项包含 coarse、fine(各自的 analyze 报告)、difference_v(四个保持电压的最大绝对差)、converged(差值≤10µV 的 bool)。candidate_indices 是已收敛、且两侧 all_pass 都为 True 的条件的从 0 开始的索引列表。没有候选时是空列表,不要与错误混淆。如果同时改变了不同的变量,就不能仅凭这个列表断定各原因的效果。

main(argv) 接收两个参数:设置列表的 JSON 文件,以及尚不存在的输出文件夹路径。验证 JSON 中所有配置和默认 dt 之后,再创建输出文件夹(父文件夹必须已存在)。把 /opt/lab/fixtures/adc_acquisition 放入 sys.path,读取 simulator.capture。每次调用 runner,都以 输出文件夹/run-00、run-01、…… 这样的新子文件夹来调用 capture。把 campaign 的结果以一行 JSON 输出到 stdout,并返回 0。参数、配置、文件、运行的 Exception,要输出一行 {"error":"analysis_failed"} 并返回 2,不要输出 traceback。失败之前已经生成的新证据不要删除。import 时不执行 CLI,只在直接运行时,才以 main 的返回值退出。

第 8 步提供的示例列表是 /opt/lab/fixtures/adc_acquisition/cases.json。要亲自确认,请像下面这样用新的文件夹名称运行,并连同报告一起查看 input.cir、config.json、solver.log、trace.tsv。报告文件也要选择不会覆盖已有资料的名称。

python3 /root/adc-acquisition/analyze.py /opt/lab/fixtures/adc_acquisition/cases.json /root/adc-acquisition/trial-01 > /root/adc-acquisition/report-01.json

步骤

  1. 明确数字与单位:实现 config(value)。检查下面 8 个键的类型和范围,并返回没有修改原始数据的新 dict。只有 bits 规范化为 int,其余规范化为 float,错误的值为 ValueError。
  2. 只读取完整生成的波形:read_trace(path) 检查下面的 TSV 契约,并返回包含四个 float 的 tuple 的 list。请检查 UTF-8、以空白分隔的表头、行数、大小、有限数值、时间顺序、起始/结束范围。忽略空行。不要修改波形。
  3. 对观测时刻做插值:sample(points,when,col=3) 在已验证的波形上,对该时刻做线性插值。col 是严格的 int 1、2、3,when 是非 bool 的有限数值,允许两个端点。超出时间范围或错误的列为 ValueError。
  4. 区分输入、开关、保持电压:observe(cfg,points) 用 config 验证之后,计算四个观测时刻和目标电压。观测时 gate 的绝对值,以及 vin 与目标之差,都必须在 1µV 以下。sample 电压与 hold 末尾电压的最大差,也必须在 1µV 以下。返回下面的观测 dict。
  5. 沿用上一次的采集电压:predict(cfg) 验证配置之后,从初始 0V 开始,通过对第一通道采集两次、第二通道采集两次的递推公式,返回 4 个电压的 list。连接时间是 acq_s+1ns,电阻是 rs_ohm+100Ω。
  6. 分离误差、模型与边界判定:assess(cfg,observed) 按照下面的判定契约,返回 LSB 误差、与解析公式的最大差、模型一致、四个采样点的判定以及 all_pass。观测 dict 的 samples_v 和 targets_v 是 4 个有限数值,如果目标列表与配置不同,则为 ValueError。
  7. 根据真实文件生成报告:analyze(cfg,trace_path) 把 config→read_trace→observe→assess 连起来,返回包含 schema=1、config、observation、assessment 四个键的 dict。文件损坏不要变成成功报告,而要传递出去。
  8. 把条件比较与真实 CLI 连起来:按照下面的契约实现 campaign(configs,runner)、main(argv) 和 CLI 入口。先验证所有配置,对每个条件分别分析 5ps 和 2.5ps 的波形,同时确认收敛和两侧的判定。用真实的 ngspice 和单独的 CLI 进程进行检查。

参考

评分用临时文件夹中的另外的波形来检查函数,最后一步还会运行真实的 ngspice 和单独的 CLI 进程。不会修改学员文件夹,只清理检查专用的文件夹。如果只返回示例数字,在其他电压方向和条件下就会失败。因为要处理约 70 万到 140 万行的波形,请不要同时启动多个运行。请保留一个输出文件夹,来审查结果。

只在理想开关 RC 模型之内选择候选。不验证真实 ADC 的电荷注入、噪声、保护电路、温度、非线性和真实缓冲器的稳定性。这不是连接设备或施加物理电压的课题。

明确数字与单位

实现 config(value)。检查下面 8 个键的类型和范围,并返回没有修改原始数据的新 dict。只有 bits 规范化为 int,其余规范化为 float,错误的值为 ValueError。

bool 的行为也像 int,但不能作为电路的电阻值接收。请在计算之前,把单位统一为秒、法拉、欧姆。

只读取完整生成的波形

read_trace(path) 检查下面的 TSV 契约,并返回包含四个 float 的 tuple 的 list。请检查 UTF-8、以空白分隔的表头、行数、大小、有限数值、时间顺序、起始/结束范围。忽略空行。不要修改波形。

不要仅凭退出码或文件存在,就判断波形已经完整。对于过大的文件,要在读取内容之前先检查大小。

对观测时刻做插值

sample(points,when,col=3) 在已验证的波形上,对该时刻做线性插值。col 是严格的 int 1、2、3,when 是非 bool 的有限数值,允许两个端点。超出时间范围或错误的列为 ValueError。

直接使用最近的下一行,与在两行之间做插值,是两回事。不要用最后一个值去填充范围之外。

区分输入、开关、保持电压

observe(cfg,points) 用 config 验证之后,计算四个观测时刻和目标电压。观测时 gate 的绝对值,以及 vin 与目标之差,都必须在 1µV 以下。sample 电压与 hold 末尾电压的最大差,也必须在 1µV 以下。返回下面的观测 dict。

如果把 v(vin) 当作采样结果,残留误差就会消失。不要把时间公式中的 27ns 与解析公式中的 1ns 混淆。

沿用上一次的采集电压

predict(cfg) 验证配置之后,从初始 0V 开始,通过对第一通道采集两次、第二通道采集两次的递推公式,返回 4 个电压的 list。连接时间是 acq_s+1ns,电阻是 rs_ohm+100Ω。

如果把整个周期当作充电时间,或者每次都初始化为 0V,就是在计算另一个模型。

分离误差、模型与边界判定

assess(cfg,observed) 按照下面的判定契约,返回 LSB 误差、与解析公式的最大差、模型一致、四个采样点的判定以及 all_pass。观测 dict 的 samples_v 和 targets_v 是 4 个有限数值,如果目标列表与配置不同,则为 ValueError。

100µV 的模型对照容差,与 10µV 的判断余量区间,作用是不同的。不要把 borderline 提升为成功。

根据真实文件生成报告

analyze(cfg,trace_path) 把 config→read_trace→observe→assess 连起来,返回包含 schema=1、config、observation、assessment 四个键的 dict。文件损坏不要变成成功报告,而要传递出去。

要区分目标值、预测值、观测值,并保留原始波形和原始配置。不要用返回示例数值的函数来代替。

把条件比较与真实 CLI 连起来

按照下面的契约实现 campaign(configs,runner)、main(argv) 和 CLI 入口。先验证所有配置,对每个条件分别分析 5ps 和 2.5ps 的波形,同时确认收敛和两侧的判定。用真实的 ngspice 和单独的 CLI 进程进行检查。

通过的候选,只在所明确指定的模型之内才是候选。不要把运行失败变成空的成功列表,也不要覆盖之前的输出文件夹。