← 返回嵌入式学习资料第 8 章 · ADC、传感器与校准

CHAPTER 8 · MEASUREMENT AND SENSORS

ADC、传感器与校准
让每个读数有条件

从参考电压、采样保持和原始码开始,追踪传感器数据链、校准误差、滤波质量与测量交付;把主机模型、目标机事实和停止条件明确分开。

6 个一级单元50 个递进小节主机路径可复现

TEXTBOOK MAP

CHAPTER 8 · MAP

从模拟输入到可复查测量

六个一级单元对应六种能力:建立 ADC 模型、安排采样、拆解传感器、完成校准、选择滤波、交付测量。

先确认读数从哪里来
  • 01 ADC 码值与参考
  • 02 采样保持与时序
再把读数变成可用数据
  • 03 传感器数据链
  • 04 校准与误差预算
最后交付带边界的结论
  • 05 滤波与质量
  • 06 测量证据与交付

小节数量按认知任务变化:传感器数据链和交付需要更多递进步骤;每个单元都保留无目标机主机路径。

使用方式:先从左侧选择一个测量认知,再按 ADC 模型、采样、传感器、校准、滤波和交付推进。每个单元底部有前后翻页;小节标题直接说明正在追踪的参考、采样、原始码、系数、延迟或质量。
主机边界:默认使用标准库模型、C 源文件和测量序列;没有目标板也能完成换算、拟合、滤波和故障注入。
目标机边界:真实参考电压、输入建立、传感器安装、环境、温漂、噪声、仪器和安全范围必须回到当前芯片、器件、板卡和官方资料。

01 · ADC MEASUREMENT MODEL

模数转换模型:从电压到码值

ADC 把连续的电压输入映射成有限位宽的数字码,但参考电压、输入范围、分辨率、量化、偏置、增益和输入拓扑共同决定码值的含义。本单元先建立从引脚到工程量的模型,再区分转换器能测到的事实与软件想象出来的精度。

看懂画出电压到码值的路径。
说清区分分辨率与准确度。
开始做为每个码值保留参考条件。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.1.1 ADC 的输入范围和参考

ADC 的满量程常由参考电压和输入拓扑共同定义,但不同器件可能有内部参考、外部参考、增益级、差分范围或保留码。一个 3.3 V 系统不代表每个通道都能安全测到 3.3 V。先查绝对最大额定值、模拟输入范围和参考连接,再写换算公式。

8.1.2 分辨率、LSB 与量化

理想 N 位 ADC 的码宽约为满量程除以 2^N,LSB 只是量化步长,不是测量准确度。量化误差通常在半个 LSB 附近,但参考偏差、输入噪声、偏置、增益、INL/DNL 和布局可能远大于它。报告位数时必须同时说明有效分辨率和误差预算。

C · ADC CODE TO VOLTAGE
uint32_t code_to_mv(uint32_t code, uint32_t vref_mv, uint8_t bits) { uint32_t full_scale = (1u << bits) - 1u; return (code * vref_mv + full_scale / 2u) / full_scale; }

理想换算不包含参考误差、偏置、增益、输入建立或目标 ADC 非线性。

PYTHON · ADC REPORT
def voltage(code, vref, bits): if not 0 <= code < (1 << bits): raise ValueError("code out of range") return code * vref / ((1 << bits) - 1)

主机公式只验证单位和边界;现场 Vref 和模拟输入必须单独测量。

8.1.3 码值到电压:公式的条件

从码值换算电压至少要记录 raw_code、bits、vref、输入模式、校准系数、端点策略和单位。公式是确定的,不代表输入端真的获得了该电压;参考源和模拟地没有测过时,换算结果只能称为基于名义条件的估计。

表 1 · 模数转换模型:从电压到码值的证据判断表
层次应留下的证据不能直接推出
范围输入/参考/端点位数就是准确度
换算码值/单位/系数公式推出现场 Vref
边界饱和/误差/质量稳定码值必是真实值

8.1.4 饱和、欠量程与负输入

