/* -------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen ---------------------------*/ /* File Name : Develop.h /* Author : Fortiortech Appliction Team /* Version : V1.0 /* Date : 2020-08-31 /* Description : This file contains Advanced Applications parameter used for Motor Control. /* ----------------------------------------------------------------------------------------------*/ /* All Rights Reserved /* ----------------------------------------------------------------------------------------------*/ /* -----Define to prevent recursive inclusion----- */ #ifndef __DEVELOP_H_ #define __DEVELOP_H_ /* -----Define to prevent recursive inclusion----- */ /* -----Q format define----- */ #define _Q7(A) (int8) ((A) * (128)) #define _Q8(A) (int16)((A) * (256)) // Q8 format #define _Q10(A) (int16)((A) * (1024)) // Q15 format #define _Q11(A) (int16)((A) * (2048)) // Q12 format #define _Q12(A) (int16)((A) * (4096)) // Q12 format #define _Q13(A) (int16)((A) * (8192)) // Q12 format #define _Q14(A) (int16)((A) * (16383)) // Q15 format #define _Q15(A) (int16)((A) * (32767)) // Q15 format #define _2PI (3.1415926 * 2) // 2 PI value #define _Q16 (65535.0) // Q16 format value /* -----Private define----- */ #define SystemPowerUpTime (10000) // 上电等待时间,cpu计数时钟 #define I_ValueX(Curr_Value) ((Curr_Value) * (HW_RSHUNT) * (HW_AMPGAIN) / (HW_ADC_REF)) #define I_Value(Curr_Value) _Q15(I_ValueX(Curr_Value)) #define QOUTVALUE I_Value(QOUTCURRENT) //I_Value(10.0) /* -----芯片参数值----- */ /* -----CPU and PWM Parameter----- */ #define MCU_CLOCK (24.0) // (MHz) 主频 #define AO_Enable (1) //自适应估算器模式使能 /* -----硬件板子参数设置值----- */ /* -----PWM high or low level Mode----- */ /* -----根据驱动芯片的类型选择,大部分芯片为High_Level----- */ #define PWM_Level_Mode (UP_H_DOWN_L) #define RV ((RV1 + RV2 + RV3) / RV3) // 分压比 #define HW_BOARD_VOLT_MAX (HW_ADC_REF * RV) // (V) ADC可测得的最大母线电压 /* -----时间设置值----- */ #define Calib_Time (1000) // 校正次数,固定1000次,单位:次 #define Charge_Time (20) // (ms) 预充电时间,单位:ms /* -----正常运行时估算算法的参数设置值----- */ #define OBS_KSLIDE _Q15(0.85) // SMO算法里的滑膜增益值 #define E_BW_Wind (600.0)//(BASE_FREQ*2) // PLL算法里的反电动势滤波值 #define E_BW (400.0)//(BASE_FREQ*2) // PLL算法里的反电动势滤波值 /* -----逆风判断时的估算算法设置值----- */ #define TailWind_Time (100) // (ms) 顺逆风检测时间 #define ATO_BW_Wind (120.0)//120.0-PLL 120.0-smo // 逆风判断观测器带宽的滤波值,经典值为8.0-100.0 #define SPD_BW_Wind (10.0)//10.0-PLL ,10.0-smo // 逆风判断速度带宽的滤波值,经典值为5.0-40.0 /* -----逆风顺风状态下的KP、KI----- */ #define DQKP_TailWind _Q12(0.8) //_Q12(1.0)-PLL , _Q12(1.5) -smo #define DQKI_TailWind _Q15(0.01) //_Q15(0.08)-PLL ,_Q15(0.2)-smo /* -----芯片参数值----- */ /* -----CPU and PWM Parameter----- */ #define PWM_CYCLE (1000.0 / PWM_FREQUENCY) // 周期us #define SAMP_FREQ (PWM_FREQUENCY * 1000) // 采样频率(HZ) #define TPWM_VALUE (1.0 / SAMP_FREQ) // 载波周期(S) #define PWM_VALUE_LOAD (uint16)(MCU_CLOCK * 500 / PWM_FREQUENCY) // PWM 定时器重载值 /* -----初始位置检查参数----- */ #define PosCheckEnable (0) // 初始位置使能,目前程序中没添加此功能 20220616 #define AlignEnable (0) // 预定位使能 /* -----脉冲注入时间长于2ms 或 低于2ms----- */ #define InjectTime (Short_Inject) #define RPD_Time (3) // (ms) 每次RPD的时间 #define RPD_CurValue (6.5) // (A) RPD过流值 #define DAC_RPDCurValue _Q7(I_ValueX(RPD_CurValue * 2)) #define ATT_COEF (0.85) // 无需改动 #define UDQMAX_Volt_VALUE _Q15(Under_Protect_Voltage/HW_BOARD_VOLT_MAX) #define UDQMIN_Volt_VALUE _Q15(Over_Protect_Voltage/HW_BOARD_VOLT_MAX) #define UDQ_K ((float)(UDQMAX-UDQMIN)/(float)(UDQMAX_Volt_VALUE-UDQMIN_Volt_VALUE)) //2498 /* -----过温保护值设置----- */ #define Tempera_Value(NTC_Value) _Q15((5.0*NTC_Value/(10.0+NTC_Value))/4.5) // 10K上拉电阻时,NTC阻值对应Q15_AD值,单位:KΩ /* -----double resistor sample Parameter----- */ #define DLL_TIME (1.0) // 双电阻最小脉宽设置(us),建议值为死区时间值+0.2us以上 /* -----three resistor overmodule Parameter----- */ #define OVERMOD_TIME (2.0) // 三电阻过调制时间(us),建议值2.0 /* -----deadtime compensation----- */ #define DT_TIME (0.0) // 死区补偿时间(us),适用于双电阻和三电阻,建议值是1/2死区时间 /* -----*min pulse----- */ #define GLI_TIME (0.0) // 桥臂窄脉宽消除(us),建议值0.5 /* -----deadtime Parameter----- */ #define PWM_LOAD_DEADTIME (PWM_DEADTIME * MCU_CLOCK) // 死区设置值 #define PWM_OVERMODULE_TIME (OVERMOD_TIME * MCU_CLOCK / 2) // 过调制时间 #define PWM_DLOWL_TIME (DLL_TIME * MCU_CLOCK / 2) //下桥臂最小时间 /* -----single resistor sample Parameter----- */ #define PWM_TS_LOAD (uint16)(_Q16 / PWM_CYCLE * MIN_WIND_TIME / 16) // 单电阻采样设置值 #define PWM_DT_LOAD (uint16)(_Q16 / PWM_CYCLE * DT_TIME / 16) // 死区补偿值 //#define PWM_TGLI_LOAD (uint16)(_Q16 / PWM_CYCLE * (GLI_TIME + PWM_DEADTIME) / 16) // 最小脉冲 #define PWM_TGLI_LOAD (uint16)(_Q16 / PWM_CYCLE * (GLI_TIME) / 16) // 最小脉冲 /* -----硬件板子参数设置值----- */ /* -----hardware current sample Parameter----- */ /* -----电流基准的电路参数----- */ #define HW_BOARD_CURR_MAX (HW_ADC_REF / 2 / HW_AMPGAIN / HW_RSHUNT) // 最大采样电流,2.702A #define HW_BOARD_CURR_MIN (-HW_BOARD_CURR_MAX) // 最小采样电流,-2.702A #define HW_BOARD_CURR_BASE (HW_BOARD_CURR_MAX * 2) // 电流基准//5.4A /* -----hardware voltage sample Parameter----- */ /* -----母线电压采样分压电路参数----- */ #define HW_BOARD_VOLTAGE_BASE (HW_BOARD_VOLT_MAX / 1.732) // 电压基准 #define HW_BOARD_VOLTAGE_VC ((RV1 + RV2 + RV3 * VC1) / (RV3 * VC1)) #define HW_BOARD_VOLTAGE_BASE_Start (HW_ADC_REF * HW_BOARD_VOLTAGE_VC / 1.732) // 电压基准 /* -----硬件过流保护DAC值----- */ /*硬件过流保护DAC值*/ #if (AMP0_VHALF == 1) #define DAC_OvercurrentValue ((uint8)_Q8(I_ValueX(OverHardcurrentValue))+0x7F) #else #define DAC_OvercurrentValue ((uint8)_Q8(I_ValueX(OverHardcurrentValue))) #endif #define Align_Theta _Q15((float)Align_Angle / 180.0) #define BEMF_Theta _Q15((float)0.0 / 180.0) #define BASE_FREQ ((MOTOR_SPEED_BASE / 60) * Pole_Pairs) // 基准频率 #define FG_Value (TIM4_Fre/BASE_FREQ/ FG_K) /* -----保护参数值----- */ #define GetCurrentOffsetValueLow (16383-GetCurrentOffsetValue) // 偏置电压差值低点 #define GetCurrentOffsetValueHigh (16383+GetCurrentOffsetValue) // 偏置电压差值高点 /* -----protect value----- */ #define OVER_PROTECT_VALUE _Q15(Over_Protect_Voltage / HW_BOARD_VOLT_MAX) #define UNDER_PROTECT_VALUE _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX) #define OVER_RECOVER_VALUE _Q15(Over_Recover_Vlotage / HW_BOARD_VOLT_MAX) #define UNDER_RECOVER_VALUE _Q15(Under_Recover_Vlotage / HW_BOARD_VOLT_MAX) /* -----motor speed set value----- */ #define Motor_Open_Ramp_ACC _Q15(MOTOR_OPEN_ACC / MOTOR_SPEED_BASE) #define Motor_Open_Ramp_Min _Q15(MOTOR_OPEN_ACC_MIN / MOTOR_SPEED_BASE) #define Motor_Omega_Ramp_Min _Q15(MOTOR_OMEGA_ACC_MIN / MOTOR_SPEED_BASE) #define Motor_Omega_Ramp_End _Q15(MOTOR_OMEGA_ACC_END / MOTOR_SPEED_BASE) #define Motor_Loop_Speed _Q15(MOTOR_LOOP_RPM / MOTOR_SPEED_BASE) #define Motor_Max_Speed _Q15(MOTOR_SPEED_MAX_RPM / MOTOR_SPEED_BASE) #define Motor_Min_Speed _Q15(MOTOR_SPEED_MIN_RPM / MOTOR_SPEED_BASE) #define Motor_Limit_Speed _Q15(MOTOR_SPEED_LIMIT_RPM / MOTOR_SPEED_BASE) #define Motor_Stop_Speed _Q15(MOTOR_SPEED_STOP_RPM / MOTOR_SPEED_BASE) #define Motor_Stall_Speed _Q15(Stall_DectSpeed / MOTOR_SPEED_BASE) #define Motor_Stall_Min_Speed _Q15(MOTOR_SPEED_STAL_MIN_RPM / MOTOR_SPEED_BASE) #define Motor_Stall_Max_Speed _Q15(MOTOR_SPEED_STAL_MAX_RPM / MOTOR_SPEED_BASE) #define Motor_RD_Speed _Q15(MOTOR_SPEED_RD_RPM / MOTOR_SPEED_BASE) #define Motor_RDPT_Speed _Q15(MOTOR_SPEED_RDPT_RPM / MOTOR_SPEED_BASE) #define Motor_RDRCV_Speed _Q15(MOTOR_SPEED_RDRCV_RPM / MOTOR_SPEED_BASE) #define Motor_Over_Speed _Q15(MOTOR_SPEED_OVER_RPM / MOTOR_SPEED_BASE) #define Motor_Over_RecoverSpeed _Q15(MOTOR_SPEED_OVER_RecoverRPM / MOTOR_SPEED_BASE) #define SPEED_K ((float)(Motor_Max_Speed-Motor_Min_Speed)/(float)(MAXPWMDuty-MINPWMDuty)) #define POWER_K ((float)(Motor_Max_Power-Motor_Min_Power)/(float)(MAXPWMDuty-MINPWMDuty)) /* -----obsever parameter set value----- */ #define MAX_BEMF_VOLTAGE ((MOTOR_SPEED_BASE*Ke)/(1000.0)) #define MAX_OMEG_RAD_SEC ((float)(_2PI*BASE_FREQ)) //#define OBS_K1T _Q15(LD/(LD+RS*TPWM_VALUE)) //#define OBS_K2T _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE)) //#define OBS_K2T_SMO _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*1.4*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE)) //#define OBS_K2T_Actual _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE/HW_BOARD_CURR_BASE)) //#define OBS_K3T _Q15((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(MAX_BEMF_VOLTAGE/HW_BOARD_CURR_BASE)) //#define OBS_K4T _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE)) //自适应估算器模式使能 #if (AO_Enable==1) #define OBS_K1T _Q11((1.0*3.0/(125.0*1.0))*(LQ/TPWM_VALUE)*(HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)) #define OBS_K2T _Q11(0.8*RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE) //#define OBS_K2T_SMO _Q11(1.0*RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE) #define OBS_K2T_Actual OBS_K2T #define OBS_K3T _Q8(2.5) #define OBS_K4T _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE)) #else #define OBS_K1T _Q15(LD/(LD+RS*TPWM_VALUE)) #define OBS_K2T _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE)) #define OBS_K2T_SMO _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*1.4*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE)) #define OBS_K2T_Actual _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE/HW_BOARD_CURR_BASE)) #define OBS_K3T _Q15((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(MAX_BEMF_VOLTAGE/HW_BOARD_CURR_BASE)) #define OBS_K4T _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE)) #endif #define OBSW_KP_GAIN _Q12(2*_2PI*ATT_COEF*ATO_BW/BASE_FREQ) #define OBSW_KI_GAIN _Q15(_2PI*ATO_BW*ATO_BW*TPWM_VALUE/BASE_FREQ) #define OBSW_KP_GAIN_RUN _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN/BASE_FREQ) #define OBSW_KI_GAIN_RUN _Q15(_2PI*ATO_BW_RUN*ATO_BW_RUN*TPWM_VALUE/BASE_FREQ) #define OBSW_KP_GAIN_RUN1 _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN1/BASE_FREQ) #define OBSW_KI_GAIN_RUN1 _Q15(_2PI*ATO_BW_RUN1*ATO_BW_RUN1*TPWM_VALUE/BASE_FREQ) #define OBSW_KP_GAIN_RUN2 _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN2/BASE_FREQ) #define OBSW_KI_GAIN_RUN2 _Q15(_2PI*ATO_BW_RUN2*ATO_BW_RUN2*TPWM_VALUE/BASE_FREQ) #define OBSW_KP_GAIN_RUN3 _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN3/BASE_FREQ) #define OBSW_KI_GAIN_RUN3 _Q15(_2PI*ATO_BW_RUN3*ATO_BW_RUN3*TPWM_VALUE/BASE_FREQ) #define OBSW_KP_GAIN_RUN4 _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN4/BASE_FREQ) #define OBSW_KI_GAIN_RUN4 _Q15(_2PI*ATO_BW_RUN4*ATO_BW_RUN4*TPWM_VALUE/BASE_FREQ) #define OBS_FBASE BASE_FREQ*TPWM_VALUE*32768 // Fbase*Tpwm*32768 #define OBS_KLPF _Q15(_2PI*BASE_FREQ*TPWM_VALUE) // 2PI*Fbase*Tpwm #define SPEED_KLPF _Q15(_2PI*SPD_BW*TPWM_VALUE) // 2PI*SPD_BW*Tpwm #define OBS_EA_KS _Q15((2*MOTOR_SPEED_SMOMIN_RPM*_2PI*BASE_FREQ*TPWM_VALUE)/MOTOR_SPEED_BASE) // SMO的最小速度 #define OBSE_PLLKP_GAIN_WIND _Q11(((2*ATT_COEF*_2PI*E_BW_Wind*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE) #define OBSE_PLLKI_GAIN_WIND _Q11((_2PI*E_BW_Wind*_2PI*E_BW_Wind*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE) #define OBSE_PLLKP_GAIN _Q11(((2*ATT_COEF*_2PI*E_BW*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE) #define OBSE_PLLKI_GAIN _Q11((_2PI*E_BW*_2PI*E_BW*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE) #define VREF3_0 (1) #define VREF4_0 (2) #define VREF4_5 (3) #define VREF5_0 (4) #if (HW_ADC_VREF==VREF5_0) #define HW_ADC_REF (5.0) // (V) ADC参考电压 #elif (HW_ADC_VREF==VREF4_5) #define HW_ADC_REF (4.5) // (V) ADC参考电压 #elif (HW_ADC_VREF==VREF4_0) #define HW_ADC_REF (4.0) // (V) ADC参考电压 #elif (HW_ADC_VREF==VREF3_0) #define HW_ADC_REF (3.0) // (V) ADC参考电压 #endif /* -----逆风判断时的估算算法设置值----- */ #define SPEED_KLPF_WIND _Q15(_2PI*SPD_BW_Wind*TPWM_VALUE) // 2PI*SPD_BW_Wind*Tpwm #define OBSW_KP_GAIN_WIND _Q12(2*_2PI*ATT_COEF*ATO_BW_Wind/BASE_FREQ) //#define OBSW_KI_GAIN_WIND _Q15(_2PI*0.5*ATO_BW_Wind*ATO_BW_Wind*TPWM_VALUE/BASE_FREQ) //---SMO #define OBSW_KI_GAIN_WIND _Q15(_2PI*ATO_BW_Wind*ATO_BW_Wind*TPWM_VALUE/BASE_FREQ) //---PLL /* -----motor start speed value----- */ /* -----open 算法启动参数----- */ #define MOTOR_OPEN_ACC (200) // 强拖启动的增量(每载波周期加一次) #define MOTOR_OPEN_ACC_MIN (0) // 强拖启动的初始速度 #define MOTOR_OPEN_ACC_CNT (100) // 强拖启动的执行次数(MOTOR_OPEN_ACC_CNT*256) /* -----Current Calib:enable or disable----- */ #define CalibDisable (0) // #define CalibEnable (1) // #define CalibENDIS (CalibEnable) /* -----SVPWM mode----- */ #define SVPWM_5_Segment (0) // 五段式SVPWM #define SVPWM_7_Segment (1) // 七段式SVPWM #define SVPMW_Mode (SVPWM_7_Segment) /* -----double resistor sample mode----- */ #define DouRes_1_Cycle (0) // 1 周期采样完 ia, ib #define DouRes_2_Cycle (1) // 交替采用ia, ib, 2周期采样完成 #define DouRes_Sample_Mode (DouRes_1_Cycle) /* -----PWM high or low level Mode----- */ /* -----根据驱动芯片的类型选择,大部分芯片为High_Level----- */ #define High_Level (0) // 驱动高电平有效 #define Low_Level (1) // 驱动低电平有效 #define UP_H_DOWN_L (2) // 上桥臂高电平有效,下桥臂低电平有效 #define UP_L_DOWN_H (3) // 上桥臂低电平有效,下桥臂高电平有效 /* -----脉冲注入时间长于2ms 或 低于2ms----- */ #define Long_Inject (0) // 脉冲注入时间长于2ms,若时间长于4ms,则要修改定时器分频 #define Short_Inject (1) // 脉冲注入时间低于2ms /* -----调速模式----- */ #define PWMMODE (0) // PWM调速 #define SREFMODE (1) // 模拟调速 #define NONEMODE (2) // 直接给定值,不调速 #define KEYMODE (3) // 按键调速模式 /* -----IPM测试模式----- */ #define IPMtest (0) // IPM测试或者MOS测试,MCU输出固定占空比 #define NormalRun (1) // 正常按电机状态机运行 /* -----估算器模式选择----- */ #define SMO (0) // SMO ,滑膜估算 #define PLL (1) // PLL ,锁相环 /* -----顺逆风判断设置----- */ #define NoTailWind (0) // 无逆风顺风判断 #define RSDMethod (1) // RSD比较器方法 #define BEMFMethod (2) // BEMF方法 /* -----开环启动模式选择----- */ #define Open_Start (0) // 开环强拖启动 #define Omega_Start (1) // Omega启动 #define Open_Omega_Start (2) // 先开环启,后Omega启动 /* -----电流采样模式----- */ #define Single_Resistor (0) // 单电阻电流采样模式 #define Double_Resistor (1) // 双电阻电流采样模式 #define Three_Resistor (2) // 三电阻电流采样模式 /* -----硬件过流保护----- */ #define Hardware_FO_Protect (1) // 硬件FO过流保护使能,适用于IPM有FO保护的场合 #define Hardware_CMP_Protect (2) // 硬件CMP比较过流保护使能,适用于MOS管应用场合 #define Hardware_FO_CMP_Protect (3) // 硬件CMP比较和FO过流保护都使能 #define Hardware_Protect_Disable (4) // 硬件过流保护禁止,用于测试 /* -----硬件过流保护比较值来源----- */ #define Compare_DAC (0) // DAC设置硬件过流值 #define Compare_Hardware (1) // 硬件设置硬件过流值 /* -----外环选择功率环或速度环----- */ //#define POWER_LOOP_CONTROL (0) //恒功率 //#define SPEED_LOOP_CONTROL (1) //恒转速 //#define CURRENT_LOOP_CONTROL (2) /* -----外环使能----- */ #define OUTLoop_Disable (0) // 关闭外环 #define OUTLoop_Enable (1) // 使能外环 /* -----正PWMduty or 负PWMduty Choose----- */ #define PosiPWMDUTY (0) // 正PWMduty #define NegaPWMDUTY (1) // 负PWMduty /* -----堵转跟启动保护----- */ #define StartFault (1) // #define StallFault (2) // #if (PosCheckEnable==1) #error "data 20220616,RPD Program has not been added" #endif #if ((AO_Enable==1) &&(EstimateAlgorithm == PLL)) #error "AO_Enable must match `EstimateAlgorithm = SMO`" #endif #endif