系列目錄:
-
STM32 HAL庫快速實戰【一】《32點燈》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【三】《pwm控制舵機》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【四】《串口簡單使用》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【五】《控制串口電機》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
前言
本項目控制電機采用串口電機驅動控制,可以減少主控資源占用和控制難度。
開始本節前,請確保已經看完《串口簡單使用》
模塊接線
如圖

后續如果遇到電機與測試轉向相反,請反接紅線與黑線,直至正常。
CubeMX配置
串口驅動使用USART3控制,配置方法與USART1一致。


編寫代碼
首先在Src文件夾中新建一個motor.c文件,在Inc文件夾中新建一個motor.h文件,然后雙擊Application/User 添加到工程中。

打開motor.h文件。添加以下代碼。
#include "usart.h"
#include "stdio.h"
#include "string.h"
void usart_send_str(UART_HandleTypeDef *huart,unsigned char *Data); //串口發送字符串
void motor_init(void); //初始化電機驅動
void motor_set(int car_left, int car_right); //聲明控制代碼
然后打開motor.c文件,添加以下代碼
#include "motor.h"
void usart_send_str(UART_HandleTypeDef *huart,unsigned char *Data) {
while(HAL_UART_Transmit_IT(huart, Data,strlen((char *)Data))!=HAL_OK){};
return;
}
串口驅動的詳細使用參考《總線馬達驅動模塊使用手冊》
由於串口總線上需要掛載很多設備,因此為了區分不同設備,需要先設置ID
特別地,雙路修改時,使用 255 指令,比如#255PID001+002!的含義就是把左邊總線電機 ID 設定為 001,右邊總線電機設定為 002。
實際上,雙路修改時,設置左邊ID后,右邊的會自動設置為同組ID
因此只需要發送#255PID001!即可。
初始化代碼如下
void motor_init(void){
usart_send_str(&huart3,(unsigned char *)"#255PID001!");
return;
}
電機控制指令:比如#000P1500T1000!
1)id 相當於每個總線電機的“名字”,其范圍是 000~254,必須為三位數,不足的位數補 0 , 255 為廣播 ID,所有設備都會響應這個指令;
2)pwm 的范圍是 0500~2500 ,必須為四位數,不足的位數補 0,1500 表示停止,大於1500 為正轉,數值越大轉速越快,小於 1500為反轉,數值越小反向轉速越快;
3)Time 表示旋轉時間(單位 s),必須為四位數范圍:0000-9999,特殊的 0 代表循環執行
易得控制代碼如下:
//小車控制函數
//參數 左輪速度和右輪速度 范圍 -1000 到 1000
void motor_set(int car_left, int car_right) {
//總線馬達設置
char cmd_return[100];
sprintf(cmd_return, "{#001P%04dT0000!#002P%04dT0000!}", (int)(1500+car_left), (int)(1500-car_right));
usart_send_str(&huart3,(unsigned char *)cmd_return);
return;
}
至此簡單的控制函數已經結束,接下來在main中使用即可。
首先包含motor.h
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "motor.h"
/* USER CODE END Includes */
然后執行初始化驅動
/* USER CODE BEGIN 2 */
motor_init();
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
HAL_Delay(2000);
HAL_GPIO_WritePin(led_GPIO_Port,led_Pin,GPIO_PIN_RESET);
/* USER CODE END 2 */
在while循環中通過motor_set()來設置輪子的速度以及轉向。
/* USER CODE BEGIN WHILE */
int speed=500;
char input;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
input=getchar();
if(input){
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed);
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
speed+=3;
printf("led togglePin,speed [%d],you input %c",speed,input);
//usart_send_str(&huart1,(unsigned char *)"is usart_send_str test \r\n");
printf("car go\r\n");
motor_set(1000,1000);
HAL_Delay(2000);
printf("car back\r\n");
motor_set(-1000,-1000);
HAL_Delay(2000);
printf("car left\r\n");
motor_set(1000,0);
HAL_Delay(2000);
printf("car right\r\n");
motor_set(0,1000);
HAL_Delay(2000);
printf("car stop\r\n");
motor_set(0,0);
HAL_Delay(2000);
}
}
/* USER CODE END 3 */
編譯下載。
執行前請確保使用了外部電源供電,否則USB供電可能會出現異常。
在串口終端中輸入任意字符即可運動。
如果電機轉向不對,請檢查接線。
工程源碼
國內用戶請使用gitee克隆或是使用代理訪問Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/uart - motor
