4、D增益的阻尼作用:微分项对抖动的抑制作用、微分先行与不完全微分、微分噪声放大问题

聊完了P和I,咱们终于轮到D了。说实话,D增益是三个参数里最让人又爱又恨的。爱它,是因为它能提前预判误差的变化趋势,像给系统加了个“刹车”;恨它,是因为它太敏感了,稍微有点噪声就能把输出搞得乱七八糟。

我在现场调过不少抖动严重的系统,很多时候不是P和I没调好,而是D没用好。今天咱们就把D增益的底裤扒干净,看看它到底怎么抑制抖动,又怎么把自己变成了抖动的源头。

4.1 微分项的物理直觉:它到底在干什么?

先想一个问题:为什么系统会抖动?

说白了,就是控制器反应慢了半拍。误差已经变小了,P项还在使劲输出;误差已经过冲了,I项还在累积。等你发现不对劲的时候,系统已经抖起来了。

微分项解决的就是这个“滞后”问题。它看的是误差的变化率——不是误差有多大,而是误差正在怎么变。

  • 误差在快速增大 → D项输出负向力,帮你“踩刹车”
  • 误差在快速减小 → D项输出正向力,防止你“冲过头”

我习惯把D项比作一个“预见者”。它不看现在,它看未来。你想想看,如果一个人能提前知道你要摔倒,他是不是能提前扶你一把?D项就是这个角色。

核心理解:微分项不关心误差的值,只关心误差的变化趋势。它提供的是阻尼力,不是驱动力。

4.2 D增益对抖动的抑制作用

咱们用一个实际场景来说明。假设你调一个位置伺服系统,P=10,I=0,D=0。系统会怎么样?大概率会超调,然后来回震荡,最后慢慢稳定下来。

这时候你加一点D进去,比如D=0.5。你会发现:

  • 超调量明显减小
  • 震荡次数减少
  • 稳定时间缩短

为什么会这样?因为D项在误差接近目标时,提前输出了反向力,阻止了过冲。这就是阻尼作用的本质。

我整理了一个对比表,方便你理解不同D值的效果:

D增益 系统响应 抖动情况 典型场景
D=0 超调明显,震荡多次 严重抖动 纯P控制
D=0.2~0.5 轻微超调,快速收敛 抖动明显改善 一般伺服系统
D=0.5~1.0 无超调,响应略慢 几乎无抖动 高精度定位
D>1.0 响应迟钝,可能高频振荡 噪声放大导致新抖动 需要谨慎

注意最后一行。D不是越大越好。我见过有人觉得“抖动就加D”,结果D越加越大,系统反而开始高频振荡了。嗯,这里要特别小心。

4.3 微分先行:解决“设定值突变”的妙招

咱们在实际项目中经常遇到一个问题:目标值突然变了,比如从0度跳到90度。这时候误差瞬间变得很大,微分项会怎么反应?

它会输出一个巨大的负向力——因为误差变化率太大了。结果就是:系统启动时反而被“刹车”了,响应变慢。

这就是传统微分的问题:它对设定值的变化太敏感了。

解决办法是什么?微分先行(Derivative on Measurement)。

说白了,就是只对被控量(测量值)做微分,不对设定值做微分。公式上看起来是这样的:

传统PID:u(t) = Kp*e(t) + Ki*∫e(t)dt + Kd*de(t)/dt
微分先行:u(t) = Kp*e(t) + Ki*∫e(t)dt - Kd*dy(t)/dt

注意看,第二个公式里微分项用的是dy/dt,而不是de/dt。y是测量值,e是误差。当设定值突变时,测量值不会突变,所以微分项不会产生冲击。

我在做温度控制时用过这个技巧。温控系统对设定值变化特别敏感,传统PID每次改变目标温度都会先反向冲一下,用了微分先行后,启动曲线平滑多了。

实用建议:如果你的系统经常需要改变目标值(比如轨迹跟踪、温控曲线),优先考虑微分先行。实现起来也不复杂,就是在代码里把微分输入从误差改成测量值。

4.4 不完全微分:别让微分项“太激动”

还有一个常见问题:微分项对高频噪声特别敏感。哪怕测量值只有一点点毛刺,微分一下就能放大成很大的输出。

