找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 15982|回復(fù): 20
收起左側(cè)

基于Stm32f103紅外藍(lán)牙尋跡智能小車設(shè)計(jì)

  [復(fù)制鏈接]
ID:263159 發(fā)表于 2017-12-18 15:54 | 顯示全部樓層 |閱讀模式
之前的一個(gè)小項(xiàng)目,基于stm32f103這款單片機(jī),實(shí)現(xiàn)紅外遙控,超聲波避障,黑白尋跡,pwm調(diào)速,齒輪測速等功能,這里上傳下之前的工程文件,附部分項(xiàng)目筆記,希望對(duì)需要的人有幫助,有不對(duì)的地方還請(qǐng)指出來,謝謝!

下面是設(shè)計(jì)報(bào)告的內(nèi)容節(jié)選(清晰圖片版請(qǐng)下載附件)
項(xiàng)目設(shè)計(jì)智能小車1、項(xiàng)目簡介

本次項(xiàng)目中我們利用SMART103平臺(tái)中的硬件資源控制電機(jī)驅(qū)動(dòng)、紅外遙控模塊從而實(shí)現(xiàn)對(duì)小車的前進(jìn),后退,左右轉(zhuǎn)彎以及速度調(diào)整,并能夠持續(xù)加減速。速度狀態(tài)通過LED指示狀態(tài)來識(shí)別。通過此次項(xiàng)目,可以掌握電機(jī)驅(qū)動(dòng)模塊跟紅外遙控模塊的使用、I/O口作為輸出模式時(shí),CPU對(duì)I/O口的基本操作和控制,系統(tǒng)滴答定時(shí)器的工作原理、高級(jí)定時(shí)器TIM1的PWM調(diào)制原理、以及紅外遙控器的工作原理、對(duì)系統(tǒng)工作有個(gè)整體認(rèn)識(shí)。

2、電機(jī)驅(qū)動(dòng)模塊
接口說明:
輸出口:OUT1、OUT2、OUT3、OUT4
四路輸出口分別對(duì)應(yīng)小車左右兩側(cè)的電機(jī);其中1、2為一組,對(duì)應(yīng)左側(cè)電機(jī)的正負(fù)極;3、4位一組,對(duì)應(yīng)右側(cè)電機(jī)的正負(fù)極,在安裝電機(jī)之前對(duì)電機(jī)正負(fù)極進(jìn)行檢測。
輸入口:ENA、IN1、IN2、IN3、IN4、ENB
                            ENA、ENB為電機(jī)控制使能端口,改口接入PWM波可以根據(jù)波形占空比調(diào)節(jié)電機(jī)轉(zhuǎn)速IN1、IN2、IN3、IN4              分別對(duì)應(yīng)單片機(jī)IO口,用來控制電機(jī)正反轉(zhuǎn)。
電源輸入:12V輸入、GND
                              12V接入電源正極,GND接入電源負(fù)極,供電機(jī)驅(qū)動(dòng)模塊正常驅(qū)動(dòng)電機(jī),該模塊自帶5V板載輸出。
原理圖:
                           

              圖中假定IN1、IN2分別對(duì)應(yīng)輸入1、0;電流流經(jīng)方向?yàn)辄S色熒光筆軌跡,驅(qū)動(dòng)電路一側(cè)電機(jī)電機(jī)正傳,反之輸入0、1電機(jī)反轉(zhuǎn);同樣電路另一側(cè)原理相同。

MOTO_GPIO初始化:

General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴(kuò)展器,利用工業(yè)標(biāo)準(zhǔn)I2C、SMBus或SPI接口簡化了I/O口的擴(kuò)展。當(dāng)微控制器或芯片組沒有足夠的I/O端口,或當(dāng)系統(tǒng)需要采用遠(yuǎn)端串行通信或控制時(shí),GPIO產(chǎn)品能夠提供額外的控制和監(jiān)視功能。

在STM32中,每個(gè)GPI/O端口有兩個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32位鎖定寄存器(GPIOx_LCKR)。

根據(jù)數(shù)據(jù)手冊(cè)中列出的每個(gè)I/O端口的特定硬件特征,GPIO端口的每個(gè)位可以由軟件分別配置成如下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,
    • 推挽式復(fù)用功能                                                        GPIO_Mode_AF_PP = 0x18
    • 開漏式復(fù)用功能                                                        GPIO_Mode_AF_OD = 0x1C,

STM32的GPIO端口位配置表如下圖所示:

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

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

Init_PWM_GPIO初始化

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

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

STM3內(nèi)部PWM波產(chǎn)生原理:

PWM產(chǎn)生的流程:

  • 使能定時(shí)器TIM1(高級(jí)定時(shí)器1)和相關(guān)IO口時(shí)鐘。使能定時(shí)器1時(shí)鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

