步进电机连线驱动

铭牌参数

  • 57HD5401... :开头的 "57" 代表电机的法兰盘尺寸是

  • 1.8°步进角 。意思是 STM32 每给一个脉冲,电机就精准转动。电机转一整圈需要 个脉冲。

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

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

第一步:连线

AUBOS → TM32 → 驱动器 → 步进电机

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 控制逻辑

对于步进电机来说,它无法直接反馈电流或扭矩

cpp 复制代码
// ==================== 底层步进电机驱动函数 ====================

// 设定方向:0为张开(OPEN),1为闭合(CLOSE)
void motor_set_dir(uint8_t dir) {
    if (dir == 0) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // DIR低电平
    } else {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);   // DIR高电平
    }
}

// 让步进电机走 1 步 (通过翻转引脚产生一个脉冲)
// speed_delay 越小,脉冲越快,电机转速越高
void motor_step(uint32_t speed_delay) {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    delay_us(speed_delay);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    delay_us(speed_delay);
}

// ==================== 四个核心动作 ====================

// 1. 夹持动作 (使用中等速度,靠力传感器或最大步数限制停止)
void clamp_action() 
{
    state = CLAMPING;
    motor_set_dir(1); // 设为闭合方向
    
    uint32_t steps_taken = 0;
    const uint32_t MAX_CLAMP_STEPS = 5000; // 安全上限步数,防止死卡
    
    while (state == CLAMPING)
    {
        // 走一步
        motor_step(200); // 延迟200us,速度适中
        steps_taken++;
        
        // 读取传感器 (完全保留你博客的逻辑)
        float force = read_force_sensor(); 
        
        if (force > FORCE_LIMIT) {
            // 抓紧了,停止
            state = IDLE;
            break;
        }
        if (steps_taken >= MAX_CLAMP_STEPS) {
            // 没抓到东西,但机械结构到头了,停止
            state = IDLE;
            break;
        }
        if (READ_STOP_CMD()) { // 收到急停
            stop_action();
            break;
        }
    }
}

// 2. 剪切动作 (高速度、大力量,强行走到设定的剪切脉冲终点)
void cut_action() 
{
    state = CUTTING;
    motor_set_dir(1); // 设为闭合方向
    
    uint32_t steps_taken = 0;
    // 根据剪刀结构算好:剪断需要步进电机走多少步(例如转3圈 = 200步/圈 * 3 = 600步)
    const uint32_t CUT_END_STEPS = 3000; 
    
    while (state == CUTTING)
    {
        motor_step(100); // 延迟100us,高速强力剪切
        steps_taken++;
        
        if (steps_taken >= CUT_END_STEPS) {
            // 剪切完成
            state = IDLE;
            // 剪完自动复位
            reset_action(); 
            break;
        }
        if (READ_STOP_CMD()) {
            stop_action();
            break;
        }
    }
}

// 3. 复位动作 (反转,直到撞到物理限位开关 HOME_SWITCH 停止)
void reset_action() 
{
    state = RESETTING;
    motor_set_dir(0); // 设为打开方向
    
    // 只要没压到复位限位开关,就一直往回转
    while (!READ_CLAMP_HOME_SWITCH())
    {
        motor_step(200); // 中速复位
        
        if (READ_STOP_CMD()) {
            stop_action();
            return;
        }
    }
    // 撞到开关,停止电机,复位完成
    state = IDLE;
}

// 4. 停止动作 (立刻切断所有控制)
void stop_action() 
{
    state = STOPPED;
    // 步进电机停止发送脉冲即为停止
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); 
    
    // 如果驱动器接了 ENA (使能) 引脚,可以给使能信号让电机完全断电完全松开
    // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 
    
    error_flag = EMERGENCY_STOP;
}

第三步:调试上电顺序

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

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

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

  3. 标定步数与速度

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

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

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