#ifndef DJI_MOTOR_H #define DJI_MOTOR_H #include "bsp_can.h" /* DJI 电机(M3508/M2006/GM6020)统一驱动 * - 反馈:can_start() 后通过 can_rx_register 按 rx_id 注册,接收中断内解析(多圈累计) * - 控制:组装 0x200/0x1FF/0x1FE/0x2FE 控制帧,经 CAN_SendTxMessage 发送 */ typedef enum { DJI_MOTOR_3508, // 减速比 3591:187(≈19:1), 转矩常数 0.3N·m/A DJI_MOTOR_2006, // 减速比 36:1, 转矩常数 0.18N·m/A DJI_MOTOR_6020, // 直驱, 电流控制(ID1~4 为 0x1FE 帧, ±16384 对应 ±3A) } dji_motor_type_e; typedef struct { uint16_t raw_angle; // 本次机械角度原始数据(0~8191 对应 0~360°) int64_t total_tick; // 累计角度位置原始数据(8192*圈数+raw,无 ±1 圈限制) float rotor_angle_deg; // 累计转子机械角(°) int16_t rotor_speed; // 转子转速(RPM) int16_t raw_torque; // 转矩电流原始数据 float torque_current; // 转矩电流(A) uint8_t temperature; // 电机温度(℃) uint32_t last_online_tick; // 最近一次收到反馈的 tick(HAL_GetTick) } dji_motor_feedback_t; typedef struct { dji_motor_type_e type; hcan_t * hcan; uint16_t rx_id; // 反馈 ID:M3508/M2006 0x201~0x208,GM6020 0x205~0x20B dji_motor_feedback_t fdb; } dji_motor_t; /* 初始化并注册 CAN 接收回调(can_start() 之后调用) */ extern void dji_motor_init(dji_motor_t * motor, hcan_t * hcan, uint16_t rx_id, dji_motor_type_e type); /* ---- 控制帧发送 ---- * M3508/M2006 ID1~4:0x200 电流帧(±16384 对应 ±20A/±10A) * M3508/M2006 ID5~8:0x1FF 电流帧(±16384) * GM6020 电流控制:ID1~4 为 0x1FE 电流帧(±16384 对应 ±3A),ID5~8 为 0x2FE 电流帧(±16384) */ extern void dji_motor_send_current_low(hcan_t * hcan, int16_t i1, int16_t i2, int16_t i3, int16_t i4); extern void dji_motor_send_current_high(hcan_t * hcan, int16_t i5, int16_t i6, int16_t i7, int16_t i8); extern void dji_motor_send_gm6020_current_low(hcan_t * hcan, int16_t i1, int16_t i2, int16_t i3, int16_t i4); extern void dji_motor_send_gm6020_current_high(hcan_t * hcan, int16_t i5, int16_t i6, int16_t i7, int16_t i8); /* 通用 int16x4 发送(板间通讯等复用) */ extern void dji_motor_send_int16x4(hcan_t * hcan, uint32_t std_id, const int16_t val[4]); #endif