速度环设计:PI参数整定与观测器实战
速度环,说白了就是让电机老老实实按你给的速度转。我做了这么多年驱动,见过太多人把精力全花在电流环上,结果速度环一跑就抖。其实速度环才是决定系统好不好用的关键。
这一章我们重点聊三件事:PI参数怎么调、速度怎么测准、以及速度环和电流环到底怎么配合。嗯,都是实战里绕不开的硬骨头。
速度环PI参数整定
速度环的PI参数,和电流环不太一样。电流环响应快,带宽高,PI参数可以往大了怼。但速度环不行——机械时间常数比电气时间常数大得多,你调快了反而容易振荡。
我个人习惯先调比例,再调积分。比例决定响应速度,积分消除静差。但积分加多了,系统会变「肉」,超调也大。
速度环PI整定口诀(我自己的经验总结):
- 先给一个小的Kp,让电机能转起来,别抖
- 慢慢加Kp,直到出现轻微振荡,然后退回70%
- 加Ki,从0开始慢慢加,直到静差消失
- 如果超调太大,加一点微分或者做积分限幅
我曾经在一个伺服项目里,Ki给大了,结果电机低速时一窜一窜的,像抽风一样。查了半天才发现是积分饱和。后来加了积分限幅和抗饱和处理,问题才解决。
下面是一个常用的速度环PI结构,我习惯用增量式,避免积分饱和的麻烦:
// 速度环PI - 增量式实现
float speed_pi_ctrl(float target_speed, float actual_speed) {
float error = target_speed - actual_speed;
float delta_out;
// 比例项
float p_out = Kp_speed * error;
// 积分项 - 带限幅
integral_speed += Ki_speed * error;
if (integral_speed > INTEGRAL_LIMIT) integral_speed = INTEGRAL_LIMIT;
if (integral_speed < -INTEGRAL_LIMIT) integral_speed = -INTEGRAL_LIMIT;
// 输出
float output = p_out + integral_speed;
// 输出限幅
if (output > OUTPUT_LIMIT) output = OUTPUT_LIMIT;
if (output < -OUTPUT_LIMIT) output = -OUTPUT_LIMIT;
return output;
}
小技巧:速度环的输出就是电流环的给定值。所以速度环的输出限幅,其实就是电流限幅。我一般把输出限幅设为额定电流的1.5倍,既能保护电机,又不影响动态响应。
速度观测器:M法和T法测速
速度环再牛,测不准速度也是白搭。常用的测速方法就两种:M法和T法。你想想看,一个靠计数,一个靠计时,各有各的适用场景。
| 方法 | 原理 | 适用场景 | 精度特点 |
|---|---|---|---|
| M法 | 固定时间内计脉冲数 | 中高速(>100 RPM) | 高速时精度高,低速时误差大 |
| T法 | 测量相邻脉冲的时间 | 低速(<100 RPM) | 低速时精度高,高速时更新慢 |
| M/T法 | 两者结合 | 全速域 | 综合最优,但计算量大 |
M法实现简单,我早期项目里全用M法。但有一次做低速对位,电机在10 RPM以下转,M法测出来的速度跳得跟心电图似的。后来换成T法,才稳下来。
下面是M法和T法的核心代码,我贴出来供你参考:
// M法测速:固定时间窗口内计数
float m_method_speed(uint32_t pulse_count, float time_window_ms) {
// pulse_count: 时间窗口内的脉冲数
// time_window_ms: 时间窗口,单位ms
// PPR: 编码器线数
float speed_rpm = (pulse_count * 60.0f * 1000.0f) / (PPR * time_window_ms);
return speed_rpm;
}
// T法测速:测量两个脉冲之间的时间
float t_method_speed(float pulse_interval_us) {
// pulse_interval_us: 相邻脉冲间隔,单位us
float speed_rpm = (60.0f * 1000000.0f) / (PPR * pulse_interval_us);
return speed_rpm;
}
注意:T法在高速时,脉冲间隔会变得非常短。如果定时器分辨率不够,测出来的速度会跳。我曾经在3000 RPM时用T法,结果速度反馈跳了±200 RPM,后来加了低通滤波才压住。建议高速时切回M法,或者用M/T法自适应切换。
速度环与电流环的级联关系
三环控制里,速度环是外环,电流环是内环。速度环的输出直接给到电流环的给定。这个级联关系,说白了就是「速度环告诉电流环该出多大力」。
但这里有个关键点:电流环的带宽必须远大于速度环。我一般要求电流环带宽是速度环的5-10倍。否则速度环一调整,电流环跟不上,系统就会振荡。
下面这张图是我自己画的级联关系,你看一眼就明白了:
从图里你能看到,速度环的输出直接喂给电流环。电流环执行得快,速度环才能稳。我一般把电流环周期设在50-100μs,速度环周期设在500μs-2ms。这样速度环每次更新,电流环已经跑了好几轮了。
还有一个容易忽略的点:速度环的输出限幅。这个限幅值其实就是电流环的峰值电流。如果你把速度环输出限幅设得太大,电流环会一直饱和,速度环就失控了。我习惯把限幅设在电机额定电流的1.2-1.5倍,既能保证加速性能,又不会烧电机。
级联调试顺序(我的标准流程):
- 先调好电流环,确保电流响应快且无超调
- 电流环闭环,速度环开环,手动给电流看电机转不转
- 速度环加比例,从0开始慢慢加,直到速度响应满意
- 加积分,消除静差,注意不要加太多
- 做阶跃响应测试,看超调和调节时间
嗯,这一章的内容差不多就这些。速度环设计说难不难,说简单也不简单。关键是把PI参数调明白,把速度测准,再把级联关系理清楚。做到这三点,你的速度环基本就稳了。