cleanup: remove unused motor drivers and simplify motor_def.h

- Remove DJImotor, HTmotor, LKmotor, step_motor, servo_motor directories
- Remove Motor_Control_Setting_s and related enums (Closeloop_Type_e,
  Feedback_Source_e, Feedfoward_Type_e, MOTOR_SEND_MODE_e, Motor_Working_Type_e)
- Merge motor_reverse_flag and feedback_reverse_flag into output_reverse
- Hardcode DM motor control: IMU angle feedback → angle PID → velocity output
- Simplify Motor_Init_Config_s to only: PID params, output_reverse, motor_type, CAN config
This commit is contained in:
2026-05-29 23:45:38 +08:00
parent 4d1702b577
commit 67a26a5ff6
26 changed files with 44 additions and 4068 deletions
+11 -53
View File
@@ -153,20 +153,16 @@ DMMotorInstance *DMMotorInit(DM_Motor_Init_Config_s *config)
DMMotorInstance *motor = (DMMotorInstance *)malloc(sizeof(DMMotorInstance));
memset(motor, 0, sizeof(DMMotorInstance));
motor->motor_settings = config->motor_config.controller_setting_init_config;
motor->output_reverse = config->motor_config.output_reverse;
motor->ctrl_mode = config->ctrl_mode;
motor->mit_kp = config->mit_kp;
motor->mit_kd = config->mit_kd;
/* init PID controllers */
PIDInit(&motor->motor_controller.angle_PID, &config->motor_config.controller_param_init_config.angle_PID);
PIDInit(&motor->motor_controller.speed_PID, &config->motor_config.controller_param_init_config.speed_PID);
PIDInit(&motor->motor_controller.current_PID, &config->motor_config.controller_param_init_config.current_PID);
/* init angle PID controller */
PIDInit(&motor->motor_controller.angle_PID, &config->motor_config.controller_param_init_config.angle_PID);
motor->motor_controller.other_angle_feedback_ptr = config->motor_config.controller_param_init_config.other_angle_feedback_ptr;
motor->motor_controller.other_speed_feedback_ptr = config->motor_config.controller_param_init_config.other_speed_feedback_ptr;
motor->motor_controller.speed_feedforward_ptr = config->motor_config.controller_param_init_config.speed_feedforward_ptr;
motor->motor_controller.current_feedforward_ptr = config->motor_config.controller_param_init_config.current_feedforward_ptr;
/* register CAN instance */
config->motor_config.can_init_config.can_module_callback = DMMotorDecode;
@@ -195,30 +191,23 @@ void DMMotorSetRef(DMMotorInstance *motor, float ref)
motor->pid_ref = ref;
}
void DMMotorOuterLoop(DMMotorInstance *motor, Closeloop_Type_e type)
{
motor->motor_settings.outer_loop_type = type;
}
void DMMotorSetCtrlMode(DMMotorInstance *motor, DM_Motor_Mode_e mode)
{
motor->ctrl_mode = mode;
}
/* ---- Main control: called from Motor Task at 1kHz ---- */
/* 硬编码: IMU 角度反馈 → 角度 PID → 速度指令 → 电机速度模式 */
void DMMotorControl(void)
{
for (uint8_t i = 0; i < idx; i++)
{
DMMotorInstance *motor = dm_motor_instance[i];
DM_Motor_Measure_s *measure = &motor->measure;
Motor_Control_Setting_s *setting = &motor->motor_settings;
Motor_Controller_s *ctrl = &motor->motor_controller;
CANInstance *can = motor->motor_can_instance;
/* handle motor error states */
if (measure->state != 0x00 && measure->state != 0x01)
if (motor->measure.state != 0x00 && motor->measure.state != 0x01)
{
DMMotorSetMode(DM_CMD_CLEAR_ERROR, motor);
DWT_Delay(0.001);
@@ -226,60 +215,29 @@ void DMMotorControl(void)
continue;
}
float pid_ref = motor->pid_ref;
/* angle PID: IMU feedback → velocity output */
float pid_ref = PIDCalculate(&motor->motor_controller.angle_PID,
*motor->motor_controller.other_angle_feedback_ptr,
motor->pid_ref);
/* ---- Angle loop (outermost) ---- */
if ((setting->close_loop_type & ANGLE_LOOP) && setting->outer_loop_type == ANGLE_LOOP)
{
float pid_measure;
if (setting->angle_feedback_source == OTHER_FEED)
pid_measure = *ctrl->other_angle_feedback_ptr;
else
pid_measure = measure->total_angle;
pid_ref = PIDCalculate(&ctrl->angle_PID, pid_measure, pid_ref);
}
/* ---- Speed loop (inner) ---- */
if ((setting->close_loop_type & SPEED_LOOP) && (setting->outer_loop_type & (ANGLE_LOOP | SPEED_LOOP)))
{
if (setting->feedforward_flag & SPEED_FEEDFORWARD)
pid_ref += *ctrl->speed_feedforward_ptr;
float pid_measure;
if (setting->speed_feedback_source == OTHER_FEED)
pid_measure = *ctrl->other_speed_feedback_ptr;
else
pid_measure = measure->velocity;
pid_ref = PIDCalculate(&ctrl->speed_PID, pid_measure, pid_ref);
}
/* output reverse */
if (setting->output_reverse == OUTPUT_DIRECTION_REVERSE)
if (motor->output_reverse == OUTPUT_DIRECTION_REVERSE)
pid_ref *= -1;
/* ---- Send via selected control mode ---- */
float vel_cmd = pid_ref * DEGREE_2_RAD; // deg/s → rad/s
float vel_cmd = pid_ref * DEGREE_2_RAD;
LIMIT_MIN_MAX(vel_cmd, DM_V_MIN, DM_V_MAX);
switch (motor->ctrl_mode)
{
case DM_MODE_VELOCITY:
/* Velocity mode: MCU angle PID output → motor velocity ref */
DMMotorSendVelocity(can, vel_cmd);
break;
case DM_MODE_MIT: {
/* MIT mode: MCU angle PID output → motor position ref, motor handles position-velocity internally */
float pos_cmd = pid_ref * DEGREE_2_RAD;
LIMIT_MIN_MAX(pos_cmd, DM_P_MIN, DM_P_MAX);
DMMotorSendMIT(can, pos_cmd, 0.0f, motor->mit_kp, motor->mit_kd, 0.0f);
break;
}
case DM_MODE_POS_VEL: {
/* Position-Velocity mode: MCU angle PID output → motor position ref + velocity ff */
float pos_cmd = pid_ref * DEGREE_2_RAD;
LIMIT_MIN_MAX(pos_cmd, DM_P_MIN, DM_P_MAX);
DMMotorSendPosVel(can, pos_cmd, vel_cmd);