pid控制C语言实现

积分分离pid控制算法

/*
	积分分离的pid控制算法c语言实现
	系统所用时间是原来时间的一半
	系统的快速性得到了提高
*/
 
#include<stdio.h>
#include<stdlib.h>
 
struct _pid{
	float SetSpeed; 		//定义设定值	//24V   1100-1900
	float ActualSpeed; 		//定义实际值
	float err; 				//定义偏差值
	float err_last; 		//定义上一个偏差值
	float Kp,Ki,Kd; 		//定义比例、积分、微分系数
	float voltage; 			//定义电压值(控制执行器的变量)
	float integral;		    //定义积分值
}pid;
 
//项目中获取到的参数
void PID_init(){
	printf("PID_init begin \n");
	pid.SetSpeed=0.0;
	pid.ActualSpeed=0.0;
	pid.err=0.0;
	pid.err_last=0.0;
	pid.voltage=0.0;
	pid.integral=0.0;
	pid.Kp=0.2;				//自己设定
	pid.Ki=0.04;			//自己设定
	pid.Kd=0.2;				//自己设定
	printf("PID_init end \n");
}
 
 
float PID_realize(float speed){
	pid.SetSpeed=speed;						//设定值
	pid.err=pid.SetSpeed-pid.ActualSpeed;	//设定值-实际值
	int index;
	if(abs(pid.err)>200)
	{
		index=0;
	}else{
		index=1;
		pid.integral+=pid.err;
	}
	pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.
	err-pid.err_last); //算法具体实现过程
	
	pid.err_last=pid.err;					//上一个偏差值
	pid.ActualSpeed=pid.voltage*1.0;		//算出实际值
	return pid.ActualSpeed;					//返回
}
 
int main(){
	PID_init();
	int count=0;
	while(count<1000)
	{
	float speed=PID_realize(200.0);
	printf("%f\n",speed);
	count++;
	}
	return 0;
}

积分抗饱和pid控制算法

/*
	抗击分饱和的pid控制算法
	
*/
 
#include<stdio.h>
#include<stdlib.h>
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(){
	printf("PID_init begin \n");
	pid.SetSpeed=0.0;
	pid.ActualSpeed=0.0;
	pid.err=0.0;
	pid.err_last=0.0;
	pid.voltage=0.0;
	pid.integral=0.0;
	pid.Kp=0.2;
	pid.Ki=0.1; //注意,和上几次相比,这里加大了积分环节的值
	pid.Kd=0.2;
	pid.umax=400;
	pid.umin=-200;
	printf("PID_init end \n");
}
 
float PID_realize(float speed){
	int index;
	pid.SetSpeed=speed;
	pid.err=pid.SetSpeed-pid.ActualSpeed;
	if(pid.ActualSpeed>pid.umax) //灰色底色表示抗积分饱和的实现
	{
		if(abs(pid.err)>200) //蓝色标注为积分分离过程
		{
		index=0;
		}else{
			index=1;
			if(pid.err<0)
			{
			pid.integral+=pid.err;
			}
		}
	}else if(pid.ActualSpeed<pid.umin){
		if(abs(pid.err)>200) //积分分离过程
		{
			index=0;
		}else{
			index=1;
			if(pid.err>0)
			{
				pid.integral+=pid.err;
			}
		}
	}else{
			if(abs(pid.err)>200) //积分分离过程
			{
				index=0;
			}else{
				index=1;
				pid.integral+=pid.err;
			}
		}
//	pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.err-pid.err_last);//梯形积分
	pid.err_last=pid.err;
	pid.ActualSpeed=pid.voltage*1.0;
	return pid.ActualSpeed;
}
 
int main(){
	PID_init();
	int count=0;
	while(count<1000)
	{
	float speed=PID_realize(200.0);
	printf("%f\n",speed);
	count++;
	}
	return 0;
}

输出跟随

 

参考:

https://wenku.baidu.com/view/827c5423647d27284a735105.html

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
模糊PID控制是一种基于模糊逻辑的控制方法,可以提高控制系统的鲁棒性和适应性。下面是一个简单的模糊PID控制C语言实现: ```c #include <stdio.h> #define Kp 0.5 // 比例系数 #define Ki 0.2 // 积分系数 #define Kd 0.1 // 微分系数 #define N 10 // 规则库数量 // 规则库结构体 struct FuzzyRule { float e; // 偏差 float de; // 偏差变化率 float u; // 输出 }; struct FuzzyRule rules[N] = { {-1.0, -1.0, -1.0}, {-1.0, -1.0, -1.0}, {-1.0, -1.0, -1.0}, {-1.0, -1.0, -1.0}, {-1.0, -1.0, -1.0}, {0.0, -1.0, 0.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0} }; // 模糊控制器 float fuzzyController(float e, float de) { float u = 0.0; float w = 0.0; float sum_w = 0.0; for (int i = 0; i < N; i++) { float mu_e = 1.0 - fabs(e - rules[i].e); float mu_de = 1.0 - fabs(de - rules[i].de); w = mu_e * mu_de; u += w * rules[i].u; sum_w += w; } if (sum_w > 0) { u /= sum_w; } return u; } // PID控制器 float pidController(float e, float de) { static float integral = 0.0; static float last_e = 0.0; float p_term = Kp * e; integral += Ki * e; float i_term = integral; float d_term = Kd * (e - last_e); last_e = e; float u = p_term + i_term + d_term; return u; } int main() { float e = 0.0; float de = 0.0; for (int i = 0; i < 100; i++) { // 计算偏差和偏差变化率 e = 0.5 - (float)i/100.0; de = e - (float)(i-1)/100.0; // 模糊PID控制 float u_fuzzy = fuzzyController(e, de); // PID控制 float u_pid = pidController(e, de); printf("e=%f, de=%f, u_fuzzy=%f, u_pid=%f\n", e, de, u_fuzzy, u_pid); } return 0; } ``` 这个程序中,先定义了比例系数 Kp、积分系数 Ki 和微分系数 Kd。接着定义了一个规则库结构体,包含偏差 e、偏差变化率 de 和输出 u。 在 fuzzyController 函数中,利用模糊逻辑计算出输出 u。首先根据偏差 e 和偏差变化率 de 计算出每个规则的权重 w,然后根据权重和输出计算出最终的输出 u。 在 pidController 函数中,根据比例、积分和微分三个项计算出输出 u。 最后在主函数中,循环计算偏差和偏差变化率,并用模糊PID控制PID控制计算出输出 u,并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值