標(biāo)題: 小車跑不了直線?是怎么回事 [打印本頁]

作者: hymtnzc    時間: 2017-6-10 12:37
標(biāo)題: 小車跑不了直線?是怎么回事
#include<reg52.h>  
#define uchar unsigned char  
#define V_TH  0XFF  
#define V_TL  0XF6  
#define V_TMOD 0X01  

void init_sys(void);            /*系統(tǒng)初始化函數(shù)*/  
void f_left();  //前進(jìn)左轉(zhuǎn)  
void f_right(); //前進(jìn)右轉(zhuǎn)  
void b_left();  //后退左轉(zhuǎn)  
void b_right(); //后退右轉(zhuǎn)  
void forward(); //前進(jìn)  
void back();    //后退  
void stop();    //停止  

//控制小車正反轉(zhuǎn)  
sbit IN1 = P0 ^ 0;  
sbit IN2 = P0 ^ 1;  
sbit IN3 = P0 ^ 2;  
sbit IN4 = P0 ^ 3;  
//控制小車轉(zhuǎn)速  
sbit ENA = P2 ^ 0;  
sbit ENB = P2 ^ 1;  

uchar ZKB1 = 80, ZKB2 = 80; //控制輪子轉(zhuǎn)速  
uchar tmp;  //存放串口數(shù)據(jù)  
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位自動重載模式, 用于產(chǎn)生波特率  
    TH1 = 0xFD;             // 波特率9600  
    TL1 = 0xFD;  
    SCON = 0x50;            // 設(shè)定串行口工作方式  
    PCON &= 0xef;           // 波特率不倍增  
    TR1 = 1;                // 啟動定時器1  
    while(1)  
    {  

        if(RI)                      // 是否有數(shù)據(jù)到來  
        {  
            RI = 0;  
            tmp = SBUF;             // 暫存接收到的數(shù)據(jù)  
            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;  
            }  
        }  
    }  
}  
/******************************************************
*函數(shù)功能:對系統(tǒng)進(jìn)行初始化,包括定時器初始化和變量初始化*/  
void init_sys(void)            /*系統(tǒng)初始化函數(shù)*/  
{  
    /*定時器初始化*/  
    TMOD = V_TMOD;  
    TH0 = V_TH;  
    TL0 = V_TL;  
    TR0 = 1;  
    ET0 = 1;  
    EA = 1;  
}  
/*********************************************
*函數(shù)功能:控制方向*/  

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;  
}  
/********************************************************
/*中斷函數(shù)*/  
void timer0(void) interrupt 1 using 2  
{  
    static uchar click = 0;                /*中斷次數(shù)計數(shù)器變量*/  
    TH0 = V_TH;                                  /*恢復(fù)定時器初始值*/  
    TL0 = V_TL;  
    ++click;  

    if (click >= 100) click = 0;  

    if (click <= ZKB1)     /*當(dāng)小于占空比值時輸出高電平,高于時是低電平,從而實(shí)現(xiàn)占空比的調(diào)整*/  
    {  
        ENA = 1;  
    }  

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

    if (click <= ZKB2)     /*當(dāng)小于占空比值時輸出高電平,高于時是低電平,從而實(shí)現(xiàn)占空比的調(diào)整*/  
    {  
        ENB = 1;  
    }  

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

}  

1497069302039.jpg (3.75 MB, 下載次數(shù): 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輪的因為左右兩邊電機(jī)轉(zhuǎn)速不一致,基本上走不了直線,采用增量PID控制電機(jī)轉(zhuǎn)速可以是走的曲線平滑一點(diǎn)
作者: 2587012141    時間: 2017-6-10 23:09
占樓 湊個熱鬧
作者: HC6800-ES-V2.0    時間: 2017-6-11 09:26
一般在小車,在沒有限制條件時(如尋跡等),是跑不了直線的。!
因為:(這就是技術(shù)與科學(xué)的區(qū)別了。
第一:你以為給電機(jī)的電壓是“絕對”——就是絕對一樣嗎?
第二:你的電機(jī)絕對一樣嗎?
第三:你啟動電機(jī)的時間絕對一樣嗎?
第四:電車的輪子與地面的抓地力絕對一樣嗎?這個涉及小車重心在絕對中心嗎?輪子受到壓力絕對一樣嗎?等等
第五:地面絕對一樣平整嗎?
.................
不說了,你要生氣了。
在課本中說的科學(xué),都是理想化的,你做技術(shù),就是具體化的,以前書上的題,不能拿到這里來用。而且,我們用的模塊,本身便宜,精度就不是很高。
所以,正常情況下,小車自己走不了直線。
像樓上說的,你要讓小車走直線,得加好多傳感器才行。如:測個速,但千萬不要以為測出、調(diào)節(jié)到一樣的速度,小車就走直線了(平整路面差不多了),輪子打不打滑呢等等。
之所以我能說這么多,也是有經(jīng)歷的。原來我也想搞這個,咨詢了專業(yè)人士,這些都是專業(yè)人士說的,還說這本身就是一個大大的研究課題。我放棄了。沒辦法,我沒那個能力。呵呵

作者: 羊5553    時間: 2017-6-11 12:59
看個熱鬧
作者: hymtnzc    時間: 2017-6-11 17:15
謝謝大家了,我用四輪的會好點(diǎn)下次搞個試試。
作者: hymtnzc    時間: 2017-6-19 09:22
大家好,我用另外一個程序小車可以走直,這個走不了。我說的走直線不是直線是正常的前進(jìn)后退。
作者: 2222222222223    時間: 2017-6-19 09:58
加油~湊個熱鬧,
作者: 2222222222223    時間: 2017-6-19 09:59
用增益式PID算法試試
作者: 18379751330    時間: 2017-6-19 10:42
要實(shí)現(xiàn)什么功能呢

作者: timmy1227    時間: 2017-6-19 18:48
學(xué)習(xí)學(xué)習(xí)
作者: 南柯風(fēng)靜    時間: 2017-6-19 20:23
湊個熱鬧
作者: 饑餓的丶蟲子    時間: 2017-6-20 11:32
排除程序問題的話,很有可能是兩個輪子或電機(jī)不平行,有一定誤差,會導(dǎo)致小車越跑越偏。
作者: xjjwws    時間: 2017-6-20 16:43
1.小車的輪子是否直徑絕對相一致?2.程序的運(yùn)行時間你看看有沒有問題?
作者: hymtnzc    時間: 2017-6-23 13:06
三輪小車,視頻上不了。

IMG_20170617_154844.jpg (110.5 KB, 下載次數(shù): 80)

IMG_20170617_154844.jpg

作者: zxy51    時間: 2017-6-23 18:00
HC6800-ES-V2.0 發(fā)表于 2017-6-11 09:26
一般在小車,在沒有限制條件時(如尋跡等),是跑不了直線的。。
因為:(這就是技術(shù)與科學(xué)的區(qū)別了。 ...

好厲害的樣子,長見識了,原來還有這么多的問題




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1