pid算法完全讲解

上传人:第*** 文档编号:34199524 上传时间:2018-02-21 格式:DOCX 页数:12 大小:24.73KB
返回 下载 相关 举报
pid算法完全讲解_第1页
第1页 / 共12页
pid算法完全讲解_第2页
第2页 / 共12页
pid算法完全讲解_第3页
第3页 / 共12页
pid算法完全讲解_第4页
第4页 / 共12页
pid算法完全讲解_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《pid算法完全讲解》由会员分享,可在线阅读,更多相关《pid算法完全讲解(12页珍藏版)》请在金锄头文库上搜索。

1、PID算法完全讲解#include typedef unsigned char uChar8; typedef unsigned int uInt16;typedef unsigned long int uInt32;sbit ConOut = P11; /加热丝接到 P1.1口typedef struct PID_ValueuInt32 liEkVal3; /差值保存,给定和反馈的差值uChar8 uEkFlag3; /符号,1 则对应的为负数,0 为对应的为正数 uChar8 uKP_Coe; /比例系数uChar8 uKI_Coe; /积分常数uChar8 uKD_Coe; /微分常数u

2、Int16 iPriVal; /上一时刻值uInt16 iSetVal; /设定值uInt16 iCurVal; /实际值PID_ValueStr;PID_ValueStr PID; /定义一个结构体,这个结构体用来存算法中要用到的各种数据bit g_bPIDRunFlag = 0; /PID运行标志位,PID 算法不是一直在运算。而是每隔一定时间,算一次。/* */* 函数名称:PID_Operation() /* 函数功能:PID 运算 /* 入口参数:无(隐形输入,系数、设定值等) /* 出口参数:无(隐形输出,U(k))/* 函数说明:U(k)+KP*E(k)-E(k-1)+KI*E(

3、k)+KD*E(k)-2E(k-1)+E(k-2)* */void PID_Operation(void)uInt32 Temp3 = 0; /中间临时变量uInt32 PostSum = 0; /正数和uInt32 NegSum = 0; /负数和if(PID.iSetVal PID.iCurVal) /设定值大于实际值否?if(PID.iSetVal - PID.iCurVal 10) /偏差大于 10否?PID.iPriVal = 100; /偏差大于 10为上限幅值输出(全速加热) else /否则慢慢来Temp0 = PID.iSetVal - PID.iCurVal; /偏差 PI

