给王八用的轮毂和履带电机是997直流有刷减速电机,本文记录该电机的调试过程。
硬件信息
电机
电机的淘宝链接:997暴力直流行星齿轮减速电机24V12低速大扭力正反转可调中轴马达-淘宝网 (taobao.com)
选用的是24V235转/分钟(rpm)版本,具体参数如下表:
参数名称 | 参数值 |
---|---|
额定输入电压(V) | 24 |
输入电流(A) | 15-20 |
减速比 | 51 |
减速级数 | 3 |
减速器长度(mm) | 58.4 |
空载转速(rpm) | 235 |
额定转速(rpm) | 215 |
额定转矩(N.m) | 15 |
最大瞬间允许负载(N.m) | 25 |
电机实拍图片如下:
电机一头有两个突出的铜片(?可能是铜),是电机的两相,MOTOR+和MOTOR-
电机驱动
电机驱动的淘宝链接:电机驱动模块 大功率H桥驱动 直流电机驱动器 30A单路(特价版)-淘宝网 (taobao.com)
由于997电机需要用15-20A的电流,通过的电流较大。在此前提条件下,挑选了这款额定电流最大可达30A的直流电机驱动模块,而且该模块还可以通过PWM来调速,非常容易通过单片机来控制,符合我们的需求。
驱动模块的参数如下表:
参数名称 | 参数值 |
---|---|
尺寸(mm) | 60*42 |
额定电流(A) | 最大30 |
峰值电流(A) | 60 |
输入电压(V) | 12~30 |
控制频率(KHz) | 最高60 |
驱动模块的实拍图片如下:
控制器
控制器使用的是STM32F103ZET6芯片的开发板,是正点原子的精英开发板
淘宝链接:正点原子精英STM32开发板F103ZET6入门学习套件ARM嵌入式 单片机-tmall.com天猫
实拍图片:
仿真器
仿真器使用的ST-link
实拍图片:
调试过程
回路连通
首先是焊线,实现整个回路的连通
- 电机的两相MOTOR+和MOTOR-焊上线,12AWG,红色接MOTOR+、黑色接MOTOR-
- 驱动模块的电源线焊上,12AWG,红正黑负
然后将电机和驱动连接,驱动和电源连接:
然后将单片机的引脚与驱动模块用杜邦线连接,2个控制转向的引脚,1个GND,1个5V,1个PWM脉冲输入。
程序测试
PWM频率为15KHz,占空比50%:
997直流无刷减速电机调试_15KHz占空比50%
PWM频率为15KHz,占空比87.5%:
997直流无刷减速电机调试_15KHz占空比87.5%
PWM的频率为15KHz,占空比从0到50%的测试:
997直流无刷减速电机调试_15KHz占空比0-50
PWM的频率为30KHz,占空比为50%:
997直流无刷减速电机调试_30KHz占空比50%
PWM的频率为50KHz,占空比为50%:
997直流无刷减速电机调试_50KHz占空比50%
占空比增加会使得电机转速增大;增大频率并不会对转速造成影响,只要占空比一样转速就一样。从15KHz到30KHz电流减小了0.1A,但是从30KHz到50KHz电流没有减小,推测频率和电流大小没有明显关系。
转向测试:
997直流无刷减速电机调试_转向测试
转向比较顺利,但是转向时由于突然的变向会有一瞬间的大电流以及比较剧烈的抖动。
刹车测试:
997直流无刷减速电机调试_刹车测试
库文件
/**
* @brief 997直流减速电机库文件
* @author JYS
* @date 20230227
* @details 997直流减速电机的驱动库文件,不止可以用于997电机,其它使用PWM控制的电机也可以使用
* @attention !使用之前根据自己使用的PWM和GPIO的引脚修改或添加宏定义,并对函数实现做添加或修改
* !根据设定的ARR值修改PULSE_MAX宏定义,PULSE_MAX的值应为ARR值的98%(驱动限制)
*/
#include "tim.h"
#include "gpio.h"
#define HTIM htimx
#define TIM_CHANNEL1 TIM_CHANNEL_x
//add more channel macros below
#define GPIO_PORT1 GPIOx
//add more GPIO_PORT macros below
#define GPIO_PIN1 GPIO_PIN_x1
#define GPIO_PIN2 GPIO_PIN_x2
//add more GPIO_PIN macros below
#define PULSE_MAX //add a value here
/**
* @brief 初始化997电机
* @return None
* @details 开启对应TIM对应通道的PWM
*
*/
void init997Motor()
{
HAL_TIM_PWM_Start(&HTIM, TIM_CHANNEL1); //start PWM of motor
//add more "HAL_TIM_PWM_Start" below
}
/**
* @brief 997电机正转
* @return None
* @details 修改对应引脚的高低电平;这里写的A1为1,A2为0对应正转,使用时可根据实际效果修改
*
*/
void rotate997MotorForeward()
{
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN1, GPIO_PIN_SET); //A1
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN2, GPIO_PIN_RESET); //A2
//add more "HAL_GPIO_WritePin" below
}
/**
* @brief 997电机反转
* @return None
* @details 修改对应引脚的高低电平;这里写的A1为0,A2为1对应正转,使用时可根据实际效果修改
*
*/
void rotate997MotorBackward()
{
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN1, GPIO_PIN_RESET); //A1
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN2, GPIO_PIN_SET); //A2
//add more "HAL_GPIO_WritePin" below
}
/**
* @brief 997电机刹车
* @return None
* @details 引脚都设低电平
*
*/
void brake997Motor()
{
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN1, GPIO_PIN_RESET); //A1
HAL_GPIO_WritePin(GPIO_PORT, GPIO_PIN2, GPIO_PIN_RESET); //A2
//add more "HAL_GPIO_WritePin" below
}
/**
* @brief 设定997电机速度
* @param pulse 设定的pulse值,范围[-PULSE_MAX,PULSE_MAX]
* @return None
* @details 根据输入的pulse的正负判断方向,然后设定pulse值,改变占空比,从而改变速度
* @attention !根据电机数量增加参数个数
*/
void set997MotorSpeed(int pulse)
{
//限幅
if(pulse >= PULSE_MAX)
pulse = PULSE_MAX;
else if(pulse <= -PULSE_MAX)
pulse = -PULSE_MAX;
//add more limits here according to param number
//判断方向
if(pulse >= 0)
{
//正转
rotate997MotorForeward();
//设定pulse
__HAL_TIM_SetCompare(&HTIM, TIM_CHANNEL1, pulse);
}
else if(pulse < 0)
{
//反转
rotate997MotorBackward();
//设定pulse
__HAL_TIM_SetCompare(&HTIM, TIM_CHANNEL1, -pulse);
}
//根据参数个数,添加更多设定pulse
}