跳转至

01 测量信号的基础:采样、噪声与误差

滤波器不是魔法。它不能把坏传感器变成好传感器,也不能让采样率不足的系统凭空获得细节。学习算法之前,要先理解测量数据从哪里来、长什么样、以及哪些问题靠滤波能解决、哪些不能。

这一章是全书的地基。后面每一个滤波器的设计——窗口选多长、系数取多大、截止频率定在哪——都要回到这里的基本概念。如果这一章没读清楚,后面的参数选择就只能靠猜。

本章先建立三件事:

  • 测量值从物理世界进入 MCU 时,会经历哪些误差来源。
  • 采样率、量化噪声、混叠和抗混叠之间是什么关系。
  • 评价滤波效果时,应该看哪些工程指标,而不是只看曲线顺不顺眼。

一个测量值是怎样产生的

典型 MCU 测量链路是:

真实物理量 -> 传感器 -> 模拟调理电路 -> ADC -> 数字滤波 -> 标定换算 -> 显示/控制

每一环都会引入自己的问题:

环节 典型问题
传感器 非线性、温漂、灵敏度误差、输出阻抗
模拟调理 运放失调、增益误差、带宽限制、电源纹波耦合
ADC 量化噪声、积分非线性、微分非线性、采样抖动
数字滤波 延迟、过冲、稳态误差(这是本书重点)
标定换算 标定误差、温度补偿残差

数字滤波只处理 ADC 之后的数据。模拟电路饱和、供电纹波严重、采样布线错误、量程选错,这些问题靠软件滤波只能缓解,不能根治。所以在讨论任何滤波器之前,先确认你已经做对了前三个环节。

ADC 量化基础

ADC 把连续的模拟电压变成离散的数字码值。这个过程叫量化。

位数与分辨率

一个 \(B\) 位 ADC 的输出范围是 0 到 \(2^B - 1\)。常见情况(以 2.5V 参考电压为例):

ADC 位数 码值范围 分辨率(2.5V 参考)
8 位(内部 ADC 常见) 0 ~ 255 9.77 mV/LSB
12 位(内部 ADC 常见) 0 ~ 4095 0.610 mV/LSB
16 位(外部 ADC 常见) 0 ~ 65535 38.1 µV/LSB
24 位(Σ-Δ 型 ADC) 0 ~ 16777215 149 nV/LSB

其中 LSB(Least Significant Bit)就是最小分辨单位。一个 12 位 ADC 配 2.5V 参考电压,意味着它只能区分相差 0.610 mV 以上的两个电压。比这更小的变化,ADC 看不到。

量化噪声

量化会引入误差。每次采样,真实值和量化后的值之间会有一个偏差。

设 ADC 的量化步长为 \(\Delta\),也就是一个 LSB 对应的电压宽度:

\[ \Delta = \text{LSB} \]

如果输入信号有足够随机波动(比如传感器本身的噪声),量化误差会随机落在 \(-\Delta/2\)\(+\Delta/2\) 之间,没有固定方向。这个区间的总宽度就是 \(\Delta\)。宽度为 \(\Delta\) 的均匀分布,其方差为:

\[ \sigma_q^2 = \frac{\Delta^2}{12} \]

所以量化噪声的方差可以写成:

\[ \sigma_q^2 = \frac{\text{LSB}^2}{12} \]

需要注意:这个公式成立的前提是量化误差确实是随机的。如果输入是直流信号、没有抖动,输出会锁死在同一个码值,方差接近零,公式就不适用了。

对应的等效均方根(RMS)电压为:

\[ \sigma_q = \frac{\text{LSB}}{\sqrt{12}} \]

对于 12 位 ADC、2.5V 参考:

\[ \text{LSB} = \frac{2.5}{4096} \approx 0.610\;\text{mV}, \quad \sigma_q \approx 0.176\;\text{mV} \]

注:满量程正弦波输入主要用于推导理想 SNR 公式,和上面的均匀分布假设是两个不同的分析角度。

