--- 工业控制中常用算法 ---
——可——编——程——控-制-器-技——术——门——户
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
/*====================================================================================================
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID
WW.W_PLCJS_COM-PLC-技.术_网
参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余
——可——编——程——控-制-器-技——术——门——户
数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。
WWW_PLC※JS_COM-PmLC-技.术_网
=====================================================================================================*/
P.L.C.技.术.网——可编程控制器技术门户
#include
P.L.C.技.术.网——可编程控制器技术门户
#include
WWW_PLCJS_COM-PLC-技.术_网
/*====================================================================================================
W1WW_P4LCJS_COM-PLC-技.术_网
PID Function
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWcW_PLCJS_COM-PLC-技.术_网
The PID (比例、积分、微分) function is used in mainly
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
control applications. PIDCalc performs one iteration of the PID
P.L.C.技.术.网——可编程控制器技术门户
algorithm.
WWW_P※LCJS_COM-PLC-)技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
While the PID function works, main is just a dummy program showing
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
a typical usage.
WWW_PLCJS_COM-PLC-技.术_网
=====================================================================================================*/
WW.W_PLCJS_COM-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
typedef struct PID {
P.L.C.技.术.网——可编程控制器技术门户
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
double SetPoint; // 设定目标 Desired value
WWW.PLCJS.COM——可编程控制器技术门户
——可——编——程——控-制-器-技——术——门——户
double Proportion; // 比例常数 Proportional Const
WWW_P※LCJS_COM-PLC-)技.术_网
double Integral; // 积分常数 Integral Const
P.L.C.技.术.网——可编程控制器技术门户
double Derivative; // 微分常数 Derivative Const
W1WW_P4LCJS_COM-PLC-技.术_网
WWW_P※LCJS_COM-PLC-)技.术_网
double LastError; // Error[-1]
WWW_PLCJS@_COM%-PLC-技.术_网
double PrevError; // Error[-2]
WWW_PLCJS_COM-PLC-技.术_网
double SumError; // Sums of Errors
WWW_P※LCJS_CO※M-PLC-技-.术_网
plcjs.技.术_网
} PID;
W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
/*====================================================================================================
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
PID计算部分
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
=====================================================================================================*/
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PL※CJS_COM-PLC-技.术_网
double PIDCalc( PID *pp, double NextPoint )
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
{
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
double dError,
WWcW_PLCJS_COM-PLC-技.术_网
Error;
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
Error = pp->SetPoint - NextPoint; // 偏差
W1WW_P4LCJS_COM-PLC-技.术_网
pp->SumError += Error; // 积分
plcjs.技.术_网
dError = pp->LastError - pp->PrevError; // 当前微分
WW.W_PLCJS_COM-PLC-技.术_网
pp->PrevError = pp->LastError;
WW.W_PLC※JS_C,OM-PL,C-技.术_网
pp->LastError = Error;
WW.W_PLCJS_COM-PLC-技.术_网
return (pp->Proportion * Error // 比例项
WWW_PLC※JS_COM-PmLC-技.术_网