铭牌参数

  • 57HD5401...:开头的 “57” 代表电机的法兰盘尺寸是 $57\text{mm} \times 57\text{mm}$

  • 1.8°步进角。意思是 STM32 每给一个脉冲,电机就精准转动$1.8^\circ$。电机转一整圈$360^\circ$需要 $360 / 1.8 = 200$个脉冲。

  • 3.0A额定电流。这非常重要,意味着你选用的驱动器,输出电流必须能达到或超过 3.0A,否则电机没力气,夹持器剪不动东西

驱动器:DM542DM556 数字步进电机驱动器

第一步:连线

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();
}

第三步:调试上电顺序

为了防止机械剪刀在上电瞬间乱晃打伤人或损坏结构,请务必遵循以下调试顺序:

  1. 首次测试脱开机械连杆:先把电机从红色的 3D 打印剪刀座上拆下来(只让电机光轴转),防止代码写错导致连杆疯狂对撞死卡。

  2. 测试方向:运行 clamp_action(),观察电机是顺时针转还是逆时针转。如果方向反了,不需要改代码,直接把电机接线里的 A+A- 对调一下即可。

  3. 标定步数与速度

    • 逐步调整 motor_step(speed_delay) 里的延迟时间。如果电机发出呜呜声但不转,说明速度给太快了(步进电机启动需要高载荷慢速),把延迟加大(如改为 300 或 500)。

    • 手动数一下夹爪从完全张开到闭合,电机一共转了多少圈,乘以每圈的脉冲数,填入代码里的 MAX_CLAMP_STEPSCUT_END_STEPS

  4. 装回连杆联调:确信限位开关(Home Switch)和力传感器能正常触发停止后,再把电机装回红色机构上进行整体测试。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