超量程可能饱和到最大码,欠量程可能被钳位或触发保护,负输入在单端 ADC 上通常没有物理意义。饱和计数应保留,不要把它们送入滤波后假装是边界内数据。过压、异常电流、输入保护导通或发热时停止并断开来源。

8.1.5 单端、差分与共模范围

差分 ADC 测量的是两个输入的差,同时还要求共模电压处于允许范围;单端 ADC 则相对模拟地测量。输入保护、负端噪声、增益设置和通道配对都会改变结果。一个差分公式不能被直接套到单端通道。

图 1.1 · 模数转换模型:从电压到码值的判断路径每一格都要有自己的条件。
输入电压/范围
转换采样/量化
换算码值/单位
边界误差/饱和

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.1.6 理想分辨率不等于准确度

准确度还包含 offset error、gain error、INL、DNL、噪声、参考误差、温漂和采样网络误差。提高位宽只缩小理想量化步长,不会自动修复参考、布局或输入驱动。读数据手册时把静态误差、动态噪声和系统误差分成不同字段。

8.1.7 码值序列与物理现象

原始码序列应与输入源、时间戳、参考电压、通道、采样时间和环境一起保存。一个均值很稳定的序列可能来自输入被短路、通道没切换或 ADC 饱和。趋势、跳变和饱和比例需要与外部电压或已知标准对照。

8.1.8 本节交付:ADC 输入与换算卡

ADC 输入与换算卡包括 channel、input_mode、range、vref_source、vref_measured、resolution、raw_code、formula、calibration、saturation、uncertainty 和 raw_samples。它把‘读到一个数’改成有条件、有单位、可复核的测量对象。

CHECKPOINT 8.1把“一个 ADC 码值究竟能说明多少真实电压?”写成一份可复查记录

请围绕“模数转换模型:从电压到码值”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

02 · SAMPLE AND HOLD

采样保持与时序:什么时候读到

ADC 转换前的采样保持阶段会让内部电容与输入源建立电压,采样时间、源阻抗、通道切换、触发频率、转换时间和 DMA/中断读取共同决定数据是否代表目标信号。时序错误会产生系统性偏差,即使数字码看起来很稳定。本单元把‘采样频率’拆成完整时间合同。

看懂读懂采样保持链路。
说清为源阻抗和采样时间配对。
开始做用序列和波形定位时序错位。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.2.1 采样保持的两个阶段

采样保持通常先闭合开关让内部电容追随输入,再断开进入转换;采样时间越短,源必须越快地给电容充电。数据手册给出的最大源阻抗、采样周期和误差条件要与前端电阻、电容、运放输出能力一起核对,不能只看 ADC 时钟。

8.2.2 源阻抗与建立时间

高阻分压、NTC、桥式传感器或长线会让采样电容看到一个有时间常数的源。连续采同一通道可能表现正常,快速切换通道却会把前一通道电压带入下一次。增加采样时间、加缓冲或安排 dummy conversion 都是有代价的设计选择,应以原始码和输入波形验证。

C · SAMPLE BUDGET
uint32_t sample_period_cycles(uint32_t sample_cycles, uint32_t convert_cycles) { return sample_cycles + convert_cycles; } bool trigger_rate_ok(uint32_t adc_clk, uint32_t period_cycles, uint32_t trigger_hz) { return period_cycles * trigger_hz <= adc_clk; }

真实 ADC 还受通道序列、过采样、触发同步和 DMA 服务能力约束。

C · CHANNEL RECORD
typedef struct { uint16_t raw; uint8_t channel; uint32_t sample_index; uint64_t trigger_tick; } sample_t;

记录索引和触发时刻,避免把 DMA 回调时间误当物理采样时间。

8.2.3 通道扫描与串扰

扫描序列中的 rank、采样时间、通道切换和 DMA 索引必须一一对应。把 DMA 数组的第 0 项当作‘通道 0’而没有保存序列,是多通道错位的常见来源。用高/低已知输入交替并观察残留,是发现串扰比看均值更有效的办法。

表 2 · 采样保持与时序:什么时候读到的证据判断表
层次应留下的证据不能直接推出
源阻抗/RC/带宽任意源都能短采样
时序采样/转换/触发触发率就是采样率
数据序列/DMA/时间戳回调时间就是样本时间

