找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6635|回复: 18
收起左侧

小车跑不了直线?是怎么回事

  [复制链接]
ID:173860 发表于 2017-6-10 12:37 | 显示全部楼层 |阅读模式
#include<reg52.h>  
#define uchar unsigned char  
#define V_TH  0XFF  
#define V_TL  0XF6  
#define V_TMOD 0X01  

void init_sys(void);            /*系统初始化函数*/  
void f_left();  //前进左转  
void f_right(); //前进右转  
void b_left();  //后退左转  
void b_right(); //后退右转  
void forward(); //前进  
void back();    //后退  
void stop();    //停止  

//控制小车正反转  
sbit IN1 = P0 ^ 0;  
sbit IN2 = P0 ^ 1;  
sbit IN3 = P0 ^ 2;  
sbit IN4 = P0 ^ 3;  
//控制小车转速  
sbit ENA = P2 ^ 0;  
sbit ENB = P2 ^ 1;  

uchar ZKB1 = 80, ZKB2 = 80; //控制轮子转速  
uchar tmp;  //存放串口数据  
void main (void)  
{  
    init_sys();  
    ENA = 0;  
    ENB = 0;  
    ZKB1 = 90;  
    ZKB2 = 90;  
    IN1 = 0;  
    IN2 = 0;  
    IN3 = 0;  
    IN4 = 0;  
    TMOD |= 0x20;           // 定时器1工作于8位自动重载模式, 用于产生波特率  
    TH1 = 0xFD;             // 波特率9600  
    TL1 = 0xFD;  
    SCON = 0x50;            // 设定串行口工作方式  
    PCON &= 0xef;           // 波特率不倍增  
    TR1 = 1;                // 启动定时器1  
    while(1)  
    {  

        if(RI)                      // 是否有数据到来  
        {  
            RI = 0;  
            tmp = SBUF;             // 暂存接收到的数据  
            switch(tmp)  
            {  
            case 'a':  
                forward();  
                break;  
            case 'b':  
                back();  
                break;  
            case 'c':  
                f_left();  
                break;  
            case 'd':  
                f_right();  
                break;  
            case 'e':  
                b_left();  
                break;  
            case 'f':  
                b_right();  
                break;  
            case 'g':  
                stop();  
                break;  
            }  
        }  
    }  
}  
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/  
void init_sys(void)            /*系统初始化函数*/  
{  
    /*定时器初始化*/  
    TMOD = V_TMOD;  
    TH0 = V_TH;  
    TL0 = V_TL;  
    TR0 = 1;  
    ET0 = 1;  
    EA = 1;  
}  
/*********************************************
*函数功能:控制方向*/  

void forward()  
{  
    IN1 = 1;  
    IN2 = 0;  
    IN3 = 1;  
    IN4 = 0;  
}  
void back()  
{  
    IN1 = 0;  
    IN2 = 1;  
    IN3 = 0;  
    IN4 = 1;  
}  
void f_left()  
{  
    ZKB1 = 90;  
    ZKB2 = 45;  
    IN1 = 1;  
    IN2 = 0;  
    IN3 = 1;  
    IN4 = 0;  
}  
void f_right()  
{  
    ZKB1 = 45;  
    ZKB2 = 90;  
    IN1 = 1;  
    IN2 = 0;  
    IN3 = 1;  
    IN4 = 0;  
}  
void b_left()  
{  
    ZKB1 = 90;  
    ZKB2 = 45;  
    IN1 = 0;  
    IN2 = 1;  
    IN3 = 0;  
    IN4 = 1;  
}  
void b_right()  
{  
    ZKB1 = 45;  
    ZKB2 = 90;  
    IN1 = 0;  
    IN2 = 1;  
    IN3 = 0;  
    IN4 = 1;  
}  
void stop()  
{  
    IN1 = 1;  
    IN2 = 1;  
    IN3 = 1;  
    IN4 = 1;  
}  
/********************************************************
/*中断函数*/  
void timer0(void) interrupt 1 using 2  
{  
    static uchar click = 0;                /*中断次数计数器变量*/  
    TH0 = V_TH;                                  /*恢复定时器初始值*/  
    TL0 = V_TL;  
    ++click;  

    if (click >= 100) click = 0;  

    if (click <= ZKB1)     /*当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整*/  
    {  
        ENA = 1;  
    }  

    if (click > ZKB1)  
    {  
        ENA = 0;  
    }  

    if (click <= ZKB2)     /*当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整*/  
    {  
        ENB = 1;  
    }  

    if (click > ZKB2)  
    {  
        ENB = 0;  
    }  

}  
1497069302039.jpg
回复

