STM32基於hal庫的智能小車(1)

以前做了一個紅外遙控、避障和尋線的小車,用的是固件庫,現在流行hal庫,於是在這新冠也不能出門之際,重新用hal庫做一個,並準備用上PWM來調節速度,並用wifi遙控,本人新手,有好的方法和錯誤的望指點!謝謝!
材料:智能小車自己安裝,STM32核心板,兩個l298n電機驅動模塊(“5v輸出可不接”我將它用來給單片機供電,通道使能後期用PWM控制來調節速度,暫時直接使能就好),其他需要用的後期再列出來。
一、組裝
電路怎麼接,可以看l298n電機驅動模塊的使用說明,接起來很簡單,馬達的兩根線其實隨便接都可以,但是爲了方便調試,建議都最好相同的順序,STM32接l298n時最好每組線接在相鄰的引腳上,既美觀又便於維護。
在這裏插入圖片描述
二、主要程序
1、STM32CUBEMX配置如下:
在這裏插入圖片描述
說明:
//定義4個馬達的兩個引腳,都是GPIOB
//左前馬達腳1 out3 MLF1 GPIO_PIN_13
//左前馬達腳2 out4 MLF2 GPIO_PIN_12
//左後馬達腳1 out1 MLB1 GPIO_PIN_15
//左後馬達腳2 out2 MLB2 GPIO_PIN_14
//右前馬達腳1 out3 MRF1 GPIO_PIN_4
//右前馬達腳2 out4 MRF2 GPIO_PIN_3
//右後馬達腳1 out1 MRB1 GPIO_PIN_6
//右後馬達腳2 out2 MRB2 GPIO_PIN_5
其中的PC13爲我STM32上的一個LED燈,調試用的。
2.程序
在main.h中添加如下定義(也可以自己編寫成函數),目的就是定義小車的前進後退左轉右轉。

//定義馬達引腳高低電平
#define MLF1_0			HAL_GPIO_WritePin(MLF1_GPIO_Port,MLF1_Pin,GPIO_PIN_RESET)
#define MLF1_1			HAL_GPIO_WritePin(MLF1_GPIO_Port,MLF1_Pin,GPIO_PIN_SET)
#define MLF2_0			HAL_GPIO_WritePin(MLF2_GPIO_Port,MLF2_Pin,GPIO_PIN_RESET)
#define MLF2_1			HAL_GPIO_WritePin(MLF2_GPIO_Port,MLF2_Pin,GPIO_PIN_SET)
#define MLB1_0			HAL_GPIO_WritePin(MLB1_GPIO_Port,MLB1_Pin,GPIO_PIN_RESET)
#define MLB1_1			HAL_GPIO_WritePin(MLB1_GPIO_Port,MLB1_Pin,GPIO_PIN_SET)
#define MLB2_0			HAL_GPIO_WritePin(MLB2_GPIO_Port,MLB2_Pin,GPIO_PIN_RESET)
#define MLB2_1			HAL_GPIO_WritePin(MLB2_GPIO_Port,MLB2_Pin,GPIO_PIN_SET)

#define MRF1_0			HAL_GPIO_WritePin(MRF1_GPIO_Port,MRF1_Pin,GPIO_PIN_RESET)
#define MRF1_1			HAL_GPIO_WritePin(MRF1_GPIO_Port,MRF1_Pin,GPIO_PIN_SET)
#define MRF2_0			HAL_GPIO_WritePin(MRF2_GPIO_Port,MRF2_Pin,GPIO_PIN_RESET)
#define MRF2_1			HAL_GPIO_WritePin(MRF2_GPIO_Port,MRF2_Pin,GPIO_PIN_SET)
#define MRB1_0			HAL_GPIO_WritePin(MRB1_GPIO_Port,MRB1_Pin,GPIO_PIN_RESET)
#define MRB1_1			HAL_GPIO_WritePin(MRB1_GPIO_Port,MRB1_Pin,GPIO_PIN_SET)
#define MRB2_0			HAL_GPIO_WritePin(MRB2_GPIO_Port,MRB2_Pin,GPIO_PIN_RESET)
#define MRB2_1			HAL_GPIO_WritePin(MRB2_GPIO_Port,MRB2_Pin,GPIO_PIN_SET)

//定義馬達狀態:10正轉 01反轉 11和00制動(當使能位爲0時是自由狀態,爲1時纔有這些狀態)
//drive行駛 park泊車 reverse倒車 neutral空擋
#define ML1_D			{MLF1_1;MLF2_0;}
#define ML1_P			{MLF1_0;MLF2_0;}
#define ML1_R			{MLF1_0;MLF2_1;}
#define ML1_N			{;}

#define ML2_D			{MLB1_1;MLB2_0;}
#define ML2_P			{MLB1_0;MLB2_0;}
#define ML2_R			{MLB1_0;MLB2_1;}
#define ML2_N			{;}

#define MR1_R			{MRF1_1;MRF2_0;}
#define MR1_P			{MRF1_0;MRF2_0;}
#define MR1_D			{MRF1_0;MRF2_1;}
#define MR1_N			{;}

#define MR2_R			{MRB1_1;MRB2_0;}
#define MR2_P			{MRB1_0;MRB2_0;}
#define MR2_D			{MRB1_0;MRB2_1;}
#define MR2_N			{;}
    
//定義小車前進後退左轉彎右轉彎
#define CAR_UP			{ML1_D;ML2_D;MR1_D;MR2_D;}
#define CAR_DOWN		{ML1_R;ML2_R;MR1_R;MR2_R;}
#define CAR_LEFT		{ML1_R;ML2_R;MR1_D;MR2_D;}
#define CAR_RIGHT		{ML1_D;ML2_D;MR1_R;MR2_R;}	
#define CAR_STOP		{ML1_P;ML2_P;MR1_P;MR2_P;}

在main.c中的while中添加

  while(1)
  {
      	LED_on;
		CAR_UP;
		HAL_Delay(6000);
		CAR_DOWN;
		HAL_Delay(6000);
		CAR_LEFT;
		HAL_Delay(6000);
		CAR_RIGHT;
		HAL_Delay(6000);
		LED_off;
		HAL_Delay(6000);
		CAR_STOP;
		HAL_Delay(6000);
  }

至此下載程序給小車接上電池(我用的3節18650充電電池,其實很多充電寶裏面都是),並通過l298n給單片機供5V電,小車即可運行起來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章