在日常的学习、工作、生活中,肯定对各类范文都很熟悉吧。大家想知道怎么样才能写一篇比较优质的范文吗?下面是小编帮大家整理的优质范文,仅供参考,大家一起来看看吧。
pid控制算法的c语言实现 pdf pid算法积分作用篇一
导语:c语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看pid算法的c语言实现:抗积分饱和的pid优化,希望对大家有所帮助。
积分饱和通俗讲就是系统在一个偏差方向上的.饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致pid控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!
为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!
//位置型+抗积分饱和+积分分离 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! ");
ed = 0;
speed = 0;
= 0;
_last = 0;
= 0.2;
= 0.1; //增大了积分环节的值
= 0.2;
e = 0;
al = 0;
= 400; //正饱和值为400
= -200; //负饱和值为-200
printf("pid_init end! ");
}
float pid_cal(float speed)
{
unsigned char index;
ed = speed;
= ed - speed;
if(speed>) //如果上一次输出变量出现正向的饱和
{
if(abs()>200)
{
index = 0;
}
else
{
index = 1;
if(<0)
{
al += ; //正饱和只积分负偏差
}
}
}
else if(speed {
if(abs()>200)
{
index = 0;
}
else
{
index = 1;
if(>0)
{
al += ; //负饱和只积分正偏差
}
}
}
else
{
if(abs()>200) //
{
index = 0;
}
else
{
index = 1;
al += ;
}
}
e = * +index**al + *( - _last);
_last = ;
speed = e*1.0;
return speed;
}
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;
}
s("content_relate");【pid算法的c语言实现:抗积分饱和的pid优化】相关文章:
pid算法的c语言实现
12-16
c语言中实现kmp算法实例
11-19
希尔排序算法的c语言实现示例
12-07
6种常见的排序算法的c语言实现
12-06
c语言的排序算法
12-12
c语言实现归并排序算法实例
11-21
kmp算法的c#实现方法
10-24
c语言排序的几种算法
12-03
c语言优化阶段
12-14
【本文地址:http://www.pourbars.com/zuowen/2797655.html】