PID算法完全讲解

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

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

1、PID算法完全讲解#include typedef unsigned chartypedef unsigned inttypedef unsigned long intsbit ConOut = P1A1;typedef struct PID_ValueuInt32 liEkVal3;uChar8 uEkFlag3;的为正数uChar8 uKP_Coe;uChar8 uKI_Coe;uChar8 uKD_Coe;uInt16 iPriVal;uInt16 iSetVal;uInt16 iCurVal;PID_ValueStr;PID_ValueStr PID;体用来存算法中要用到的各种数据uC

2、har8;uInt16;uInt32;加热丝接到P1.1 口/差值保存,给定和反馈的差值/符号,1则对应的为负数,0为对应/比例系数/积分常数/微分常数/上一时刻值/设定值/实际值/定义一个结构体,这个结构bit g_bPIDRunFlag = 0;/PID运行标志位,PID算法不是直在运算。而是每隔一定时间,算一次。/* */* 函数名称:PID_Operation()/*函数功能:PID运算/* 入口参数:无(隐形输入,系数、设定值等)/*出口参数:无(隐形输出,U(k)/* 函数说明:U(k)+KP*E(k)-E(k-1)+KI*E(k)+KD*E(k)-2E(k-1)+E(k-2)*

3、*/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/否则慢慢来TempO = PID.iSetVal - PID.iCurVal;偏差PID.liEkVal1)E(k)E(k-1)否?Temp0 = PID.li

4、EkVal0 - 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(K)0)才进入 if 的,那么就没可能为负,所以打个转回去就是了 */* = = = = = =

5、= = =计算 KD*E(k-2)+E(k)-2E(k-1)的值= */if(PID.uEkFlag2=0)PostSum +=Temp2;elseTemp2;/正数和NegSum +=/负数和/* =计算u(k)*/PostSum += (uInt32)PID.iPriVal;if(PostSum NegSum) /是否控制量为正数 Temp0 = PostSum - NegSum; if(Temp0 0,才有必要减“1”uCounter+;if(100 = uCounter)PID_Operation();每过0.1*100S调用一次PID运算。uCounter = 0;/* */* 函数

6、名称: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();void Timer0_ISR(void) interrupt 1static uInt16 uiCounter = 0;TH0

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

8、值。比如说我要把温度控制 在26度,但是现在我从温度传感器上读出温度为28度。则这个26度 就是”设定值“,28度就是“读出的被控制对象的值”。然后来看一下,这 三个元素对PID算法的作用,了解一下即可,不懂不用勉强。P,打个比方,如果现在的输出是1,目标输出是100,那么P的作用是 以最快的速度达到100,把P理解为一个系数即可;而丨呢?大家学过 高数的,0的积分才能是一个常数,丨就是使误差为0而起调和作用;D 呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最 快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调 节过程的作用了。二、然后要知道PID算法具体分两种:一种是位置式的,一种是增量 式的。在小车里般用增量式,为什么呢?位置式PID的输出与过去的 所有状态有关,计算时要对e (每一次的控制误差)进行累加,这个计 算量非常大,而明显没有必要。而且小车的PID控制器的输出并不是绝 对数值,而是一个代表增多少,减多少。换句话说,通过增量PID 算法,每次输出是PWM要增加多少或者减小多少

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械/制造/汽车 > 电气技术

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