什么是PIDPID算法代码实现_第1页
什么是PIDPID算法代码实现_第2页
什么是PIDPID算法代码实现_第3页
什么是PIDPID算法代码实现_第4页
什么是PIDPID算法代码实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页什么是PID,PID算法代码实现(PI)D(算法)可以用于温度控制、水位控制、飞行姿态控制等领域。

后面我们通过PID控制电机进行说明。

自动控制系统

在直流有刷(电机)的基础驱动中,如果电机负载不变,我们只要设置固定的占空比(电压),电机的速度就会稳定在目标范围。

然而,在实际的应用中,负载可能会发生变化,此时如果还是输出固定的电压,电机的速度就偏离目标范围了,为了解决这个问题,我们需要引入自动(控制系统)中的闭环控制。接下来我们开始学习自动控制系统的内容。

概念:用自动控制装置,对关键参数进行自动控制,使它在受到外界干扰而偏离正常状态时,能够被自动地调节回到目标范围内。

应用场景:电水壶保温系统

、大棚温控系统、水位控制系统,等等。

分类:自动控制系统分为开环控制系统和闭环控制系统

①开环控制系统

在开环控制系统中,系统输出只受输入的控制,没有反馈回路,控制精度和抑制干扰的特性都比较差。

电风扇风力控制系统就是一个开环控制的系统,我们设置好目标风力之后,(控制电路)就输出相应的电压(假设是电压控制),此时电机的扇叶转速就被控制在目标范围了。

理想状态下,风扇的输出风力确实可以稳定在目标值附近,然而,在实际的使用中,电机会逐渐老化,扇叶上的灰尘也会让负载增大,此时我们所设定目标风力和实际风力可能就存在偏差了。

②闭环控制系统

在闭环控制系统中,引入了反馈回路,利用输出(实际值)和输入(目标值)的偏差,对系统进行控制,避免偏离预定目标。

大棚温控系统就是一个闭环控制的系统,我们设置好目标温度之后,(温度传感器)会采集棚内的实际温度,然后将目标温度和实际温度进行偏差的计算,计算后的结果输入到控制电路中,控制电路进一步控制温控设备进行升温和降温,此时棚内的实际温度就被控制在目标范围了。

当实际温度因外部影响偏离目标值时,温度传感器(反馈电路)就能及时的反馈偏差,让系统自动调节温控设备,使得实际温度逐渐回到目标范围。

PID算法

