用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

相关内容

热门资讯

动态规划——背包问题01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的...
Thread类的基本用法 Thread小小的回顾初识线程创建线程继承Thread类构造方法中传入Runnable实例匿名内部类...
对话傅盛:Agent杀死了传统... “创业没有静态壁垒,只有动态壁垒。”文|《中国企业家》记者 闫俊文编辑|张晓迪头图来源|受访者两年前...
WEB安全 HTML基础 1.简单的HTML页面架构 charset  编码 gbk gbk2...
碳汇投资“锁”在系统里,甘肃碳... 5月22日,新京报贝壳财经记者刊发了《交易中心休市一年,碳汇投资“锁”在系统里》报道,多位投资人称接...
赠送粽子股价连跌,五芳斋回应:... 新京报贝壳财经讯(记者阎侠)给股东赠送粽子礼盒,五芳斋一则“送礼”公告也把自己送上了头条。公告发布后...
面试官 : G1垃圾回收器你了... 文章目录 为什么CMS 垃圾收集器停顿时间短?G1垃圾收集器G1的工作流程Minor GC的回收过程...
如何通过优化网站内容提高外贸网... 作为外贸行业从业者,我们都知道,谷歌是全球最大的搜索引擎之一࿰...
实控人股权清零倒计时!“A股光... 近日,亿晶光电公告称,控股股东深圳市唯之能源有限公司(下称“唯之能源”)所持全部上市公司股份将被司法...
Linux指令之搜索查找类 文章目录前言一、搜索查找类find指令locate指令grep指令和管道符号| 前言 上一篇我们学...
【一】springboot启动... 说明 SpringBoot 版本 2.7.1 SpringApplication.run()...
军工板块再度拉升,航空航天ET... 5月30日下午,军工板块再度拉升,逆市走强,截至13:35,航空航天ETF(159227)涨0.80...
Python日志logging... 一、什么是日志 在《网络安全之认识日志采集分析审计系统》中我们认识了日志。日志数据的核心就是日志消息...
黑马点评redis使用 (1) 搭建环境 黑马点评用的redis版本比较高,这里有win6.2.6版本安装包ÿ...
上市28年第4次谋划跨界转型,... 本报(chinatimes.net.cn)记者胡雅文 北京报道从锂电负极到尼龙材料,负债压顶的天津滨...
中证协拟对券商做好“五篇大文章... 今日,记者获悉,中证协拟开展2025年券商做好金融“五篇大文章”试评价。据悉,为促进行业功能发挥,做...
【2023-Pytorch-检... 项目下载地址:YOLOV5交通标志识别检测数据集+代码+模型+...
Jetson Nano驱动机器... 基于Jetson Nano板子搭建一个无人车,少不了减速电机驱动轮子滚动,...
五粮液董事会换届,曾从钦等继续... 5月29日晚,五粮液(000858.SZ)发布《第六届董事会2025年第7次会议决议公告》,涉及9项...
在Spring框架中实现属性配... 如何在不重启应用的前提下,在内存中直接修改配置文件中的属性值? 自定义...