PID控制器整理分享
概述
日常开发中,常常需要对速度、温度等物理量进行稳态控制,而在目前的自动化控制原理中,使用最为广泛的方法就是PID控制算法。本文简要整理分享PID控制器的使用。
正文
PID控制器,即比例-积分-微分控制器。它是一个不依赖系统模型,仅依赖系统输出即可进行控制的负反馈控制器。PID控制器通过直观地观测当前误差(比例作用)、过去的误差(积分作用)、误差的变化趋势(微分作用) 来进行系统控制。
PID控制器的数学公式可以写成:u=Kp∗e+Ki∗∫edt+Kd∗dedtu=K_p*e+K_i*\int{e}dt+K_d*\frac{de}{dt}u=Kp∗e+Ki∗∫edt+Kd∗dtde
其中:
eee是当前误差
KpK_pKp是比例增益系数
KiK_iKi是积分增益系数
KdK_dKd是微分增益系数
所以,从上述公式可以看出,PID控制器对系统的控制作用是比例项、积分项、微分项的加权和。
其次,衡量一个系统的状态,可以从稳定性、准确性、快速性来衡量。其中,
P和I降低系统稳定性,D提高系统稳定性。
P和I减小静态误差,D无作用。
P和D提高响应速度,I降低响应速度。
PID调参方法
(1)整定比例项
方法:先将积分、微分作用去除,设置目标值为系统最大控制量的70%。然后,逐渐加大比例作用,直到系统发生震荡。观察控制量波形,若波形的波峰由大变小,且最终稳定在某个值,且第一个波峰与第二个波峰之间数值比约为4:1。那么可以把当前KpK_pKp固定。
(2)整定积分项
方法:逐渐减小积分时间,使得积分项作用增强,观察控制量波形。若控制量静差为0,则可以把当前TiT_iTi固定下来。
(3)整定微分项
方法:逐渐增加微分时间,使得微分项作用增强,观察控制量波形。若控制量波形震荡减小至基本无震荡,则可以把当前TdT_dTd固定下来。
(4)微调参数
方法:若发现粗调后,系统稳定性不足(震荡多),则稍稍加大TdT_dTd;若准确性不足,则稍稍减小TiT_iTi;循环往复观察对比,调整TiT_iTi和TdT_dTd,直到满足系统要求为止。
对于联级PID的调参方法与单环PID调参方法一样,只是联级PID调参时,需要先整定内环,再整定外环(即先将外环作用去除)
使用matlab simulink简单测试调参方法
参数及效果如下:
代码实现
PID控制器分为位置式PID和增量式PID。
位置式PID公式:u(k)=Kp∗e(k)+Kp∗TTi∗∑i=1ke(i)+Kp∗TdT∗[e(k)−e(k−1)]u(k)=K_p*e(k)+\frac{K_p*T}{T_i}*{\sum_{i=1}^{k}e(i)}+\frac{K_p*T_d}{T}*\left[e(k)-e(k-1)\right]u(k)=Kp∗e(k)+TiKp∗T∗∑i=1ke(i)+TKp∗Td∗[e(k)−e(k−1)]
由于基于误差的微分方程存在微分冲击的缺陷,所以微分项可以改进为:−Kp∗TdT[Pv(k)−Pv(k−1)]-\frac{K_p*T_d}{T}\left[Pv(k)-Pv(k-1)\right]−TKp∗Td[Pv(k)−Pv(k−1)]
所以C代码如下:
void pid_calc(pid_t *pid)
{float DelPv;float ti,ki;float td;float kd;float out;pid->Ek = pid->Sv - pid->Pv; //得到当前偏差值pid->Pout = pid->Kp * pid->Ek; //比例输出//抗积分饱和if(pid->OUT >= pid->pwmcycle){if(pid->Ek < 0)pid->SEk += pid->Ek;}else if(pid-OUT <= pid->OUT0){if(pid->Ek > 0)pid->SEk += pid->Ek;}elsepid->SEk += pid->Ek;
// pid->SEk += pid->Ek; //历史偏差总和ti = pid->T / pid->Ti;ki = ti * pid->Kp;pid->Iout = ki * pid->SEk; //积分输出DelPv = pid->Pv - pid->Pv_1;td = pid->Td / pid->T;kd = pid->Kp * td;pid->Dout = kd * DelPv; //微分输出out = pid->Pout + pid->Iout - pid->Dout;//输出限幅if(out > pid->pwmcycle){pid->OUT = pid->pwmcycle;}else if(out < 0){pid->OUT = pid->OUT0; }else {pid->OUT = out;}pid->Pv_1 = pid->Pv;
}
增量式PID公式:Δu=Kp∗[e(k)−e(k−1)]+Kp∗TTi∗e(k)+Kp∗TdT∗[e(k)−2∗e(k−1)+e(k−2)]\Delta{u}=K_p*\left[e(k)-e(k-1)\right]+\frac{K_p*T}{T_i}*e(k)+\frac{K_p*T_d}{T}*\left[e(k)-2*e(k-1)+e(k-2)\right]Δu=Kp∗[e(k)−e(k−1)]+TiKp∗T∗e(k)+TKp∗Td∗[e(k)−2∗e(k−1)+e(k−2)]
同样的,可以改进式子以消除微分冲击:
−Kp∗TdT[Pv(k)−2∗Pv(k−1)+Pv(k−2)]-\frac{K_p*T_d}{T}\left[Pv(k)-2*Pv(k-1)+Pv(k-2)\right]−TKp∗Td[Pv(k)−2∗Pv(k−1)+Pv(k−2)]
所以C代码如下:
void incremental_pid_calc(pid_t *pid)
{float DelPv;float ti,ki;float td,kd;float beta;float out;pid->Ek = pid->Sv - pid->Pv; //当前误差//积分分离if(fabs(pid->Ek) <= 100) //偏差较大时,不加入积分作用beta = 1;elsebeta = 0;//比例项输出pid->Pout = pid->Kp * (pid->Ek - pid->Ek_1);//积分项输出ti = pid->T / pid->Ti;ki = ti * pid->Kp;pid->Iout = beta * ki * pid->Ek;//微分项输出DelPv = pid->Pv - (2 * pid->Pv_1 ) + pid->Pv_2;//抗微分冲击td = pid->Td / pid->T;kd = td * pid->Kp;pid->Dout = kd * DelPv;out = pid->Pout + pid->Iout - pid->Dout;//输出限幅if(out > pid->pwmcycle)pid->OUT = pid->pwmcycle;else if(out < 0)pid->OUT = pid->OUT0; else pid->OUT = out;//死区限定if(fabs(pid->Ek) <= 10)pid->OUT = pid->OUT0; pid->Ek_1 = pid->Ek;pid->Pv_2 = pid->Pv_1;pid->Pv_1 = pid->Pv;
}
总结
这样就可以移植和使用PID控制了。实际开发中,经典PID控制器基本不适用,所以常常需要对PID控制器进行一下改进,如加入积分分离、微分先行、死区控制等方式优化。所以,虽然PID控制原理很简单,但是调参及优化才是比较花时间的地方。熟能生巧,用多了,自然就会了。关于PID的整理分享就到这儿,说得不好的地方请大佬们指教。
PID控制器整理分享相关推荐
- 西门子PLC S7-300系列的PID控制器参数整定的一般方法分享
西门子PLC S7-300系列的模块配置灵活,扩展性强,通讯功能强大,为自动化控制系统提供了解决方案.西门子PLC S7-300的编程软件是STEP7 V5.5,在编程软件中,用户可以通过PID功能块 ...
- 神经网络pid控制原理框图,神经网络pid控制器设计
神经网络自整定PID真的有效吗?我看图书馆的参考书上和知网论文上的方法,感觉推导过程都不对啊? 楼主的这个问题已经是六年前的问题了(今天2021年5月),不知道楼主现在还关注这个话题不?神经网络自整定 ...
- 经典PID控制器的缺陷
去年买了本韩京清教授编著的的<自抗扰控制技术--估计补偿不确定因素的控制技术>,认真真真的通读了一遍,尽管很多地方由于自身专业水平的限制,没能读懂,但是里面提到经典PID控制器的缺陷却给我 ...
- 一文读懂pid控制器
文章目录 PID控制器 1. 控制器 1.1 电机速度控制系统 1.2 温度或水位控制系统 1.3 小小总结 2. PID 3. 模拟式PID 4. 数字式PID 4.1 位置式PID算法 4.1.2 ...
- 计算机控制实验PID数字控制器设计,实验二数字PID控制器的设计
<实验二数字PID控制器的设计>由会员分享,可在线阅读,更多相关<实验二数字PID控制器的设计(13页珍藏版)>请在人人文库网上搜索. 1.实验二 数字PID控制器的设计直流闭 ...
- 【老生谈算法】matlab实现磁悬浮系统建模及其PID控制器设计——磁悬浮
磁悬浮系统建模及其PID控制器设计MATLAB 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab磁悬浮系统建模及其 ...
- 超详细多旋翼无人机飞控 pid 控制器结构图(含视觉追踪)
因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 很久不做嵌入式了,今天找到以前画的飞控 pid 结构图,分享一波 ...
- 现代的先进控制理论先进在哪里?如何评价在PID控制器份额在95%条件下稳定性逊色的先进控制系统?
感谢 冷哲.Tam Alex.小心假设 三位在知乎精彩而透彻的回答 经三位作者同意,转发至本博. 转载请联系原作者. 对第二个问题的解释在于,既然PID控制器运用已经如此广泛了,那么基于现代控制理论的 ...
- Matlab 仿真——单自由度倒立摆(3)PID控制器设计
文章目录 0. 受控对象与设计要求 0.1 受控对象 0.2 设计要求 1. 控制系统结构 2. PID控制器设计 3. 那小车呢? 4. 几个问题 5. 参考 0. 受控对象与设计要求 这里列出上一 ...
最新文章
- 最快让你上手ReactiveCocoa之基础篇
- C++中的类对象的内存分布以及虚函数表内存分布
- PHP递归复制文件夹的类
- TP-Link发布网格路由器Deco M5
- android工程换背景图片,android换肤功能 如何动态获取控件中背景图片的资源id?
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
- 关于var、let和const
- 谁能再一次接受“南京大×××”不存在?
- LaTeX函数、符号及特殊字符
- Java Web实战详细教程(一)系列介绍+环境搭建
- 红米note4android,红米Note4深度评测
- 爬虫笔记——urllib实战之淘宝零食板块爬取
- cesium模型爆炸案例
- 谷歌google安装vue插件,(npm安装)避坑指南
- bp神经网络python源代码_python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现...
- RabbitMQ精讲7:与SpringBoot、Spring Cloud Stream整合实战
- php artisan migrate,关于laravel 5.1下php artisan migrate的使用
- 【微信公众号h5】授权
- 集成学习1——voting、baggingstacking
- unity创建与解析json
热门文章
- js实现多个小球碰撞
- highcharts如何去掉图表右下角的官网标识链接
- 基于SpringBoot和微信小程序的点餐系统(毕业设计论文)
- htmlCSS-----CSS选择器(上)
- matplotlib 修改字体,解决中文显示乱码的问题
- 飞速创软 | “ 无代码 ” 并不是 “ 低代码 ” 的进阶版
- 数据结构与算法习题库
- 第二章 3ds Max物体的操作及选择
- GBK与GB2312 解决GBK转UTF-8部分字符乱码
- ArcGIS应用(十九)Arcgis 统计分析计算多波段图像最大值、最小值、平均值等