4、D.liEkVal1) /E(k)E(k-1)否?Temp0 = PID.liEkVal0 - PID.liEkVal1; /E(k)E(k-1)PID.uEkFlag0 = 0; /E(k)-E(k-1)为正数 elseTemp0 = PID.liEkVal1 - PID.liEkVal0; /E(k) Temp2) /E(k-2)+E(k)2E(k-1)否?Temp2 = (PID.liEkVal0 + PID.liEkVal2) - Temp2;PID.uEkFlag2=0; /E(k-2)+E(k)-2E(k-1)为正数 else /E(k-2)+E(k) PID.iCurVal(即E

5、(K)0)才进入 if的,那么就没可能为负,所以打个转回去就是了 */* = 计算 KD*E(k-2)+E(k)-2E(k-1)的值 = */if(PID.uEkFlag2=0)PostSum += Temp2; /正数和elseNegSum += Temp2; /负数和/* = 计算 U(k) = */ PostSum += (uInt32)PID.iPriVal; if(PostSum NegSum) /是否控制量为正数 Temp0 = PostSum - NegSum;if(Temp0 0,才有必要减“1”uCounter+;if(100 = uCounter)PID_Operation

6、(); /每过 0.1*100S调用一次 PID运算。uCounter = 0; /* */* 函数名称:PID_Output() /* 函数功能:PID 输出控制 /* 入口参数:无(隐形输入,U(k)) /* 出口参数:无(控制端) * */void Timer0Init(void)TMOD |= 0x01; / 设置定时器 0工作在模式 1下TH0 = 0xDC;TL0 = 0x00; / 赋初始值TR0 = 1; / 开定时器 0EA = 1; / 开总中断 ET0 = 1; / 开定时器中断void main(void)Timer0Init();while(1)PID_Output(

7、);void Timer0_ISR(void) interrupt 1static uInt16 uiCounter = 0;TH0 = 0xDC;TL0 = 0x00;uiCounter+;if(100 = uiCounter)g_bPIDRunFlag = 1;总所周知,PID 算法是个很经典的东西。而做自平衡小车,飞行器PID 是一个必须翻过的坎。因此本节我们来好好讲解一下 PID,根据我在学习中的体会,力求通俗易懂。并举出 PID 的形象例子来帮助理解 PID。一、首先介绍一下 PID 名字的由来:P:Proportion(比例) ,就是输入偏差乘以一个常数。I :Integral(积

8、分) ,就是对输入偏差进行积分运算。D:Derivative(微分) ,对输入偏差进行微分运算。注:输入偏差=读出的被控制对象的值-设定值。比如说我要把温度控制在 26 度,但是现在我从温度传感器上读出温度为 28 度。则这个 26度就是”设定值“ ,28 度就是“读出的被控制对象的值”。然后来看一下,这三个元素对 PID 算法的作用,了解一下即可,不懂不用勉强。P,打个比方,如果现在的输出是 1,目标输出是 100,那么 P 的作用是以最快的速度达到 100,把 P 理解为一个系数即可;而 I 呢?大家学过高数的,0 的积分才能是一个常数,I 就是使误差为 0 而起调和作用;D 呢?大家都知

9、道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。二、然后要知道 PID 算法具体分两种:一种是位置式的 ,一种是增量式的。在小车里一般用增量式,为什么呢?位置式 PID 的输出与过去的所有状态有关,计算时要对 e(每一次的控制误差)进行累加,这个计算量非常大,而明显没有必要。而且小车的 PID 控制器的输出并不是绝对数值,而是一个,代表增多少,减多少。换句话说,通过增量 PID 算法,每次输出是 PWM 要增加多少或者减小多少,而不是PWM 的实际值。所以明白增量式 PID 就行了。三、接着讲 PID 参数的整定,

10、也就是 PID 公式中,那几个常数系数Kp,Ti,Td 等是怎么被确定下来然后带入 PID 算法中的。如果要运用PID,则 PID 参数是必须由自己调出来适合自己的项目的。通常四旋翼,自平衡车的参数都是由自己一个调节出来的,这是一个繁琐的过程。本次我们可以不管,关于 PID 参数怎么确定的,网上有很多经验可以借鉴。比如那个经典的经验试凑口诀:参数整定找最佳, 从小到大顺序查。 先是比例后积分, 最后再把微分加。曲线振荡很频繁, 比例度盘要放大。曲线漂浮绕大弯, 比例度盘往小扳。曲线偏离回复慢, 积分时间往下降。曲线波动周期长, 积分时间再加长。曲线振荡频率快, 先把微分降下来。动差大来波动慢,

11、 微分时间应加长。理想曲线两个波, 前高后低四比一。一看二调多分析, 调节质量不会低。四、接下来我们用例子来辅助我们把常用的 PID 模型讲解了。 (PID 控制并不一定要三者都出现,也可以只是 PI、PD 控制,关键决定于控制的对象。 ) (下面的内容只是介绍一下 PID 模型,可以不看,对理解PID 没什么用)例子:我们要控制一个人,让他一 PID 的控制方式来行走 110 步后停下来。1)P 比例控制,就是让他按照一定的比例走,然后停下。比如比例系数为 108,则走一次就走了 108 步,然后就不走了。说明:P 比例控制是一种最简单的控制方式,控制器的输出与输入误差信号成比例关系。但是仅

12、有比例控制时系统输出存在稳态误差。比如上面的只能走到 108,无论怎样都走不到 110。2)PI 积分控制,就是按照一定的步伐走到 112 步然后回头接着走,走到 108 步位置时,然后又回头向 110 步位置走。在 110 位置处来回晃荡几次,最后停在 110 步的位置。说明:在积分 I 控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统来说,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差的影响取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大,从而使稳态误差进一步减小,直到等于 0。因此,比例+积分(PI)控制器可以使系统在进入稳态后无稳态误差。3)PD 微分控制,就是按照一定的步伐走到一百零几步后,再慢慢地走向 110 步的位置靠近,如果最后能精确停在 110 步的位置,就是无静差控制;如果停在 110 步附近(如 109 步或 111 步位置) ,就是有静差控制。说明:在微分控制 D 中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号