/**
 * @copyright None
 * @file      Definition.h
 * @author    Comment Vivre
 * @date      2025-11-03
 * @brief     None
 */
#ifndef __DEFINITION_H_
#define __DEFINITION_H_

// ------------------------------------------------------------------------------------------------------------------
// 1.可选配置项定义

// 转向
#define CW                              (0)
#define CCW                             (1)

// 基准电压
#define VREF3_0                         (0xA0)          
#define VREF4_0                         (0xB0)
#define VREF4_5                         (0xC0)
#define VREF5_0                         (0xD0)

// 驱动电平
#define High_Level                      (0xA0)
#define Low_Level                       (0xB0)
#define UP_H_DOWN_L                     (0xC0)
#define UP_L_DOWN_H                     (0xD0)

// 电流采样模式
#define Single_Resistor                 (0xA0)                                     
#define Double_Resistor                 (0xB0)
#define Three_Resistor                  (0xC0)

// 内部PGA放大倍数选择
#define AMP2x                           (2)
#define AMP4x                           (4)
#define AMP8x                           (8)
#define AMP16x                          (16)

// 运放模式选择
#define AMP_NOMAL                       (0xA0)
#define AMP_PGA_DUAL                    (0xB0)

// 浮点转整数定义
#define _Q7(A)                          (int8) ((A) * 0x7f)         // Q7  128*1  = 128
#define _Q8(A)                          (int16)((A) * 0xff)         // Q8  128*2  = 256
#define _Q9(A)                          (int16)((A) * 0x1ff)        // Q9  128*4  = 512
#define _Q10(A)                         (int16)((A) * 0x3ff)        // Q10 128*8  = 1024
#define _Q11(A)                         (int16)((A) * 0x07ff)       // Q11 128*16 = 2048
#define _Q12(A)                         (int16)((A) * 0x0fff)       // Q12 128*32 = 4096
#define _Q13(A)                         (int16)((A) * 0x1fff)       // Q13 128*64 = 8192
#define _Q14(A)                         (int16)((A) * 0x3fff)       // Q14 128*128= 18383
#define _Q15(A)                         (int16)((A) * 0x7fff)       // Q15 128*256= 32767
#define _Q16                            (65535.0)                   // Q16 
#define _2PI                            (3.1415926 * 2) 

// 双电阻采样周期配置
#define DouRes_1_Cycle                  (0xA0)						// 周期采样完 ia, ib
#define DouRes_2_Cycle                  (0xB0)						// 交替采用ia, ib, 2周期采样完成

// SVPWM模式
#define SVPWM_5_Segment                 (0xA0)
#define SVPWM_7_Segment                 (0xB0)

// 估算器
#define SMO                            	(0xA0)
#define PLL                            	(0xB0)
#define AO                             	(0xC0)

// 开环启动模式选择
#define Open_Start                      (0xA0)
#define Omega_Start                     (0xB0)
#define Open_Omega_Start                (0xC0)

//调速模式
#define UARTMODE                       	(0xA0)
#define NONEMODE                       	(0xB0)

// 外环
#define POWER_CONTROL_MODE              (0xA0)
#define SPEED_CONTROL_MODE				(0xB0)
// ------------------------------------------------------------------------------------------------------------------
// 2.电机控制参数定义与配置


// DQ轴最大限幅值
#define DOUTMAX                        _Q15(0.99)
#define DOUTMIN                        _Q15(-0.99)
#define QOUTMAX                        _Q15(0.99) 
#define QOUTMIN                        _Q15(-0.99)

// 过调制
#define OverModulation                 (0)

#define EstimateAlgorithm              (AO)
#define Open_Start_Mode                (Omega_Start)
#define Shunt_Resistor_Mode            (Double_Resistor)



// ------------------------------------------------------------------------------------------------------------------
// 3.其他宏定义

#define LEDPin							GP03						// 故障指示灯
#define SetLEDPin						GP03 = 1
#define ResetLEDPin						GP03 = 0
#define LEDPinONOFF						GP03 = ~GP03


#define VDCBUS_ADC						ADC2_DR						// 高压直流
#define VACBUS_ADC						ADC3_DR						// 高压交流
#define NTC1_ADC						ADC6_DR						// NTC1
#define NTC2_ADC						ADC7_DR						// NTC2
#define IGBT_NTC_ADC					ADC11_DR					// IGBT

#define PRE_DRIVER_RST					GP04						// 驱动复位
#define MAIN_RELAY						GP51						// 母线主继电器



// ------------------------------------------------------------------------------------------------------------------
// 4.结构体定义与声明 函数声明


// LED控制
typedef struct
{
	enum
	{
		LED_STATE_OFF,                              // 熄灭
		LED_STATE_ON,                               // 常亮
		LED_STATE_BLINK_FAULT,                      // 故障闪烁
		LED_STATE_POST_FAULT_DELAY                  // 延时等待
	}LedState ;
	
	uint16_t PauseDelayCnt;
	uint8_t BlinkCnt;
}LED_Control_t;
extern LED_Control_t ledControl;
void LED_State_Display(uint8_t Xn0);


// 上电控制
typedef  struct
{
	enum
	{
		DELAY_POWER_ON,						// 等待上电
		DELAY_FREE_RST,						// 等待释放复位
		POWER_RUN							// 上电完成
	}PowerSate;
	uint16_t PowerInCnt;					// 上电时间计数
}Power_Control_t;

extern volatile Power_Control_t powerControl;
void Power_In_Control(void);


// 电机控制
typedef struct
{
	// 模拟数据
	uint16_t DCBus;
	uint16_t ACBus;
	uint16_t IPMTemp;
	
	int16_t RampInc;
	int16_t RampDec;
	int16_t TargetRef;
	int16_t ActualRef;
	int16_t ActualSpeed;
	
	int16_t IQRef;
	int16_t IDRef;
	
}Motor_Control_t;

extern Motor_Control_t motorControl;


// ------------------------------------------------------------------------------------------------------------------
// 5.硬件初始化与调用声明

void Driver_Init(void);

void VREF_Config_Init(void);
void ADC_Init(void);
void Get_ADC_Value(void);
void AMP_Init(void);
void GPIO_Init(void);
void PreDriver_Falut_Init(void);

// 增量式硬件PI控制器初始化
void HW_Zero_PI_Init(void);
void HW_One_PI_Init(void);
void HW_Two_PI_Init(void);
void HW_Three_PI_Init(void);
// 增量式硬件PI计算
int16_t HW_Zero_Calc(int16_t Xn0);
int16_t HW_One_Calc(int16_t Xn0);
int16_t HW_Two_Calc(int16_t Xn0);
int16_t HW_Three_Calc(int16_t Xn0);

// 低通滤波计算
int16_t LPF_Zero_Update(int16_t Xn1, int16_t Xn0, int16_t K);
int16_t LPF_One_Update(int16_t Xn1, int16_t Xn0, int16_t K);
int16_t LPF_Two_Update(int16_t Xn1, int16_t Xn0, int16_t K);

// ------------------------------------------------------------------------------------------------------------------
// 6.函数声明 变量声明

extern bool data IsTick;
extern bool data isCtrlPowOn;

void Tick_Task(void);
void Motor_Control_State(void);


void Get_Target_Ref(void);
#endif


