贴上的我的一段PID算法,我相信没有注释大家也都看得懂,参考下吧。
float setpoint=180;//180°平衡
float pid()
{
float kp=8,ki=0.01,kd=0.5;
float error,lasterror,preverror,out; //增量式PID
error = setpoint-kalAngleX; // 偏差值 `
out=kp * error +ki *lasterror + kp * preverror; // 计算输出值
Output=5*out; //PWM太小电机不会转,所以*5
Output=constrain(Output,-200,200);// 限定值域
preverror=lasterror;//存储误差,用于下次计算
lasterror=error;
return abs(Output);
}
void loop() {
if(kalAngleX>(setpoint+2)){//加2的原因是我想让小车在设定值左右2°内平衡
analogWrite(M1,pid()+3);
analogWrite(M2,LOW);
analogWrite(M3,pid());
analogWrite(M4,LOW);
}
else if(kalAngleX<(setpoint-2)){
analogWrite(M2,pid()+3);
analogWrite(M1,LOW);
analogWrite(M4,pid());
analogWrite(M3,LOW);}
else if((setpoint-2)<=kalAngleX<=(setpoint+2)){
analogWrite(M1,LOW);
analogWrite(M2,LOW);
analogWrite(M3,LOW);
analogWrite(M4,LOW);
} |