您的位置:首页 > 其它

控制算法、基本定义及其实现

2016-04-04 14:57 645 查看

控制系统基本环节

比例

积分

微分

惯性

二阶系统

延时

PID调节

基本公式

可以直接在网上搜

分类

位置式PID

PID输出直接给输出

增量式PID

PID得到的输出叠加在上一次PID的输出中作为系统输出

积分分离PID

当控制量与给定值相差较大时,取消积分作用, 避免积分累加和过大造成的系统不稳定因素增加

相关代码

float SeqIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
float result;
float Err,KpWork, KiWork, KdWork;
Err = GiveValue - ActualValue;
KpWork = Kp*Err;
KiWork = Ki*SeqIntPIDErrADD;
KdWork = Kd*(Err-SeqIntErrBack);
if(fabs(Err) > 100)
{
result = KpWork+KdWork;
}
else{
result = KpWork+KiWork+KdWork;
}
SeqIntPIDErrADD = SeqIntPIDErrADD + Err;
SeqIntErrBack = Err;
return result;
}


抗积分饱和PID

2种方法

限制积分累加和

限制每次的控制量输出(可以防止长期停止在饱和区)

相关代码(限制每次控制量输出代码)

float OverIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
float result;
float Err,KpWork, KiWork, KdWork;
Err = GiveValue - ActualValue;
if(OverIntResultBack > 120)
{
if(Err < 0)
{
OverIntPIDErrADD = OverIntPIDErrADD + Err;
}
}
else if(OverIntResultBack < 120)
{
if(Err > 0)
{
OverIntPIDErrADD = OverIntPIDErrADD + Err;
}
}
else
{
OverIntPIDErrADD = OverIntPIDErrADD + Err;
}
KpWork = Kp*Err;
KiWork = Ki*OverIntPIDErrADD;
KdWork = Kd*(Err-OverIntErrBack);
result = KpWork+KiWork+KdWork;
OverIntErrBack = Err;
OverIntResultBack = result;
return result;
}


变积分PID实现

说明

偏差越大,积分越慢;偏差越小,积分越快。

给定累加的偏差一个权值,当系统偏差大于某一个值时,累积不完全的偏差值,甚至不进行偏差值的累加。

相关代码

float ChangeIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
float result;
float Err,KpWork, KiWork, KdWork,ErrCont;
Err = GiveValue - ActualValue;
KpWork = Kp*Err;
KiWork = Ki*ChangeIntPIDErrADD;
KdWork = Kd*(Err-ChangeIntErrBack);
result = KpWork+KiWork+KdWork;
if(fabs(Err)<= GiveValue*0.1)
{
ErrCont = Err;
}
else if((fabs(Err)<= GiveValue*0.9)&&(fabs(Err)> GiveValue*0.1))
{
ErrCont = ((0.9*GiveValue)-fabs(Err))*Err/(0.8*GiveValue);
}
else
{
ErrCont = 0;
}
ChangeIntPIDErrADD = ChangeIntPIDErrADD + ErrCont;
ChangeIntErrBack = Err;
return result;
}


不完全微分 PID控制

说明

微分信号的可以改善系统的动态特性,但也容易引入高频干扰,在误差信号存在扰动时, 更是能够显示微分的不足之处。克服上述问题的方法之一就是在采用不完全微分 PID 控制,所谓不完全微分法就是在 PID 控制算法的微分项中加入一个一阶惯性环节。如此可是系统性能得到改善。

这样会在高频时起到滤波的作用。

参考代码

float NoComDPID(float Kp, float Ki, float Kd, float Aifa, float GiveValue, float ActualValue)
{
float result;
float Err,KpWork, KiWork, KdWork;
Err = GiveValue - ActualValue;
KpWork = Kp*Err;
KiWork = Ki*NoComIntPIDErrADD;
if(Aifa > 1)
{
Aifa = 1;
}
if(Aifa < 0)
{
Aifa = 0;
}
KdWork = Kd*(1-Aifa)*(Err-ErrBbk)+ Aifa*KdWorkBbk;
result = KpWork+KiWork+KdWork;
NoComIntPIDErrADD = NoComIntPIDErrADD + Err;
KdWorkBbk = KdWork;
ErrBbk = Err;
return result;
}


工业控制及其C语言算法实现

专家系统及其C语言实现

if else即可实现

针对不同的条件组合给出不同的决策

模糊逻辑及其C语言实现

神经网络及其C语言实现

遗传算法及其C语言实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: