智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 18740|回复: 36
打印 上一主题 下一主题

[单片机] 51单片机小车,不走直线!

  [复制链接]

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
跳转到指定楼层
1#
发表于 2014-8-1 09:12:55 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
1贡献
本帖最后由 五加六等于一 于 2014-8-1 09:15 编辑

新手没是那么经验,只是靠兴趣自学了单片机,又自学了C语言,现在做了一个基于51单片机的小车,处于程序调试阶段。大概说说我的小车吧,三个轮子,前面一个万向轮后面两个直流马达驱动另外两个轮子。直流马达采用ULN2803驱动,可以实现PWM调速。小车上一共备有四组红外传感器,Sensor01 和 Sensor02 分别测速 Motor01 和 Motor2,Sensor03 实现避障功能,Sensor04 备用以防不时之需。先上个图,Show 一下我的处女座小车,哈哈......
一开始楼主单纯的认为只要两边的Motor 给相同的电压就可以走直线了,所以随便调来了一个PWM就OK了。结果小车走的那叫一个歪,然后我在网上发帖求助,网友说开环控制不能实现小车直线,最好要闭环控制。然后我就构思了小车的闭环控制,闭环控制的程序流程图请参看下面的截图。

不幸的是小车还是不走直线,然后我就发现测速的两个Sensor有点问题,就是这个读出的数值有偏差,然后我就在同一个马达上调试了这个两个Sensor。如何调试?在红外发光端加大了限流电阻从220欧加到2K,调节红外接收极的分压电阻(滑动变阻器),然后用单片机的定时器定时30s 每个Sensor 收集21个数据,最终调试的结构如下面的截图。

最后我按照之前的思路编写了程序,可是小车还是不能走直线,所以在这里请各位大牛给点建议,只能谢谢了。







补充内容 (2014-8-14 11:05):
小车已经搞好了,视频链接: http://v.youku.com/v_show/id_XNzU1NTIxMzcy.html

附件: 您需要 登录 才可以下载或查看,没有帐号?注册
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
2#
 楼主| 发表于 2014-8-1 10:04:48 | 显示全部楼层
aytc100 发表于 2014-8-1 09:27
上陀螺吧。一个差不多的陀螺就能让你的小车走直了。

可否详细说说你的方案,另外在不改造小车主题结构的前提下,是否有使小车走直线的方案?
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
3#
 楼主| 发表于 2014-8-1 10:07:16 | 显示全部楼层
hymwgk 发表于 2014-8-1 09:33
有编码器也可以吧   底盘下面应该有那种光栅编码器的接口

编码器?没有编码器! 小车是自己做的,主板自己画的,底盘在网上淘的。你说编码器就是测速的那个吧,我的小车也有测速模块,就是通过槽型红外传感器实现的。可是还是不能走直线。
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
4#
 楼主| 发表于 2014-8-1 10:08:00 | 显示全部楼层
whisker 发表于 2014-8-1 10:02
调占空比,直到走直线

你确定能够调到一个固定的占空比?
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
5#
 楼主| 发表于 2014-8-1 10:18:03 | 显示全部楼层
whisker 发表于 2014-8-1 10:10
试试吧,我觉得应该是可以的

我调试过了,找到了一个数,比这个数大1就左偏,使用这个数就右偏,如何解释?而且小车相同的参数设置,有时候左偏有时候右偏,这个又怎么控制?纠结。。。
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
6#
 楼主| 发表于 2014-8-1 11:02:25 | 显示全部楼层
迷离的眼神 发表于 2014-8-1 10:34
闭环嘛

是闭环,可是还好调试好。不知道是程序的问题,还是硬件的问题。程序流程图在上面贴了,两个测速红外传感器也调试过了,帮忙再仔细看看。谢谢了
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
7#
 楼主| 发表于 2014-8-1 11:06:27 | 显示全部楼层
hymwgk 发表于 2014-8-1 10:32
这种车底盘靠近轮子处有一个长槽口   电机上与轮子同轴应该可以接一个光电码盘   就是你说的那个红外传感 ...

配套?自己做的,就怕有误差,可是还是有问题。现在不知道是程序的问题,还是硬件的问题,直觉觉得这个红外是有问题的,但是不知道如何精确的调试?
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
8#
 楼主| 发表于 2014-8-1 23:14:54 | 显示全部楼层
hymwgk 发表于 2014-8-1 11:15
看了看    你看是不是调节太过频繁   电机高频启动停止   有可能和地面产生微小的打滑    可以多次采集之 ...

好吧,我上程序吧,该程序是按照上面的那个程序流程图编写的,帮忙看看是程序的问题,还是硬件问题?

void main ()
{
    init();
    TMOD=0x10;                              // T0和T1 的工作方式为方式1
    TH1=(65535-46082)/256;              // 装入初值 50ms
    TL1=(65535-46082)%256;
    EA=1;                                       // 开总中断
    ET1=1;                                     // 开T1 中断
    TR1=1;                                     // 启动T1中断
        while (1)
        {
                /* Motor go , stop if there is something blocking the way*/
                while ( sensor03)
//                while (!flag)
                {
                        for (count00=230;count00>0;count00--)
                        {
                                if (relay_read == 0)
                                        relay_send=1;
                                motor02=0;                        /* PWM */
                                motor01=0;
                                delayms0(10);                               
                                motor02=1;
                        //        delayms0(preset_num);
                                motor01=1;
                                delayms0(20);
                                /* To check sensor01 and sensor02 good or not */
                                if ( sensor01 == 0)
                                        led0=~led0;
                                else
                                        led1=~led1;
                                if ( sensor02 == 0)
                                        led2=~led2;
                                else
                                        led3=~led3;
                                /* To record both motor V(sudu) */
                                if (sensor01==0)
                                {
                                        delayms0(100);
                                        if (sensor01==0)
                                        count01++;
                                        if( count01==130)
                                                count01=0;
                                        circle01++;
                                }

                                if (sensor02==0)
                                {
                                        delayms0(100);
                                        if (sensor02==0)                               
                                        count02++;
                                        if( count02==130)
                                                count02=0;
                                        circle02++;
                                }
                        }
                       
                        /* To control preset_num , then car goes on line*/
                        while (circle02 > circle01)
                        {
                            motor02=0;                        /* PWM */
                                motor01=0;
                                delayms0(1);
                                motor01=1;
                                delayms0(20);
                                if (sensor01==0)
                                {
                                        delayms0(100);
                                        if (sensor01==0)
                                                count01++;
                                        if( count01==130)
                                                count01=0;
                                        circle01++;
                                }
                        }
                       
                }
               
                motor01=0;
                motor02=0;
               
                /* LD E on, if motor stops */
                while (!sensor03)
                {
                        led0=~led0;
                        delayms0(6500);
                    write_time(0x80+8,circle01);
            write_time(0x80+0x40+8,circle02);
                }

        }

}


回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
9#
 楼主| 发表于 2014-8-1 23:16:08 | 显示全部楼层
aytc100 发表于 2014-8-1 11:21
你的小车要是这样就没太好的办法了。51的PWM精度不够。要么换主控芯片,飞思卡尔的单片机什么的;要么你就 ...

难道51单片机不能搞定?
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
10#
 楼主| 发表于 2014-8-1 23:18:36 | 显示全部楼层
易湘鑫 发表于 2014-8-1 11:32
加个反馈嘛

反馈加了,程序流程图如下/:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-19 04:14 , Processed in 0.078822 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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