当前位置:网站首页>PID详解
PID详解
2022-08-05 05:16:00 【Mr.Fu!】
PID在控制领域应该是应用最为广泛的算法了,在工业控制,汽车电子等诸多领域中运用
下面我用一个例子和算法过程来讲解PID的概念
PID:
P比例控制:基本作用就是控制对象以线性的方式增加,在一个常量比例下,动态输出
缺点:会产生稳态误差
I积分控制:基本作用就是用来消除稳态误差
缺点:会增加超调
D微分控制:基本作用就是减弱超调,加大惯性响应速度
1、什么是PID及其作用
上图描述: 设定一个输出目标,反馈系统传回输出值,如与目标不一致,则存在一个误差,PID 根据此误差调整输入值,直至输出达到设定值.
为什么需要PID呢,比如控制温度,我们需要设置一个要达到的目标温度值,当将温度稳定在目标温度值
例如,我们希望水的目标温度值为70°,其希望无非就是可以快速而且无抖动的达到70°,并稳定在70°
如果我们使用普通的方式加热,当温度到达70°后就以及停止加热,岂不是简单快速,当然用在要求不高的场合也可以,但是如果要求更高的场合呢,会出现温度到达70°后,由于加热器的余温会使温度继续上升,并且再加上环境的温度会散热,所以我们无法将水温很平稳的稳定在70°
总结一下:我们需要PID的作用无非就是无法通过普通控制手段快速稳定的输出到目前设定值
2、公式
经过化解后的公式
Kp-------比例常数
Ki= (Kp*T)/Ti------积分常数
Kd=(Kp*Td)/T------微分常数
3、实战例子
小明接到一个任务: 有个水桶,需要时刻保持1m 的高度,目前水桶里有0.2m 的水
那么小明采用P(比例) 的方法加水:即每次测量与1m 的误差,并加入与误差成比例的水量
设Kp=0.4
第一次,误差是 e(1)=1-0.2=0.8m,那么加入水量是 Kp0.8= 0.40.8 = 0.32m.当前水桶水位:0.2+0.32=0.52
第二次, 误差是e(2) = 1-(0.2+0.32) =0.48m 那么加入水量是 Kp*0.48=0.192m,当前水桶水位:0.52+0.192=0.712
通过P比例控制完美解决了快速稳定在目前值,但是在实际环境中得考虑各种影响问题,所以
小明的新任务: 有个水桶,但桶底漏了个洞,仍需保持1m 的高度,目前水桶里有0.2m 的水,但每次加水都会流出0.1m. 这个例子就接近我们实际工程的例子了,比如电机摩擦的阻力,损耗.
P (比例控制) u= Kp e (e为与上次差值)*
当前水量0.2m,目前值水量1m
设Kp=0.4. 则u= 0.4*e ,e=上次水量 - 当前水量
第一次,误差是 e(1)=1-0.2=0.8m,那么加入水量是 Kp0.8= 0.40.8 = 0.32m.当前水桶水位:0.2+0.32 -0.1=0.42
第二次, 误差是e(2) = 1-(0.2+0.32) =0.48m 那么加入水量是 Kp*0.48=0.192m,当前水桶水位:0.52+0.192=0.552
问题来了,水位最终在0.75m 处稳定了,但是,当误差是0.25m 时,加水量时0.1,每次加入的刚好等于漏掉的0.1.
这里就引入了稳态误差的概念:即当系统到达稳态时与目标的误差.
当我们加大KP时,增加值1
已经更接近目前值了,当我们继续增加呢
当增加值1.8时,已经非常接近1m的水量了,但是也出现了非常大的抖动
结论: 比例控制引入了稳态误差,且无法消除.比例常数增大可以减小稳态误差,但如果太大则引起系统震荡,不稳定.
为了消除稳态误差,第二次加入积分,使用PI(比例积分控制)
积分控制就是将历史误差全部加起来乘以积分常数.
一样的情况,现在设Kp=0.4,Ki= 0.3
第一次,误差是 e(1)=1-0.2=0.8m,那么加入水量是 Kp0.8 = 0.40.8 = 0.32m , KI * e(1) = 0.3 * 0.8 = 0.24 加入水量 = 0.32m + 0.256 = 0.56 当前水桶水位:0.2+ 0.276 - 0.1=0.66
第二次,误差是 e(2)=1-0.66=0.34m,那么加入水量是 Kp0.34 = 0.40.34 = 0.136m , KI * (e(2)+e(1)) = 0.3 * 0.342 = 0.342 加入水量 = 0.136m + 0.342 = 0.478 当前水桶水位:0.66+ 0.478 - 0.1=1.038
我们发现加入KI后,有效的消除了稳态误差,但是发现了超调现象
如果我们增加KI呢
超调也会增加,同样减小KI值,超调也会变小
结论:
只要存在偏差,积分就不停的累计,直到误差为0, 积分项不再累加,变成一个常数,可以抵消稳态误差.
在表中最后几项的输出已经非常接近0.1,说明消除了稳态无处,但是却出现的超调的部分
所以为了消弱超调,KD出现了
所以公式是:
设Kp=0.4,Ki= 0.3,Kd=0.3,水位0.2,目标水位1
第一次,误差是 e(1)=1-0.2=0.8m,那么加入水量是 Kp0.8 = 0.40.8 = 0.32m , KI * e(1) = 0.3 * 0.8 = 0.24 , KD = 0 (因为当前水位差就是0.8) 加入水量 = 0.32m + 0.256 = 0.56 当前水桶水位:0.2+ 0.276 - 0.1=0.66
第二次,误差是 e(2)=1-0.66=0.34m,那么加入水量是 Kp0.34 = 0.40.34 = 0.136m , KI * (e(2)+e(1)) = 0.3 * 0.342 = 0.342 , KD (e(2) - (e1))= 0.3(0.342 - 0.8) = -0.138 加入水量 = 0.136m + 0.342 -0.138 = 0.34 当前水桶水位:0.66+ 0.478 - 0.1=0.9
有明显的削弱超调
结论: 微分能够减弱超调趋势.
为了更明显对比三个系数的关系,我们进行计算对比,看下图
设初始水位0.2,目前水位1,流出水位0.1,KP=0.4,KI=0.3,KD=0.3
首先是数据对比
仔细查看三个图的最终水量的变化,
只有KP情况下,第一张图水位无法达到目标水位
有KP和KI情况下,第二张图水位达到目标水位,但是出现超调
有PID的情况下,第三张图在出现超调后,KD马上进行的减小,有效抑制了超调
说明:PID三个参数是随意设定,所以在调整时,需要不断测试及根据经验调试
下面用曲线图对比
此参数只是参考,具体PID参数的设置需要不断尝试,直到达到标准
如果运用在电机控制领域,同样在控制输出给电机的电流大小,一般通过PWM去控制输出的电流量,通过反馈的采样电阻得知当前的电机转速,也就是说,我们设定目前转速,采样当前电机转速,去调整PID三个参数,经过不断尝试达到预定状态,但是在控制电机时,会涉及到电机的开环和闭环,开环简单来说就是电机加速的过程,相当于电机从0到预定转速并平稳后的过程,而闭环就是后续稳定的运行过程,如果图中所示
所以对于电机的调试一般开环转闭环的过程会比较麻烦一些,当在调试过程中你会发现你设定转速达不到预定转速,这时你就要想到出现了稳态误差,需要KI的帮助,当你加入了KI后,可能转速达到了预定转速,但是可能出现启动抖动的想象或者出现启动电流很大这样的想象,所以可以加入KD去削弱超调减小抖动或启动电流,只有三个参数配合得当时,才会启动稳定,运行正常,当然要考虑电机的属性,以及电路的设计,开关管的参数等等。
谢谢
边栏推荐
- IJCAI 2022|边界引导的伪装目标检测模型BGNet
- 【22李宏毅机器学习】课程大纲概述
- 服务网格istio 1.12.x安装
- 【论文精读】Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation(R-CNN)
- 基于Flink CDC实现实时数据采集(二)-Source接口实现
- 2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情
- ACL 的一点心得
- 通过Flink-Sql将Kafka数据写入HDFS
- Oracle压缩表修改字段的处理方法
- Flink accumulator Counter 累加器 和 计数器
猜你喜欢
全尺度表示的上下文非局部对齐
【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
flink部署操作-flink on yarn集群安装部署
AWS 常用服务
Flink HA安装配置实战
记我的第一篇CCF-A会议论文|在经历六次被拒之后,我的论文终于中啦,耶!
A deep learning code base for Xiaobai, one line of code implements 30+ attention mechanisms.
BFC详解(Block Formmating Context)
Mysql-连接https域名的Mysql数据源踩的坑
SQL(1) - Add, delete, modify and search
随机推荐
AIDL详解
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
读论文-Cycle GAN
单片机按键开发库-支持连击、长按等操作
基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程
华科提出首个用于伪装实例分割的一阶段框架OSFormer
CVPR 2020 - 频谱正则化
Detailed explanation of BroadCast Receiver (broadcast)
网络信息安全运营方法论 (下)
flink实例开发-batch批处理实例
网工必用神器:网络排查工具MTR
SQL (2) - join window function view
spingboot 容器项目完成CICD部署
SharedPreferences and SQlite database
flink项目开发-配置jar依赖,连接器,类库
Oracle压缩表修改字段的处理方法
Kubernetes常备技能
【数据库和SQL学习笔记】8.SQL中的视图(view)
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
RecycleView和ViewPager2