8.2.4 触发频率、吞吐与转换时间

一次转换的周期包含采样、转换、可能的过采样和数据传输;最大触发率由最慢通道和序列总长度决定。触发频率超过吞吐时,硬件可能丢触发、覆盖数据或改变间隔。配置值要和实际 DMA 时间戳、更新事件和错误标志对账。

8.2.5 定时器触发与采样抖动

由定时器触发比软件 while 循环更容易形成稳定采样相位,但定时器时钟、触发边沿、ADC 同步延迟和低功耗恢复仍会改变时刻。一个‘1 kHz 采样’结论应说明触发源、通道顺序、允许抖动和是否跨睡眠。

图 2.1 · 采样保持与时序:什么时候读到的判断路径每一格都要有自己的条件。
源阻抗/带宽
采样电容/时间
序列通道/触发
数据DMA/时间戳

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.2.6 DMA 缓冲、半满和时间戳

DMA half/full 回调发生在内存达到某个水位之后,不是每个样本的物理采样时刻。应由触发计数或硬件时间戳推断样本索引,避免用回调时间给整块数据打同一个时间。缓存一致性和所有权也会影响消费者何时能安全读取。

8.2.7 混叠、带宽与前端滤波

若输入信号在 Nyquist 频率以上,ADC 会把它折叠成另一个低频成分;平均或数字滤波不能恢复已经混叠的信息。前端抗混叠滤波、采样率、触发抖动和有效带宽应一起设计,并用已知频率扫描验证频谱而非只看一张波形。

8.2.8 本节交付:采样时序卡

采样时序卡包括 source_impedance、front_end_rc、sample_cycles、adc_clock、channel_sequence、trigger_source、conversion_period、dma_layout、timestamp_source、aliasing_limit 和 raw_capture。它让后续校准、滤波和传感器换算知道每个样本的来历。

CHECKPOINT 8.2把“ADC 采到的是哪一个瞬间,输入源怎样给采样电容充电?”写成一份可复查记录

请围绕“采样保持与时序:什么时候读到”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

03 · SENSOR DATA PATH

传感器数据链:从物理量到工程量

传感器系统通常包含物理量、敏感元件、模拟/数字接口、ADC、原始码、校准、补偿、滤波、单位换算和有效性标志。每层都有自己的坐标、时间和误差;把驱动返回的一个浮点数当作‘真实温度/压力’会丢掉全部条件。本单元建立端到端数据链。

看懂拆开物理量到工程量的层次。
说清保留原始值和质量标志。
开始做为一条传感器读数建立证据链。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.3.1 传感器量程与 ADC 量程不是一回事

传感器量程描述物理量能覆盖多大范围,ADC 量程描述电气输入能转成多大电压,前端增益/分压还会在两者之间建立映射。一个温度传感器输出 0.5–2.5 V 不等于 ADC 直接测摄氏度;每个比例、参考和方向都要写在数据合同。

8.3.2 模拟传感器与数字传感器

模拟传感器把电压/电流交给 ADC,数字传感器可能在内部完成采样、补偿和量化,再通过 I²C/SPI 返回寄存器。后者仍可能有转换时间、内部校准、状态位和数据格式。看到一个数字接口不代表已经绕过了测量误差。

C · SENSOR PIPELINE
typedef struct { int32_t raw; int32_t value_milli; uint64_t timestamp; uint32_t quality; } sensor_sample_t; sensor_sample_t convert(int32_t raw, int32_t scale, int32_t offset) { return (sensor_sample_t){raw, raw * scale + offset, now_ticks(), QUALITY_VALID}; }

单位、系数、状态和样本年龄需要由具体传感器合同填充。

C · DATA_READY GUARD
if (!sensor_data_ready()) { record_quality(QUALITY_STALE); return ERR_NOT_READY; } read_sensor_registers(raw);

读取成功不等于拿到新样本;ready/busy、序号和转换延迟必须验证。

8.3.3 灵敏度、偏置与单位换算

