1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #include "pid.h"
-
- //用于初始化pid参数的函数
- void PID_Init(PID *pid, float p, float i, float d, float maxI, float maxOut, float minOut)
- {
- pid->kp = p;
- pid->ki = i;
- pid->kd = d;
- pid->maxIntegral = maxI;
- pid->maxOutput = maxOut;
- pid->minOutput = minOut;
-
- pid->error = 0;
- pid->error1 = 0;
- pid->error2 = 0;
- pid->integral = 0;
- pid->output = 0;
- }
-
- //位置式PID
- //pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
- //setvalue : 设置值(期望值)
- //actualvalue: 实际值
- //由于全量输出,每次输出均与过去状态有关,计算时要对ek累加,计算量大
- float PID_Location(PID *pid, float setvalue, float feedback, float dt)
- {
- //更新数据
- pid->error1 = pid->error; //将旧error存起来
- pid->error = setvalue - feedback; //计算新error
-
- //计算微分
- float dout = (pid->error - pid->error1)/dt * pid->kd;
- //计算比例
- float pout = pid->error * pid->kp;
- //计算积分
- pid->integral += pid->error*dt * pid->ki;
-
- //积分限幅
- if(pid->integral > pid->maxIntegral)
- pid->integral = pid->maxIntegral;
- else if(pid->integral < -pid->maxIntegral)
- pid->integral = -pid->maxIntegral;
-
- //计算输出
- pid->output = pout+dout + pid->integral;
-
- //输出限幅
- if(pid->output > pid->maxOutput)
- pid->output = pid->maxOutput;
- if(pid->output < pid->minOutput)
- pid->output = pid->minOutput;
-
- return pid->output;
-
- }
- //增量式PID
- //pidout+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
- //setvalue : 设置值(期望值)
- //feedback: 实际值
- float PID_Increment(PID *pid, float setvalue, float feedback)
- {
- //更新数据
- pid->error2 = pid->error1; //将旧error1存起来
- pid->error1 = pid->error; //将旧error存起来
-
- pid->error = setvalue - feedback; //计算新error
-
- //计算微分
- float dout = (pid->error - 2*pid->error1 + pid->error2) * pid->kd;
- //计算比例
- float pout = (pid->error - pid->error1 )* pid->kp;
- //计算积分
- pid->integral = pid->error * pid->ki;
- //计算输出
- pid->output += (pout+dout + pid->integral);
-
- //输出限幅
- // if(pid->output > pid->maxOutput)
- // pid->output = pid->maxOutput;
- // if(pid->output < pid->minOutput)
- // pid->output = pid->minOutput;
- return pid->output;
- }
|