量化造成的信息损失不可完全恢复——同一个码值对应一段连续电压范围,你无法从码值反推出原始电压在这段范围内的确切位置。

但在一定条件下,量化误差可以近似为零均值、与信号不相关的随机噪声,此时过采样和平均可以降低其均方值。这个条件是:信号本身有足够小的随机波动(或人为注入抖动/dither),使得量化误差在相邻采样点之间表现为不相关。

反过来说,对于完全静止的直流输入、没有抖动的情况,ADC 输出会锁死在同一个码值上。对 \(N\) 次相同的码值求平均,结果还是那个码值——有效分辨率没有增加。这不是滤波器的缺陷,而是输入信号没有给滤波器任何可以利用的“变化信息”。

信噪比与有效位数

当量化误差满足上述随机性条件时,ADC 的理想信噪比(SNR)由位数 \(B\) 决定:

\[ \text{SNR}_{\text{ideal}} \approx 6.02\,B + 1.76 \quad \text{dB} \]

代入几个常见值:

位数 \(B\) 理论 SNR
8 49.9 dB
10 62.0 dB
12 74.0 dB
14 86.0 dB
16 98.1 dB

实际 ADC 往往达不到理论值。有效位数(ENOB)是衡量实际性能的指标:

\[ \text{ENOB} = \frac{\text{SNR}_{\text{measured}} - 1.76}{6.02} \]

一个标称 12 位的 ADC,如果实测 SNR 只有 68 dB,那它的 ENOB 约为 11 位。剩下的 1 位被各种误差吃掉了。

过采样与平均的条件

当量化误差确实表现为随机噪声时,滤波的本质是用时间换精度

如果你对信号采 \(N\) 个点然后求平均,噪声的 RMS 电压会降低到原来的 \(1/\sqrt{N}\),信噪比(功率比)提高 \(N\) 倍,折算成 dB 即 \(10\log_{10}(N)\)。换算成等效位数:

\[ \Delta B \approx \frac{1}{2}\,\log_2(N) \]

以下数据适用于对 N 个独立(不重叠)样本求平均,且量化误差近似白噪声。滑动平均的方差改善取决于噪声相关性,对白噪声效果类似但不完全等同。

平均点数 N SNR 提高 等效增加位数
4 6 dB 1 位
16 12 dB 2 位
64 18 dB 3 位
256 24 dB 4 位

所以一个 12 位 ADC 配合 256 点平均,在量化误差满足随机性条件时,理论上可以接近 16 位的精度。

实际 MCU 工程中,"用时间换精度"有两种玩法:

  • 滑动平均(Moving Average):依然以 fs 的速率输出,每个周期更新一次,延迟低,但输出数据量没有减少。
  • 抽取(Decimation):每采 \(N\) 个点求和并右移(或除以 \(N\)),输出一个高精度值,输出速率降为 \(f_s/N\)。这就是过采样与抽取(Oversampling and Decimation),是 ADC 芯片内部和高精度测量系统中常用的技术。

工程中常用的做法是人为注入小幅抖动(Dither),确保量化误差的随机性条件成立。部分高精度 ADC 内部已经集成了抖动功能。如果系统中没有抖动,不要盲目相信“平均 \(N\) 次就多了几位精度”这个说法——先确认你的信号或噪声是否足够让量化误差表现得像随机的。

采样与混叠

ADC 按固定时间间隔采样。相邻两次采样之间的时间叫采样周期 \(T_s\),采样率 \(f_s = 1/T_s\)

采样率太低会发生什么

考虑一个信号包含两个频率分量:一个 10 Hz 的慢变化和一个 90 Hz 的快变化。如果采样率是 100 Hz:

10 Hz 信号:每个周期采 10 个点,能正确还原。
90 Hz 信号:每个周期只采约 1.1 个点,严重不足。

