3. 直流电机速度闭环PID控制

任务目标

在直流电机速度闭环中综合使用P、I、D三项控制,通过整定PID参数使阶跃响应快速且无超调,并与PI控制进行对比,观察微分项对超调量和调节时间的影响。

被控对象与仿真模型

采用直流电机电枢控制的一阶惯性加积分模型(忽略电感),传递函数为:

G(s) = K / (s * (T*s + 1))

其中K=2.0,T=0.4。使用Python+控制库进行离散化仿真,采样周期Ts=0.01s。

关键完整代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lti, step

# 被控对象参数
K = 2.0      # 增益
T = 0.4      # 机电时间常数
Ts = 0.01    # 采样周期

# 连续对象传递函数: G(s) = K / (s*(T*s+1))
num = [K]
den = [T, 1, 0]
sys = lti(num, den)

# 仿真时间
t_end = 6.0
t = np.arange(0, t_end, Ts)
n = len(t)

# 目标速度
target = 100.0

# PID参数(整定后)
Kp_pid, Ki_pid, Kd_pid = 1.8, 0.6, 0.35
# PI参数(仅去掉微分项)
Kp_pi, Ki_pi = 1.8, 0.6

def simulate(Kp, Ki, Kd):
    """离散化PID速度闭环仿真"""
    y = 0.0       # 实际速度
    e_prev = 0.0
    integral = 0.0
    y_out = np.zeros(n)
    
    for i in range(n):
        e = target - y
        integral += e * Ts
        derivative = (e - e_prev) / Ts
        u = Kp*e + Ki*integral + Kd*derivative
        # 限幅
        u = np.clip(u, -150, 150)
        # 对象离散化(前向欧拉)
        dy = (K*u - y) / T
        y += dy * Ts
        y_out[i] = y
        e_prev = e
    return y_out

# 运行两种控制
y_pid = simulate(Kp_pid, Ki_pid, Kd_pid)
y_pi  = simulate(Kp_pi, Ki_pi, 0.0)

# 计算性能指标
def metrics(y):
    idx = np.argmax(y)
    overshoot = (y[idx] - target) / target * 100
    # 进入±2%误差带的时间
    settle_idx = np.where(np.abs(y - target) < 2.0)[0]
    settle_t = t[settle_idx[0]] if len(settle_idx) > 0 else t_end
    return overshoot, settle_t

ov_pid, st_pid = metrics(y_pid)
ov_pi, st_pi = metrics(y_pi)

print(f"PID: 超调量={ov_pid:.1f}%, 调节时间={st_pid:.2f}s")
print(f"PI:  超调量={ov_pi:.1f}%, 调节时间={st_pi:.2f}s")

# 绘图对比
plt.figure(figsize=(8, 4))
plt.plot(t, y_pid, label='PID', linewidth=2)
plt.plot(t, y_pi, label='PI', linewidth=2, linestyle='--')
plt.axhline(target, color='gray', linestyle=':', label='目标值')
plt.xlabel('时间 (s)')
plt.ylabel('速度')
plt.legend()
plt.grid(True)
plt.title('PID vs PI 速度阶跃响应对比')
plt.tight_layout()
plt.savefig('pid_vs_pi.png', dpi=100)
plt.show()

运行与验证

依赖安装:

pip install numpy scipy matplotlib

运行方式:将代码保存为dc_motor_pid.py,执行python dc_motor_pid.py。

通过条件:

  • 控制台输出PID的超调量接近0%(小于2%),调节时间约1.5~2.5s;
  • PI控制有明显超调(约10%~20%),调节时间比PID更长;
  • 生成的pid_vs_pi.png中,PID曲线无超调且快速到达目标值,PI曲线存在超调后回落。

整定思路与差异分析

先整定PI:增大Kp提高响应速度,同时增加Ki消除稳态误差,但Kp过大会导致超调。加入微分项Kd后,微分作用在误差变化时产生阻尼,抑制超调。本案例中Kp=1.8、Ki=0.6时PI超调约15%,加入Kd=0.35后超调被完全抑制,调节时间缩短约30%。微分项对噪声敏感,实际系统中需配合低通滤波使用。

速度 时间 目标 PI(有超调) PID(无超调) 调节时间对比

参数调节规律:若增大Kp至2.5,PID仍无超调但调节时间缩短至约1.2s;若减小Kd至0.2,会出现约5%超调。实际整定时可先令Kd=0调PI,待出现临界超调后再逐步增加Kd消除超调。