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 个周期。这会导致控制不同步,甚至震荡。

我的做法: 在速度环采样时刻,强制读取电流环的最新值,而不是缓存值。这样虽然多了一点点延迟,但保证了数据的一致性。

下面这张图,是我常用的多速率采样框架:

多速率采样策略框架 高速任务 电流环 (10 kHz) 中速任务 速度环 (2 kHz) 低速任务 位置环 (500 Hz) 输出 输出 同步机制:高速任务输出最新值,中/低速任务在采样时刻直接读取 CPU 负载分布: 高速 40% 中速 15% 5% 通信 10% 空闲 30% 总 CPU 占用率 70%,留有 30% 余量应对突发任务

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