標題: 基于Stm32f103紅外藍牙尋跡智能小車設(shè)計 [打印本頁]
作者: xiamoduyi 時間: 2017-12-18 15:54
標題: 基于Stm32f103紅外藍牙尋跡智能小車設(shè)計
之前的一個小項目,基于stm32f103這款單片機,實現(xiàn)紅外遙控,超聲波避障,黑白尋跡,pwm調(diào)速,齒輪測速等功能,這里上傳下之前的工程文件,附部分項目筆記,希望對需要的人有幫助,有不對的地方還請指出來,謝謝!
下面是設(shè)計報告的內(nèi)容節(jié)選(清晰圖片版請下載附件)
項目設(shè)計:智能小車1、項目簡介本次項目中我們利用SMART103平臺中的硬件資源控制電機驅(qū)動、紅外遙控模塊從而實現(xiàn)對小車的前進,后退,左右轉(zhuǎn)彎以及速度調(diào)整,并能夠持續(xù)加減速。速度狀態(tài)通過LED指示狀態(tài)來識別。通過此次項目,可以掌握電機驅(qū)動模塊跟紅外遙控模塊的使用、I/O口作為輸出模式時,CPU對I/O口的基本操作和控制,系統(tǒng)滴答定時器的工作原理、高級定時器TIM1的PWM調(diào)制原理、以及紅外遙控器的工作原理、對系統(tǒng)工作有個整體認識。
2、電機驅(qū)動模塊
接口說明:
輸出口:OUT1、OUT2、OUT3、OUT4
四路輸出口分別對應(yīng)小車左右兩側(cè)的電機;其中1、2為一組,對應(yīng)左側(cè)電機的正負極;3、4位一組,對應(yīng)右側(cè)電機的正負極,在安裝電機之前對電機正負極進行檢測。
輸入口:ENA、IN1、IN2、IN3、IN4、ENB
ENA、ENB為電機控制使能端口,改口接入PWM波可以根據(jù)波形占空比調(diào)節(jié)電機轉(zhuǎn)速IN1、IN2、IN3、IN4 分別對應(yīng)單片機IO口,用來控制電機正反轉(zhuǎn)。
電源輸入:12V輸入、GND
12V接入電源正極,GND接入電源負極,供電機驅(qū)動模塊正常驅(qū)動電機,該模塊自帶5V板載輸出。
原理圖:
圖中假定IN1、IN2分別對應(yīng)輸入1、0;電流流經(jīng)方向為黃色熒光筆軌跡,驅(qū)動電路一側(cè)電機電機正傳,反之輸入0、1電機反轉(zhuǎn);同樣電路另一側(cè)原理相同。
MOTO_GPIO初始化:General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,利用工業(yè)標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或芯片組沒有足夠的I/O端口,或當系統(tǒng)需要采用遠端串行通信或控制時,GPIO產(chǎn)品能夠提供額外的控制和監(jiān)視功能。
在STM32中,每個GPI/O端口有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。
根據(jù)數(shù)據(jù)手冊中列出的每個I/O端口的特定硬件特征,GPIO端口的每個位可以由軟件分別配置成如下8中工作模式:
- 輸入浮空 GPIO_Mode_IN_FLOATING = 0x04,
- 輸入上拉 GPIO_Mode_IPU = 0x48,
- 輸入下拉 GPIO_Mode_IPD = 0x28,
- 模擬輸入 GPIO_Mode_AIN = 0x0,
- 開漏輸出 GPIO_Mode_Out_OD = 0x14,
- 推挽輸出 GPIO_Mode_Out_PP = 0x10,
- 推挽式復用功能 GPIO_Mode_AF_PP = 0x18
- 開漏式復用功能 GPIO_Mode_AF_OD = 0x1C,
STM32的GPIO端口位配置表如下圖所示:

STM32的輸出模式配置如下表所示:

下面編寫電機驅(qū)動模塊IO初始化函數(shù):



Init_PWM_GPIO初始化脈沖寬度調(diào)制(PWM),是英文“ Pulse Width Modulation” 的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制, PWM 原理如圖:

圖中,我們假定定時器工作在向上計數(shù) PWM模式,且當 CNT<CCRx 時,輸出 0,當 CNT>=CCRx 時輸出 1。那么就可以得到如上的 PWM示意圖:當 CNT 值小于CCRx 的時候, IO 輸出低電平(0),當 CNT 值大于等于 CCRx 的時候,IO 輸出高電平(1),當 CNT 達到 ARR 值的時候,重新歸零,然后重新向上計數(shù),依次循環(huán)。改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的
頻率,這就是 PWM 輸出的原理。
STM3內(nèi)部PWM波產(chǎn)生原理:

