前言

本项目控制电机采用串口电机驱动控制,可以减少主控资源占用和控制难度。
开始本节前,请确保已经看完《串口简单使用》

模块接线

如图

后续如果遇到电机与测试转向相反,请反接红线与黑线,直至正常。

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