1. 直流电机速度闭环P控制
任务目标
搭建直流电机速度单闭环控制系统,仅使用比例控制器(P控制),通过改变比例增益 Kp 观察系统响应,重点记录并分析稳态误差随 Kp 的变化规律。
被控对象与闭环结构
直流电机电枢电压-转速传递函数可简化为一阶惯性环节:
G(s) = K<sub>m</sub> / (T<sub>m</sub>·s + 1)
其中 Km 为电机增益(rpm/V),Tm 为机电时间常数(s)。速度闭环采用单位反馈,P控制器输出 u = Kp·(nref − n),其中 nref 为目标转速,n 为实际转速。
环境依赖
本案例使用 Python 3 + NumPy + Matplotlib,无需额外硬件。安装命令:
pip install numpy matplotlib
关键完整代码
以下代码完成系统仿真、P控制闭环计算,并绘制不同 Kp 下的阶跃响应曲线:
import numpy as np
import matplotlib.pyplot as plt
# 电机参数(示例值)
Km = 200.0 # rpm/V
Tm = 0.5 # s
# 仿真参数
dt = 0.001 # 步长 s
t_end = 3.0 # 仿真时长 s
t = np.arange(0, t_end, dt)
n_steps = len(t)
# 目标转速
n_ref = 1000.0 # rpm
# 不同比例增益
Kp_list = [0.5, 1.0, 2.0, 5.0]
plt.figure(figsize=(10, 6))
for Kp in Kp_list:
n = 0.0 # 实际转速初值
n_history = np.zeros(n_steps)
for i in range(n_steps):
error = n_ref - n
u = Kp * error # P控制输出
# 一阶惯性系统离散化(前向欧拉)
dn_dt = (Km * u - n) / Tm
n = n + dn_dt * dt
n_history[i] = n
# 理论稳态误差: e_ss = n_ref / (1 + Kp*Km)
e_ss = n_ref / (1 + Kp * Km)
print(f"Kp={Kp:.1f} 仿真稳态值={n_history[-1]:.1f} rpm "
f"理论稳态误差={e_ss:.1f} rpm")
plt.plot(t, n_history, label=f'Kp={Kp}')
plt.axhline(y=n_ref, color='k', linestyle='--', linewidth=1, label='目标转速')
plt.xlabel('时间 (s)')
plt.ylabel('转速 (rpm)')
plt.title('直流电机速度闭环P控制阶跃响应')
plt.legend()
plt.grid(True)
plt.xlim(0, t_end)
plt.ylim(0, n_ref * 1.2)
plt.tight_layout()
plt.savefig('p_control_response.png', dpi=150)
plt.show()
运行方式
将上述代码保存为 p_control_speed.py,在终端执行:
python p_control_speed.py
验证方法与判定标准
- 程序运行后应输出4行结果,每行包含对应 Kp 的仿真稳态值与理论稳态误差。
- 观察输出:仿真稳态值应接近
n_ref − e_ss,且与理论稳态误差公式e_ss = n_ref / (1 + Kp·Km)计算值一致(误差小于1 rpm 即通过)。 - 观察图形:所有曲线从0开始上升,最终趋于各自稳态值;Kp 越大,稳态值越接近目标转速1000 rpm,稳态误差越小,但响应超调量不增加(P控制一阶系统无超调)。
- 判定通过条件:Kp=0.5 时稳态误差约为 500 rpm,Kp=5.0 时稳态误差约为 99 rpm,与理论值吻合。
预期输出(由代码逻辑直接推出)
Kp=0.5 仿真稳态值=500.0 rpm 理论稳态误差=500.0 rpm
Kp=1.0 仿真稳态值=666.7 rpm 理论稳态误差=333.3 rpm
Kp=2.0 仿真稳态值=800.0 rpm 理论稳态误差=200.0 rpm
Kp=5.0 仿真稳态值=909.1 rpm 理论稳态误差=90.9 rpm
关键结论
纯P控制下,稳态误差 e_ss = n_ref / (1 + Kp·Km),增大 Kp 可减小但无法消除稳态误差。若需完全消除,必须引入积分作用(PI控制),将在后续案例中实现。