首先,就增量式PID的函数进行编写:
头文件,全局变量与宏定义如下:
#include "stdio.h"
#include "math.h"
void pid_init();//PID参数初始化
float pid_realise(float speed);//实现PID算法
#define value 1400.0
首先定义结构体pid的相关内容,后面将根据PID里面的相关参数进行修改调整,观察波形情况。
struct {
float set_speed;//设定速度
float actual_speed;//实际速度
float error;//偏差
float error_next;//上一个偏差
float error_last;//上上一个偏差
float kp,ki,kd;//定义比例,积分,微分参数
}pid;
将PID结构体中的参数进行初始化设置,其中的参数是我经过调整后的参数
void pid_init()
{
pid.set_speed = 0;
pid.actual_speed = 10000.0;//原始值0.0
pid.error = 0.0;
pid.error_next = 0.0;
pid.error_last = 0.0;
//可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 //
pid.kp = 0.33333;//原始值0.2
pid.ki = 0.2111;//原始值0.1
pid.kd = 0.1;//原始值0.3
}
接下来实现PID实现的过程函数:
float pid_realise(float speed)//实现pid
{ float increment_speed;//增量
pid.set_speed = speed;//设置目标速度
pid.error = pid.set_speed - pid.actual_speed;
increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+\
pid.kd*(pid.error-2*pid.error_next+pid.error_last);//增量计算公式
pid.actual_speed+= increment_speed;
pid.error_last = pid.error_next;//下一次迭代
pid.error_next = pid.error;
return pid.actual_speed;
}
接着就是主函数,主函数这里将进行设置,逻辑如下:初始化参数,进行运算,运算次数设置为400次,可以提高,因为调整后的参数,后面又有break可以跳出while循环因此不需要在意这里,接下来就是不断判断期望值与实际值误差书否在5以内
int main()
{ int count = 1;
int num = 0;
int type;
pid_init();
while(count<400)//进行400次 PID 运算可以提高,使初始值从0开始接近200.0
{
float speed = pid_realise(value);//设定值设定为200.0
type=abs(speed-value);
printf("%f\n",speed);//
if( type <= 5) ///判断每次的误差是否在5以内
{
num++;
if(num==6)
{
printf("run number is %d\r\n",count);
break;
}
else count++;
}
else count++;
}
}
运行函数之后得到如下图所示的曲线,可以看到,假设单位阶跃相应的过程中期望值发生改变,假设初始值为7000,要调整到理想值按照当前参数大约需要47次变换。
全部0条评论
快来发表一下你的评论吧 !