PWM產(chǎn)生的流程:
- 使能定時器TIM1(高級定時器1)和相關(guān)IO口時鐘。使能定時器1時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
使能GPIOF時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- 初始化IO口為復用功能輸出。函數(shù):GPIO_Init();
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復用功GPIOA8,GPIO9復用映射到定時器TIM1
- 初始化定時器:ARR,PSC等:TIM_TimeBaseInit();
- 初始化輸出比較參數(shù):TIM_OC1Init();TIM_OC2Init();
- 使能預(yù)裝載寄存器:TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
使能預(yù)裝載寄存器:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
- 使能自動重裝載的預(yù)裝載寄存器允許位TIM_ARRPreloadConfig(TIM1,ENABLE);
- 使能定時器,TIM_Cmd(TIM1,ENABLE);
- 不斷改變比較值CCRx,達到不同的占空比效果:TIM_SetCompare1();


3、紅外遙控模塊
一個通用的紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,如圖
編碼格式:
目前廣泛使用較普遍的兩種:一種是NEC Protocol 的PWM( 脈沖寬度調(diào)制) 標準;另一種是Philips RC-5 Protocol 的PPM( 脈沖位置調(diào)制) 標準。
NEC 標準(代表芯片WD6122):遙控載波的頻率為38kHz( 占空比為1:3) ;當某個按鍵按下時,系統(tǒng)首先發(fā)射一個完整的全碼,然后經(jīng)延時再發(fā)射一系列簡碼,直到按鍵松開即停止發(fā)射。NTC編碼,引導碼由一個9ms的載波波形和4.5ms的關(guān)斷時間構(gòu)成,它作為隨后發(fā)射的碼的引導,這樣當接收系統(tǒng)是微處理器構(gòu)成的時候,能更有效地處理碼的接收與檢測及其它各項控制之間的時序關(guān)系。編碼采用脈沖位置調(diào)制方式(PPM)
紅外NEC協(xié)議編碼利用脈沖之間的時間間隔來區(qū)分“0”和“1”:數(shù)據(jù)0 可用“高電平0.56ms +低電平0.56ms”表示,數(shù)據(jù)1 可用“高電平0.56ms +低電平1.68ms”表示。當一個鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這110ms發(fā)射代碼由一個引導碼(9ms),一個結(jié)果碼(4.5ms),8位地址碼,8位地址反碼,8位數(shù)據(jù)碼和這8位數(shù)據(jù)的反碼組成。如果鍵按下超過110ms仍未松開,接下來發(fā)射的代碼(連發(fā)碼)將僅由起始碼(9ms)和結(jié)束碼(2.25ms)組成。
編碼構(gòu)成:

Init_TELECONTRAL_IO初始化紅外遙控初始化流程:
- 初始化 GPIO_Pin_5并打開IO時鐘使能,打開復用時鐘,模式上 拉輸入,速度50MHZ。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
- 將GPIO_Pin_5的外部中斷掛載到外部中斷線上。
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
- 初始化外部中斷EXTI_Init(&EXTI_InitStruct);
- 設(shè)置優(yōu)先級分組NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- 設(shè)置搶占優(yōu)先級,響應(yīng)優(yōu)先級, NVIC_Init(&NVIC_InitStruct);
- 在中斷服務(wù)函數(shù)中判斷紅外按鍵的狀態(tài);
- 通過命令解析函數(shù)獲取當前按鍵的指令狀態(tài)int Remote_Process(void);


