智能车制作

 找回密码
 注册

扫一扫,访问微社区

打印 上一主题 下一主题

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

  [复制链接]

4

主题

114

帖子

0

精华

高级会员

Rank: 4

积分
828
威望
444
贡献
232
兑换币
260
注册时间
2014-3-1
在线时间
76 小时
毕业学校
dd
21#
发表于 2014-8-1 13:54:26 | 只看该作者
PID算法
回复

使用道具 举报

0

主题

152

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2287
威望
1095
贡献
824
兑换币
703
注册时间
2014-5-4
在线时间
184 小时
22#
发表于 2014-8-1 16:48:22 | 只看该作者
加油
回复

使用道具 举报

1

主题

158

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4086
威望
1868
贡献
1178
兑换币
1163
注册时间
2013-11-1
在线时间
520 小时
毕业学校
北京工业大学
23#
发表于 2014-8-1 21:49:39 | 只看该作者
想当年我玩这种车的时候,任何速度计都没有,事先调好,给不同的PWM,大概走过3m不是很歪就可以了,为了完完全全走直线增加很多东西没必要。
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
24#
 楼主| 发表于 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 小时
毕业学校
大连理工大学
25#
 楼主| 发表于 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 小时
毕业学校
大连理工大学
26#
 楼主| 发表于 2014-8-1 23:18:36 | 只看该作者
易湘鑫 发表于 2014-8-1 11:32
加个反馈嘛

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


本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
27#
 楼主| 发表于 2014-8-1 23:49:59 | 只看该作者
时光机╰' 发表于 2014-8-1 12:41
左右轮分别给相同目标速度而不是pwm,电机各自读脉冲调pid

PID 从前没有接触过,能够给个教程?
回复

使用道具 举报

5

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
威望
119
贡献
49
兑换币
58
注册时间
2014-7-6
在线时间
18 小时
毕业学校
武汉大学
28#
发表于 2014-8-2 16:43:15 | 只看该作者
显然是你的PWM的精度不够。两边电机对相同占空比的PWM响应也不一定一样,用双电机的话要精确的测出来两个电机分别对PWM占空比的响应才行。
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
29#
 楼主| 发表于 2014-8-2 20:15:46 | 只看该作者
wjfuture 发表于 2014-8-2 16:43
显然是你的PWM的精度不够。两边电机对相同占空比的PWM响应也不一定一样,用双电机的话要精确的测出来两个电 ...

你讲的很靠谱,可否详细说说?
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
威望
136
贡献
92
兑换币
79
注册时间
2014-8-1
在线时间
47 小时
毕业学校
大连理工大学
30#
 楼主| 发表于 2014-8-4 16:27:34 | 只看该作者
本帖最后由 五加六等于一 于 2014-8-4 16:35 编辑

向大家报道一个喜讯,小车目前来看有望走直线了,我晚上回去就去调程序。目前来看, 之前的测速程序有很大问题,楼主之前的测速程序用的大循环里的if 语句:
while(1)
{
          /* PWM to control motor speed */
     motor01=0;     motor02=0;
     delayms(5);
     motor01=1;
     motor02=1;
     delayms(20);

     /* Check the speed of motor */
     if (sensor01==0)
         pulse_motor01++;
     if (sensor02==0)
         pulse_motor02++;

}


这个测速程序非常有问题,这个就是楼主写了半天程序,逻辑没错可是不按照设想走直线的原因,回去就去用定时器的计数模式改测速程序,然后再来汇报。
PS : 楼主正在研究 PID ,等我搞懂了PID的 概念和方法, 再来请教。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:49 , Processed in 0.079334 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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