|
PID算法出來的的當(dāng)前速度在設(shè)定速度附近震蕩
計(jì)算調(diào)速如下
ivoid PID()
{
p1.e2=tar_spd - speed; //比例 計(jì)算當(dāng)前誤差,可以粗調(diào)
p1.vpa=p1.Kp*(p1.e2-p1.e1) //增量式PID計(jì)算
+p1.Ki*p1.e2
+p1.Kd*(p1.e2+p1.e0-2*p1.e1);
p1.vpa=p1.vpa*0.1;//因?yàn)楸壤禂?shù)擴(kuò)大了10倍,所以這里要除掉
p1.e0=p1.e1; //把上次誤差給上上次誤差
p1.e1=p1.e2; //當(dāng)前誤差給到上次
p1.pa+=p1.vpa;//調(diào)節(jié)后的量
}
/**************計(jì)算調(diào)速*****************/
void action()
{
float c;
if(p1.pa<0)
c=0;
else if(p1.pa<10)
c=p1.pa*1.67+5;
else if(p1.pa<29)
c=p1.pa*2.5-5;
else if(p1.pa<32)
c=p1.pa*2.5+2.5;
else
c=p1.pa*5-85;
PWM_val= c;
}
|
|