panxu5s 发表于 2012-7-29 14:17:01

pid控制小车的问题

以下是我用的pid算法,先看看:
/*************************PID运算函数**********************************/
signed int v_PIDCalc( PID *pp )
{
        signed longerror,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值。不知道哪位能解答。谢谢

happyhls 发表于 2012-7-29 14:32:53

我用过,不过很久之前了,你这个应该是增量式的,那假设速度低于预先设置值的话,返回值就会不断增大,至阀值为止。如果误差较小,则基本上维持原PWM,所以这样用可以的。

luodan 发表于 2012-7-29 14:33:56

学习学习

JUNKTR 发表于 2012-7-29 19:15:44

你输入的是速度脉冲数的偏差值的话,PID控制器计算的输出值就是当做PWM的当前占空比,通过调节PWM的占空比来控制电机的转速

panxu5s 发表于 2012-7-30 09:46:42

happyhls 发表于 2012-7-29 14:32 static/image/common/back.gif
我用过,不过很久之前了,你这个应该是增量式的,那假设速度低于预先设置值的话,返回值就会不断增大,至阀 ...

如果速度低于预先设置值,返回值不断增大至阀值,长期停在阀值,那不就失去了调整的功能?

panxu5s 发表于 2012-7-30 09:50:23

JUNKTR 发表于 2012-7-29 19:15 static/image/common/back.gif
你输入的是速度脉冲数的偏差值的话,PID控制器计算的输出值就是当做PWM的当前占空比,通过调节PWM的占空比 ...

我就是对这一说法很不确定,所以一直很疑惑。我输入的是脉冲数,却能得到pwm占空比?
感觉不可思议,如何会有这种关联?
还有一点,“pwm的当前占空比”是指40%之类的值即0.4,还是具体值比如40(基值是100)

JUNKTR 发表于 2012-7-30 09:54:17

对于是PWM的占空比还是高电平时的计数值,我都试过,都是可以的,建议你可以去看一下这个前辈的帖子http://www.amobbs.com/forum.php?mod=viewthread&tid=3334504&highlight=pid%E6%8E%A7%E5%88%B6%E7%94%B5%E6%9C%BA,对理解会有很大帮助

lengmian 发表于 2012-7-30 09:55:04

想问一下按照您的思路,现在调试情况怎么样了,我也在做类似的小车,也遇到PID控制的问题,调节不好,我使用外部中断配合定时器计数的,想和您交流一下,这是我QQ:738428711

panxu5s 发表于 2012-7-30 10:00:06

lengmian 发表于 2012-7-30 09:55 static/image/common/back.gif
想问一下按照您的思路,现在调试情况怎么样了,我也在做类似的小车,也遇到PID控制的问题,调节不好,我使 ...

我不用外部中断,那个还不如计数器好用。

panxu5s 发表于 2012-7-30 10:00:50

JUNKTR 发表于 2012-7-30 09:54 static/image/common/back.gif
对于是PWM的占空比还是高电平时的计数值,我都试过,都是可以的,建议你可以去看一下这个前辈的帖子http:// ...

嗯,谢谢您,我去学习下~

kayatsl 发表于 2012-7-30 10:21:04

panxu5s 发表于 2012-7-30 09:50 static/image/common/back.gif
我就是对这一说法很不确定,所以一直很疑惑。我输入的是脉冲数,却能得到pwm占空比?
感觉不可思议,如何 ...

为什么奇怪输入的是脉冲数,却能得到pwm占空比 ?

就像你早餐吃一点就饱了.. 中午吃一大堆才饱. 没什么好不可思议的..

输出和输入之间不一定是一条一次或者二次代数函数..

摆脱不开你以前输入物理量计算值单位必须等于输出物理量的单位这思维,永远理解不了PID..

panxu5s 发表于 2012-7-30 11:14:34

kayatsl 发表于 2012-7-30 10:21 static/image/common/back.gif
为什么奇怪输入的是脉冲数,却能得到pwm占空比 ?

就像你早餐吃一点就饱了.. 中午吃一大堆才饱. 没什么好 ...

嗯,原来如此,谢谢纠正

happyhls 发表于 2012-7-30 13:00:32

panxu5s 发表于 2012-7-30 09:46 static/image/common/back.gif
如果速度低于预先设置值,返回值不断增大至阀值,长期停在阀值,那不就失去了调整的功能? ...

这不就是在调整吗?说明外部阻力过大或当前电机驱动能力过小,使得速度达不到预设值,所以要增大输出,比方说PWM占空比增大,以期望提高速度,接近设定值,不是吗?

lcmdw 发表于 2012-7-30 13:06:29

学习{:smile:}

月光疾風 发表于 2012-9-5 08:36:02

好贴~顶一个!
页: [1]
查看完整版本: pid控制小车的问题