工程单位换算通常是 raw → 电压/计数 → 灵敏度/增益 → 偏置/补偿 → 单位。每层要保留中间值和版本;只保存最终浮点会让别人无法判断错误发生在 ADC、驱动、系数还是单位。

表 3 · 传感器数据链:从物理量到工程量的证据判断表
层次应留下的证据不能直接推出
对象物理量/量程传感器数字就是工程单位
数据raw/scale/status读取成功就是新样本
质量age/range/reference异常可以替换为 0

8.3.4 数据 ready、busy 和转换延迟

许多传感器先启动一次转换,等待 data-ready 或 busy 清除,再读取结果;过早读取可能得到上一次样本。时间戳应标出转换完成而非总线读取,状态寄存器和样本序号可帮助发现旧数据。超时和 busy 风暴必须有上限和恢复。

8.3.5 时间戳和样本年龄

样本年龄是读取时刻减去测量/转换完成时刻,慢速温度传感器和快速控制回路对它的容忍不同。把串口打印时刻当作样本时刻会造成延迟误判。驱动接口应返回 timestamp、age 或 freshness,并让应用根据 deadline 决定是否使用。

图 3.1 · 传感器数据链:从物理量到工程量的判断路径每一格都要有自己的条件。
物理量/环境
原始ADC/寄存器
处理校准/滤波
输出单位/质量

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.3.6 质量标志、范围和异常码

质量标志可以表示 out_of_range、saturated、disconnected、crc_error、not_ready、self_test_failed、stale 或 calibration_missing。无效样本不应被静默替换为 0 或上一次值;如果必须保持输出,也要附上质量和替代原因。

8.3.7 环境、安装和对照仪器

传感器的安装位置、热阻、气流、机械耦合、供电噪声和激励电流会改变读数。对照仪器的精度、探头位置、同步方式和稳定时间要记录;同一型号换一块板或换一处安装,不一定是同一个测量条件。

8.3.8 换型号时哪些字段必须重核对

换型号时重新核对地址/片选、寄存器格式、字节序、量程、灵敏度、转换时间、状态位、补偿公式和上电默认值。兼容接口只保证函数能调用,不保证物理单位、响应时间和质量字段含义相同。

8.3.9 本节交付:传感器数据合同

传感器数据合同包括 sensor_identity、physical_quantity、range、excitation、raw_source、scale、offset、compensation、timestamp、age、status、quality、environment、reference_instrument 和 limits。它把读数变成可以追溯的工程量。

CHECKPOINT 8.3把“ADC 码值、传感器输出和最终工程单位之间究竟隔了几层?”写成一份可复查记录

请围绕“传感器数据链:从物理量到工程量”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

04 · CALIBRATION AND ERROR

校准与误差预算:偏置、增益、温漂

校准不是把一个数字调到看起来正确。零点偏置、增益误差、非线性、参考偏差、温度、装配、重复性和参考仪器不确定度都可能需要不同方法和不同证据。本单元用误差预算连接两点校准、温度补偿、验证和版本管理。

看懂区分校准参数与测量事实。
说清写出可复算的误差预算。
开始做验证校准没有越过适用范围。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.4.1 零点偏置与增益误差

零点偏置让整条转换曲线整体平移,增益误差让斜率改变;两点校准可以在理想线性模型下同时修正它们。真正的 ADC/传感器还可能有非线性、迟滞、噪声和温漂,两个点上的完美匹配不等于整段范围都准确。

8.4.2 两点校准与线性拟合

线性校准可写成 engineering = slope × raw + intercept,但 raw 的来源、单位、参考点和有效范围必须固定。保存系数时同时保存拟合点、残差、方法、温度、参考仪器和版本;否则别人只能看到一个不能复算的魔法常数。

PYTHON · TWO-POINT CALIBRATION
def fit_two_points(raw_a, eng_a, raw_b, eng_b): if raw_a == raw_b: raise ValueError("reference points must differ") slope = (eng_b - eng_a) / (raw_b - raw_a) intercept = eng_a - slope * raw_a return slope, intercept

拟合参数必须附带参考不确定度、温度、范围、残差和版本。