更糟糕的是,90 Hz 信号采样后会混叠到 10 Hz——在数字域中,你无法区分这个 10 Hz 分量是来自真实的 10 Hz 信号,还是来自 90 Hz 的混叠。混叠可能带有相位或符号的变化,但频率成分上无法区分。这叫混叠(aliasing)。

用数学表示,对于采样率 \(f_s\),频率 \(f\)\(f_s - f\) 在采样后是不可区分的:

\[ f_{\text{alias}} = |f - k \cdot f_s| \quad \text{(}k\text{ 是使结果落在 }0 \sim f_s/2\text{ 的整数)} \]

一个具体的混叠例子

假设采样率 \(f_s = 100\;\text{Hz}\),真实信号是 110 Hz 的正弦波:

\[ f_{\text{alias}} = |110 - 1 \times 100| = 10\;\text{Hz} \]

采样后,这个 110 Hz 信号看起来完全像一个 10 Hz 信号。如果你的系统本来就在测量 10 Hz 的物理量,这个混叠信号会混进你的测量结果里,而且你完全看不出来。

Nyquist(奈奎斯特)定理

对基带信号来说,如果希望采样后不发生混叠,采样率 \(f_s\) 必须大于信号最高有效频率 \(f_{\max}\) 的两倍:

\[ f_s > 2 f_{\max} \]

这里还有一个容易忽略的前提:进入 ADC 的模拟信号必须是带限的。也就是说,在 \(f_s/2\) 以上的频率分量必须被充分衰减,否则这些高频分量会折叠到低频,变成数字域里看起来"合法"的假信号。

\(f_s/2\) 叫做 Nyquist 频率。它不是现实世界中信号能有的最高频率,而是采样系统在不混叠的前提下能够表示的最高频率。

实际工程中,信号不可能天然严格带限,所以通常在 ADC 之前放一个模拟低通滤波器,也就是抗混叠滤波器。它的作用不是让高频分量完全消失,而是把 \(f_s/2\) 以上的成分压低到系统允许的误差范围内。

工程上通常不会让信号频率刚好等于 Nyquist 频率。一般要求信号频率不超过采样率的 1/3 到 1/5,留出足够的裕量。

要观察的信号 最低采样率(理论) 推荐采样率(工程)
50 Hz 工频 100 Hz 300 ~ 500 Hz
1 kHz 电机电流纹波 2 kHz 6 ~ 10 kHz
温度慢变化(< 1 Hz) 2 Hz 5 ~ 10 Hz

采样率选高了有什么代价

采样率不是越高越好。更高的采样率意味着:

  • 更多数据:存储和传输压力增大。
  • 更多计算:每个采样周期都要执行一次滤波更新,MCU 算力可能不够。
  • 更多功耗:ADC 和 CPU 频繁唤醒,电池供电系统尤其敏感。
  • 更低的单次采样质量:有些 SAR 型 ADC 在高速采样时精度会下降。

所以采样率的选择是一个权衡:够用就行,留适当裕量,不要盲目追求高。

抗混叠:滤波器做不到的事

混叠一旦发生,数字滤波器无法消除它。因为混叠后的信号和真实低频信号在数字域里完全一样,滤波器分不出谁是谁。

解决混叠必须在 ADC 之前——用模拟低通滤波器把高于 Nyquist 频率的分量衰减掉。这个滤波器叫抗混叠滤波器(anti-aliasing filter)。

传感器 -> 抗混叠滤波器(模拟低通) -> ADC -> 数字滤波器

抗混叠滤波器的截止频率通常设在 Nyquist 频率附近或以下。比如采样率 1 kHz,抗混叠滤波器截止频率可以设在 200 ~ 400 Hz。

很多初学者以为抗混叠滤波器必须很复杂。实际上如果采样率裕量足够大(比如信号带宽只有采样率的 1/10 甚至更低),一个最简单的一阶无源 RC 滤波器就能起到很好的抗混叠效果。只有当信号带宽非常贴近 Nyquist 频率时,才需要二阶甚至有源巴特沃斯等高阶滤波器。

