概述

日常开发中,常常需要对速度、温度等物理量进行稳态控制,而在目前的自动化控制原理中,使用最为广泛的方法就是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)+Ti​Kp​∗T​∗∑i=1k​e(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)]+Ti​Kp​∗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控制器整理分享相关推荐

  1. 西门子PLC S7-300系列的PID控制器参数整定的一般方法分享

    西门子PLC S7-300系列的模块配置灵活,扩展性强,通讯功能强大,为自动化控制系统提供了解决方案.西门子PLC S7-300的编程软件是STEP7 V5.5,在编程软件中,用户可以通过PID功能块 ...

  2. 神经网络pid控制原理框图,神经网络pid控制器设计

    神经网络自整定PID真的有效吗?我看图书馆的参考书上和知网论文上的方法,感觉推导过程都不对啊? 楼主的这个问题已经是六年前的问题了(今天2021年5月),不知道楼主现在还关注这个话题不?神经网络自整定 ...

  3. 经典PID控制器的缺陷

    去年买了本韩京清教授编著的的<自抗扰控制技术--估计补偿不确定因素的控制技术>,认真真真的通读了一遍,尽管很多地方由于自身专业水平的限制,没能读懂,但是里面提到经典PID控制器的缺陷却给我 ...

  4. 一文读懂pid控制器

    文章目录 PID控制器 1. 控制器 1.1 电机速度控制系统 1.2 温度或水位控制系统 1.3 小小总结 2. PID 3. 模拟式PID 4. 数字式PID 4.1 位置式PID算法 4.1.2 ...

  5. 计算机控制实验PID数字控制器设计,实验二数字PID控制器的设计

    <实验二数字PID控制器的设计>由会员分享,可在线阅读,更多相关<实验二数字PID控制器的设计(13页珍藏版)>请在人人文库网上搜索. 1.实验二 数字PID控制器的设计直流闭 ...

  6. 【老生谈算法】matlab实现磁悬浮系统建模及其PID控制器设计——磁悬浮

    磁悬浮系统建模及其PID控制器设计MATLAB 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab磁悬浮系统建模及其 ...

  7. 超详细多旋翼无人机飞控 pid 控制器结构图(含视觉追踪)

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 很久不做嵌入式了,今天找到以前画的飞控 pid 结构图,分享一波 ...

  8. 现代的先进控制理论先进在哪里?如何评价在PID控制器份额在95%条件下稳定性逊色的先进控制系统?

    感谢 冷哲.Tam Alex.小心假设 三位在知乎精彩而透彻的回答 经三位作者同意,转发至本博. 转载请联系原作者. 对第二个问题的解释在于,既然PID控制器运用已经如此广泛了,那么基于现代控制理论的 ...

  9. Matlab 仿真——单自由度倒立摆(3)PID控制器设计

    文章目录 0. 受控对象与设计要求 0.1 受控对象 0.2 设计要求 1. 控制系统结构 2. PID控制器设计 3. 那小车呢? 4. 几个问题 5. 参考 0. 受控对象与设计要求 这里列出上一 ...

最新文章

  1. 最快让你上手ReactiveCocoa之基础篇
  2. C++中的类对象的内存分布以及虚函数表内存分布
  3. PHP递归复制文件夹的类
  4. TP-Link发布网格路由器Deco M5
  5. android工程换背景图片,android换肤功能 如何动态获取控件中背景图片的资源id?
  6. HDFS 读取、写入、遍历文件夹获取文件全路径、append
  7. 关于var、let和const
  8. 谁能再一次接受“南京大×××”不存在?
  9. LaTeX函数、符号及特殊字符
  10. Java Web实战详细教程(一)系列介绍+环境搭建
  11. 红米note4android,红米Note4深度评测
  12. 爬虫笔记——urllib实战之淘宝零食板块爬取
  13. cesium模型爆炸案例
  14. 谷歌google安装vue插件,(npm安装)避坑指南
  15. bp神经网络python源代码_python构建bp神经网络_曲线拟合(一个隐藏层)__2.代码实现...
  16. RabbitMQ精讲7:与SpringBoot、Spring Cloud Stream整合实战
  17. php artisan migrate,关于laravel 5.1下php artisan migrate的使用
  18. 【微信公众号h5】授权
  19. 集成学习1——voting、baggingstacking
  20. unity创建与解析json

热门文章

  1. js实现多个小球碰撞
  2. highcharts如何去掉图表右下角的官网标识链接
  3. 基于SpringBoot和微信小程序的点餐系统(毕业设计论文)
  4. htmlCSS-----CSS选择器(上)
  5. matplotlib 修改字体,解决中文显示乱码的问题
  6. 飞速创软 | “ 无代码 ” 并不是 “ 低代码 ” 的进阶版
  7. 数据结构与算法习题库
  8. 第二章 3ds Max物体的操作及选择
  9. GBK与GB2312 解决GBK转UTF-8部分字符乱码
  10. ArcGIS应用(十九)Arcgis 统计分析计算多波段图像最大值、最小值、平均值等