|
去年11月到12月,和同學(xué)一起在學(xué)校參加院電子設(shè)計(jì)大賽做的項(xiàng)目,看起來(lái)時(shí)間很長(zhǎng),但實(shí)際上我們攏共做的時(shí)間差不多是3天的樣子。
板子是正點(diǎn)的,所以很多地方我們就直接扒的正點(diǎn)的例程,比如紅外遙控的部分完整拿過(guò)來(lái)了,能直接用。
我們?cè)谕瓿蓪W(xué)校的要求后又多加了測(cè)距顯示和差速調(diào)節(jié)(讓小車可以從完全停止到最高速度),后面我會(huì)分塊盡量詳細(xì)敘述小車的功能原理及代碼介紹。
視頻演示
https://www.bilibili.com/video/av85501350/
電源
我們采用的是三節(jié)18650供電,三節(jié)電池就有12v,用來(lái)驅(qū)動(dòng)小車綽綽有余,為了獲得更穩(wěn)定符合小車需求的電壓,我們又采用了一個(gè)LM2596S降壓模塊,把12V的電壓給降到3v給單片機(jī)供電。在安裝電源的時(shí)候,其實(shí)我們犯了一個(gè)錯(cuò)誤,把電池給安裝在了小車的第二層,這樣在取放電池時(shí)就需要拆卸螺絲,比較麻煩。
驅(qū)動(dòng)
驅(qū)動(dòng)模塊使用的是經(jīng)典的L298N,主要是實(shí)驗(yàn)室一抓一大把,關(guān)于模塊的詳細(xì)說(shuō)明可以搜索得到,不再贅述。
我們對(duì)于這個(gè)模塊具體的使用如圖我們做的是4輪驅(qū)動(dòng),把輪子分左右用一個(gè)驅(qū)動(dòng)模塊進(jìn)行驅(qū)動(dòng),為了用PWM對(duì)小車進(jìn)行速度控制,所以我們需要調(diào)用時(shí)鐘,這里調(diào)用TIM4,使能PB8對(duì)左電機(jī)進(jìn)行方向控制,使能PB9作為左電機(jī)的PWM信號(hào),使能PA6對(duì)右電機(jī)進(jìn)行方向控制,使能PB10作為右電機(jī)的PWM信號(hào)。
一邊有倆電機(jī)對(duì)應(yīng)倆輪子,所以,這里還進(jìn)行了映射,PB8映射到PB5和PB6,對(duì)應(yīng)左邊的in1和in2,進(jìn)行方向控制。
PA6映射到PA5和PA6,對(duì)應(yīng)左邊的in3和in4,進(jìn)行方向控制。
更多具體的配置都在函數(shù)里面。
驅(qū)動(dòng)部分并不是由我完全負(fù)責(zé),所以我會(huì)在大體完成后找機(jī)會(huì)請(qǐng)當(dāng)時(shí)一起完成的小伙伴一起校驗(yàn)。
在驅(qū)動(dòng)部分,我想再主要挑一部分詳細(xì)談?wù)劇?br />
當(dāng)時(shí)我們?cè)趯?duì)于進(jìn)行差速控制部分有一個(gè)想法,讓它實(shí)現(xiàn)從零開(kāi)始逐步加速或者最高速逐步減速,同時(shí)也完成要求的三擋速度。
對(duì)于要求的三擋速度,其他選了小車的組,據(jù)我觀察,應(yīng)該都是在函數(shù)里面寫(xiě)好了預(yù)先配置3個(gè)的PWM占空比,來(lái)實(shí)現(xiàn)。
當(dāng)時(shí)是我負(fù)責(zé)的這個(gè)功能的實(shí)現(xiàn),我覺(jué)得這樣寫(xiě)只能單一完成那個(gè)要求,然后為了達(dá)成我們預(yù)想的差速調(diào)節(jié),于是我在主函數(shù)設(shè)置一個(gè)變量來(lái)代表占空比,然后motor.c里面引進(jìn)并在后面的調(diào)速函數(shù)和三擋預(yù)置速度函數(shù)調(diào)用,就能夠?qū)崿F(xiàn)這兩個(gè)功能了。里面更改占空比的數(shù)值是我們測(cè)試調(diào)節(jié)修改出來(lái)的。
在控制方向上,我們有旋轉(zhuǎn)和有一定精度的角度的旋轉(zhuǎn)。功能完成也是依靠調(diào)節(jié)占空比,不再贅述。
超聲波部分我們采用的模塊是HC-SR04,同樣是一個(gè)比較經(jīng)典的模塊,這一部分比較搞的是什么,是超聲波模塊需要5v供電,及其重要,我們一開(kāi)始代碼調(diào)試好后,一直顯示不出來(lái)正確的數(shù)據(jù),一直為0(我們有加OLED顯示模塊,所以可以方便測(cè)試),從驅(qū)動(dòng)做好后一直順風(fēng)順?biāo)蝗辉谶@卡殼了,弄得我們自閉許久。后來(lái)在網(wǎng)上查到是5v供電后,一改立馬成功。
OLED顯示
我們用的0.96寸7針顯示模塊,代碼部分也沒(méi)什么好說(shuō)的,網(wǎng)上找到讀懂后直接調(diào)用就行了
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "motor.h"
- #include "usart.h"
- #include "remote.h"
- #include "oled.h"
- #include "hcsr04.h"
- /*
- void ZYSTM32_run(int speed,int time); //前進(jìn)函數(shù)
- void ZYSTM32_brake(int time); //剎車函數(shù)
- void ZYSTM32_Spin_Left(int speed,int time); //左旋轉(zhuǎn)函數(shù)
- void ZYSTM32_Spin_Right(int speed,int time);//右旋轉(zhuǎn)函數(shù)
- void ZYSTM32_back(int speed,int time); //后退函數(shù)
- */
- float length=0,sum=0;
- u16 tim;
- uint j=0;
- int i=2000;
- int main(void)
- {
- u8 key;
- float distance;
- delay_init();
- TIM4_PWM_Init(7199,0); //初始化PWM
- Remote_Init(); //紅外接收初始化
- CH_SR04_Init();
- OLED_Init(); //初始化OLED
- OLED_Clear();
- ZYSTM32_brake(500);
- NVIC_Config();
- while(1)
- {
- key=Remote_Scan();
- distance=Senor_Using();
- OLED_ShowString(0,2,"distance is");
- OLED_ShowNum(0,4,distance,8,20);
- if(distance>30)
- switch(key)
- {
- case 98:ZYSTM32_run(100);break;
- case 2:ZYSTM32_brake(100);break;
- case 34:ZYSTM32_Spin_Left(100);break;
- case 168:ZYSTM32_back(100);break;
- case 194:ZYSTM32_Spin_Right(100);break;
- case 104:speedchange(1);break;
- case 152:speedchange(2);break;
- case 176:speedchange(3);break;
- case 48:turnleft45(220);break; //4
- case 24:turnright45(220);break; //5
- case 16:turnleft45(50);break; //7
- case 56:turnright45(50);break; //8
- case 224:speeddown();break;
- case 144:speedup();break;
- }
- else
- {
- ZYSTM32_back(100);
- delay_us(50);
- ZYSTM32_brake(100);
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
小車基礎(chǔ)部分+紅外遙控+超聲波避障測(cè)距顯示.7z
(205.01 KB, 下載次數(shù): 126)
2020-7-2 12:52 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|