PID算法是闭环控制系统中常用的算法,PID分别是Propor(ti)on(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。

我们将输入目标值和实际输出值进行偏差的计算,然后把计算结果输入到PID控制算法中,经过比例、积分和微分三个环节的运算,运算后的输出作用于执行器,从而让系统的实际值逐渐靠近目标值。

以大棚温控系统为例,来理解PID算法中三个环节的作用。

比例环节(Proportion)

比例环节可以成比例地反应控制系统的偏差(信号),即输出与输入偏差成正比,可以用来减小系统的偏差。公式如下:

u—输出

Kp—比例系数

e—偏差

我们可以通过大棚温控去理解PID公式。例如需要调节棚内温度为30℃,而实际温度为10℃,此时的偏差e=20,由比例环节的公式可知

当e确定时,Kp越大则输出u越大,也就是温控系统的调节力度越大,这样就可以更快地达到目标温度;而当Kp确定时,偏差e越大则输出u越大。

由此可见,在比例环节中,比例系数Kp和偏差e越大则系统消除偏差的时间越短

当Kp的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降。

所以我们在设置比例系数的时候,并不是越大越好,而是要兼顾消除偏差的时间以及整个系统的稳定性。

在实际的应用中,如果仅有比例环节的控制,可能会给系统带来一个问题:静态误差。

静态误差是指系统控制过程趋于稳定时,目标值与实测值之间的偏差。

如果我们在需要调节棚内温度为30℃,而实际温度为25℃,此时偏差e=5,Kp为固定值,那么此时的输出可以让大棚在半个小时之内升温5℃,而外部的温差可以让大棚在半个小时之内降温5℃,也就是说,输出u的作用刚好被外部影响抵消了,这就使得偏差会一直存在。

我们可以通过增大Kp来增大输出,以此消除偏差。在实际应用中,此方法的局限性很大,因为我们不能确定偏差的大小,它是在实时变化的,如果我们把Kp设置得太大,就会引入超调和振荡,让整个系统的稳定性变差。因此,为了消除静态误差,我们引入了积分环节。

积分环节(Integral)

积分环节可以对偏差e进行积分,只要存在偏差,积分环节就会不断起作用,主要用于消除静态误差,提高系统的无差度。

引入积分环节后,比例+积分环节的公式如下:

u—输出

e—

偏差

∑e—累计偏差

Kp—

比例系数

Ki—积分系数

通过以大棚温控分析可以知道,如果温控系统的比例环节作用被抵消,存在静态误差5℃,此时偏差存在,积分环节会一直累计偏差,以此增大输出,从而消除静态误差。

从上述公式中可以得知,当积分系数Ki或者累计偏差越大时,输出就越大,系统消除静态误差的时间就越短。

Ki

的值越大时,其对应的橙色曲线达到目标值的时间就越短,与此同时,橙色曲线出现了一定幅度的超调和振荡,这会使得系统的稳定性下降

因此,我们在设置积分系数的时候,并不是越大越好,而是要兼顾消除静态误差的时间以及整个系统的稳定性。

只要系统还存在偏差,积分环节就会不断地累计偏差。当系统偏差为0的时候,说明已经达到目标值,此时的累计偏差不再变化,但是积分环节依旧在发挥作用(此时往往作用最大),这就很容易产生超调的现象了。

因此,我们需要引入微分环节,提前减弱输出,抑制超调的发生。

微分环节(Differential)

微分环节可以反应偏差量的变化趋势,根据偏差的变化量提前作出相应控制,减小超调,克服振荡。引入微分环节后,比例+积分+微分环节的公式如下:

我们继续使用大棚温控去分析微分环节的作用。如果温控系统目标温度为30℃,在上午八点的时候存在偏差15℃,经过一段时间的调节,到了上午九点,此时偏差已经缩小到5℃,偏差的变化量=九点的偏差(第k次)-八点的偏差(第k-1次)=-10,结合上述公式可知,此时微分环节会削弱比例和积分环节的作用,减小输出以抑制超调。

最终得到了一个PID算法公式:

这个公式是PID离散公式之一,除了离散公式之外,PID还有连续的公式,但是因为连续的公式不利于机器计算,我们一般不研究。每一个系统的PID系数并不是通用的,这需要根据实际的情况去设置。

PID算法离散公式

位置式PID公式

这个公式的计算需要全部控制量参与,它的每一次输出都和过去的状态有关。

增量式PID公式

通过位置式的PID公式,可推导出增量式PID公式

将k=k-1代入位置式PID公式

增量式PID可以看出,增量式PID的计算并不需要一直累计偏差,它的输出与近三次的偏差有很大关系。

注意:增量式PID公式输出的只是控制量的增量。假设电机实际转速为50RPM,现在我们要让它加速到60RPM,如果采用的是位置式PID,系统将直接输出60RPM对应的控制量(占空比);

如果采用的是增量式PID,系统将输出提速10RPM对应的控制量(占空比),此时我们还需要加上上次(50RPM)的输出。

两个PID公式的不同点

两种

PID

公式的优缺点

①位置式:

优点:位置式PID是一种非递推式算法,带有积分作用,适用于不带积分部件的对象。

缺点:全量计算,计算错误影响很大;需要对偏差进行累加,运算量大。

②增量式:

优点:只输出增量,计算错误影响小;不需要累计偏差,运算量少,实时性相对较好。

缺点:积分截断效应大,有稳态误差。

积分饱和问题

在位置式PID中,如果系统长时间无法达到目标值,累计偏差(积分)就会变得很大,此时系统的响应就很慢了。

例如某个电机能达到的最大速度为300RPM,而我们设置了目标速度为350RPM,这明显是一个不合理的目

由于系统长时间无法达到目标值,累计偏差(积分)会变得越来越大,逐渐达到深度饱和的状态,此时我们再设置一个合理范围的目标速度(例如200RPM),系统就没有办法在短时间内响应了。

为了避免位置式PID中可能出现的积分饱和问题,可以考虑下面解决方法:

优化PID曲线,系统越快达到目标值,累计的偏差就越小;

限制目标值调节范围,规避可以预见的偏差;

进行积分限幅,在调整好PID系数之后,根据实际系统来选择限幅范围。

PID

算法代码实现

控制量相关的结构体

我们知道PID的离散化公式后,实现PID算法的代码是非常简单。

定义结构体来管理这些控制量

typedefstruct{__IOfloatSetPoint;/*目标值*/__IOfloatActualValue;/*期望输出值*/__IOfloatSumError;/*偏差累计*/__IOfloatProportion;/*比例系数P*/__IOfloatIntegral;/*积分系数I*/__IOfloatDerivative;/*微分系数D*/__IOfloatError;/*Error[1],第k次偏差*/__IOfloatLastError;/*Error[-1],第k-1次偏差*/__IOfloatPrevError;/*Error[-2],第k-2次偏差*/}PID_TypeDef;PID算法代码

位置式PID代码

/**@briefpid闭环控制*@pa(ram)*PID:PID结构体变量地址*@paramFeedback_value:当前实际值*@retval期望输出值*/int32_town_pid_ctrl(PID_TypeDef*PID,floatFeedback_value){

PID->Error=(float)(PID->SetPoint-Feedback_value);/*计算偏差*/

PID->SumError+=PID->Error;/*累计偏差*/

PID->ActualValue=(PID->Proportion*PID->Error)/*比例环节*/

+(PID->Integral*PID->SumError)/*积分环节*/

+(PID->Derivative*(PID->Error-PID->LastError));/*微分环节*/

PID->LastError=PID->Error;/*存储偏差,用于下次计算*/

return((int32_t)(PID->ActualValue));/*返回计算后输出的数值*/}own_pid_ctrl函数用来进行位置式PID的控制,该函数的2个形参:PID传入PID控制量相关的结构体地址;Feedback_value传入当前系统的实际值,用于计算偏差。

在函数中,我们先计算本次偏差Error,然后把偏差累计,存入SumError成员当中,接着根据位置式的公式进行三个环节的计算,计算后的期望输出存入ActualValue成员当中,然后存储本次偏差,最后返回期望输出值。

增量式PID代码

/**@briefpid闭环控制*@param*PID:PID结构体变量地址*@paramFeedback_value:当前实际值*@retval期望输出值*/int32_town_pid_ctrl(PID_TypeDef*PID,floatFeedback_value){PID->Error=(float)(PID->SetPoint-Feedback_value);/*计算偏差*/PID

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论