#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
