STM32红外寻迹小车
STM32紅外尋跡小車(寄存器版)
最近學(xué)習(xí)了STM32,想通過制作一輛小車來(lái)加深對(duì)STM32的理解,在平時(shí)學(xué)習(xí)時(shí)經(jīng)常用正點(diǎn)原子提供的源代碼稍加該裝就行,但是正點(diǎn)原子沒有提供關(guān)于紅外尋跡模板的相關(guān)程序。盡管網(wǎng)上很多關(guān)于STM32的紅外尋跡的資料和源代碼,但是幾乎沒有寄存器版本的源代碼。有些博主有寄存器版的程序源碼但是得花錢才能下載。那么今天我就分享一下制作尋跡小車的經(jīng)驗(yàn)和程序源碼。
 一、紅外尋跡小車原理
 循跡模塊我用的是紅外傳感器。黑線的檢測(cè)原理是紅外發(fā)射管發(fā)射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經(jīng)施密特觸發(fā)器整形后輸出低電平;當(dāng)紅外光遇到黑線時(shí)則被吸收,接收管沒有接收到反射光,經(jīng)施密特觸發(fā)器整形后輸出高電平。簡(jiǎn)單的說就是當(dāng)紅外尋跡模板遇見黑線時(shí)會(huì)產(chǎn)生一個(gè)高電平,遇見白線時(shí)會(huì)返回一個(gè)低電平。所以根據(jù)原理設(shè)計(jì)思路為當(dāng)左側(cè)紅外傳感器遇見黑線時(shí)左拐,右邊紅外傳感器遇見黑線時(shí)右拐。這樣就可以完成
| 原理 | 左側(cè)紅外傳感器遇見黑線時(shí)左拐,右邊紅外傳感器遇見黑線時(shí)右拐。 | 當(dāng)左側(cè)紅外傳感器遇見黑線時(shí)右拐,右側(cè)紅外傳感器遇見黑線時(shí)左拐。 | 
二、尋跡小車設(shè)計(jì)注意事項(xiàng)
 (1)因?yàn)橛布l件有限,反應(yīng)速度不是很快會(huì)有一定的誤差,所以小車的速度要盡量慢下來(lái),從而彌補(bǔ)硬件的不足讓小車有足夠的反應(yīng)時(shí)間。
 (2)在設(shè)置兩個(gè)紅外傳感器的IO口模式時(shí)要設(shè)置為浮空輸入,這樣才能通過程序讀取IO口的狀態(tài)來(lái)判斷。
 (3)在測(cè)試小車時(shí)盡量在光線較暗的條件下來(lái)測(cè)試小車,避免光線過亮影響測(cè)試。
 (4)紅外尋跡模塊的OUT不能接在有上拉電阻的IO口。
 三、尋跡小車程序
 1.新建工程在工程文件下新建MOTER、TIMER、XUNJI這3個(gè)文件夾,然后在各自文件夾下建立相關(guān)文件小寫的.c和.h文件。
 2.timer.c的程序如下:
timer.h代碼如下:
#ifndef __TIMER_H #define __TIMER_H #include "sys.h" #define left TIM3->CCR1 #define right TIM3->CCR3void TIM3_Int_Init(u16 arr,u16 psc); void TIM3_PWM_Init(u16 arr,u16 psc); #endifmoter.c代碼如下:
RCC->APB2ENR|=1<<2; //使能PORTA時(shí)鐘RCC->APB2ENR|=1<<3; //使能PORTB時(shí)鐘RCC->APB2ENR|=1<<4; //使能PORTC時(shí)鐘GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=0X00300000;GPIOA->ODR|=1<<5; GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=0X30000000;GPIOA->ODR|=1<<7; GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=0X00000030;GPIOB->ODR|=1<<1;GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=0X00000300;GPIOB->ODR|=1<<2;GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=0X00003000;GPIOB->ODR|=1<<3;GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=0X00030000;GPIOB->ODR|=1<<4; GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=0X00030000;GPIOC->ODR|=1<<4; GPIOC->CRL&=0XFF0FFFFF;GPIOC->CRL|=0X00300000;GPIOC->ODR|=1<<5;moter.h代碼如下:
#ifndef __MOTER_H #define __MOTER_H #include "sys.h" //電機(jī)端口定義(PWMA PB0 PWMB PA6) #define AIN2 PBout(1) #define AIN1 PBout(2) #define STBY PBout(3) #define BIN2 PCout(5) #define BIN1 PCout(4) void MOTER_Init(void); //初始化 #endifxunji.c代碼如下:
#include "xunji.h" void XUNji_init(void) {RCC->APB2ENR|=1<<4; //使能PORTC時(shí)鐘GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=0X08000000;//PC6浮空輸入GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=0X80000000;//PC7浮空輸入 }xunji.h代碼如下
#ifndef __XUNJI_H #define __XUNJI_H #include "sys.h" #define left_led PCin(6) #define right_led PCin(7) void XUN_Init(void); //初始化 #endif這段代碼中很容易犯錯(cuò)誤為#define left_led PCout(6) #define right_led PCout(7)
 因?yàn)槲覀円?strong>讀取IO口的狀態(tài),所以不能用out必須用in,寫成#define left_led PCin(6)和#define right_led PCin(7)
 test.c代碼如下:
以上就是我在調(diào)試尋跡小車時(shí)的程序,和得到的一些注意事項(xiàng)。分享給大家希望對(duì)大家有所幫驟。如果有問題希望大家評(píng)論區(qū)留言我及時(shí)改正。
總結(jié)
以上是生活随笔為你收集整理的STM32红外寻迹小车的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: html仪表盘模版,【Minton v1
- 下一篇: 使用libwebsocket搭建webs
