以前做了一個紅外遙控、避障和尋線的小車,用的是固件庫,現在流行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電,小車即可運行起來了。