前言:
眼前咱们对“算法初步c”大概比较关心,姐妹们都想要知道一些“算法初步c”的相关知识。那么小编在网络上搜集了一些有关“算法初步c””的相关资讯,希望你们能喜欢,朋友们一起来了解一下吧!一、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代表着未来,反应了偏差变化率,可以超前预测并提出控制。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
扫码进群领资料
标签: #算法初步c #增量式pid程序流程图