Skip to content

单个电机

简介

实验室经常出现电机疑似寄了但其实没寄、寄了很久但没被发现的情况,严重影响开发效率。为节省排查时间,特此整理本测试文档。

可在 GSRL 库的 tsk_test.cpp 中调用 testMotor() 进行快速验证。


Checklist:多个电机均无法连接

  • 是否在同一条 CAN 上存在相同 ID 的 同类型电机(GSRL 遗留问题)
  • CAN 总线上是否有终端电阻
  • 通常第一个与最远端 各开 120Ω
  • 其余节点不开(否则等效电阻会变小)

Checklist:单个电机

不一定需要拆下电机才能判断是否损坏,建议先按以下项逐条排查:

  • 电机驱动器型号是否正确?
  • 电机是否有反馈?(查看 Motor 类的 isMotorConnected
  • CAN 总线上是否有60Ω(总)终端电阻?
  • 电机 ID 是否正确?
  • PID 是否给得太小,无法驱动转动?
  • CAN 线 H/L 是否接反
  • CAN 线、电源线是否导通
  • 电调是否正确接在 CAN 口?电机是否正确接电调?
  • 电调与电机是否匹配?
  • 电调是否损坏?
  • 是否存在其他“鬼线”(短路/干扰/错接)?

若以上均无问题,电机大概率损坏,建议进入测试环节验证。


测试步骤

1. 找到测试代码位置

打开 GSRL/tsk_test.cpp,找到电机型号 4310 的测试段(约 29 行):

// Motor
MotorDM4310 motor(1, 0, 3.1415926f, 40, 15, &myPID);

Tip:请一定注意达妙4310,有两个id号参数,不要随意套用其他电机型号。

2. 修改电机型号和参数以匹配你的电机配置。(此处默认电机ID是1)

2325

MotorDM2325 motor(1,0,1, 1, 5, &myPID);

(该电机为力矩控制,P V 随意,T 最大给到5,具体数据参考电机设置,该数据可更改)

6020

MotorDM6020 motor(1,&myPID);

3508

MotorDM3508 motor(1,&myPID);

2006

MotorDM2006 motor(1,&myPID);

MG翎控

MotorLKMG mgMotor(1, &myPID);

J60

MotorJ60 motor(1,&myPID);

3. 根据需求修改mypid参数。约20行,原代码如下:

SimplePID::PIDParam param = {
    10.0f,  // Kp
    0.0f,   // Ki
    500.0f, // Kd
    10.0f,  // outputLimit
    0.0f,   // intergralLimit
};

注意: - PID参数需要根据电机型号和负载情况进行调整,建议参考电机手册或官方示例代码。(一定要改,p只给10一般来说驱动不了) - 注意P limit是否调大。

4. 角速度闭环控制输出。

while (1) {
        motor.angleClosedloopControl(1000.0f);
        transmitMotorsControlData();
        vTaskDelayUntil(&taskLastWakeTime, 1); // 确保任务以定周期1ms运行
    }

若测试MG翎控电机,请将闭环控制逻辑替换为MG类下的函数,即:

while (1) {
        mgMotor.speedClosedloopControl(1000.0f);
        transmitMotorsControlData();
        vTaskDelayUntil(&taskLastWakeTime, 1); // 确保任务以定周期1ms运行
    }

若测试J60电机,请加入motor.enable:

extern "C" void test_task(void *argument)
{
    CAN_Init(&hcan1, can1RxCallback);                  // 初始化CAN1
    UART_Init(&huart3, dr16ITCallback, 36);            // 初始化DR16串口
    motor.enable();                                    // 使能J60电机
    TickType_t taskLastWakeTime = xTaskGetTickCount(); // 获取任务开始时间
    while (1) {
        motor.angleClosedloopControl(1000.0f);
        transmitMotorsControlData();
        vTaskDelayUntil(&taskLastWakeTime, 1); // 确保任务以定周期1ms运行
    }
}