设计常规PID控制器,被控对象为G(z)=0.0183z/(z-0.8187),PID参数为:Kp=1,Ti=2,Td=0.5,用python编写程序仿真
时间: 2023-08-16 14:05:46 浏览: 85
PID控制电机原理.7z
首先,我们需要将被控对象G(z)转化为离散时间域下的传递函数。假设采样周期为T,使用双线性变换将连续时间域下的传递函数转化为离散时间域下的传递函数:
```
s = 2/T * (1 - z^(-1))/(1 + z^(-1))
Gd(z) = G(s)|s=(2/T * (1 - z^(-1))/(1 + z^(-1)))
```
将G(z)代入上式,得到离散时间域下的传递函数:
```
Gd(z) = 0.0183*T*(z-0.8187)/(z-0.1813)
```
接下来,我们可以设计PID控制器的离散时间域表达式:
```
u(k) = Kp*[e(k) + 1/Ti * ∑e(i)dt + Td/T * (e(k)-e(k-1))]
```
其中,e(k)为当前时刻的误差,u(k)为当前时刻的控制量。
在代码实现中,我们可以使用Python的控制系统工具箱(Control System Toolbox)来进行仿真。代码如下:
```python
import control as ct
import numpy as np
import matplotlib.pyplot as plt
# 离散时间域下的传递函数
T = 0.1
num = [0.0183*T, -0.015*T]
den = [1, -1.1813, 0.3633]
Gd = ct.tf(num, den, T)
# PID控制器参数
Kp = 1
Ti = 2
Td = 0.5
# 设计PID控制器
Kp_d = Kp
Ki_d = Kp / Ti * T
Kd_d = Kp * Td / T
num_c = [Kd_d, Kp_d + Ki_d + Kd_d, -Kp_d - 2*Kd_d, Kd_d]
den_c = [1, -1, 0]
C = ct.tf(num_c, den_c, T)
# 闭环系统
sys = ct.feedback(C*Gd)
# 仿真
t = np.linspace(0, 10, 101)
r = np.ones_like(t)
t, y, x = ct.forced_response(sys, t, r)
# 绘图
plt.plot(t, r, label='Reference')
plt.plot(t, y, label='Output')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Step Response')
plt.legend()
plt.show()
```
运行代码,输出的图像即为系统的阶跃响应曲线。
阅读全文