使能GPIOF時(shí)鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  • 初始化IO口為復(fù)用功能輸出。函數(shù):GPIO_Init();

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復(fù)用功GPIOA8,GPIO9復(fù)用映射到定時(shí)器TIM1            

  • 初始化定時(shí)器:ARR,PSC等:TIM_TimeBaseInit();
  • 初始化輸出比較參數(shù):TIM_OC1Init();TIM_OC2Init();
  • 使能預(yù)裝載寄存器:TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

                            使能預(yù)裝載寄存器:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

  • 使能自動(dòng)重裝載的預(yù)裝載寄存器允許位TIM_ARRPreloadConfig(TIM1,ENABLE);
  • 使能定時(shí)器,TIM_Cmd(TIM1,ENABLE);
  • 不斷改變比較值CCRx,達(dá)到不同的占空比效果:TIM_SetCompare1();




3、紅外遙控模塊

一個(gè)通用的紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,如圖

編碼格式:

目前廣泛使用較普遍的兩種:一種是NEC Protocol 的PWM( 脈沖寬度調(diào)制) 標(biāo)準(zhǔn);另一種是Philips RC-5 Protocol 的PPM( 脈沖位置調(diào)制) 標(biāo)準(zhǔn)。

NEC 標(biāo)準(zhǔn)(代表芯片WD6122):遙控載波的頻率為38kHz( 占空比為1:3) ;當(dāng)某個(gè)按鍵按下時(shí),系統(tǒng)首先發(fā)射一個(gè)完整的全碼,然后經(jīng)延時(shí)再發(fā)射一系列簡碼,直到按鍵松開即停止發(fā)射。NTC編碼,引導(dǎo)碼由一個(gè)9ms的載波波形和4.5ms的關(guān)斷時(shí)間構(gòu)成,它作為隨后發(fā)射的碼的引導(dǎo),這樣當(dāng)接收系統(tǒng)是微處理器構(gòu)成的時(shí)候,能更有效地處理碼的接收與檢測及其它各項(xiàng)控制之間的時(shí)序關(guān)系。編碼采用脈沖位置調(diào)制方式(PPM)

紅外NEC協(xié)議編碼

利用脈沖之間的時(shí)間間隔來區(qū)分“0”和“1”:數(shù)據(jù)0 可用“高電平0.56ms +低電平0.56ms”表示,數(shù)據(jù)1 可用“高電平0.56ms +低電平1.68ms”表示。當(dāng)一個(gè)鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這110ms發(fā)射代碼由一個(gè)引導(dǎo)碼(9ms),一個(gè)結(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時(shí)鐘使能,打開復(fù)用時(shí)鐘,模式上 拉輸入,速度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)先級(jí)分組NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  • 設(shè)置搶占優(yōu)先級(jí),響應(yīng)優(yōu)先級(jí),              NVIC_Init(&NVIC_InitStruct);
  • 在中斷服務(wù)函數(shù)中判斷紅外按鍵的狀態(tài);
  • 通過命令解析函數(shù)獲取當(dāng)前按鍵的指令狀態(tài)int Remote_Process(void);




中斷優(yōu)先級(jí)分組



Control_Init
紅外遙控按鍵值獲。

通過獲取到的按鍵值,編寫小車控制的程序,并設(shè)置模式標(biāo)志位,切換模式完成小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止、加減速等功能。同時(shí)將當(dāng)前獲取到的速度值跟小車的模式狀態(tài)顯示到LCD1602上面。

設(shè)置按鍵模式 :判斷當(dāng)前按鍵5是否被按下,在模式一與模式二之間進(jìn)行切換。

編寫兩種模式下的控制函數(shù):