我举个例子。假设你的传感器有±1个字的噪声,采样周期1ms。如果D=10,那么微分项的输出波动就是:

Δu = Kd * Δe / Δt = 10 * 1 / 0.001 = 10000

看到了吗?1个字的噪声,被放大成了10000的输出波动。这谁受得了?

不完全微分就是来解决这个问题的。它的思路很简单:给微分项加一个低通滤波器,让高频噪声过不来。

数学上,不完全微分的传递函数是:

传统微分:Gd(s) = Kd * s
不完全微分:Gd(s) = Kd * s / (Tf * s + 1)

其中Tf是滤波时间常数。Tf越大,滤波效果越强,但微分作用也越弱。

我一般这样设置Tf:

  • 噪声不大时:Tf = 0.01 ~ 0.05 * Ts(采样周期)
  • 噪声明显时:Tf = 0.1 ~ 0.5 * Ts
  • 噪声严重时:Tf = 1 ~ 5 * Ts(但这时候微分效果已经很弱了)

代码实现也很简单,我贴一个常用的递推形式:

// 不完全微分 - 递推实现
float Tf = 0.01;  // 滤波时间常数
float Ts = 0.001; // 采样周期
float alpha = Tf / (Tf + Ts);
float d_term_filtered = 0;

// 每次采样时执行
float error_raw = setpoint - measurement;
float derivative = (error_raw - error_prev) / Ts;
d_term_filtered = alpha * d_term_filtered + (1 - alpha) * derivative;
output = Kp * error + Ki * integral + Kd * d_term_filtered;
error_prev = error_raw;

注意:不完全微分不是万能的。如果噪声频率和系统带宽重叠,滤波会同时削弱有用的微分信号。这时候需要从源头解决噪声问题,比如换传感器、加硬件滤波。

4.5 微分噪声放大问题:一个避坑指南

我曾经在一个项目中吃过亏。那是一个高速运动控制平台,位置反馈用的是编码器。编码器本身精度很高,但安装时有点松动,导致测量值有微小的周期性抖动。

我一开始没在意,觉得这点抖动不影响稳态精度。结果一加D项,系统就开始高频振荡,声音都变了。我花了整整两天才找到原因——就是编码器那点微小的安装间隙。

从那以后,我总结了一套微分噪声排查流程:

  1. 先看原始信号:把测量值直接打印出来,看看有没有肉眼可见的毛刺
  2. 再看微分信号:单独输出微分项的值,看看它是不是在剧烈波动
  3. 频谱分析:如果条件允许,做一下FFT,看看噪声集中在哪个频段
  4. 对症下药:
    • 低频噪声 → 检查机械结构、传感器安装
    • 高频噪声 → 加不完全微分或硬件滤波
    • 周期性噪声 → 用陷波滤波器

还有一个容易被忽略的点:采样周期越短,微分噪声放大越严重。因为Δt在分母上,采样周期越小,微分增益越大。如果你发现D项怎么调都不对,试试把采样周期稍微放大一点,有时候会有奇效。

4.6 知识体系总览

说了这么多,咱们用一张图把D增益的核心逻辑串起来:

D增益知识体系 D增益核心逻辑 微分项 D 增益 阻尼作用:抑制抖动 微分先行 不完全微分 预判误差变化趋势 提供反向阻尼力 减少超调与震荡 只对测量值微分 避免设定值突变冲击 适合轨迹跟踪场景 加低通滤波器 抑制高频噪声放大 Tf参数需权衡 核心矛盾:D增益越大,阻尼越强,但噪声放大也越严重 微分先行 + 不完全微分 = 实用解决方案

这张图把D增益的三个核心分支串在了一起。左边是它的本职工作——提供阻尼、抑制抖动;中间和右边是两个实用改进方案,分别解决设定值突变和噪声放大问题。

我个人觉得,D增益是PID里最需要“手感”的参数。P和I可以靠公式估算,D更多是靠观察和调试。你调得多了,自然就能感觉到“这个系统需要多少阻尼”。

最后说一句:如果你发现系统怎么调都抖,别只盯着D。回头看看机械结构、传感器、采样周期,有时候问题根本不在算法里。