engineering/modules/motor/HTmotor/HT04.md

2.1 KiB
Raw Blame History

  • 在通过串口设置电机的时候,注意发送指令不要追加回车\n否则电机端不响应。可以使用sscom其会将你的按键直接当作ascii字符发送出去。

  • 此电机的CAN线序和RoboMaster开发板相反注意单独制作CAN线

  • 电机控制和反馈报文: 控制报文

注意我们的代码实现不使用其电调协议的位置PD算法自行实现了三环并在最后给出电流参考值发送给电调。因此command packed structure中的pos cmd & vel cmd & Kp & Kd均为零。报文均为小端,低位在前

请注意发送和反馈数据的单位

HT的电机协议做的真不行纯纯直接抄mit还抄不明白之后全部换成LK

另一种上电时校准编码器的方法:

static void HTMotorDecode(CANInstance *motor_can)
{
    uint16_t tmp; // 用于暂存解析值,稍后转换成float数据,避免多次创建临时变量
    uint8_t *rxbuff = motor_can->rx_buff;
    HTMotor_Measure_t *measure = &((HTMotorInstance *)motor_can->id)->measure; // 将can实例中保存的id转换成电机实例的指针

    measure->last_angle = measure->total_angle;
    tmp = (uint16_t)((rxbuff[1] << 8) | rxbuff[2]);
    measure->total_angle = uint_to_float(tmp, P_MIN, P_MAX, 16) - measure->angle_bias;

    tmp = (uint16_t)(rxbuff[3] << 4) | (rxbuff[4] >> 4);
    measure->speed_rads = AverageFilter((uint_to_float(tmp, V_MIN, V_MAX, 12) - HT_SPEED_BIAS), measure->speed_buff, SPEED_BUFFER_SIZE);

    tmp = (uint16_t)(((rxbuff[4] & 0x0f) << 8) | rxbuff[5]);
    measure->real_current = CURRENT_SMOOTH_COEF * uint_to_float(tmp, T_MIN, T_MAX, 12) +
                            (1 - CURRENT_SMOOTH_COEF) * measure->real_current;

    if (!measure->first_feedback_flag) // 初始化的时候设置偏置
    {
        measure->first_feedback_flag = 1;
        measure->angle_bias = measure->total_angle;
        measure->total_angle = 0;
        measure->speed_rads = 0;
    }
}

第一次收到数据时默认电机处于限位处,将速度和角度都设置为零,记录当前的编码器数据,之后每次收到都减去该值.