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值观察响应变化,理解积分增益对系统性能的影响。

PI控制消除稳态误差原理示意 时间 (s) 转速 (rad/s) 目标=100 纯P控制(有静差) PI控制(超调<10%) 稳态误差 超调量 控制效果对比 P:有静差 PI:无静差