前言
本项目控制电机采用串口电机驱动控制,可以减少主控资源占用和控制难度。
开始本节前,请确保已经看完《串口简单使用》
模块接线
如图
后续如果遇到电机与测试转向相反,请反接红线与黑线,直至正常。
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
评论(0)
您还未登录,请登录后发表或查看评论