标题: 小车跑不了直线?是怎么回事 [打印本页]

作者: hymtnzc    时间: 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 (3.75 MB, 下载次数: 121)

1497069302039.jpg

作者: qjyjack612510    时间: 2017-6-10 14:01
凑个热闹。
作者: yzwzfyz    时间: 2017-6-10 18:09
先不考虑程序,你的车子能跑直线吗?
作者: FGH12_PCC    时间: 2017-6-10 19:36
可以考虑使用PID算法

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

作者: 羊5553    时间: 2017-6-11 12:59
看个热闹
作者: hymtnzc    时间: 2017-6-11 17:15
谢谢大家了,我用四轮的会好点下次搞个试试。
作者: hymtnzc    时间: 2017-6-19 09:22
大家好,我用另外一个程序小车可以走直,这个走不了。我说的走直线不是直线是正常的前进后退。
作者: 2222222222223    时间: 2017-6-19 09:58
加油~凑个热闹,
作者: 2222222222223    时间: 2017-6-19 09:59
用增益式PID算法试试
作者: 18379751330    时间: 2017-6-19 10:42
要实现什么功能呢

作者: timmy1227    时间: 2017-6-19 18:48
學習學習
作者: 南柯风静    时间: 2017-6-19 20:23
凑个热闹
作者: 饥饿的丶虫子    时间: 2017-6-20 11:32
排除程序问题的话,很有可能是两个轮子或电机不平行,有一定误差,会导致小车越跑越偏。
作者: xjjwws    时间: 2017-6-20 16:43
1.小车的轮子是否直径绝对相一致?2.程序的运行时间你看看有没有问题?
作者: hymtnzc    时间: 2017-6-23 13:06
三轮小车,视频上不了。

IMG_20170617_154844.jpg (110.5 KB, 下载次数: 80)

IMG_20170617_154844.jpg

作者: zxy51    时间: 2017-6-23 18:00
HC6800-ES-V2.0 发表于 2017-6-11 09:26
一般在小车,在没有限制条件时(如寻迹等),是跑不了直线的!!!
因为:(这就是技术与科学的区别了!) ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1