PID算法的C程序实现方式,大神带你入门
时间:2018-04-24作者:华清远见
一、PID算法简介 在水温控制模型、智能车比赛、四轴飞行器稳定,平衡车速度等控制实现时,因为预设值与实际控制效果之间存在一定的偏差、实际输出与数据反馈之间存在一定的延时,往往不能得到理想的控制效果。PID作为应用为广泛的一种自动控制器,在实际控制中加入PID算法将能达到系统不断灵活变化的效果。 上面的提到的几种实例都可以称为惰性系统(过程控制对象具有“一介滞后+纯滞后”与“二介滞后+纯滞后 ”特点,说白了就是响应延迟+反馈延时),PID控制器是一种最优控制器。 顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律: 1.1比例P Proportion(比例),就是输入偏差乘以一个常数。 比例调节器方程为: y=Kp*e(t) 调节器的输出与输入偏差成正比。比例项部分其实就是对预设值和反馈值差值的放大倍数。 图示
图1 比例放大示意图 控制对象为电机时,比例Kp越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。从而,加Kp值,可以减少从非稳态到稳态的时间。但是同时也可能造成电机转速在预设值附近振荡的情形,即用力过猛,调整跨度太大,如果是舵机转向系统,会出现智能车摇摆S型前进,这就是Kp过大造成的,所以又引入积分I解决此问题。 1.2 积分I Integral(积分),积分作用是指调节器的输出与输入偏差的积分成比例的作用。 积分方程为:
Ti是积分时间常数,它表示积分速度的大小,Ti越大,积分速度越慢,积分作用越弱。 图示
图2 积分调节示意图 积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,也就是积分项的调节存在明显的滞后,因为Ti代表的是时间常数,Ti值越大,时间越长,滞后效果越明显,增加系统的超调量。积分常数T I 越大,积分的积累作用越弱。增大积分常数T I 会减慢静态误差的消除过程,但可以减少超调量,提高系统的稳定性。所以,必须根据实际控制的具体要求来确定TI 。比如:当差值不是很大时,可以减小控制效果,维持原系统的输出值。但是还是要将偏差进行加法积累。当这个和累加超过预定值时,再一次性进行处理。从而避免了频繁控制而出现振荡现象。 1.3 微分D Derivative(微分),微分项部分其实就是求电机转速的变化率。也就是前后两次差值的差。 微分调节器的微分方程为
图示
图3 微分控制器曲线 微分反应了偏差信号的变化规律,或者说是变化趋势,偏差的微分实际偏差的变化速率,变化越快,其微分绝对值越大。偏差增大时,其微分为正;偏差减小时,其微分为负。控制器输出量的微分部分与误差的微分成正比,反映了被控量变化的趋势。根据偏差信号的变化趋势来进行超前调节,从而增加了系统的快速性。Td值越大,超前控制作用就会越明显,可以在做到提前控制。比例仅仅是偏差的放大增幅,表示当前调节参数,微分是预测偏差的变化,相当于提前加入了控制数据。在比例微分调节器中,能够提前控制偏差,也有可能出现负值,避免了惰性系统的超调现象。 一、PID算法内容 2.1 PID算法选择 PID算法中有比例积分调节(PI),比例微分调节器(PD),可根据系统要求进行选择,通常为了改善调节品质,往往把比例、积分、微分三种作用组合起来,形成PID调节器。理想的PID微分方程为:
其中u(t) 调节器的输出信号; e(t) 调节器的偏差信号,它等于给定值与测量值之差 Kp 为比例增益; T i 积分时间 T d 微分时间 KP /T I 积分系数 KP / T D 微分系数 2.2 PID算法要求 PID需要在一个闭环系统里面(桥黑板)。闭环系统即在控制系统中,有执行处理单元,同时必须有输入反馈单元,电机系统中,必须有编码器、测速电机等测速设备。控制系统原理图如下:
图4 闭环PID控制系统 2.3 PID参数常用小口诀: 整定参数寻最佳,从小到大逐步查; 先调比例后积分,微分作用最后加; 曲线震荡很频繁,比例刻度要放大; 曲线漂浮波动大,比例刻度要拉小; 曲线偏离回复慢,积分时间往小降; 曲线波动周期长,积分时间要加长; 曲线震荡动作繁,微分时间要加长。 一、C代码实现 由于计算机控制是一种采样控制,它只能根据采样许可的偏差计算控制量,而不能象模拟控制那样连续输出控制量,进行连续控制。那么上面的PID公式不能直接使用,必须进行离散化处理 假设采样时间间隔为T,则在k时刻: 偏差为e(k); 积分为e(k)+e(k-1)+e(k-2)+...+e(0); 微分为(e(k)-e(k-1))/T; 从而公式离散化后如下:
k 采样信号,k=0,1,2,… u k 第k 次采样时刻的计算机输出值 e k 第k 次采样时刻输入的偏差值 e k −1 第k-1 次采样时刻输入的偏差值。 实际上面的公式为位置式PID,运算较多,占用单片机资源,还可以推出增量式PID: U(k) = P *e(k) + I *[e(k)+e(k-1)+...+e(0)]+ D *[e(k)-e(k-1)]。 简化后可以在C语言中写成: u(k) = u(k)-u(k-1) = Kp(e(k) - e(k-1)) + Ki *e(k) + Kd(e(k)) - 2e(k-1) + e(k-2)) 上面的表达式就是增量式表达形式,u(k)与最后三次计算偏差有关。 C语言理解代码: //创建变量结构体 struct pid_type{ float Kp; //PI调节的比例常数 float Ti; //PI调节的积分常数 float T; //采样周期 float Ki; float ek; //偏差e[k] float ek1; //偏差e[k-1] float ek2; //偏差e[k-2] float uk; //u[k] signed int uk1; //对u[k]四舍五入取整 signed int adjust; //调节器输出调整量 }pid; //变量初始 void Pid_Init(void) { pid.Kp=4; pid.Ti=0.005; pid.T=0.001; pid.Ki=0.6; //微分系数Kd=KpTd/T。根据实际调节 pid.ek=0; pid.ek1=0; pid.ek2=0; pid.uk=0; pid.uk1=0; pid.adjust=0; } int PIDadjust(float ek) //PI调节算法 { if( gabs(ek)<0.1 ) { pid.adjust=0; } else { pid.uk=pid.Kp*(pid.ek-pid.ek1)+pid.Ki*pid.ek; //计算控制增量 pid.ek1=pid.ek; pid.uk1=(signed int)pid.uk; if(pid.uk>0) { if(piduk-piduk1>=0.5) { pi.uk1=pid.uk1+1; } } if(piduk<0) { if(pid.uk1-pid.uk>=0.5) { pid.uk1=pid.uk1-1; } } adjust=pid.uk1; } return adjust; } 一、小结 增大比例系数P一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。 增大积分时间I有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。 增大微分时间D有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。 也可以说比例系数P代表着现在,表明现在预设值与实际的偏差,积分代表着过去,是过去Ti时间内的偏差积累,可以减少震荡,微分D代表着未来,反应了偏差变化率,可以超前预测并提出控制。 这里有关PID资料的讲的非常好,推荐给大家: 1. https://blog.csdn.net/u010312937/article/details/53363831#t3《PID控制算法的C语言实现<完整版>》 2. https://blog.csdn.net/qq229596421/article/details/51419813 3. https://blog.csdn.net/msdnwolaile/article/details/51038196 祝君爽!! 相关资讯
发表评论
|