实际工程中,很多 MCU 应用没有外加抗混叠滤波器。这在测量温度、电压等慢变化信号时通常没问题,因为信号本身就没有高频分量。但如果你在测量振动、电流纹波、声音等快速变化的信号,没有抗混叠滤波器就是在冒险。

常见噪声类型

了解噪声类型,才能选对滤波器。下面按工程中遇到的频率从高到低排列。

量化噪声

表现:当输入附近存在足够小的随机波动时,ADC 输出会在相邻几个码值之间跳动,幅度通常在 ±1 LSB 以内。如果输入和前端都非常安静,码值反而可能长期停在同一个数上。

频谱:在信号有足够随机波动或注入抖动(dither)的条件下,近似白噪声,均匀分布在整个频带。直流输入且无抖动时,量化噪声不是白噪声,而是确定性的(输出锁死在同一码值)。

对策:过采样 + 平均。配合小幅抖动(Dither)或前端本身适量的随机噪声,在量化误差随机化条件成立时,可以得到亚 LSB 的平均结果,等效提高测量分辨率。但要注意:它不能修复 INL(积分非线性)、DNL(微分非线性)、参考电压漂移或模拟前端饱和等硬件误差,也不等于 ADC 芯片本身的转换精度变高了。

随机热噪声(白噪声)

表现:数值围绕真实值上下跳动,没有固定方向和规律。每次跳动的幅度不等,但统计上呈正态分布。

来源:传感器本身的热噪声、电阻噪声、运放输入噪声。

量化指标:幅度通常远大于 1 LSB。如果你的 12 位 ADC 读数在稳态时上下跳动 10~20 个码值,那主要是热噪声在作怪。

频谱:近似白噪声,在所有频率上均匀分布。

对策:滑动平均、一阶滞后、FIR 低通。这类噪声是滤波器最擅长处理的,因为它接近零均值,平均和低通可以降低其均方值。

尖峰干扰(脉冲干扰)

表现:大部分时间正常,偶尔突然跳到很大或很小的值。持续时间通常只有 1~3 个采样点。

来源:电源开关噪声、继电器动作、EMI 突发、接触不良。

量化指标:幅度通常是正常值的 2~10 倍,甚至更大。出现频率可能很低(几分钟一次),但单次破坏力大。

频谱:能量分散在很宽的频带,不属于某个特定频率。

对策:限幅滤波、中值滤波、Hampel 滤波、去极值平均。关键是要用非线性方法把极端值剔除,线性滤波器(平均、FIR)会被尖峰严重污染。

机械抖动(消抖问题)

表现:按键、继电器、干簧管在状态切换时,触点会快速弹跳,产生几毫秒到几十毫秒的反复跳变。

量化指标:一个按键的典型抖动时间是 5~20 ms,抖动次数 3~10 次。

对策:消抖滤波(确认连续 \(N\) 次相同才认为状态改变)、迟滞回差。注意消抖滤波是非线性的,不能用频率响应来分析。

慢漂移

表现:读数在几分钟到几小时的时间尺度上缓慢偏移。方向可能单向,也可能来回。

来源:温度变化导致的零点漂移、电源电压缓慢变化、传感器老化。

量化指标:偏移速度可能很慢(每分钟零点几度),但累积效果可能很大。

频谱:能量集中在极低频,接近直流。

对策:滤波不能完全解决慢漂。通常需要周期标定、温度补偿、差分测量或自校准。高通滤波可以去除直流偏移,但也会丢失真正的慢变化信号。

周期干扰(工频干扰等)

表现:读数有规律地波动,周期固定。最常见的是 50 Hz 或 60 Hz 工频干扰。

来源:电源纹波通过地线或空间耦合进入信号链路。

量化指标:幅度取决于耦合强度,可能从几 LSB 到几百 LSB 不等。如果干扰幅度接近信号本身,问题就很严重。

频谱:能量集中在干扰频率及其谐波(50, 100, 150, 200 Hz...)。