使用道具 举报

ID:177855 发表于 2017-6-10 14:01 | 显示全部楼层
凑个热闹。
回复

使用道具 举报

ID:123289 发表于 2017-6-10 18:09 | 显示全部楼层
先不考虑程序,你的车子能跑直线吗?
回复

使用道具 举报

ID:209916 发表于 2017-6-10 19:36 | 显示全部楼层
可以考虑使用PID算法
回复

使用道具 举报

ID:189134 发表于 2017-6-10 22:20 | 显示全部楼层
2轮的因为左右两边电机转速不一致,基本上走不了直线,采用增量PID控制电机转速可以是走的曲线平滑一点
回复

使用道具 举报

ID:209976 发表于 2017-6-10 23:09 | 显示全部楼层
占楼 凑个热闹
回复

使用道具 举报

ID:164602 发表于 2017-6-11 09:26 | 显示全部楼层
一般在小车,在没有限制条件时(如寻迹等),是跑不了直线的!!!
因为:(这就是技术与科学的区别了!)
第一:你以为给电机的电压是“绝对”——就是绝对一样吗?
第二:你的电机绝对一样吗?
第三:你启动电机的时间绝对一样吗?
第四:电车的轮子与地面的抓地力绝对一样吗?这个涉及小车重心在绝对中心吗?轮子受到压力绝对一样吗?等等
第五:地面绝对一样平整吗?
.................
不说了,你要生气了。
在课本中说的科学,都是理想化的,你做技术,就是具体化的,以前书上的题,不能拿到这里来用。而且,我们用的模块,本身便宜,精度就不是很高。
所以,正常情况下,小车自己走不了直线。
像楼上说的,你要让小车走直线,得加好多传感器才行。如:测个速,但千万不要以为测出、调节到一样的速度,小车就走直线了(平整路面差不多了),轮子打不打滑呢等等。
之所以我能说这么多,也是有经历的。原来我也想搞这个,咨询了专业人士,这些都是专业人士说的,还说这本身就是一个大大的研究课题。我放弃了。没办法,我没那个能力。呵呵

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:210066 发表于 2017-6-11 12:59 | 显示全部楼层
看个热闹
回复

使用道具 举报

ID:173860 发表于 2017-6-11 17:15 | 显示全部楼层
谢谢大家了,我用四轮的会好点下次搞个试试。
回复

使用道具 举报

ID:173860 发表于 2017-6-19 09:22 | 显示全部楼层
大家好,我用另外一个程序小车可以走直,这个走不了。我说的走直线不是直线是正常的前进后退。
回复

使用道具 举报

ID:182758 发表于 2017-6-19 09:58 | 显示全部楼层
加油~凑个热闹,
回复

使用道具 举报

ID:182758 发表于 2017-6-19 09:59 | 显示全部楼层
用增益式PID算法试试
回复

使用道具 举报

ID:201524 发表于 2017-6-19 10:42 | 显示全部楼层
要实现什么功能呢
回复

使用道具 举报

ID:212679 发表于 2017-6-19 18:48 | 显示全部楼层
學習學習
回复

使用道具 举报

ID:212711 发表于 2017-6-19 20:23 | 显示全部楼层
凑个热闹
回复

使用道具 举报

ID:212474 发表于 2017-6-20 11:32 | 显示全部楼层
排除程序问题的话,很有可能是两个轮子或电机不平行,有一定误差,会导致小车越跑越偏。
回复

使用道具 举报

ID:110734 发表于 2017-6-20 16:43 | 显示全部楼层
1.小车的轮子是否直径绝对相一致?2.程序的运行时间你看看有没有问题?
回复

使用道具 举报

ID:173860 发表于 2017-6-23 13:06 来自手机 | 显示全部楼层
三轮小车,视频上不了。
IMG_20170617_154844.jpg
回复

使用道具 举报

ID:212728 发表于 2017-6-23 18:00 来自手机 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-6-11 09:26
一般在小车,在没有限制条件时(如寻迹等),是跑不了直线的!!!
因为:(这就是技术与科学的区别了!) ...

好厉害的样子,长见识了,原来还有这么多的问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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