#ifndef DRV8837D_H #define DRV8837D_H #ifdef __cplusplus extern "C" { #endif #include "main.h" #include "tim.h" #include "gpio.h" extern uint8_t use_pid_control; // 是否启用PID调节 extern float Kp, Ki, Kd; extern float error; extern float target_angle_deg; extern float diff_Angle; typedef enum { SPEED_MODE, ANGLE_MODE } ControlMode; extern ControlMode mode; typedef enum { MOTOR_STOPPED = 0, // 不转 MOTOR_FORWARD, // 正转 MOTOR_REVERSE, // 反转 MOTOR_OVERCURRENT // 过流 } MotorDirection; extern MotorDirection Motormode; typedef struct { float target_val; // 目标值 float actual_val; // 实际测量值 float target_speed; // 目标速度 float err; // 当前误差 float err_last; // 上一次误差 float err_sum; // 累积误差(积分项) float PrevError; // Error[-2] float Kp; // 比例系数 float Ki; // 积分系数 float Kd; // 微分系数 float output; // PID输出值 float output_max; // 输出最大值(限幅) float output_min; // 输出最小值(限幅) float integral_max; // 最大积分量(防积分饱和) } tPid; extern tPid pidMotor1Speed; void PID_init(void); float P_realize(tPid * pid, float actual_val); // 比例P调节 float PI_realize(tPid * pid, float actual_val);// 比例P 积分I 控制函数 float PID_Realize(tPid *pid, float actual_val, float dt);// PID控制函数 float PID_Incremental_Calc(tPid *pid, float target_speed, float Motor_spe); void Motor_PID_Control(void); void Motor_Control(float control);// 控制输出到电机 void motor_forward(void); // 电机正转 void motor_rollback(void); // 电机反转 void Auto_Tune_PID(float error, float derivative, float dt); float get_shortest_angle_error(float target, float actual); void Set_Speed_Mode(float speed_dps); void Set_Angle_Mode(float angle); void Motor_Angle_Current_PID_Control(void); void motor_stop(void); // 电机停转 void Motor_PID_Control(void); void Motor_ZF(void); void Motor_control_ZF(uint16_t forward_speed ,uint16_t reverse_speed); void Motor_Forward(uint16_t speed); void Motor_Reverse(uint16_t speed); void Motor_control(uint16_t forward_speed,uint16_t reverse_speed); #ifdef __cplusplus } #endif #endif // DRV8837D_H