中斷優(yōu)先級分組
Control_Init紅外遙控按鍵值獲取:
通過獲取到的按鍵值,編寫小車控制的程序,并設(shè)置模式標志位,切換模式完成小車的前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止、加減速等功能。同時將當前獲取到的速度值跟小車的模式狀態(tài)顯示到LCD1602上面。
設(shè)置按鍵模式 :判斷當前按鍵5是否被按下,在模式一與模式二之間進行切換。
編寫兩種模式下的控制函數(shù):
單片機源程序如下(主程序):
- #include <stdio.h>
- #include "moto.h"
- #include "delay.h"
- #include "trail.h"
- #include "range.h"
- #include "timer3.h"
- #include "lcd1602.h"
- #include "telecontral.h"
- #include "speed.h"
- #include "pid.h"
- extern u16 Cnt_10ms;
- extern unsigned int object; //超聲波避障
- extern unsigned int trail; //尋跡模式
- int main(void)
- {
- Init_Moto_IO(); //電機驅(qū)動IO初始化
- Init_PWM_GPIO(); //定時器1兩路PWM波
- Init_Trail_IO(); //尋跡模塊
- LCD_Init(); //LCD1602初始化
- Range_Init();
- Init_TELECONTRAL_IO(); //紅外遙控初始化
- TIM3_Configuration(); //定時器3初始化
- Init_TIM1_BaseInit(100,100);
- delay_init();
-
- Init_Speed_IO(); //初始化測速模塊的IO
- TIM4_Configuration(); //測速模塊用到了定時器4
- Init_PID(); //PID速度
-
- while(1)
- {
- if(Cnt_10ms >= 10)
- {
- Cnt_10ms = 0;
- UltrasonicWave1_StartMeasure();
- Stop_run();
- if(object == 1) //避障模式用到超聲波
- {
- Test(); //避障0 //按鍵0觸發(fā)避障模式
- }
- }
- if(trail == 1)
- {
- Trail(); //尋跡8 //按鍵8觸發(fā)尋跡模式
- }
- Show_Current_Speed();
- Control_Init();
- // Pid_Test();
-
- }
- }
復制代碼
0.jpg (10.08 KB, 下載次數(shù): 127)
下載附件
2017-12-18 23:44 上傳
所有資料51hei提供下載(內(nèi)含完整源碼與word格式清晰版的設(shè)計論文):
Smartcar.rar
(2.06 MB, 下載次數(shù): 321)
2017-12-18 23:47 上傳
點擊文件名下載附件
智能小車項目工程
下載積分: 黑幣 -5
作者: 可可分享 時間: 2017-12-23 16:17
能具體說一下STM32 f103 具體型號呢
作者: 可可分享 時間: 2018-1-10 21:24
厲害了!!
作者: 寂寞小奧特曼 時間: 2018-1-25 21:06
謝謝 您的分享
作者: wobuzhuchele 時間: 2018-3-20 15:25
謝謝分享 頂一個
作者: youn@g 時間: 2018-3-21 22:31
學習 謝謝
作者: 單調(diào)機 時間: 2018-4-15 12:11
謝謝分享
作者: shawnfrank 時間: 2018-5-1 15:14
謝謝分享,初學者多指教
作者: shawnfrank 時間: 2018-5-1 15:15
麻煩回復通過下,謝謝
作者: 功夫熊貓 時間: 2018-5-2 20:05
挺不錯的,就是代碼的注釋部分好像是有亂碼,希望能在注意一下。
作者: songfengyi 時間: 2018-6-10 14:30
謝謝分享
作者: dslr 時間: 2018-7-31 14:49
f103與f407有些什么需要注意的
作者: 17621304132 時間: 2018-10-26 10:37
樓上亂碼那個,可能是你軟件里設(shè)置的字體格式不對。相幫同學做個尋跡避障的藍牙小車,先參考下。
作者: 丿追風的少年 時間: 2018-11-4 10:48
厲害·
作者: 學習的大雨 時間: 2018-11-7 23:48
謝謝樓主,學習中ing
作者: 關(guān)繼斌 時間: 2018-11-11 15:34
感謝您的分享,,謝謝
作者: 木棉花開3 時間: 2018-12-3 22:50
謝謝樓主分享,小白一個,學習一下
作者: 御魔之彩羽 時間: 2019-4-12 10:53
謝謝您的分享對我很有幫助
作者: 2290145679 時間: 2019-5-13 09:04
看一下感覺挺有用的
作者: guodayou 時間: 2019-5-23 21:12
感激不盡!!
作者: lovmong 時間: 2019-11-16 17:39
謝謝分享
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩免费一二三区
|
日韩二区
|
国产精品亚洲一区二区三区在线
|
色在线免费视频
|
久久天堂网|
岛国视频|
97影院2|
一区二区在线观看免费视频
|
国产精品久久久久久久久
|
久久久精品综合
|
亚洲视频一区
|
一区精品视频在线观看
|
国产亚洲人成a在线v网站
|
91视频入口
|
成人午夜电影网
|
亚洲毛片在线观看
|
99国内精品久久久久久久
|
青青草亚洲
|
中文字幕一页二页
|
黄色大片观看
|
欧美一卡二卡在线观看
|
中文字幕乱码一区二区三区
|
精品电影
|
一区二区精品
|
亚洲综合激情
|
久久久久国产一区二区三区四区
|
亚洲夜射
|
午夜视频在线免费观看
|
久久国产婷婷国产香蕉
|
国产中文字幕在线
|
日韩中文不卡
|
亚洲免费在线
|
草草视频在线免费观看
|
午夜网
|
99精品欧美一区二区三区
|
北条麻妃国产九九九精品小说
|
亚洲自拍偷拍免费视频
|
国产精品观看
|
99精品国产一区二区三区
|
日韩在线一区二区三区
|
中文字幕亚洲视频
|