單片機(jī)源程序如下(主程序):
  1. #include <stdio.h>
  2. #include "moto.h"
  3. #include "delay.h"
  4. #include "trail.h"
  5. #include "range.h"
  6. #include "timer3.h"
  7. #include "lcd1602.h"
  8. #include "telecontral.h"
  9. #include "speed.h"
  10. #include "pid.h"


  11. extern u16 Cnt_10ms;
  12. extern unsigned int object;                                                                //超聲波避障
  13. extern unsigned int trail;                                                                //尋跡模式

  14. int main(void)
  15. {
  16.         Init_Moto_IO();                                                                //電機(jī)驅(qū)動(dòng)IO初始化
  17.         Init_PWM_GPIO();                                                        //定時(shí)器1兩路PWM波
  18.         Init_Trail_IO();                                                        //尋跡模塊
  19.         LCD_Init();                                                                                //LCD1602初始化
  20.         Range_Init();
  21.         Init_TELECONTRAL_IO();                                //紅外遙控初始化        
  22.         TIM3_Configuration();                                        //定時(shí)器3初始化
  23.         Init_TIM1_BaseInit(100,100);
  24.         delay_init();
  25.         
  26.         Init_Speed_IO();                                                        //初始化測速模塊的IO
  27.         TIM4_Configuration();                                        //測速模塊用到了定時(shí)器4        
  28.         Init_PID();                                                                                //PID速度
  29.         
  30.         while(1)
  31.         {        
  32.                         if(Cnt_10ms >= 10)
  33.                         {
  34.                                 Cnt_10ms = 0;
  35.                                 UltrasonicWave1_StartMeasure();        
  36.                                 Stop_run();
  37.                                 if(object == 1)                                        //避障模式用到超聲波
  38.                                 {
  39.                                         Test();                //避障0                        //按鍵0觸發(fā)避障模式        
  40.                                 }
  41.                         }
  42.                         if(trail == 1)
  43.                         {
  44.                                         Trail();        //尋跡8                        //按鍵8觸發(fā)尋跡模式
  45.                         }
  46.                         Show_Current_Speed();
  47.                         Control_Init();
  48. //                        Pid_Test();
  49.                

  50.         }
  51. }

復(fù)制代碼
0.jpg

所有資料51hei提供下載(內(nèi)含完整源碼與word格式清晰版的設(shè)計(jì)論文):
Smartcar.rar (2.06 MB, 下載次數(shù): 321)


回復(fù)

使用道具 舉報(bào)

ID:262559 發(fā)表于 2017-12-23 16:17 來自手機(jī) | 顯示全部樓層
能具體說一下STM32 f103  具體型號(hào)呢  
回復(fù)

使用道具 舉報(bào)

ID:262559 發(fā)表于 2018-1-10 21:24 來自手機(jī) | 顯示全部樓層
厲害了!
回復(fù)

使用道具 舉報(bào)

ID:118238 發(fā)表于 2018-1-25 21:06 | 顯示全部樓層
謝謝 您的分享
回復(fù)

使用道具 舉報(bào)

ID:218529 發(fā)表于 2018-3-20 15:25 | 顯示全部樓層
謝謝分享 頂一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:295278 發(fā)表于 2018-3-21 22:31 | 顯示全部樓層
學(xué)習(xí) 謝謝
回復(fù)

使用道具 舉報(bào)

ID:253037 發(fā)表于 2018-4-15 12:11 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:319872 發(fā)表于 2018-5-1 15:14 | 顯示全部樓層
謝謝分享,初學(xué)者多指教
回復(fù)

使用道具 舉報(bào)

ID:319872 發(fā)表于 2018-5-1 15:15 | 顯示全部樓層
麻煩回復(fù)通過下,謝謝
回復(fù)

使用道具 舉報(bào)

ID:317867 發(fā)表于 2018-5-2 20:05 | 顯示全部樓層
挺不錯(cuò)的,就是代碼的注釋部分好像是有亂碼,希望能在注意一下。
回復(fù)

使用道具 舉報(bào)

ID:348697 發(fā)表于 2018-6-10 14:30 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:381278 發(fā)表于 2018-7-31 14:49 | 顯示全部樓層
f103與f407有些什么需要注意的
回復(fù)

使用道具 舉報(bào)

ID:415678 發(fā)表于 2018-10-26 10:37 | 顯示全部樓層
樓上亂碼那個(gè),可能是你軟件里設(shè)置的字體格式不對(duì)。相幫同學(xué)做個(gè)尋跡避障的藍(lán)牙小車,先參考下。
回復(fù)

使用道具 舉報(bào)

ID:420387 發(fā)表于 2018-11-4 10:48 | 顯示全部樓層
厲害·
回復(fù)

使用道具 舉報(bào)

ID:382179 發(fā)表于 2018-11-7 23:48 | 顯示全部樓層
謝謝樓主,學(xué)習(xí)中ing
回復(fù)

使用道具 舉報(bào)

ID:264467 發(fā)表于 2018-11-11 15:34 | 顯示全部樓層
感謝您的分享,,謝謝
回復(fù)

使用道具 舉報(bào)

ID:438716 發(fā)表于 2018-12-3 22:50 | 顯示全部樓層
謝謝樓主分享,小白一個(gè),學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:507145 發(fā)表于 2019-4-12 10:53 | 顯示全部樓層
謝謝您的分享對(duì)我很有幫助
回復(fù)

使用道具 舉報(bào)

ID:517912 發(fā)表于 2019-5-13 09:04 | 顯示全部樓層
看一下感覺挺有用的
回復(fù)

使用道具 舉報(bào)

ID:229044 發(fā)表于 2019-5-23 21:12 | 顯示全部樓層
感激不盡。
回復(fù)

使用道具 舉報(bào)

ID:615786 發(fā)表于 2019-11-16 17:39 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表