搜索
bottom↓
回复: 14

pid控制小车的问题

[复制链接]

出0入0汤圆

发表于 2012-7-29 14:17:01 | 显示全部楼层 |阅读模式
以下是我用的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值。不知道哪位能解答。谢谢

出0入0汤圆

发表于 2012-7-29 14:32:53 来自手机 | 显示全部楼层
我用过,不过很久之前了,你这个应该是增量式的,那假设速度低于预先设置值的话,返回值就会不断增大,至阀值为止。如果误差较小,则基本上维持原PWM,所以这样用可以的。

出0入0汤圆

发表于 2012-7-29 14:33:56 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2012-7-29 19:15:44 | 显示全部楼层
你输入的是速度脉冲数的偏差值的话,PID控制器计算的输出值就是当做PWM的当前占空比,通过调节PWM的占空比来控制电机的转速

出0入0汤圆

 楼主| 发表于 2012-7-30 09:46:42 | 显示全部楼层
happyhls 发表于 2012-7-29 14:32
我用过,不过很久之前了,你这个应该是增量式的,那假设速度低于预先设置值的话,返回值就会不断增大,至阀 ...

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

出0入0汤圆

 楼主| 发表于 2012-7-30 09:50:23 | 显示全部楼层
JUNKTR 发表于 2012-7-29 19:15
你输入的是速度脉冲数的偏差值的话,PID控制器计算的输出值就是当做PWM的当前占空比,通过调节PWM的占空比 ...

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

出0入0汤圆

发表于 2012-7-30 09:54:17 | 显示全部楼层
对于是PWM的占空比还是高电平时的计数值,我都试过,都是可以的,建议你可以去看一下这个前辈的帖子http://www.amobbs.com/forum.php? ... 6%E7%94%B5%E6%9C%BA,对理解会有很大帮助

出0入0汤圆

发表于 2012-7-30 09:55:04 | 显示全部楼层
想问一下按照您的思路,现在调试情况怎么样了,我也在做类似的小车,也遇到PID控制的问题,调节不好,我使用外部中断配合定时器计数的,想和您交流一下,这是我QQ:738428711

出0入0汤圆

 楼主| 发表于 2012-7-30 10:00:06 | 显示全部楼层
lengmian 发表于 2012-7-30 09:55
想问一下按照您的思路,现在调试情况怎么样了,我也在做类似的小车,也遇到PID控制的问题,调节不好,我使 ...

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

出0入0汤圆

 楼主| 发表于 2012-7-30 10:00:50 | 显示全部楼层
JUNKTR 发表于 2012-7-30 09:54
对于是PWM的占空比还是高电平时的计数值,我都试过,都是可以的,建议你可以去看一下这个前辈的帖子http:// ...

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

出0入0汤圆

发表于 2012-7-30 10:21:04 | 显示全部楼层
panxu5s 发表于 2012-7-30 09:50
我就是对这一说法很不确定,所以一直很疑惑。我输入的是脉冲数,却能得到pwm占空比?
感觉不可思议,如何 ...

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

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

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

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

出0入0汤圆

 楼主| 发表于 2012-7-30 11:14:34 | 显示全部楼层
kayatsl 发表于 2012-7-30 10:21
为什么奇怪输入的是脉冲数,却能得到pwm占空比 ?

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

嗯,原来如此,谢谢纠正

出0入0汤圆

发表于 2012-7-30 13:00:32 | 显示全部楼层
panxu5s 发表于 2012-7-30 09:46
如果速度低于预先设置值,返回值不断增大至阀值,长期停在阀值,那不就失去了调整的功能? ...

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

出0入0汤圆

发表于 2012-7-30 13:06:29 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-9-5 08:36:02 | 显示全部楼层
好贴~顶一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 05:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表