对策:陷波滤波器(针对特定频率)、同步采样(采样时刻和干扰周期对齐)、整周期积分平均。注意:如果采样率和干扰频率不成整数倍关系,普通平均可能产生"拍频"残余。

噪声类型速查表

噪声类型 时间特征 幅度特征 推荐滤波器
量化噪声 每个采样点 ±1 LSB 过采样 + 平均
热噪声 每个采样点 几到几十 LSB,正态分布 平均、一阶滞后、FIR
尖峰干扰 偶发,1~3 点 正常值的 2~10 倍 限幅、中值、Hampel
机械抖动 状态切换时,5~20 ms 0/1 反复跳 消抖、迟滞
慢漂移 分钟到小时 缓慢单向偏移 标定、温度补偿、高通
周期干扰 固定周期 几到几百 LSB 陷波、同步采样

频率响应:描述滤波器的统一语言

前面讲了噪声有不同频率成分。滤波器的作用就是选择性地保留某些频率、衰减某些频率。要定量描述这个能力,就需要频率响应。

什么情况下可以谈频率响应

只要一个算法满足两个条件:

  • 线性:输入放大多少,输出也放大多少;两个输入相加,输出也相加。
  • 时不变:同样的输入晚一点出现,输出也只是晚一点出现。

它就可以用频率响应来分析。

滑动平均、FIR、一阶 IIR 都属于线性时不变(LTI)系统。中值滤波、限幅滤波、消抖、迟滞不属于 LTI 系统,所以不能简单说它们有某一个固定截止频率。

怎么判断一个滤波器是不是线性的?一个简单办法:

如果输入变成原来的 2 倍,输出也变成 2 倍吗?
如果两个输入相加,输出等于各自输出的和吗?

例如滑动平均 y = (x1 + x2 + x3) / 3

输入 2 倍:(2x1 + 2x2 + 2x3) / 3 = 2 × (x1 + x2 + x3) / 3 ✓
输入相加:((a1+b1) + (a2+b2) + (a3+b3)) / 3 = 均值(a) + 均值(b) ✓

中值滤波 y = median(x1, x2, x3)

设 A = [1, 0, 0],median(A) = 0
设 B = [0, 0, 1],median(B) = 0

各自输出相加:median(A) + median(B) = 0 + 0 = 0
先将输入相加:A + B = [1, 0, 1],median(A + B) = 1

0 ≠ 1 → 不满足叠加性 ✗

中值滤波不满足叠加性,所以是非线性的。这不意味着它不好,只是不能用频率响应来分析它。

频率响应回答什么问题

频率响应回答的是这个问题:

如果输入是某个频率的正弦波,输出会被放大还是衰减?相位会滞后多少?

对于 LTI 滤波器,频率响应是一个复数函数 \(H(f)\),它的:

  • 幅度 \(|H(f)|\) 表示该频率的增益(1 = 不变,0.5 = 衰减一半,0 表示理想情况下该频率被压到零)
  • 相位 \(\angle H(f)\) 表示该频率的滞后角度

数字系统中常用归一化角频率:

\[ \omega = 2\pi \cdot \frac{f}{f_s} \]

其中 \(f\) 是实际频率,\(f_s\) 是采样率。

这个公式的意思是:把频率轴压缩到 0 到 \(\pi\) 的范围内。 \(\omega = 0\) 对应直流(不变的量),\(\omega = \pi\) 对应 Nyquist 频率 \(f_s/2\)(最快的振荡),中间的值对应不同速度的波动。

用归一化角频率的好处是,滤波器特性不依赖于具体采样率,方便比较和移植。

截止频率

低通滤波器的截止频率通常指幅度下降到通带低频幅度的 \(1/\sqrt{2}\) 处,也就是功率下降一半的位置,工程上叫 -3 dB 点:

\[ |H(f_c)| = \frac{1}{\sqrt{2}} \cdot |H(0)| \approx 0.707 \cdot |H(0)| \]

