PID算法的C语言实现:抗积分饱和的PID优化
导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的.机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看PID算法的C语言实现:抗积分饱和的PID优化,希望对大家有所帮助。
积分饱和通俗讲就是系统在一个偏差方向上的饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致PID控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!
为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!
下面我以位置型+抗积分饱和+积分分离的PID控制算法C语言来观察调节结果:
//位置型+抗积分饱和+积分分离 PID控制算法
struct _pid{
float SetSpeed;
float ActualSpeed;
float Err;
float Err_Last;
float Kp,Ki,Kd;
float Voltage;
float Integral;
float Umax; //最大正饱和上限值
float Umin; //最大负饱和下限值
}pid;
void PID_Init(void)
{
printf("PID_Init begin!");
peed = 0;
alSpeed = 0;
= 0;
_Last = 0;
= 0.2;
= 0.1; //增大了积分环节的值
= 0.2;
age = 0;
gral = 0;
= 400; //正饱和值为400
= -200; //负饱和值为-200
printf("PID_Init end!");
}
float PID_Cal(float Speed)
{
unsigned char index;
peed = Speed;
= peed - alSpeed;
if(alSpeed>) //如果上一次输出变量出现正向的饱和
{
if(abs()>200)
{
index = 0;
}
else
{
index = 1;
if(<0)
{
gral += ; //正饱和只积分负偏差
}
}
}
else if(alSpeed {
if(abs()>200)
{
index = 0;
}
else
{
index = 1;
if(>0)
{
gral += ; //负饱和只积分正偏差
}
}
}
else
{
if(abs()>200) //
{
index = 0;
}
else
{
index = 1;
gral += ;
}
}
age = * +index**gral + *( - _Last);
_Last = ;
alSpeed = age*1.0;
return alSpeed;
}
int main(void)
{
int count = 0 ;
printf("SYSTEM BEGIN!");
PID_Init();
while(count<1000)
{
float speed = PID_Cal(200.0);
printf("-%d-%f-",count,speed);
count++;
}
return 0;
}
-
C语言编程中的联合体union入门学习教程详解
联合体(union)在C语言中是一个特殊的数据类型,能够存储不同类型的数据在同一个内存位置。可以定义一个联合体使用许多成员,但只有一个部件可以包含在任何时候给定的值。联合体会提供使用相同的存储器位置供多用途的有效方式。定义联合体要定义联合体,必须使用unio...
-
c语言如何控制硬件
你们知道在C语言中如何控制计算机的硬件吗?下面是应届毕业生小编带来的关于c语言如何控制硬件的内容,欢迎阅读!c语言如何控制硬件?C语言是没办法控制硬件的首先,C语言不能够直接对硬件进行操作。从本质上来说,连汇编语言都不可以。只有机器语言能够直接操作硬件。...
-
C语言数据结构中栈操作实验大纲
c语言中栈是一种数据结构,后进先出,即最后进入栈的数据最先弹出。以下是本站小编搜索整理的关于C语言数据结构中栈操作实验,需要的`朋友可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网!实验:编写一个程序实现顺序栈的各种基本运算,并在此基础上设...
-
如何在c语言中调用Linux脚本
如何在c语言中调用Linux脚本呢?你知道如何在c语言中调用Linux脚本吗?下面是小编为大家带来的如何在c语言中调用Linux脚本的知识,欢迎阅读。一、引言对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系...