#ifndef __DEFINITION_H_
#define __DEFINITION_H_

#define _Q7(A)                          (int8) ((A) * 0x7f)         ///< Q7 format
#define _Q8(A)                          (int16)((A) * 0xff)         ///< Q8 format
#define _Q9(A)                          (int16)((A) * 0x1ff)        ///< Q9 format
#define _Q10(A)                         (int16)((A) * 0x3ff)        ///< Q10 format
#define _Q11(A)                         (int16)((A) * 0x07ff)       ///< Q11 format
#define _Q12(A)                         (int16)((A) * 0x0fff)       ///< Q12 format
#define _Q13(A)                         (int16)((A) * 0x1fff)       ///< Q13 format
#define _Q14(A)                         (int16)((A) * 0x3fff)       ///< Q14 format
#define _Q15(A)                         (int16)((A) * 0x7fff)       ///< Q15 format
#define _Q16                            (65535.0)                   ///< Q16 format value
#define _2PI                            (3.1415926 * 2)             ///< 2 PI value

#define I_ValueX(Xn0)            		(Xn0 * HW_RSHUNT * HW_AMPGAIN / (HW_ADC_REF))
#define I_Value(Xn0)             		_Q15(I_ValueX(Xn0))
#define S_Value(Xn0)             		_Q15((float)(Xn0) / MOTOR_SPEED_BASE)
#define A_Value(Xn0)                  	_Q15((float)(Xn0) / 180.0)
#define UDC_Value(Xn0)                  _Q15((Xn0)/ HW_BOARD_VOLT_MAX)
#define TEMPER_VALUE(Xn0)           	_Q15(5.0*Xn0/(10+Xn0)/HW_ADC_REF)

#define Disable                         (0)                              
#define Enable                          (1)

// 转向定义
#define CW                              (0)             ///<正转
#define CCW                             (1)             ///<反转

// ADC参考电压配置
#define VREF3_0                         (0xA0)          ///< 0XA0 远离实际值  减少直接填写数值导致错误，其他同理
#define VREF4_0                         (0xB0)
#define VREF4_5                         (0xC0)
#define VREF5_0                         (0xD0)

// 运放模式选择
#define AMP_NOMAL                       (0xA0)          ///< 外部放大
#define AMP_PGA_DUAL                    (0xB0)          ///< 内部PGA 双端差分输入

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

// 驱动电平设置 
#define HIGH_LEVEL                      (0xA0)          ///< 驱动高电平有效
#define LOW_LEVEL                       (0xB0)          ///< 驱动低电平有效
#define UP_H_DOWN_L                     (0xC0)          ///< 上桥臂高电平有效，下桥臂低电平有效
#define UP_L_DOWN_H                     (0xD0)          ///< 上桥臂低电平有效，下桥臂高电平有效


#define BASE_FREQ                       ((MOTOR_SPEED_BASE / 60) * Pole_Pairs)



#define SVPWM_5_Segment                 (0xA0)          ///< 五段式SVPWM
#define SVPWM_7_Segment                 (0xB0)          ///< 七段式SVPWM

#define DouRes_1_Cycle                  (0xA0)          ///< 1 周期采样完 ia, ib
#define DouRes_2_Cycle                  (0xB0)          ///< 交替采用ia, ib, 2周期采样完成


#define ALIGN_DSIABLE                   (0xA0)          ///< 禁止 
#define ALIGN_NOMAL                     (0xB0)          ///< 正常预定位 
#define ALIGN_TEST                      (0xC0)          ///< 测试模式，可用于手动测试电机极对数 


#define NONEMODE                        (0xA0)          ///< 直接给定值，不调速
#define PWMMODE                         (0xB0)          ///< PWM调速
#define SREFMODE                        (0xC0)          ///< 模拟调速
#define STARTTEST                   	(0xD0)

#define SMO                             (0xA0)          ///< SMO ,滑膜估算
#define PLL                             (0xB0)          ///< PLL ,锁相环
#define AO                              (0xC0)          ///< AO，自适应估算器


#define Open_Start                      (0xA0)          ///< 开环强拖启动
#define Omega_Start                     (0xB0)          ///< Omega启动
#define Open_Omega_Start                (0xC0)          ///< 先开环启，后Omega启动


#define Single_Resistor                 (0xA0)          ///< 单电阻电流采样模式
#define Double_Resistor                 (0xB0)          ///< 双电阻电流采样模式
#define Three_Resistor                  (0xC0)          ///< 三电阻电流采样模式

#define Long_Inject                     (0)             ///< 脉冲注入时间长于2ms,若时间长于4ms，则要修改定时器分频
#define Short_Inject                    (1)             ///< 脉冲注入时间低于2ms

// FOC__POW转换实际功率公式
// P = FOC__POW/32767*HW_BOARD_VOLT_MAX*HW_BOARD_CURR_MAX 732 6.25
#define OVER_POWER_VAL              	((float)(32767/HW_BOARD_VOLT_MAX/HW_BOARD_CURR_MAX*OVER_POWER_VALUE))
#define LPF_FC(Xn0)                	 	_Q15(_2PI / 1000 * Xn0)
#define S_Value(Xn0)             		_Q15(Xn0/MOTOR_SPEED_BASE)

#endif
