单个电机
简介
实验室经常出现电机疑似寄了但其实没寄、寄了很久但没被发现的情况,严重影响开发效率。为节省排查时间,特此整理本测试文档。
可在 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运行
}
}