2. 直流电机速度闭环PI控制
任务目标
在比例控制(P控制)基础上,为直流电机速度闭环加入积分环节构成PI控制器,通过整定积分系数Ki消除稳态误差,并保证转速响应超调量小于10%。
被控对象与控制系统结构
被控对象为直流电机电枢控制模型,传递函数为:
G(s) = K / (J·s + B) = 2 / (0.02s + 0.1)
其中K=2为电机转矩常数,J=0.02 kg·m²为转动惯量,B=0.1 N·m·s为粘性阻尼系数。控制系统采用单位负反馈结构,PI控制器传递函数为:
C(s) = Kp + Ki/s
仿真在Python环境中完成,使用numpy和matplotlib库,无需额外硬件。
PI控制器设计与Ki整定
首先单独使用P控制(Ki=0)验证稳态误差的存在,然后逐步增大Ki观察系统响应变化。整定目标:稳态误差为0(无静差),超调量<10%。
完整实现代码
import numpy as np
import matplotlib.pyplot as plt
# 电机参数
J = 0.02 # 转动惯量 kg·m^2
B = 0.1 # 粘性阻尼 N·m·s
K = 2.0 # 转矩常数
# 目标转速 (rad/s)
target_speed = 100.0
# 仿真参数
dt = 0.001 # 采样周期 (s)
sim_time = 3.0 # 仿真时长 (s)
steps = int(sim_time / dt)
t = np.arange(0, sim_time, dt)
def simulate_pi(Kp, Ki):
"""PI控制仿真,返回转速数组"""
speed = 0.0
integral = 0.0
speeds = []
for _ in range(steps):
error = target_speed - speed
integral += error * dt
# PI控制律
u = Kp * error + Ki * integral
# 电机动态方程: J·(ds/dt) + B·s = K·u
ds = (K * u - B * speed) / J
speed += ds * dt
speeds.append(speed)
return np.array(speeds)
# ========== 1. 纯P控制验证稳态误差 ==========
Kp_pure = 5.0
speed_pure = simulate_pi(Kp_pure, 0.0)
steady_error_pure = target_speed - speed_pure[-1]
print(f"纯P控制 (Kp={Kp_pure}): 稳态转速={speed_pure[-1]:.2f} rad/s, "
f"稳态误差={steady_error_pure:.2f} rad/s")
# ========== 2. PI控制整定 ==========
Kp = 5.0 # 保持与纯P相同的比例增益
Ki = 15.0 # 积分增益(整定值)
speed_pi = simulate_pi(Kp, Ki)
# 计算超调量
overshoot = 0.0
peak_speed = np.max(speed_pi)
if peak_speed > target_speed:
overshoot = (peak_speed - target_speed) / target_speed * 100
# 稳态误差(取最后1%时间段的平均值)
steady_speed = np.mean(speed_pi[-int(steps*0.01):])
steady_error = target_speed - steady_speed
print(f"PI控制 (Kp={Kp}, Ki={Ki}): 峰值转速={peak_speed:.2f} rad/s, "
f"超调量={overshoot:.2f}%, 稳态误差={steady_error:.4f} rad/s")
# ========== 3. 绘制对比曲线 ==========
plt.figure(figsize=(10, 5))
plt.plot(t, speed_pure, 'r--', label=f'纯P控制 (Kp={Kp_pure})', linewidth=1.5)
plt.plot(t, speed_pi, 'b-', label=f'PI控制 (Kp={Kp}, Ki={Ki})', linewidth=1.5)
plt.axhline(y=target_speed, color='gray', linestyle=':', label='目标转速')
plt.xlabel('时间 (s)')
plt.ylabel('转速 (rad/s)')
plt.title('直流电机速度闭环:P控制 vs PI控制')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim(0, 2.0)
plt.ylim(0, 120)
plt.tight_layout()
plt.savefig('pi_control_result.png', dpi=100)
plt.show()
运行方式
pip install numpy matplotlib
python pi_control.py
验证方法与判定标准
运行代码后观察终端输出和图形,按以下标准判定是否通过:
- 稳态误差消除:PI控制稳态转速与目标转速100 rad/s的误差值小于0.01 rad/s(即稳态误差≈0),而纯P控制存在明显稳态误差(约16.7 rad/s)。
- 超调量约束:PI控制响应曲线的峰值不超过110 rad/s,即超调量<10%。若超调量超过10%,减小Ki值(如Ki=10)重新仿真;若响应过慢,增大Ki值。
- 图形验证:图中蓝色PI曲线最终收敛至目标虚线,红色纯P曲线稳定在目标值下方,直观对比积分项的作用。
Ki整定说明
本例中Ki=15为满足指标的整定值。Ki过小(如Ki=5)时稳态误差消除缓慢;Ki过大(如Ki=50)时超调量超过10%甚至系统振荡。可通过修改代码中的Ki值观察响应变化,理解积分增益对系统性能的影响。