C · CALIBRATION VALIDATION
float corrected = raw * slope + intercept; float residual = corrected - reference; if (fabs(residual) > LIMIT) record_calibration_failure();

验证点应独立于拟合点,并保存原始值、参考值和环境。

8.4.3 非线性、迟滞与重复性

非线性需要更多点、分段、查表或模型补偿;迟滞要分别记录上行/下行;重复性要在相同条件下重复采样并报告分布。若校准过程本身噪声很大,增加小数位只会把不确定度写得更长。

表 4 · 校准与误差预算:偏置、增益、温漂的证据判断表
层次应留下的证据不能直接推出
模型offset/gain/残差两点修复整条曲线
参考仪器/环境/不确定度参考值就是绝对真值
版本系数/CRC/有效期校准参数永久有效

8.4.4 参考仪器与不确定度

参考仪器不是绝对真值,它有准确度、分辨率、漂移、温度系数和校准证书。被测改进小于参考不确定度时,不能声称改善已证明。把参考仪器、连接、稳定时间、读数平均和环境噪声写入误差预算。

8.4.5 温漂、热稳定和时间漂移

传感器与 ADC 常有热启动、封装热阻和自发热;温度扫描若未等待稳定,系数会把瞬态误差写入永久参数。长期漂移还可能来自老化、湿度、机械应力和供电变化。校准有效期和再校准触发条件应成为合同字段。

图 4.1 · 校准与误差预算:偏置、增益、温漂的判断路径每一格都要有自己的条件。
误差偏置/增益
拟合参考/残差
环境温度/时间
验证范围/版本

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.4.6 系数存储、版本与回滚

校准参数写入 Flash/EEPROM 时要有版本、长度、CRC、默认值和原子更新策略。掉电中断可能留下半个系数;启动时若发现无效参数,应回到安全的名义系数并标出 calibration_missing,而不是继续输出高置信度数据。

8.4.7 校准后的验证点选择

独立验证点不能与拟合点完全相同,应覆盖低、中、高和必要的负向/回程点。验证输入、预测输出、实测输出、残差和允许范围要先写后测。用校准点自证最容易把过拟合误认为准确。

8.4.8 本节交付:校准与误差卡

校准与误差卡包括 calibration_id、raw_unit、engineering_unit、reference_points、reference_uncertainty、slope、intercept、residuals、temperature、stability_time、parameter_crc、version、valid_range 和 acceptance_limit。它把修正值放回测量事实的上下文。

CHECKPOINT 8.4把“一次校准究竟修正了什么,又留下了哪些误差?”写成一份可复查记录

请围绕“校准与误差预算:偏置、增益、温漂”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

05 · FILTERING AND QUALITY

滤波、过采样与异常:让数据可用

滤波不是把曲线变平。移动平均、IIR、median、过采样、抽取、限幅、迟滞和异常剔除都在延迟、带宽、噪声、阶跃响应和故障可见性之间取舍。本单元把滤波器作为带时间和质量标志的测量组件,而不是一个无条件的平滑按钮。

看懂比较滤波的延迟和带宽。
说清保留异常和质量信息。
开始做用阶跃与噪声样本验证选择。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.5.1 移动平均的窗口和延迟

长度为 N 的移动平均会把噪声平均掉,但也会让阶跃在窗口内逐步出现并带来近似半窗口延迟。窗口越长不一定越好:控制回路、报警和人机界面对响应速度有不同要求。滤波前后都应保留时间戳和有效性,而不是只保存平滑值。

8.5.2 IIR 系数与稳定性

IIR 用当前输入和历史输出递归,计算量小但系数、采样率和定点表示决定其截止频率、稳定性和响应。系数改变而采样率不变时,物理带宽才可解释;定点乘加还要防止溢出、截断和累积偏置。

PYTHON · MOVING AVERAGE
def moving_average(values, window): if window < 1 or len(values) < window: raise ValueError("insufficient samples") return [sum(values[i-window+1:i+1]) / window for i in range(window - 1, len(values))]

平均降低部分噪声但增加延迟;原始样本和质量标志不能丢弃。

