某雷赛86闭环步进驱动方案 HBS86H 86闭环电机驱动器/混合伺服驱动器。 原理图+PCB+代码。 整体方案打包。 代码无错误无警告。

这年头玩步进电机不带闭环都不好意思跟人打招呼。雷赛这波HBS86H驱动方案有点意思,直接给咱整了个全闭环控制体系。咱先瞅瞅这货的硬件架构——双核MCU配专业驱动芯片,电源部分直接怼了个TVS阵列,防浪涌设计硬核得一批。

重点在闭环算法这块,官方给的代码里藏着个骚操作:

void HB_StepCtrl(int target_pos) {
    static int32_t actual_pos = 0;
    int32_t error = target_pos - Encoder_GetCount();
    
    // 非线性PID补偿
    float kp = error > 100 ? 2.0 : (error > 50 ? 1.5 : 1.0);
    float output = kp * error + 0.05 * integral + 0.8 * derivative;
    
    Stepper_SetMicrostep(output);
    if(abs(error) < 5) {
        Motor_Enable(false);  // 到位休眠省电
    }
}

这代码妙在动态调整比例系数,大偏差时暴力输出,接近目标时温柔微调。注意看那个5个脉冲的死区设置,直接让电机到位后断电,实测能省30%功耗。不过要当心某些场景下可能引起微小振荡,建议根据负载惯性调整死区阈值。

通信协议整得挺接地气,ModbusRTU和自定义协议双模支持。看这个数据包解析函数:

uint8_t ParsePacket(uint8_t* buf) {
    if(buf[0] == 0x3A && buf[5] == 0x0D) {  // 自定义协议帧头帧尾
        target_speed = (buf[1]<<8) | buf[2];
        return 1;
    }
    else if(buf[0] == 0x01 && checkCRC(buf)) {  // Modbus帧
        HandleModbus(buf);
        return 2;
    }
    return 0;
}

这双重协议设计挺实用,现场调试用自定义协议更快,上位机对接用Modbus更规范。注意CRC校验只在Modbus帧生效,自定义协议靠固定帧尾校验,实测在115200波特率下误码率可以忽略。

PCB布局才是真功夫,驱动芯片散热片底下居然藏着温度传感器,这波操作我给满分:

void ThermalCheck() {
    if(ADS1115_Read(3) > 1.2) {  // 第4通道接NTC
        Stepper_ReduceCurrent(50);  // 过热降额
        FaultLED_Blink(3);
    }
}

模拟量采集用16位ADC,精度够细。过热保护不是直接停机而是智能降电流,产线上连续跑8小时没罢工。建议在运动控制主循环里每200ms调用一次这个函数,响应速度刚刚好。

整套方案最香的是那套参数自整定工具,上位机点点鼠标就能生成适配不同电机的配置文件。配置文件结构长这样:

[motor_A]
microstep = 256
max_current = 2800
accel_rate = 150
pid_kp = 1.2
pid_ki = 0.02

这种明码配置比写死参数灵活多了,切换不同型号电机不用重新编译固件。实测从42步进切到86步进只要改三行参数,调参时间从2小时缩到5分钟。

最后说个坑:官方demo里的急停函数没考虑减速曲线,直接cut_off电流可能导致机械冲击。自己魔改了个软刹车:

void EmergencyStop() {
    while(current_speed > 0) {
        current_speed -= max_accel * 2;
        SetSpeed(current_speed);
        delay_ms(1);
    }
    Motor_Enable(false);
}

加上这个指数衰减式停机,测试架上同步带传动机构再也没出现过脱齿现象。玩闭环驱动就得这么细,参数调教比堆硬件更重要。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