2. 采样基础理论:采样定理与量化误差
做电机控制,第一关就是采样。
你想想看,电流、速度、位置,这些物理量都是连续的模拟信号。但我们的 DSP 或 MCU 只能处理离散的数字量。怎么把连续信号变成离散数字?这个过程就叫采样。
采样这事儿,看着简单,坑却不少。我刚开始做 FOC 的时候,就因为在采样频率上偷了懒,结果电流波形怎么调都抖,电机嗡嗡响。后来才发现——采样频率选错了。
2.1 奈奎斯特采样定理
先讲最核心的理论。
奈奎斯特采样定理说得很清楚:
如果要对一个模拟信号进行无失真采样,采样频率 fs 必须大于信号最高频率 fmax 的两倍。
即:fs > 2 × fmax
这个 2 倍频率,就叫奈奎斯特频率。
为什么必须大于 2 倍?
说白了,每个周期至少采两个点,才能还原出信号的频率和幅值。如果采样频率低于 2 倍,就会发生混叠——高频信号会伪装成低频信号混进来,你根本察觉不到。
混叠的后果很严重
在电机控制里,如果 PWM 开关频率附近的噪声混叠到低频段,电流环就会出现莫名其妙的振荡。我曾经调试一个 20kHz PWM 的驱动器,采样频率设成了 15kHz,结果电流波形上多了一个 5kHz 的毛刺,查了两天才发现是混叠。
2.2 采样频率的选择原则
理论讲完了,来点实际的。
采样频率到底选多少合适?我个人的经验是:
| 应用场景 | 信号最高频率 | 推荐采样频率 | 说明 |
|---|---|---|---|
| 电流环 | PWM 基波 + 边带 | 10~20 kHz | 通常与 PWM 频率同步 |
| 速度环 | 机械谐振频率 | 1~5 kHz | 取决于电机机械时间常数 |
| 位置环 | 运动轨迹带宽 | 0.5~2 kHz | 一般比速度环低一个数量级 |
选采样频率,我一般遵循三个原则:
- 满足奈奎斯特条件——这是底线,没得商量。
- 与 PWM 同步——电流采样最好在 PWM 载波的波峰或波谷触发,避开开关噪声。
- 留有余量——实际采样频率至少取信号最高频率的 5~10 倍,不是 2 倍就够。
我的习惯做法
做电流环时,我通常把采样频率设成 PWM 频率的 1 倍或 2 倍。比如 PWM 是 10kHz,采样就取 10kHz 或 20kHz。这样采样点刚好落在 PWM 周期的固定位置,噪声最小。
2.3 采样保持与孔径误差
采样不是瞬间完成的。
ADC 内部有个采样保持电路,它先把信号电压“抓住”,然后慢慢转换。这个“抓住”的过程需要时间——叫采样保持时间。
问题来了:如果信号变化很快,在采样保持期间电压还在变,那保持住的电压就不是你想要的点了。这个误差叫孔径误差。
孔径误差计算公式
ΔV = A × 2πf × tap
其中:A 是信号幅值,f 是信号频率,tap 是孔径时间。
信号频率越高、孔径时间越长,误差越大。
怎么减小孔径误差?
- 选采样保持时间短的 ADC(比如逐次逼近型 SAR ADC 就比积分型快)
- 在采样前加一级低通滤波器,把高频分量滤掉
- 如果信号变化极快,考虑用同步采样或多路同时采样
我记得有一次做高速电机控制,电机转速到了 20000rpm,电流变化率特别大。用普通 ADC 采样,每次采出来的电流值都不一样,电流环根本稳不住。后来换了 SAR ADC,采样保持时间从 1μs 降到 200ns,问题就解决了。
2.4 量化误差
采样之后是量化。
ADC 把连续的电压值映射到离散的数字码。比如 12 位 ADC,满量程 3.3V,那么每个 LSB 代表 3.3V / 4096 ≈ 0.8mV。
这个 0.8mV 就是量化步长。实际电压和量化值之间的差,就是量化误差。
量化误差的范围
理想情况下,量化误差在 ±½ LSB 之间。
对于 12 位 ADC、3.3V 参考电压,量化误差约为 ±0.4mV。
量化误差是原理性的,没法消除。但可以减小:
- 提高 ADC 位数——12 位不够就上 14 位、16 位
- 降低参考电压——如果信号范围只有 0~1V,就别用 3.3V 参考
- 过采样 + 求平均——用软件把多个采样值平均,等效提高分辨率
过采样的技巧
每提高 1 位分辨率,需要过采样 4 倍。比如 12 位 ADC 想达到 14 位效果,采样率要提高到原来的 16 倍。代价是占用更多 CPU 时间,但有时候比换 ADC 芯片划算。
2.5 知识体系总览
下面这张图,把采样基础理论的核心逻辑串起来了:
2.6 抗混叠滤波器
前面说了,采样频率不够高会混叠。但有时候信号里确实有高频噪声,你没法把采样频率提得太高——CPU 算不过来。
这时候就需要抗混叠滤波器。
说白了,就是在 ADC 前面加一个低通滤波器,把高于奈奎斯特频率的成分提前滤掉。这样即使采样频率不高,也不会混叠。
硬件滤波 vs 软件滤波
硬件抗混叠滤波器(RC 一阶或二阶)是必须的,不能只靠软件滤波。因为软件滤波是在采样之后做的,混叠已经发生了,软件救不回来。
我见过有人只在代码里做均值滤波,硬件上连个电容都没加。结果电流波形上总有奇怪的谐波,怎么调参数都没用。后来加了一级 RC 低通,问题立刻消失。
抗混叠滤波器的截止频率怎么选?
- 一般取采样频率的 1/3~1/5
- 比如采样频率 10kHz,截止频率设在 2~3kHz
- 阶数越高,衰减越快,但相位延迟也越大
嗯,这里要注意:滤波器会引入相位延迟。在电流环这种高带宽的环路里,相位延迟会影响稳定性。所以抗混叠滤波器的截止频率不能设得太低,否则环路会振荡。
2.7 实际采样链路
最后,我把整个采样链路串起来说一下:
- 模拟信号(电流/电压)从传感器出来
- 经过抗混叠滤波器(RC 低通)
- 进入 ADC 的采样保持电路
- ADC 完成量化,输出数字码
- MCU 读取数字值,进行标定和滤波
每一步都有误差源。抗混叠滤波器有幅值衰减和相位延迟,采样保持有孔径误差,量化有量化误差。把这些误差都控制住,采样链路才算合格。
我的检查清单
每次做新板子,我都会检查这几项:
- 采样频率是否大于信号最高频率的 5 倍?
- ADC 采样触发是否与 PWM 同步?
- 采样保持时间是否足够?
- 抗混叠滤波器截止频率是否合理?
- 量化误差是否在可接受范围内?
这几项过一遍,采样链路基本不会出大问题。