C · QUALITY GATE
if (raw >= ADC_MAX || raw <= ADC_MIN || sensor_crc_bad()) { quality |= QUALITY_INVALID; reset_filter_state(); } if (quality == QUALITY_VALID) publish(value);

异常策略、边界和恢复条件必须按传感器与应用风险定义。

8.5.3 median 与离群点

median 对孤立毛刺有韧性,却可能延迟窄脉冲或改变边沿;平均对高斯噪声有效,却会把异常扩散进窗口。选择算法要看噪声模型、真实信号最短变化、允许延迟和故障策略,并用原始序列重放。

表 5 · 滤波、过采样与异常:让数据可用的证据判断表
层次应留下的证据不能直接推出
算法窗口/系数/带宽越平滑越准确
时间延迟/阶跃/deadline滤波没有时间代价
质量异常/饱和/恢复平均可以修复断线

8.5.4 过采样、平均和有效位数

过采样提高样本数量,只有在噪声独立、带宽、时钟和数字处理满足条件时才可能改善有效分辨率。把 16 次平均直接称为多 2 位准确度是不完整的;参考噪声、输入漂移和相关噪声会限制收益。

8.5.5 抽取与抗混叠

抽取前如果信号带宽超过新的 Nyquist 频率,频谱会折叠;数字滤波太晚无法恢复。模拟抗混叠、采样率、数字滤波和抽取率要成套设计,记录阶跃、扫频、噪声和 CPU/内存成本。

图 5.1 · 滤波、过采样与异常:让数据可用的判断路径每一格都要有自己的条件。
原始噪声/异常
处理窗口/系数
延迟带宽/阶跃
质量标志/恢复

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.5.6 异常、饱和与断线检测

断线、饱和、CRC 错误、超范围和不合理跳变应产生质量标志,必要时旁路滤波或清空历史,避免旧值拖延故障发现。连续异常的计数、进入/退出阈值和恢复动作要写清,不能让滤波器把故障变成‘稳定’。

8.5.7 滤波延迟与控制 deadline

滤波后的报警或控制触发时间等于原始采样时刻加算法/缓冲/调度延迟。端到端预算应包含 DMA 批量、窗口填充、线程唤醒和输出动作;均值曲线漂亮但触发晚了,仍可能违反系统合同。

8.5.8 本节交付:滤波与质量卡

滤波与质量卡包括 raw_samples、sample_rate、algorithm、window_or_coeff、fixed_point_format、latency、bandwidth、outlier_rule、saturation_rule、quality_flags、reset_policy 和 deadline。它让数据可用与数据好看分开。

CHECKPOINT 8.5把“怎样降低噪声而不把真实变化和故障一起抹掉?”写成一份可复查记录

请围绕“滤波、过采样与异常:让数据可用”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

06 · MEASUREMENT DELIVERY

测量交付:从原始码到可复查结论

本章最后把 ADC、采样、传感器、校准和滤波收束为一份测量交付包:对象和端点、参考和范围、原始码、采样时间、换算与校准、滤波参数、质量标志、环境、参考仪器、主机测试和目标机边界。可复查的结论必须把数字放回条件,而不是只展示最终曲线。

看懂建立从原始到工程量的证据链。
说清区分主机模型与目标机事实。
开始做写清范围、误差和停止条件。
官方基线RM0444 STM32G0x1 reference manual寄存器、复位值、时序和外设边界以本参考手册修订版为准。锁定:Rev 6 · 核对日期:2026-09-05

8.6.1 交付文件的最小集合

可重算交付包至少包含准确对象、输入端点、参考源、ADC 配置、原始码和时间戳、换算公式、校准系数、滤波参数、质量标志、环境、仪器和测试命令。最终曲线只应作为索引;没有原始材料和版本,任何小数都无法复核。

8.6.2 芯片、传感器与资料版本

换芯片修订、传感器批次、参考电压、前端电阻、安装位置、SDK/驱动或滤波版本,都可能改变结果。保存数据手册/协议 URL、访问日期、工具版本和固件哈希,并标出哪些结论需要重新校准或重测。

PYTHON · MEASUREMENT RECORD
from dataclasses import dataclass @dataclass class Measurement: raw: int timestamp: int value: float quality: str calibration_id: str def apply(raw, scale, offset): return raw * scale + offset

