用python实现PID控制器 (PyCharm)
创始人
2025-05-29 06:15:44
0

用python实现PID控制器 (PyCharm)

文章目录

  • 用python实现PID控制器 (PyCharm)
    • PID框图
    • python实现
      • 控制器
      • 被控对象
      • 主函数
      • 调参顺序建议
      • 程序下载

PID框图

PID 的控制框图如下图所示:

pid

python实现

控制器

PID的三个参数一般是我们自己设计的,而且一般是固定的,所以最好在初始化的时候设置一下。

在具体实现的时候,当前误差需要知道系统的输出和目标值,因此误差作为参数传入。dt是系统的步长,即调节周期,也将其作为参数传入

为了适应某些变参数算法(al,bp),设计一个函数仅用来改变三个参数

控制器代码如下:

class PID_Controller:# 给pid的三个参数赋初值def __init__(self, kp, ki, kd):self.kp = kpself.ki = kiself.kd = kdself.last_error = 0.0self.integral = 0.0def change_para(self, kp, ki, kd):self.kp = kpself.ki = kiself.kd = kddef control_action(self, error, dt):"""Args:error: 当前误差dt: 步长Returns: pid的输出"""p = self.kp * errorself.integral += errori = self.ki * self.integralderivative = (error - self.last_error) / dtd = self.kd * derivativeself.last_error = errorreturn p + i + d

被控对象

被控对象一般是用传递函数表示的,这边可以用欧拉公式实现

对传递函数为:

G(S)=3.1877S2+4900G(S)=\frac{3.1877}{S^2+4900} G(S)=S2+49003.1877​

进行变换

import numpy as npclass levitationSys:def __init__(self, ncount, x10, x20, y10, y20):self.x10 = x10self.x20 = x20self.X1 = np.zeros(ncount)self.y10 = y10self.y20 = y20self.Y1 = np.zeros(ncount)self.Y2 = np.zeros(ncount)def system_io(self, i, input, h, f):y1 = self.y10 + h * self.y20y2 = self.y20 + h * (-4900 * self.y10 + 3.1877 * input);self.Y1[i] = self.y10self.Y2[i] = self.y20self.y10 = y1self.y20 = y2return y1

主函数

控制器和传递函数设计好之后,我们只需要建立一个主函数去调用它即可


from pid import PID_Controller
from system import levitationSysimport matplotlib.pyplot as plt
import numpy as npif __name__ == '__main__':wc = 50kp = wc * wc / 3.2ki = 15kd = wc / 1.6ncount = 200000    # 循环次数h = 0.0002  #步长ts = np.zeros(ncount)# 被控对象sys = levitationSys(ncount, 0, 0, 0, 0)# 控制器PID = PID_Controller(kp, ki, kd)gap = 0.0gap_last = 0.0for i in range(ncount):gap = sys.system_io(i, PID.control_action(0.004 - gap_last, h), h, 0)ts[i] = i * hprint(gap)gap_last = gap# 图像输出plt.plot(ts, sys.Y1)plt.xlabel('x-axis')plt.ylabel('y-axis')plt.title('Simple Line Plot')plt.show()

运行结果:

图

调参顺序建议

  1. 先调节比例系数 kp,使系统的响应能够快速达到稳定状态,并具有合理的超调量。因为它是最基本的参数,可以快速反应出控制效果。
  2. 然后调节积分时间常数 ki,使系统的静态误差消失或达到最小值。增加 ki 可以减小稳态误差,但过大的 ki 会引起系统的震荡和不稳定。
  3. 调节微分时间常数 kd,使系统的稳定性和动态响应之间取得平衡。增加 kd 可以使系统更加稳定,减小系统的超调和振荡,但过大的 kd 会引起系统的噪声和抖动。
  4. 最后综合进行微调

需要注意的是,这只是一种基本的调参顺序,实际情况可能因为不同系统的特点而有所不同

程序下载

https://mp.csdn.net/mp_download/manage/download/UpDetailed

相关内容

热门资讯

北方华创,巨额商誉压力突然高悬... 文丨詹詹编辑丨百进来源丨新商悟(本文约为 1300字)当国内半导体设备龙头北方华创交出一份“营收创历...
长城华西银行原女掌门已回老东家... 湘财Plus注意到,四川银行入主长城华西银行后,该行核心管理人员调整基本落定,法定代表人已正式变更为...
立案,跌停!这家“童年记忆”,... 沉浮多年,方向何在?最近被立案的上市公司,着实有些多,就在上周末,又有一家上市公司及原董事长被立案调...
加码生态环境监测!生态环境部:... 本文来源:时代周报 作者:李杭4月27日,生态环境部举行4月例行新闻发布会。 生态环境部4月例行新...
东方甄选主播“离职潮”持续发酵... 红星资本局4月27日消息,东方甄选(01797.HK)主播“离职潮”事件仍在发酵。在社交平台上,有部...
SpaceX万亿IPO前夜:马... 从20亿美元收购,到万亿IPO前的最后叙事。2026年4月23日深夜,特斯拉向SEC提交了一份季报文...
前董事长陆宏达“闪电辞职”牵扯... 紧急澄清前董事长性侵指控后,智度股份仍难挡股价大跌。4月27日,智度股份早盘一度重挫逾9%,逼近6....
高盛:一场全球性化工危机正在爆... 霍尔木兹海峡通行受阻,正在引发一场史无前例的全球化工供应冲击。高盛最新报告表示,基础化工品价格近几周...
这笔400亿,谷歌买的不是友谊... 4月25日,Anthropic宣布谷歌将向其投资最高400亿美元——先期注入100亿美元现金,估值3...
粪坑,爬出来了 粪坑,爬出来了... 图:Simon Bailly 读者说:“有人发现吗?2019年蚂蚁的大热基金鹏华快回本了,当年最高回...