为什么是 0.707?因为功率和幅度的平方成正比,幅度降到 0.707 时功率正好降到一半(\(0.707^2 \approx 0.5\))。这是一个工程约定,不是一个物理定律。它不表示高于 \(f_c\) 的频率完全消失,只表示从这里开始衰减已经达到一个约定标准。

不同滤波器在截止频率之后的下降速度差别很大:

  • 一阶 IIR:每倍频程衰减 6 dB(频率翻倍,幅度减半)
  • 二阶 IIR:每倍频程衰减 12 dB
  • FIR:衰减速度和阻带深度由阶数和设计方法(窗函数、等波纹等)共同决定,不能只看阶数

衰减速度越快,频率选择性越强,但代价也越大——可能带来更大延迟、振铃、相位失真,或者对系数量化更敏感、实现更复杂。

截止频率与窗口长度的关系

对于 \(N\) 点滑动平均,截止频率大约在(数值近似,来自 sinc 方程的数值解):

\[ f_c \approx \frac{0.443 \cdot f_s}{N} \]

\(N \ge 4\) 时此近似误差小于 2%;\(N\) 较小时(如 2 或 3)应直接计算幅频响应 \(|H(e^{j\omega})|\) 验证。

反过来,如果你需要一个截止频率为 \(f_c\) 的滑动平均,窗口长度应该取:

\[ N \approx \frac{0.443 \cdot f_s}{f_c} \]

例如采样率 100 Hz,想要截止频率 10 Hz:

\[ N \approx \frac{0.443 \times 100}{10} \approx 4.4 \rightarrow \text{取 } N = 5 \]

这个关系是后面所有参数设计的基础:从工程指标(我要滤掉什么频率)反推算法参数(窗口多长、系数多大)。

零点:平均滤波的隐藏武器

滑动平均不只是一个"有截止频率的低通",它还有很多零点。在零点频率上,输出幅度理论上为 0。

\(N\) 点滑动平均,零点出现在:

\[ f_{\text{zero}}(k) = \frac{k \cdot f_s}{N} \quad (k = 1, 2, 3, \ldots) \]

第一零点在 \(f_s/N\) 处。

为什么会有零点?用一个 4 点滑动平均来理解。

假设输入是频率恰好等于 \(f_s/4\) 的正弦波,每个周期采 4 个点。连续 4 个采样值刚好是正弦波的一个完整周期的四个等分点:

sin(0°) = 0
sin(90°) = 1
sin(180°) = 0
sin(270°) = -1

这 4 个值的平均为:

\[ \frac{0 + 1 + 0 + (-1)}{4} = 0 \]

输出为零,也就是这个频率的正弦分量被抵消了。

这就是为什么有时平均滤波对某些周期干扰特别有效:不是因为它“平均得多”,而是干扰频率刚好落在它的零点附近。如果你知道干扰频率是 \(f_0\),可以选择窗口长度 \(N = f_s/f_0\),让零点对准干扰。

稳定性与响应速度的矛盾

滤波最常见的取舍是:

  • 越平滑,显示越稳,但响应越慢。
  • 越灵敏,响应越快,但噪声越明显。

这不是某个滤波器的缺点,而是所有滤波器的根本约束。它来自一个基本事实:你不能同时精确知道信号的"现在值"和"变化趋势"。 要确认信号稳定,需要看一段时间的历史;要看历史,就引入了延迟。

所以不要问"哪个滤波器最好",要问:

  • 允许多大抖动?
  • 允许多大延迟?
  • 异常值多不多?
  • 信号本身变化快不快?
  • MCU 有多少 RAM 和运算时间?

这些问题的答案决定了你应该用什么滤波器、参数怎么选。

评价滤波效果的三个指标

实际项目中,不要只凭肉眼觉得"顺眼"来判断滤波效果。建议用三个指标量化:

抖动幅度

稳态时最大值和最小值相差多少:

