4、速度环整定:速度环模型、PI参数计算、积分限幅与抗饱和

速度环整定,说白了就是让电机按照你想要的转速跑,而且跑得稳、跑得快。很多新手一上来就调位置环,结果发现电机抖得像筛子一样。我个人的习惯是,先把速度环调明白,再去碰位置环。为什么?因为速度环是位置环的内环,内环不稳,外环全是白搭。

这一章我们重点聊四个东西:速度环的数学模型、PI参数怎么算、积分限幅设多少、以及抗饱和怎么处理。嗯,都是实战中绕不开的硬骨头。

4.1 速度环模型:从物理到代码

速度环的控制对象是什么?说白了就是电机+负载的转动惯量。你给一个转矩电流,电机就加速;你撤掉,它靠摩擦慢慢停。这个关系用数学表达就是:

J * dω/dt = Te - TL - B * ω

其中:

  • J —— 转动惯量(电机+负载)
  • ω —— 机械角速度
  • Te —— 电磁转矩
  • TL —— 负载转矩
  • B —— 粘滞摩擦系数

在FOC里,Te和Iq是成正比的(Te = 1.5 * p * ψf * Iq)。所以速度环的输入是转速误差,输出是Iq的给定值。整个环路可以简化成一个一阶惯性环节加一个积分器。

核心结论:速度环本质上是一个一阶系统,PI控制器足够应对。不需要上PID,D项在速度环里反而容易引入噪声。

我在项目中遇到过一个问题:同样的PI参数,换一个负载就抖得不行。后来发现是转动惯量变了,系统的截止频率也跟着变了。所以调参之前,先搞清楚你的负载是轻载还是重载,差别很大。

4.2 PI参数计算:从理论到经验

速度环PI参数的整定,有两种主流方法:

  1. 基于模型计算法 —— 知道J和B,直接算
  2. 工程整定法 —— 不知道参数,靠试

先说说基于模型的方法。速度环的闭环传递函数可以写成:

G(s) = (Kp * s + Ki) / (J * s² + (B + Kp) * s + Ki)

我们希望它是个典型的二阶系统。把阻尼比ζ设成0.707(临界阻尼),带宽ωn根据你的系统需求来定。一般伺服系统的速度环带宽在20~100Hz之间。GD32跑FOC,我建议取30~50Hz,再高容易受电流环延迟影响。

参数计算公式:

Kp = 2 * ζ * ωn * J - B
Ki = ωn² * J

举个例子:假设J = 0.001 kg·m²,B = 0.0001 N·m·s,目标带宽ωn = 50Hz(约314 rad/s),ζ = 0.707:

Kp = 2 * 0.707 * 314 * 0.001 - 0.0001 ≈ 0.444
Ki = 314² * 0.001 ≈ 98.6

嗯,算出来是这个数。但实际用的时候,你会发现理论值和实际值差不少。为什么?因为你的电流环有延迟,PWM有死区,摩擦力也不是线性的。所以算出来的值只能当起点。

我的习惯:理论值算出来之后,先乘以0.5作为初始值,然后慢慢往上加。加到电机开始有轻微震荡,再往回退10%~20%。这个点就是最佳参数。

如果你不知道J和B,那就用工程整定法:

  • 先把Ki设成0,只调Kp
  • 增大Kp直到电机出现等幅震荡
  • 记录此时的Kp_crit和震荡周期T_crit
  • 按Ziegler-Nichols法则:Kp = 0.45 * Kp_crit,Ki = 1.2 * Kp / T_crit

这个方法在GD32上实测有效,但要注意:震荡测试时电流限幅要设小一点,别把电机烧了。

4.3 积分限幅:为什么必须加?

积分项的作用是消除稳态误差。但积分有个大问题:当误差一直存在时(比如电机被堵转),积分项会一直累加,最后大到离谱。等你把堵转解除,积分项释放出来,电机会猛地冲出去。这就是所谓的"积分饱和"。

积分限幅就是给积分项设一个天花板。我一般这样设:

积分限幅 = 0.3 ~ 0.5 * 电流限幅

举个例子,你的电流限幅是3A,那积分限幅就设在0.9~1.5A之间。太小了稳态误差消不掉,太大了积分饱和风险高。

场景 建议积分限幅 说明
轻载、快速响应 0.3 * 电流限幅 积分作用弱一点,响应更快
重载、需要大转矩 0.5 * 电流限幅 积分作用强,消除静差
位置环内嵌速度环 0.2 * 电流限幅 位置环自己会补偿,速度环积分别太强

注意:积分限幅不是越大越好。我曾经在一个项目里把积分限幅设到0.8倍电流限幅,结果电机在启动时每次都 overshoot 超过20%。后来查了半天,就是积分饱和搞的鬼。

4.4 抗饱和:让积分器更聪明

积分限幅是硬限制,抗饱和是软策略。常用的抗饱和方法有两种:

方法一:条件积分法

只有满足特定条件时才让积分起作用。比如:

if (abs(速度误差) < 阈值) {
    积分累加 = 积分累加 + Ki * 误差 * Ts;
} else {
    积分累加 = 积分累加;  // 冻结积分
}

这个方法的优点是简单,缺点是阈值不好选。选大了积分作用不够,选小了等于没加。

方法二:反计算法(Back-Calculation)

当PI输出被限幅时,把超出的部分反馈回积分器,让积分器"退一步"。

// 伪代码
输出 = PI_输出;
if (输出 > 上限) {
    输出 = 上限;
    积分累加 -= Kc * (PI_输出 - 上限);
} else if (输出 < 下限) {
    输出 = 下限;
    积分累加 -= Kc * (PI_输出 - 下限);
}

这里的Kc是反计算增益,一般取1~2倍的Kp。我习惯取1.5倍Kp,效果不错。

实战建议:在GD32上,我推荐用反计算法。代码量只多几行,但效果比条件积分法好很多。特别是频繁启停的场景,反计算法能让速度环的恢复时间缩短30%以上。

4.5 速度环整定流程总结

把上面这些串起来,一个完整的整定流程是这样的:

  1. 估算转动惯量J —— 可以用加减速实验测,或者直接查电机手册
  2. 计算理论PI值 —— 按二阶系统公式算,ζ取0.707,带宽取30~50Hz
  3. 设置积分限幅 —— 0.3~0.5倍电流限幅
  4. 加入抗饱和 —— 推荐反计算法,Kc取1.5倍Kp
  5. 空载调试 —— 先让电机空转,调Kp到轻微震荡再退回
  6. 带载验证 —— 加上实际负载,微调Ki消除稳态误差
  7. 极限测试 —— 做阶跃响应和堵转恢复,看超调和恢复时间

下面这张图把速度环整定的知识体系串起来了,你可以对照着看:

速度环整定知识体系 速度环整定 速度环模型 J·dω/dt = Te - TL - B·ω 一阶系统,PI足够 PI参数计算 Kp = 2ζωnJ - B Ki = ωn²·J 积分限幅 限幅值 = 0.3~0.5 × 电流限幅 防止积分饱和 抗饱和策略 推荐:反计算法 Kc = 1.5 × Kp 整定流程:模型→计算→限幅→抗饱和→调试

最后说一句,速度环整定没有"万能参数"。同样的电机,不同的负载、不同的供电电压、甚至不同的温度,参数都可能要微调。我的做法是在代码里留三组参数:轻载、中载、重载,运行时根据工况切换。GD32的Flash够大,存几组参数完全不是问题。