|
以下是我用的pid算法,先看看:
/*************************PID运算函数**********************************/
signed int v_PIDCalc( PID *pp )
{
signed long error,d_error,dd_error;
error = (signed int)( pp->vi_Ref - pp->vi_FeedBack); // 偏差计数
d_error = error - pp->vi_PreError; //e-e(n-1)
dd_error=d_error-pp->vi_PreDerror; //
pp->vi_PreError = error; //存储当前偏差
pp->vi_PreDerror = d_error;
if( ( error < DEADLINE ) && ( error > -DEADLINE ) ); //设置调节死区
else
pp->vl_PreU += ( ( pp -> Ka * d_error + pp -> Kb * error ) + (pp->Kc*dd_error));
if( pp->vl_PreU >=U_MAX ) //防止调节最高溢出
pp->vl_PreU = U_MAX;
if( pp->vl_PreU <= U_MIN ) //防止调节最低溢出
pp->vl_PreU = U_MIN;
return (pp->vl_PreU>>10); // 返回预调节占空比
}
我知道用pid调速,所以我测了50ms内的左右电机的转数。
比如counter_l=TH1*256+TL1;
counter_r=TH0*256+TL0;
/*************左电机PID调节********************/
if(pid_enablel)
{L_sPID.vi_FeedBack=counter_l;
counter_l=0;
rl=v_PIDCalc(&L_sPID);
}
然后用run(rl,rr)跑
可是,我觉得我这样直接用是有问题的,因为得出的rl应该是调整转速差值,而不是pwm值。不知道哪位能解答。谢谢 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|