1. 一阶惯性环节的P控制整定

任务目标

对一阶惯性系统 G(s) = K / (Ts + 1) 施加纯比例控制,通过临界比例法确定临界增益 Kcr,观察纯P控制下的稳态误差,并整定比例系数使系统满足给定稳态误差要求(≤2%)。

系统模型与设计指标

  • 被控对象:G(s) = 2 / (5s + 1)(K=2,T=5)
  • 闭环结构:单位负反馈,控制器 C(s) = Kp
  • 输入:单位阶跃 r(t) = 1
  • 稳态误差要求:ess ≤ 0.02(即2%)

临界比例法整定原理

一阶惯性系统在纯P控制下闭环特征方程为 5s + 1 + 2Kp = 0,根为 s = -(1+2Kp)/5。由于一阶系统不存在临界振荡(特征根始终为负实根),临界增益 Kcr 在理论上不存在。因此本案例采用工程近似方法:将系统视为高阶模型的近似,通过逐步增大 Kp 观察响应直至出现等幅振荡趋势来确定临界增益的工程近似值。实际中一阶系统不会振荡,故采用增益裕度法替代——找到使闭环系统相位裕度接近0°的增益作为临界增益的工程估计。

关键完整代码(Python + control库)


import control as ct
import numpy as np
import matplotlib.pyplot as plt

# 被控对象参数
K = 2.0
T = 5.0
G = ct.tf([K], [T, 1])  # G(s) = 2/(5s+1)

# 单位负反馈闭环
def closed_loop(Kp):
    C = ct.tf([Kp], [1])
    return ct.feedback(C * G, 1)

# 1. 稳态误差理论计算
def steady_state_error(Kp):
    # 单位阶跃输入下,误差传递函数 E(s)/R(s) = 1/(1+Kp*G(s))
    # 稳态误差 ess = 1/(1 + Kp*K) (对单位阶跃,一阶系统)
    return 1 / (1 + Kp * K)

# 2. 临界增益工程估计(增益裕度法)
# 一阶系统相位裕度永远不会到0,取增益裕度GM=2(即6dB)对应的Kp作为工程临界增益
# 开环传递函数 L(s) = Kp * G(s),增益交界频率处|L(jw)|=1
# 对一阶系统,|G(jw)| = K/sqrt(1+(wT)^2),相位 = -atan(wT)
# 工程上取相位裕度PM=30°对应的Kp作为"临界增益"的保守估计
def find_Kcr():
    # 相位裕度30°对应相位 = -150°,即 atan(w*T) = 150° → w*T = tan(150°) = -tan(30°)
    # 但一阶系统相位范围只有0~-90°,无法达到-150°,因此一阶系统永不振荡
    # 实际工程中,对一阶系统采用"幅值裕度"法:取Kp使开环增益在穿越频率处为0.5(6dB裕度)
    # 穿越频率 wc 处 |G(jwc)| = 1/Kp,取 Kp_max = 1/|G(j0)| * 裕度系数
    # 简化:一阶系统Kp可无限增大而不失稳,但受执行器饱和限制
    # 本案例取工程临界增益为 Kp_cr = 20(对应开环增益40,远超实际需要)
    return 20.0

Kp_cr = find_Kcr()
print(f"工程临界增益估计 Kcr ≈ {Kp_cr}")

# 3. 整定Kp满足稳态误差 ≤ 2%
# 稳态误差 ess = 1/(1+Kp*K) ≤ 0.02 → Kp ≥ (1/0.02 - 1)/K = 49/2 = 24.5
Kp_req = (1/0.02 - 1) / K
print(f"满足稳态误差2%所需最小Kp = {Kp_req:.2f}")

# 取整定值(略大于理论最小值)
Kp_design = 30.0
ess_design = steady_state_error(Kp_design)
print(f"Kp={Kp_design} 时稳态误差 = {ess_design:.4f} ({ess_design*100:.2f}%)")

# 4. 仿真验证
t = np.linspace(0, 30, 1000)
sys_cl = closed_loop(Kp_design)
t_resp, y_resp = ct.step_response(sys_cl, T=t)

# 计算实际稳态误差
ess_actual = 1 - y_resp[-1]
print(f"仿真稳态误差 = {ess_actual:.4f} ({ess_actual*100:.2f}%)")

# 5. 绘制阶跃响应
plt.figure(figsize=(8, 4))
plt.plot(t_resp, y_resp, 'b-', linewidth=2, label=f'Kp={Kp_design}')
plt.axhline(y=1.0, color='gray', linestyle='--', alpha=0.7)
plt.axhline(y=0.98, color='r', linestyle=':', alpha=0.7, label='2%误差带')
plt.xlabel('时间 (s)')
plt.ylabel('输出 y(t)')
plt.title('一阶惯性系统P控制阶跃响应')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('p_control_response.png', dpi=100)
plt.show()

运行方式与依赖

  • 依赖:numpy、matplotlib、control(pip install control numpy matplotlib)
  • 运行:将代码保存为 p_control_tuning.py,执行 python p_control_tuning.py

验证方法与判定标准

  • 稳态误差验证:程序输出理论稳态误差与仿真稳态误差,两者均应 ≤ 0.02(2%)。当 Kp=30 时,理论值 ess = 1/(1+30×2) = 1/61 ≈ 0.0164(1.64%),满足要求。
  • 响应曲线观察:生成的 p_control_response.png 中,输出曲线应单调上升并收敛至 0.98~1.0 之间(即进入2%误差带),无振荡。
  • 临界增益说明:一阶系统理论上不存在临界振荡,因此 Kcr 仅为工程参考值。实际整定中,若 Kp 超过执行器饱和限制,系统会因非线性而出现极限环,此时可观察到等幅振荡——这是工程上判断"临界增益"的实用方法。

整定结论

取 Kp = 30 时,系统稳态误差为1.64%,满足≤2%的设计指标。由于一阶惯性系统本身是稳定的,增大 Kp 只会减小稳态误差而不会引起振荡,但需注意实际执行器饱和约束。若需进一步消除稳态误差,应改用PI控制(见后续案例)。