主机记录帮助重算;它不能证明 Vref、安装、温漂或参考仪器已经验证。

SHELL · MEASUREMENT HASH
sha256sum build/firmware.elf evidence/raw_adc.csv evidence/sensor.log evidence/calibration.json python tools/replay_measurement.py --config evidence/calibration.json --input evidence/raw_adc.csv

目标工具链或重放工具未安装时仍应保存命令、版本、原始数据和未验证字段。

8.6.3 参考、环境和仪器设置

参考电压、环境温度、原始码、时间戳、校准前后值和滤波输出要用共同时间轴关联。若把串口打印时刻当采样时刻,或者只保存平均值,无法解释突发噪声、样本年龄和滤波延迟。

表 6 · 测量交付:从原始码到可复查结论的证据判断表
层次应留下的证据不能直接推出
身份芯片/传感器/版本同型号就是同条件
事实raw/参考/环境最终曲线覆盖全部证据
边界主机/目标/停止未验证项可以省略

8.6.4 原始码、时间戳和质量对账

质量对账可把 ADC 转换数、DMA 写入数、驱动有效数、滤波输出数和报警数并列,异常/饱和/断线计数要能追溯到原始样本索引。被滤掉的样本不能删除;应保存原因和恢复策略。

8.6.5 主机路径:公式、拟合和故障注入

没有目标板时可运行码值换算、两点校准、误差预算、移动平均、median、饱和/断线故障注入和单位链测试;不能声称现场 Vref、输入建立、传感器温漂、安装误差或参考仪器精度已验证。

图 6.1 · 测量交付:从原始码到可复查结论的判断路径每一格都要有自己的条件。
身份芯片/传感器
原始码/时间
处理校准/滤波
结论范围/误差

从左到右是思考顺序,不是把原始码、换算、滤波和结论压缩成一个“通过”。

8.6.6 目标机路径:安全连接和输入边界

目标机实验先用限流供电、已知安全输入和可恢复固件,确认模拟地、参考、输入保护、采样时间和量程,再接真实传感器。出现过压、输入发热、参考异常、饱和失控或无法解释的噪声时停止并保存现场。

8.6.7 单变量测量回归

单变量回归可以只改采样时间、触发率、参考源、校准系数、滤波窗口、安装位置或环境温度,但不能同时换板、换传感器和换仪器。先预测 raw、engineering、残差、延迟和 quality,再比较原始证据。

8.6.8 资料卡:HAL、Zephyr、Linux IIO 与模拟前端

STM32 HAL ADC 展示轮询、中断、DMA、过采样和校准入口;Zephyr ADC/传感器文档展示通道、触发、Fetch/Get 与 Read/Decode;Linux IIO 说明 scale、offset 和缓冲抽象;模拟前端资料提醒接地和噪声的边界。它们不能替代当前板级测量。

8.6.9 本章结业:交给驱动与闭环的接口

交给后续驱动、联网和闭环章节的接口包括 sensor_identity、channel、raw_code、timestamp、age、scale、offset、calibration_id、filter、quality、uncertainty、reference、limits 和 unverified_scope。后续控制逻辑应从这些字段决定是否使用数据。

CHECKPOINT 8.6把“怎样交付一个传感器结论,让读者能重算、重放并知道哪里还未知?”写成一份可复查记录

请围绕“测量交付:从原始码到可复查结论”写出对象、输入/参考和环境条件、采样/换算/滤波机制、输出和质量标志、一个误差或时间约束、一个失败路径和对应证据。没有目标板时,运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐芯片、传感器、引脚、供电、参考、仪器、安装和观察条件。不要用一个最终浮点数、一个均值或一张曲线截图覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。未知项和停止条件不是扣分项,而是交付的一部分。

资料卡(访问日期:2026-09-04):STM32 HAL ADC、Zephyr ADC/传感器、Linux IIO 和模拟前端资料展示不同生态的测量入口。通用 API 不能替代当前芯片的参考电压、输入建立、传感器安装、环境、仪器和安全条件。