步进电机连线驱动

铭牌参数
-
57HD5401...:开头的 “57” 代表电机的法兰盘尺寸是
。
-
1.8°:步进角。意思是 STM32 每给一个脉冲,电机就精准转动
。电机转一整圈
需要
个脉冲。
-
3.0A:额定电流。这非常重要,意味着你选用的驱动器,输出电流必须能达到或超过 3.0A,否则电机没力气,夹持器剪不动东西
驱动器:DM542 或 DM556 数字步进电机驱动器
第一步:连线
AUBO → STM32 → 驱动器 → 步进电机
1. AUBO 机械臂 ──> STM32 控制板(输入信号)
-
AUBO Tool DO0 (夹持) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB0)
-
AUBO Tool DO1 (剪切) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB1)
-
AUBO Tool DO2 (复位) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB2)
-
AUBO Tool DO3 (停止) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB3)
-
AUBO Tool GND ──> 连到光耦模块的 24V 地
2. STM32 控制板 ──> 步进驱动器(共阴极接法)
最常用的共阴极接法(驱动器的信号负极全部拧在一起接 STM32 的 GND)
| STM32 侧连接引脚 | 驱动器控制端口 | 功能说明 |
| STM32 的 定时器 PWM 输出引脚 | PUL+ (or CLK+) | 脉冲信号:给一个脉冲,电机转一步 |
| STM32 GND | PUL-和DIR- | 拧在一起接控制板地 |
| STM32 GPIO 引脚 | DIR+ (or CW+) | 方向信号:高电平顺时针,低电平逆时针 |
3. 驱动器 ──> 57步进电机 & 电源
电机出来的四根线(红、黄、绿、蓝)和供电电源接到驱动器标有 Power/Motor 的端口上:
| 驱动器端口 | 连接目标 | 说明 |
| V+ | 外接直流电源正极(建议 24V - 36V) | 别接 5V,步进电机在高电压下才有力气 |
| GND | 外接直流电源负极 | 电源地 |
| A+ | 电机 红线(通常) | 电机 A 相正(若反转,对调 A+ A- 即可) |
| A- | 电机 绿线(通常) | 电机 A 相负 |
| B+ | 电机 黄线(通常) | 电机 B 相正 |
| B- | 电机 蓝线(通常) | 电机 B 相负 |
确定电机的 A/B 相:用万用表测电阻,有阻值的两根线是一组(比如红绿通,它们就是 A+/A-;黄蓝通,它们就是 B+/B-)
第二步:STM32 控制逻辑
对于步进电机来说,它无法直接反馈电流或扭矩
// ==================== 用户需要根据实际硬件修改的部分 ====================
// 步进电机 PUL 脉冲引脚
#define MOTOR_PUL_PORT GPIOA
#define MOTOR_PUL_PIN GPIO_PIN_0
// 步进电机 DIR 方向引脚
#define MOTOR_DIR_PORT GPIOA
#define MOTOR_DIR_PIN GPIO_PIN_1
// 步进电机 ENA 使能引脚,如果没有接 ENA,可以注释掉 USE_MOTOR_ENA
#define USE_MOTOR_ENA
#ifdef USE_MOTOR_ENA
#define MOTOR_ENA_PORT GPIOA
#define MOTOR_ENA_PIN GPIO_PIN_3
#endif
// 方向定义
#define DIR_OPEN 0 // 张开 / 复位方向
#define DIR_CLOSE 1 // 闭合 / 夹持 / 剪切方向
// 驱动器使能电平,需要根据你的驱动器说明书修改
// 有些驱动器 ENA 低电平使能,有些高电平使能
#define MOTOR_ENABLE_LEVEL GPIO_PIN_SET
#define MOTOR_DISABLE_LEVEL GPIO_PIN_RESET
// ==================== 动作参数 ====================
// 夹持参数
#define CLAMP_STEP_DELAY_US 300 // 夹持速度,数值越大越慢
#define MAX_CLAMP_STEPS 5000 // 最大夹持步数
// 剪切参数
#define CUT_STEP_DELAY_US 400 // 剪切建议低速,保证扭矩
#define CUT_END_STEPS 3000 // 剪切需要的总步数
#define CUT_CURRENT_LIMIT 2.5f // 剪切电流上限,单位按你的传感器定义
// 复位参数
#define RESET_STEP_DELAY_US 300 // 复位速度
#define MAX_RESET_STEPS 6000 // 复位最大步数,防止限位坏掉一直转
// 通用安全参数
#define FORCE_SENSOR_ERROR -1.0f // 假设力传感器异常返回负数,可按实际修改
// ==================== 状态与错误码示例 ====================
typedef enum {
IDLE = 0,
CLAMPING,
CUTTING,
RESETTING,
STOPPED,
ERROR
} SystemState;
typedef enum {
NO_ERROR = 0,
EMERGENCY_STOP,
CLAMP_FORCE_REACHED,
CLAMP_MAX_STEPS_REACHED,
CLAMP_SENSOR_ERROR,
CUT_DONE,
CUT_OVERLOAD,
CUT_MAX_STEPS_REACHED,
RESET_DONE,
RESET_TIMEOUT
} ErrorCode;
SystemState state = IDLE;
ErrorCode error_flag = NO_ERROR;
// ==================== 底层步进电机驱动函数 ====================
// 电机使能
void motor_enable(void)
{
#ifdef USE_MOTOR_ENA
HAL_GPIO_WritePin(MOTOR_ENA_PORT, MOTOR_ENA_PIN, MOTOR_ENABLE_LEVEL);
#endif
}
// 电机失能
void motor_disable(void)
{
#ifdef USE_MOTOR_ENA
HAL_GPIO_WritePin(MOTOR_ENA_PORT, MOTOR_ENA_PIN, MOTOR_DISABLE_LEVEL);
#endif
}
// 停止输出脉冲
void motor_stop(void)
{
HAL_GPIO_WritePin(MOTOR_PUL_PORT, MOTOR_PUL_PIN, GPIO_PIN_RESET);
}
// 设定方向:0 为张开 OPEN,1 为闭合 CLOSE
void motor_set_dir(uint8_t dir)
{
if (dir == DIR_OPEN) {
HAL_GPIO_WritePin(MOTOR_DIR_PORT, MOTOR_DIR_PIN, GPIO_PIN_RESET);
} else {
HAL_GPIO_WritePin(MOTOR_DIR_PORT, MOTOR_DIR_PIN, GPIO_PIN_SET);
}
// 给方向信号一点建立时间,防止方向刚切换就发脉冲
delay_us(10);
}
// 让步进电机走 1 步
// 返回 1 表示正常走完一步,返回 0 表示中途检测到停止命令
uint8_t motor_step(uint32_t speed_delay)
{
if (READ_STOP_CMD()) {
stop_action();
return 0;
}
HAL_GPIO_WritePin(MOTOR_PUL_PORT, MOTOR_PUL_PIN, GPIO_PIN_SET);
delay_us(speed_delay);
HAL_GPIO_WritePin(MOTOR_PUL_PORT, MOTOR_PUL_PIN, GPIO_PIN_RESET);
delay_us(speed_delay);
if (READ_STOP_CMD()) {
stop_action();
return 0;
}
return 1;
}
// ==================== 四个核心动作 ====================
// 1. 夹持动作
// 逻辑:闭合方向运动,直到夹持力达到阈值,或达到最大步数,或收到停止命令
void clamp_action(void)
{
if (state == STOPPED) {
return;
}
state = CLAMPING;
error_flag = NO_ERROR;
motor_enable();
motor_set_dir(DIR_CLOSE);
uint32_t steps_taken = 0;
while (state == CLAMPING)
{
if (!motor_step(CLAMP_STEP_DELAY_US)) {
return;
}
steps_taken++;
float force = read_force_sensor();
// 传感器异常保护
if (force <= FORCE_SENSOR_ERROR) {
motor_stop();
motor_disable();
state = ERROR;
error_flag = CLAMP_SENSOR_ERROR;
break;
}
// 达到夹持力,认为夹持完成
if (force > FORCE_LIMIT) {
motor_stop();
// 这里不要立即 disable,看你的机械结构决定
// 如果失能后夹爪会松开,就不要 motor_disable()
// motor_disable();
state = IDLE;
error_flag = CLAMP_FORCE_REACHED;
break;
}
// 达到最大步数,防止机构卡死或空夹一直走
if (steps_taken >= MAX_CLAMP_STEPS) {
motor_stop();
// 同样,如果需要保持夹持力,不要失能
// motor_disable();
state = IDLE;
error_flag = CLAMP_MAX_STEPS_REACHED;
break;
}
if (READ_STOP_CMD()) {
stop_action();
break;
}
}
}
// 2. 剪切动作
// 注意:步进电机不是速度越快越有力,剪切建议低速大扭矩。
// 逻辑:闭合方向走固定步数,同时检测电流/急停/超步数。
void cut_action(void)
{
if (state == STOPPED) {
return;
}
state = CUTTING;
error_flag = NO_ERROR;
motor_enable();
motor_set_dir(DIR_CLOSE);
uint32_t steps_taken = 0;
while (state == CUTTING)
{
if (!motor_step(CUT_STEP_DELAY_US)) {
return;
}
steps_taken++;
// 如果你没有电流检测函数,可以先注释这一段
float cutter_current = read_motor_current();
if (cutter_current > CUT_CURRENT_LIMIT) {
motor_stop();
motor_disable();
state = ERROR;
error_flag = CUT_OVERLOAD;
break;
}
if (steps_taken >= CUT_END_STEPS) {
motor_stop();
state = IDLE;
error_flag = CUT_DONE;
// 剪完自动复位
reset_action();
break;
}
if (READ_STOP_CMD()) {
stop_action();
break;
}
}
}
// 3. 复位动作
// 逻辑:反向打开,直到触发 HOME_SWITCH,或者达到最大复位步数。
void reset_action(void)
{
if (state == STOPPED) {
return;
}
state = RESETTING;
error_flag = NO_ERROR;
motor_enable();
motor_set_dir(DIR_OPEN);
uint32_t steps_taken = 0;
while (state == RESETTING)
{
// 如果已经触发零位开关,直接结束
if (READ_CLAMP_HOME_SWITCH()) {
motor_stop();
motor_disable();
state = IDLE;
error_flag = RESET_DONE;
break;
}
if (!motor_step(RESET_STEP_DELAY_US)) {
return;
}
steps_taken++;
// 防止限位开关损坏或接线错误导致无限复位
if (steps_taken >= MAX_RESET_STEPS) {
motor_stop();
motor_disable();
state = ERROR;
error_flag = RESET_TIMEOUT;
break;
}
if (READ_STOP_CMD()) {
stop_action();
return;
}
}
}
// 4. 停止动作
// 逻辑:立即停止脉冲,必要时关闭驱动器使能。
void stop_action(void)
{
state = STOPPED;
error_flag = EMERGENCY_STOP;
// 停止脉冲输出
motor_stop();
// 关闭驱动器使能
// 注意:如果你的夹爪需要保持力,普通停止时不要关闭 ENA;
// 但急停时建议关闭 ENA 或切断驱动电源。
motor_disable();
}
第三步:调试上电顺序
为了防止机械剪刀在上电瞬间乱晃打伤人或损坏结构,请务必遵循以下调试顺序:
-
首次测试脱开机械连杆:先把电机从红色的 3D 打印剪刀座上拆下来(只让电机光轴转),防止代码写错导致连杆疯狂对撞死卡。
-
测试方向:运行
clamp_action(),观察电机是顺时针转还是逆时针转。如果方向反了,不需要改代码,直接把电机接线里的A+和A-对调一下即可。 -
标定步数与速度:
-
逐步调整
motor_step(speed_delay)里的延迟时间。如果电机发出呜呜声但不转,说明速度给太快了(步进电机启动需要高载荷慢速),把延迟加大(如改为 300 或 500)。 -
手动数一下夹爪从完全张开到闭合,电机一共转了多少圈,乘以每圈的脉冲数,填入代码里的
MAX_CLAMP_STEPS和CUT_END_STEPS。
-
-
装回连杆联调:确信限位开关(Home Switch)和力传感器能正常触发停止后,再把电机装回红色机构上进行整体测试。
更多推荐



所有评论(0)