PID控制

control_pid.py

本习题的程序文件

本习题以质量-弹簧-阻尼系统的控制为例,练习如何计算PID控制反馈系统的传递函数,及计算系统的阶梯响应。

系统的传递函数

【图:质量-弹簧-阻尼系统】为质量-弹簧-阻尼系统的示意图。其中m为质量块的质量,k为弹簧系数,B为阻尼器的阻尼系数。

/tech/static/books/scipyex/_images//control_pid_01.png

质量-弹簧-阻尼系统

根据牛顿力学定律我们可以列出如下的微分方程:

m \ddot{x} + B \dot{x} + k x = F

其中x为小车相对于无外力平衡位置的位移,F为对质量块施加的外力。对上面的方程做拉普拉斯变换,可以得到系统的传递函数:

\frac{F(s)}{x(s)} = \frac{1}{m s^2 + Bs + k}

线性时不变系统的传递函数是一个分子与分母均为s的多项式的函数。分子的各项系数通常用b表示,而分母的各项系数用a表示。

请编写程序绘制此系统的阶梯响应,即在0时刻突然给质量块施加一个1牛顿的恒力时,质量块的位移随时间的变化。

import numpy as np
from scipy.signal import step
import pylab as pl

m = 1.0  # kg
B = 10.0 # N.s/m
k = 20.0 # N/m

【你的程序】计算质量-弹簧-阻尼系统的阶梯响应

程序的输出应如【图:质量-弹簧-阻尼系统的阶梯响应】所示,当质量块静止之后,1牛顿的恒力使弹簧压缩了0.05米。

/tech/static/books/scipyex/_images//control_pid_02.png

质量-弹簧-阻尼系统的阶梯响应

使用scipy.signal.step()可以计算系统的阶梯响应。

PID控制器

通过使用PID控制器,可以控制质量块的位置,以及质量块到达指定位置的方式。【图:PID控制器控制系统】是用PID控制器控制系统的框图。

/tech/static/books/scipyex/_images//control_pid_03.png

PID控制器控制系统

图中Process为被控制系统,在本例中它就是质量-弹簧-阻尼系统,其输出Output为质量块的位置。SetPoint为质量块的目标位置,它和质量块当前位置Output的差Error输入到PID控制器中,PID控制器的输出由三部分组成:

  • K_p e(t)为误差的比例输出
  • K_i \int_{0}^{t}{e(\tau) d\tau}为误差的积分项的输出
  • K_d \frac{d e(t)}{dt}为误差的微分项输出

PID控制器的输入为质量块位移的误差,输出为施加给质量块的外力。我们也可以把PID控制器看作一个线性时不变系统,可以用下面的传递函数表示PID控制器:

\frac{K_d s^2 + K_p s + K_i}{s}

PID控制器和被控制系统构成一个从Error到Output的级联系统。级联系统的传递函数为两个传递函数的乘积,请编写函数计算两个系统的级联系统的传递函数:

def cascade(sys1, sys2):
    """sys1和sys2是包含传递函数的分子和分母多项式系数的元组"""
    【你的程序】

Kp=300.0
Ki=400.0
Kd=20.0
print cascade(([Kd,Kp,Ki],[1,0]), (b,a))
可以使用numpy.polymul()计算两个多项式的乘积。

程序的输出为:

(array([  20.,  300.,  400.]), array([  1.,  10.,  20.,   0.]))

反馈系统

【图:PID控制器控制系统】所示的控制系统是一个反馈系统,反馈系统的一般系统框图如【图:反馈系统的系统框图】所示:

/tech/static/books/scipyex/_images//control_pid_04.png

反馈系统的系统框图

为了计算由f(s)和b(s)所构成的反馈系统的传递函数,我们可以解如下方程:

Y(s) = (X(s) - Y(s)) * f(s) * b(s)

得到:

\frac{Y(s)}{X(s)} = \frac{f(s)}{1 + b(s) f(s)}

请编写从f(s)b(s)计算反馈系统的传递函数\frac{Y(s)}{X(s)}的函数feedback():

def feedback(f, b):
    """
    计算由f和b构成的反馈系统的传递函数
    """
    【你的程序】

sys = (b, a)
f = cascade(([Kd,Kp,Ki],[1,0]), sys)
ctrl = feedback(f, 1)

t, y = step(ctrl, T=np.arange(0, 1.0, 0.001))
pl.figure()
pl.plot(t, y, lw=2)
pl.title(u"PID控制系统的阶梯响应")
在使用numpy.polymul()和numpy.polyadd()计算出传递函数的分子分母的系数之后,分子分母的多项式可能有相同的根,因此还需要编写化简的程序。

程序的输出如【图:PID控制器系统的阶梯响应】所示。PID控制系统的输出最终会收敛到和输入相同,因此一秒以后,质量块的位移为1米。

/tech/static/books/scipyex/_images//control_pid_05.png

PID控制器系统的阶梯响应

內容目录

上一个主题

选择最大数的策略

本页

loading...