4. 采样周期选择的工程实践:经验法则、多速率策略与权衡
好,前面我们聊了那么多理论,什么香农定理、相位裕度、抗混叠滤波…… 说实话,这些是基础,但真正到了项目里,没人会拿着计算器在那算半天。今天我就跟你聊聊,我在实际项目中是怎么选采样周期的。
说白了,工程实践就是一门「妥协的艺术」。你想想看,采样周期选小了,CPU 累得半死;选大了,系统性能又拉胯。怎么找到那个「刚刚好」的点?这就是我今天要讲的核心。
4.1 经验法则:带宽的 1/10 规则
先说说最常用的一个经验法则——1/10 规则。这个规则很简单:
采样频率 fs 至少是系统闭环带宽 fBW 的 10 倍。
核心公式: fs ≥ 10 × fBW
为什么会是 10 倍?不是 2 倍?不是 20 倍?
嗯,这里有个故事。我记得刚入行时,带我的老工程师跟我说:「小张,香农定理说 2 倍就够了,但那是针对理想情况。你实际做项目,2 倍采样出来的信号,相位滞后得一塌糊涂,控制器根本稳不住。」
后来我自己试了一下,确实如此。10 倍这个数字,是无数前辈用血泪换来的经验值。它保证了:
- 足够的相位裕度:采样引入的延迟大约为 1.5 个采样周期,10 倍带宽下这个延迟影响可控
- 抗混叠滤波器容易设计:过渡带从 fBW 到 fs/2,有足够的空间
- 数字控制器的计算精度:采样间隔内,被控对象的状态变化不会太大
我的个人习惯: 如果系统对成本不敏感,我一般取 15~20 倍。比如一个带宽 100Hz 的伺服系统,我通常用 2kHz 采样。多出来的余量,用来应对模型不确定性和噪声。
当然,1/10 规则不是万能的。我曾经在一个超高速电机项目里,带宽做到 500Hz,按规则要 5kHz 采样。但我们的 ADC 和 CPU 实在扛不住。怎么办?这就引出了下一个话题——多速率采样。
4.2 多速率采样策略
多速率采样,说白了就是「不同的任务,用不同的采样率」。
你想想看,一个控制系统里,不是所有信号都需要高速采样。比如:
- 电流环:需要高速,因为电流变化快,带宽高
- 速度环:可以慢一点,机械时间常数大
- 位置环:更慢,甚至 1ms 采一次都够
- 温度监测:几秒钟采一次就行
我在一个四轴机器人项目中用过这个策略。当时 CPU 是 STM32F4,主频 168MHz,单核。如果所有环路都用 10kHz 跑,CPU 占用率直接飙到 95%,连通信都卡死了。
后来我改成这样:
| 任务 | 采样率 | CPU 占用率 |
|---|---|---|
| 电流环(4轴) | 10 kHz | 40% |
| 速度环(4轴) | 2 kHz | 15% |
| 位置环(4轴) | 500 Hz | 5% |
| 通信/监控 | 100 Hz | 10% |
你看,总占用率才 70%,还有余量。而且性能几乎没有下降——因为速度环和位置环的带宽本来就低,用低采样率完全够用。
注意: 多速率采样最怕的是「时序错乱」。比如电流环在 0.1ms 更新了输出,但速度环在 0.5ms 才读到这个值,中间差了 4 个周期。这会导致控制不同步,甚至震荡。
我的做法: 在速度环采样时刻,强制读取电流环的最新值,而不是缓存值。这样虽然多了一点点延迟,但保证了数据的一致性。
下面这张图,是我常用的多速率采样框架:
4.3 实际项目中的权衡:CPU 负载 vs 性能
这是最现实的问题。你理论算得再好,CPU 跑不动就是白搭。
我经历过一个血泪教训。有一次做无人机飞控,我为了追求极致性能,把采样率设到了 20kHz。结果呢?CPU 占用率 98%,中断嵌套乱成一锅粥。飞起来不到 30 秒,直接炸机了。
从那以后,我总结了一套权衡方法:
4.3.1 先算 CPU 预算
拿到一个项目,我第一件事不是写代码,而是算 CPU 能分给控制任务多少时间。比如:
- CPU 主频 200MHz,一个控制周期内可用指令数 = 200M / fs
- 电流环计算需要 500 条指令,速度环需要 300 条,位置环需要 200 条
- 加上 ADC 读取、通信、系统开销,总指令数不能超过可用指令数的 70%
经验公式: 实际 CPU 占用率 ≤ 70% 是比较安全的。超过 80%,系统响应会变慢,中断延迟增加,容易出问题。
4.3.2 性能损失的量化
降低采样率,性能会下降多少?我一般用两个指标衡量:
- 相位滞后:采样延迟引入的相位滞后 ≈ 1.5 × (fBW / fs) × 180°
- 控制精度:采样间隔内,被控量的变化量不能超过允许误差的 1/3
举个例子:一个温度控制系统,允许误差 ±0.5°C,升温速率 10°C/s。那么采样间隔内变化量不能超过 0.5/3 ≈ 0.17°C。所以采样周期 Ts ≤ 0.17 / 10 = 0.017s,即 17ms。换算成频率约 60Hz。
你看,这个结果比 1/10 规则算出来的(假设带宽 1Hz,10Hz 采样)要宽松得多。因为温度系统惯性大,不需要那么高的采样率。
我的建议: 先用 1/10 规则定一个上限,再用「误差变化率」定一个下限。最后在这个区间里,根据 CPU 负载做调整。
4.3.3 实际项目中的常见取舍
我整理了一个表格,供你参考:
| 场景 | 优先保证 | 可以妥协 | 我的做法 |
|---|---|---|---|
| 高精度伺服 | 电流环采样率 | 位置环采样率 | 电流环 10kHz,位置环 1kHz |
| 电池管理系统 | 电压/电流同步 | 温度采样率 | 电压电流 1kHz,温度 10Hz |
| 无人机飞控 | 姿态环采样率 | GPS 位置更新 | 姿态 1kHz,GPS 10Hz |
| 工业机器人 | 关节电流环 | 末端轨迹插补 | 电流 8kHz,轨迹 500Hz |
避坑指南: 我曾经在一个项目中,为了省 CPU,把电流环和速度环的采样率设成一样。结果发现速度环的噪声被电流环放大,系统嗡嗡响。后来我把速度环采样率降到电流环的 1/5,问题就解决了。
记住:不同环路之间,采样率最好成整数倍关系,比如 10kHz、2kHz、500Hz。这样同步逻辑简单,不容易出 bug。
4.4 小结
好了,今天聊了三个核心点:
- 1/10 规则:快速定上限,简单粗暴但有效
- 多速率采样:不同任务不同速率,省 CPU 又不降性能
- CPU 负载 vs 性能:先算预算,再量化损失,最后做取舍
说白了,采样周期选择没有标准答案。每个项目都有自己的脾气,你得去摸、去试、去调。但有了这些经验法则和权衡方法,至少你不会一开始就走偏。
下次做项目时,不妨先按我说的试试。有问题随时交流。
公众号:蓝海资料掘金营,微信deep3321