搜索
bottom↓
回复: 14

求:小车左右轮速度如何校正?

[复制链接]

出0入0汤圆

发表于 2011-8-4 20:36:03 | 显示全部楼层 |阅读模式
小车左右轮通过 2个直流电机控制,电机由PWM驱动
.2个电机有红外编码器,车轮转一圈会有8个信号。
单片机如何通过检测到的信号来校正左右轮速度,
从而使左右轮速度尽量一致,使小车能够走出完美的直线来。
具体什么算法,有没有做过的?谢谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-8-4 20:40:45 | 显示全部楼层
需要有外部参考线

出0入0汤圆

 楼主| 发表于 2011-8-4 20:44:30 | 显示全部楼层
没有什么外部参考线  我的初步思路是  通过检测两轮在1S内检测到的圈数和我设定的圈数作比较,然后通过比较的结果来调整两轮PWM的占空比。不知道这样行不行,有没有做过的,说一下你们的思路。

出0入0汤圆

发表于 2011-8-4 21:02:12 | 显示全部楼层
圈数不太行吧.

1.最后与地接触的外圈大小肯定不一致.

2.校正太慢了点.

出0入0汤圆

发表于 2011-8-4 21:11:57 | 显示全部楼层
轮子转一圈,不见得和和轮子接触的地面长度也刚好是轮子的周长
这个是很头痛的问题
不知道那些无人驾驶的汽车是如何控制方向的

出0入0汤圆

发表于 2011-8-4 21:39:37 | 显示全部楼层
没有外部参考怎么校正啊?
哪怕轮子每时每刻的摩擦也是不同的。

出0入0汤圆

 楼主| 发表于 2011-8-4 22:22:07 | 显示全部楼层
不知道像这样的控制你们是怎么做的?
我用的方法如下图,不知道可不可行?

(原文件名:IMG0028A.jpg)


(原文件名:IMG0029A.jpg)

出0入0汤圆

 楼主| 发表于 2011-8-4 22:31:14 | 显示全部楼层
回复【6楼】bai_yechuang
-----------------------------------------------------------------------

就是当红外编码器没经过一个扇叶时就会触发一次中断,中断服务程序计数器+1.这样转一圈就是8个脉冲。
程序如下:
u16 d07_speed_base=40;//基准脉冲
u16 d07_lspeed_count; //左轮脉冲
u16 d07_rspeed_count; //右轮脉冲
/*******************************************************************************
* Function Name  : EXTI2_IRQHandler
* Description    : 右轮速度编码器中断函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
        {
                d07_rspeed_count++;
        //-----------------------------------------------------------------
        EXTI_ClearITPendingBit(EXTI_Line2);//清中断请求标志位
        }
}

/*******************************************************************************
* Function Name  : EXTI3_IRQHandler
* Description    : 左轮速度编码器中断函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

void EXTI3_IRQHandler(void)
{                
        if(EXTI_GetITStatus(EXTI_Line3)!=RESET)
        {
                d07_lspeed_count++;
        //-----------------------------------------------------------------
        EXTI_ClearITPendingBit(EXTI_Line3);//清中断请求标志位
        }
}
void speed_check_07(void)//每100MS检测一次
{
        if(d07_lspeed_count>5)
        {
                if(d07_lspeed_count>d07_speed_base)
                {
                        CCR1_Val-=50;
                        TIM3_OCInitStructure.TIM_Pulse=CCR1_Val;         //输出比较值 调制占空比
                        TIM_OC1Init(TIM3, &TIM3_OCInitStructure);//初始化TIM3 通道1
                }
                else if(d07_lspeed_count<d07_speed_base)
                {
                        CCR1_Val+=50;
                        TIM3_OCInitStructure.TIM_Pulse=CCR1_Val;         //输出比较值 调制占空比
                        TIM_OC1Init(TIM3, &TIM3_OCInitStructure);//初始化TIM3 通道1
                }
                d07_lspeed_count=0;
                               
        }
        if(d07_rspeed_count>5)
        {
                if(d07_rspeed_count>d07_speed_base)
                {
                        CCR2_Val-=50;
                        TIM3_OCInitStructure.TIM_Pulse=CCR2_Val;         //输出比较值 调制占空比
                        TIM_OC2Init(TIM3, &TIM3_OCInitStructure);//初始化TIM3 通道1
                }
                else if(d07_rspeed_count<d07_speed_base)
                {
                        CCR2_Val+=50;
                        TIM3_OCInitStructure.TIM_Pulse=CCR2_Val;         //输出比较值 调制占空比
                        TIM_OC2Init(TIM3, &TIM3_OCInitStructure);//初始化TIM3 通道1
                }
                d07_rspeed_count=0;
        }
        else
        {
               
        }       
}
//=====================================================================================================================
这样出来的效果是:每个轮子的脉冲频率在几个频率之间跳动
396HZ  378HZ  403HZ 409HZ 431HZ  438HZ (基准频率是400HZ).
不知道怎么回事,像这种速度校正该怎么计算呢????

出0入0汤圆

发表于 2011-8-4 22:31:48 | 显示全部楼层
感觉分辨率太小了吧,换个分辨率大点的编码器,用PID算法校正。

出0入0汤圆

发表于 2011-8-4 22:32:39 | 显示全部楼层
当然是方向传感器,或其它能找到绝对值参考的办法

出0入0汤圆

发表于 2011-8-4 23:14:22 | 显示全部楼层
你自己算法是可以了,我也试过,不过最好把分辩率调大一些,一圈8个信号有点少。

出0入0汤圆

发表于 2011-8-5 07:10:18 | 显示全部楼层
这玩意的问题主要是积累误差啊,没有绝对参考源,很麻烦

出0入0汤圆

发表于 2011-8-5 08:04:55 | 显示全部楼层
回复【4楼】Jigsaw
轮子转一圈,不见得和和轮子接触的地面长度也刚好是轮子的周长
这个是很头痛的问题
不知道那些无人驾驶的汽车是如何控制方向的
-----------------------------------------------------------------------

可以去测量从动轮  从动轮通常都不会打滑

出0入0汤圆

发表于 2011-8-7 22:28:14 | 显示全部楼层
如果你要精确度,可以试试罗盘、角度传感器之类的东西,只要测速的话编码器足够了

出0入0汤圆

发表于 2011-8-21 09:46:47 | 显示全部楼层
用角度传感器之类方便很多,不过要调的话用最原始的慢慢调节两轮速度同步,找到输入值的差。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-17 09:11

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

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