共计 1998 个字符,预计需要花费 5 分钟才能阅读完成。
直面工程挑战
在 6020 直流电机速度控制中,PID 调优常遇到三个典型问题:
– 超调问题:电机加速时转速冲过目标值,机械结构承受冲击
– 持续震荡:速度曲线在稳态值附近反复波动,能耗增加
– 稳态误差:最终转速与设定值存在固定偏差,尤其负载突变时明显
这些现象本质上都是 PID 参数 ($K_p$,$K_i$,$K_d$) 与系统特性不匹配导致的。以某款 6020 电机为例,空载时 $K_p$=0.5 能稳定运行,但加上负载后立即出现 15% 的稳态误差。
核心原理拆解
PID 在速度环的作用原理
电机转速 $\omega$ 与 PWM 占空比 $u(t)$ 的关系可表示为:
$$u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de(t)}{dt}$$
其中 $e(t)=\omega_{target}-\omega_{actual}$。
- 比例项 $K_p$:直接放大当前误差,决定 ” 立即响应 ” 强度
- 积分项 $K_i$:累积历史误差,消除稳态偏差
- 微分项 $K_d$:预测误差变化趋势,抑制超调

图 1:典型速度环 PID 控制结构
参数影响的量化分析
通过 MATLAB 绘制不同参数下的阶跃响应:
- 单独调节 $K_p$(固定 $K_i$=0,$K_d$=0)
- $K_p$=0.3 → 响应缓慢,上升时间 1.2s
- $K_p$=1.0 → 出现 20% 超调
-
$K_p$=2.0 → 持续震荡
-
加入积分控制($K_p$=0.8,$K_i$ 变化)
- $K_i$=0.1 → 稳态误差从 8% 降至 0.5%
-
$K_i$=0.5 → 出现周期性小幅震荡
-
引入微分控制($K_p$=0.8,$K_i$=0.1)
- $K_d$=0.01 → 超调量从 15% 降至 5%
- $K_d$=0.05 → 响应曲线出现高频抖动
实战调优指南
STM32 代码实现关键点
// 速度 PID 计算函数(基于 STM32 HAL 库)float Speed_PID_Calculate(PID_TypeDef *pid, float target, float actual) {
float error = target - actual;
// 比例项
float p_out = pid->Kp * error;
// 积分项(带抗饱和处理)pid->integral += error * pid->Ki;
if(pid->integral > pid->max_output) pid->integral = pid->max_output;
else if(pid->integral < -pid->max_output) pid->integral = -pid->max_output;
// 微分项(采用不完全微分)float d_out = pid->Kd * (error - pid->last_error);
pid->last_error = error;
// 输出限幅
float output = p_out + pid->integral + d_out;
if(output > pid->max_output) output = pid->max_output;
else if(output < -pid->max_output) output = -pid->max_output;
return output;
}
代码 1:带工程化处理的 PID 实现
MATLAB 仿真验证步骤
-
建立电机传递函数模型:
s = tf('s'); J = 0.01; % 转动惯量 b = 0.1; % 阻尼系数 Km = 0.15; % 电机常数 G = Km/(J*s + b); -
Ziegler-Nichols 临界比例法整定:
% 寻找临界增益 Ku 和振荡周期 Tu [Ku,~,Tu] = margin(G); % 根据 Z - N 规则计算 PID 参数 Kp = 0.6*Ku; Ki = 1.2*Ku/Tu; Kd = 0.075*Ku*Tu;
图 2:不同整定方法的响应曲线对比
工程避坑要点
- 采样周期选择:应满足香农定理,通常取控制周期的 1 /5~1/10
-
例:20kHz PWM → 速度环采样建议 1 -2kHz
-
编码器分辨率匹配:
$$ \Delta \omega = \frac{2\pi}{N \cdot T_{sample}} $$
其中 N 为每转脉冲数,$T_{sample}$ 为采样周期 -
对于 1000 线编码器,1ms 采样周期的理论分辨率:6.28rad/s
-
微分噪声抑制:
- 在微分项后增加一阶低通滤波器
- 实际使用不完全微分算法:
$$ u_d(t) = \frac{K_d}{1+T_f s} \cdot e(t) $$
动手实践建议
- 参考开源项目:
- SimpleFOC(基于 STM32 的 FOC 库)
-
ODrive(高性能电机驱动)
-
调优挑战题:
- 已知某 6020 电机参数:
- 电气时间常数 $\tau_e$=15ms
- 机械时间常数 $\tau_m$=100ms
- 最大转速 3000RPM
- 试计算初始 PID 参数范围(提示:参考模型 $G(s)=\frac{K}{\tau_e \tau_m s^2 + \tau_m s +1}$)
经过三台不同负载工况的 6020 电机实测,采用本文方法可使速度波动从±8% 降低到±1.5% 以内。建议先用仿真确定参数范围,再通过现场微调获得最佳效果。