\[ \text{抖动} = \max(\text{输出}) - \min(\text{输出}) \quad \text{(稳态期间)} \]

这个值越小越好,但不能为零(除非信号本身不变)。测量时要等滤波器完全收敛后再取足够长的窗口。

响应时间

输入从旧值跳到新值后,滤波输出需要多久接近新值。

工程上常用"达到最终值 90% 或 95% 所需的时间"来衡量。对于一阶系统,时间常数 \(\tau\) 和系数 \(\alpha\) 的关系是:

\[ \tau = -\frac{T_s}{\ln(1 - \alpha)}, \quad \text{达到 95\%} \approx 3\tau, \quad \text{达到 99\%} \approx 5\tau \]

例如采样率 100 Hz(\(T_s = 10\;\text{ms}\)),\(\alpha = 0.1\)

\[ \tau = \frac{-0.01}{\ln(0.9)} \approx 0.095\;\text{s}, \quad 95\% \text{ 响应} \approx 0.285\;\text{s} \]

异常恢复能力

遇到尖峰、断线、饱和时,输出会不会被带偏,多久恢复。

测试方法:在正常信号中人为插入一个极端值(比如正常值的 10 倍),观察滤波器输出偏离正常范围多少、多快回来。线性滤波器(平均、FIR、IIR)会被尖峰严重污染,恢复较慢;中值滤波在窗口内异常点数量不超过半数时能有效剔除尖峰;限幅滤波依赖阈值设置是否合理。非线性方法通常更适合处理尖峰,但仍然需要满足各自的适用条件。

指标记录建议

建议把这三个指标写进测试记录,格式类似:

滤波器:滑动平均 N=10
采样率:100 Hz
抖动幅度:稳态 ±2 LSB
响应时间(95%):约 0.3 s
尖峰恢复:10 倍尖峰后偏离 5 LSB,约 5 个采样周期恢复

有了这些记录,不同滤波器、不同参数之间才能客观比较。

采样率选择的工程决策框架

最后把采样率的选择整理成一个可操作的流程:

第一步:确定信号带宽

你的系统要观察的信号,最高频率成分是多少?

  • 温度、压力、电压:通常 < 1 Hz
  • 称重、液位:通常 < 10 Hz
  • 电机电流:取决于 PWM 频率,通常 100 Hz ~ 10 kHz
  • 振动:取决于转速和关心的谐波次数

第二步:确定 Nyquist 下限

采样率至少是信号最高频率的 2 倍。这是理论下限。

第三步:加上工程裕量

乘以 3~5 倍,甚至更多。裕量用来:

  • 放松抗混叠滤波器的设计要求(裕量越大,模拟滤波器可以越简单)
  • 给数字滤波器留出工作空间(滤波器在 Nyquist 附近性能变差)
  • 应对信号频率可能的变化

第四步:检查系统约束

先看 MCU 内部 ADC 能不能满足需求:

  • MCU 的 ADC 最高采样率是多少?(很多入门级 MCU 内部 ADC 只有 100 kSPS 甚至更低)
  • ADC 位数够不够?(8 位和 16 位的量化噪声差 48 dB)
  • 多通道采样时实际速率会打折吗?(扫描模式下每通道速率 = 总速率 / 通道数)
  • 每次采样后要执行多少计算?来得及吗?
  • 数据要存储吗?存储空间够吗?
  • 电池供电吗?功耗预算够吗?

如果内部 ADC 不能满足需求,进入下面的工程补充内容。


工程补充:外部 ADC 与基准电压源

以下内容偏向硬件选型,初学者可以先跳过,等遇到具体项目需要时再回来查阅。

当内部 ADC 不够用时,需要考虑外部 ADC:

考量点 内部 ADC 外部 ADC
位数 通常 10~12 位 可选 16~24 位
采样率 受 MCU 时钟限制 独立时钟,可达 MSPS 级
通道数 受引脚限制 可选多通道、差分输入
噪声 受 MCU 数字噪声耦合影响 独立供电,噪声隔离更好
成本 零额外成本 增加芯片、PCB 面积、驱动开发

