做零售的外贸网站,开发手机app难吗,全国建设部网站官网,一般网站建设公司#xfeff;#xfeff; 在自动控制中#xff0c;PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中#xff0c;也时常会遇到类似的需求#xff0c;所以就想实现这一算法以适用于更多的应用场景。… 在自动控制中PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中也时常会遇到类似的需求所以就想实现这一算法以适用于更多的应用场景。
1、PID算法基本原理
PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说设计和实现PID算法是完成自动控制系统的基本要求。这一算法虽然简单但真正要实现好却也需要下一定功夫。首先我们从PID算法最基本的原理开始分析和设计这一经典命题。
PID算法的执行流程是非常简单的即利用反馈来检测偏差信号并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下 根据上图我们考虑在某个特定的时刻t此时输入量为rin(t)输出量为rout(t)于是偏差就可计算为err(t)rin(t)-rout(t)。于是PID的基本控制规律就可以表示为如下公式 其中Kp为比例带TI为积分时间TD为微分时间。PID控制的基本原理就是如此。
2、PID算法的离散化
上一节简单介绍了PID算法的基本原理但要在计算机上实现就必须将其离散化接下来我们就说一说PID算法的离散化问题。在实现离散化之前我们需要对比例、积分、微分的特性做一个简单的说明。
比例就是用来对系统的偏差进行反应所以只要存在偏差比例就会起作用。积分主要是用来消除静差所谓静差就是指系统稳定后输入输出之间依然存在的差值而积分就是通过偏差的累计来抵消系统的静差。而微分则是对偏差的变化趋势做出反应根据偏差的变化趋势实现超前调节提高反应速度。
在实现离散前我们假设系统采样周期为T。假设我们检查第K个采样周期很显然系统进行第K次采样。此时的偏差可以表示为err(K)rin(K)-rout(K)那么积分就可以表示为err(K) err(K1)┈┈而微分就可以表示为(err(K)- err(K-1))/T。于是我们可以将第K次采样时PID算法的离线形式表示为 也可以记为 这就是所谓的位置型PID算法的离散描述公式。我们知道还有一个增量型PID算法那么接下来我们推到一下增量型PID算法的公式。上面的公式描述了第k个采样周期的结果那么前一时刻也就是k-1个采样周期就不难表示为 那么我们再来说第K个采样周期的增量很显然就是U(k)-U(k-1)。于是我们用第k个采样周期公式减去第k-1个采样周期的公式就得到了增量型PID算法的表示公式 当然增量型PID必须记得一点就是在记住U(k)U(k-1)∆U(k)。
3、PID控制器的基本实现
完成了离散化后我们就可以来实现它了。已经用离散化的数据公式表示出来后再进型计算机编程已经不是问题了。接下来我们就使用C语言分别针对位置型公式和增量型公式来具体实现。
3.1、位置型PID的简单实现
位置型PID的实现就是以前面的位置型公式为基础。这一节我们只是完成最简单的实现也就是将前面的离散位置型PID公式的计算机语言化。
首先定义PID对象的结构体
/*定义结构体和公用体*/
typedef struct
{float setpoint; //设定值float proportiongain; //比例系数float integralgain; //积分系数float derivativegain; //微分系数float lasterror; //前一拍偏差float result; //输出值float integral;//积分值
}PID;
接下来实现PID控制器
void PIDRegulation(PID *vPID, float processValue)
{float thisError;thisErrorvPID-setpoint-processValue;vPID-integralthisError;vPID-resultvPID-proportiongain*thisErrorvPID-integralgain*vPID-integralvPID-derivativegain*(thisError-vPID-lasterror);vPID-lasterrorthisError;
}
这就实现了一个最简单的位置型PID控制器当然没有考虑任何干扰条件仅仅只是对数学公式的计算机语言化。
3.2、增量型PID的简单实现
增量型PID的实现就是以前面的增量型公式为基础。这一节我们只是完成最简单的实现也就是将前面的离散增量型PID公式的计算机语言化。
首先定义PID对象的结构体
/*定义结构体和公用体*/
typedef struct
{float setpoint; //设定值float proportiongain; //比例系数float integralgain; //积分系数float derivativegain; //微分系数float lasterror; //前一拍偏差float preerror; //前两拍偏差float deadband; //死区float result; //输出值
}PID;
接下来实现PID控制器
void PIDRegulation(PID *vPID, float processValue)
{float thisError;float increment;float pError,dError,iError;thisErrorvPID-setpoint-processValue; //得到偏差值pErrorthisError-vPID-lasterror;iErrorthisError;dErrorthisError-2*(vPID-lasterror)vPID-preerror;incrementvPID-proportiongain*pErrorvPID-integralgain*iErrorvPID-derivativegain*dError; //增量计算vPID-preerrorvPID-lasterror; //存放偏差用于下次运算vPID-lasterrorthisError;vPID-resultincrement;
}
这就实现了一个最简单的增量型PID控制器也没有考虑任何的干扰条件仅仅只是对数学公式的计算机语言化。
4、基本特点
前面讲述并且实现了PID控制器包括位置型PID控制器和增量型PID控制器。界限来我们对这两种类型的控制器的特点作一个简单的描述。
位置型PID控制器的基本特点 位置型PID控制的输出与整个过去的状态有关用到了偏差的累加值容易产生累积偏差。 位置型PID适用于执行机构不带积分部件的对象。 位置型的输出直接对应对象的输出对系统的影响比较大。
增量型PID控制器的基本特点 增量型PID算法不需要做累加控制量增量的确定仅与最近几次偏差值有关计算偏差的影响较小。 增量型PID算法得出的是控制量的增量对系统的影响相对较小。 采用增量型PID算法易于实现手动到自动的无扰动切换。
欢迎关注