常见的外部 ADC 选型方向:

  • 高精度慢信号(温度、称重):Σ-Δ 型 ADC,如 ADS1220(24 位)、ADS1115(16 位)
  • 高速信号(振动、电流):SAR 型 ADC,如 ADS8860(16 位 1 MSPS)、AD7606(16 位 8 通道同步采样)

基准电压源:容易被忽视的关键环节

ADC 的精度不仅取决于位数,还取决于参考电压的稳定性和精度。

MCU 内部通常有一个参考电压源,但精度一般(±1% ~ ±2%),温漂也较大(几十到几百 ppm/°C)。如果你对绝对精度有要求,或者系统工作温度变化大,内部参考可能不够。

外部基准电压源的选型要点:

参数 含义 典型范围
初始精度 输出电压和标称值的偏差 ±0.02% ~ ±1%
温度系数 温度变化 1°C 引起的输出变化 1 ~ 50 ppm/°C
长期漂移 工作数千小时后的输出变化 几十 ppm/√kH
噪声 基准本身的输出噪声 几 µV 到几十 µV RMS

常见基准芯片:

  • 低成本通用:TL431(精度一般,适合对绝对精度要求不高的场合)
  • 中等精度:REF3030(3.0V,±0.2%,50 ppm/°C)
  • 高精度:ADR445(5.0V,±0.04%,3 ppm/°C)

一个实际例子:如果你用 12 位 ADC 量程 2.5V,基准电压偏 1%,出厂时用标准器校准后可以修正这个偏差——只要偏差是固定的,测一次就知道该乘什么系数。

但以下三类误差靠一次性校准解决不了:

  • 温度漂移:基准的输出随温度变化,工作温度每变 10°C,50 ppm/°C 的基准就偏 0.05%。除非你在每个工作温度下都做校准,或者用温度传感器实时补偿。
  • 长期漂移:基准芯片老化会导致输出缓慢变化,通常在几十 ppm/√kH 量级。运行一年后可能偏了 0.02%~0.05%,而且你不知道具体偏了多少,除非定期重新校准。
  • 基准噪声:基准本身有输出噪声(通常几 µV 到几十 µV RMS),这是随机的,每次测量都不一样,校准也消除不了。

所以基准电压源的选择原则是:如果你只关心重复性(相对精度),初始精度可以通过校准修正,重点看温漂和噪声;如果你关心绝对精度且不方便定期校准,初始精度也要重视。 对于工作温度变化大或要求长期稳定的系统,选低温漂基准(< 10 ppm/°C)比选高初始精度更重要。

第五步:用滤波器需求反验

如果你需要一个截止频率 10 Hz 的低通滤波器,采样率 100 Hz 意味着 \(N \approx 5\)(滑动平均),群延迟 \((N-1)/(2f_s) = 4/200 = 20\;\text{ms}\)。如果采样率选 1000 Hz,同样的 10 Hz 截止需要 \(N \approx 44\),群延迟 \(43/2000 \approx 21.5\;\text{ms}\)——差不多,但 RAM 需要保存的窗口长度从 5 增加到 44(约 9 倍),单位时间内的更新次数也从 100 增加到 1000(10 倍)。

如果用朴素求和实现滑动平均,每次更新的计算量和 \(N\) 成正比,总计算量会按采样率和窗口长度一起放大。如果用递推方式(维护一个累加值,每次加新减旧),每次更新的计算量近似常数,但仍然要承受更高的更新频率。所以采样率不是孤立选择的,它和滤波器参数、延迟要求、计算资源一起构成一个系统级的权衡。


这一章建立的概念——量化、采样、噪声类型、频率响应、截止频率、零点——会在后续每一章反复用到。如果某个概念还不太清楚,不用急着在这里完全搞懂,先记住它存在,学到后面回来看往往会有新的理解。