|
@@ -1,13 +1,10 @@
|
|
|
/**
|
|
/**
|
|
|
- @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
|
|
|
|
|
- @file MotorControlFunction.c
|
|
|
|
|
- @author Fortiortech Appliction Team
|
|
|
|
|
- @since Create:2021-11-07
|
|
|
|
|
- @date Last modify:2022-07-14
|
|
|
|
|
- @note Last modify author is Marcel He
|
|
|
|
|
- @brief
|
|
|
|
|
-*/
|
|
|
|
|
-
|
|
|
|
|
|
|
+ * @copyright None
|
|
|
|
|
+ * @file MotorControlFunction.c
|
|
|
|
|
+ * @author Comment Vivre
|
|
|
|
|
+ * @date 2024-08-26
|
|
|
|
|
+ * @brief None
|
|
|
|
|
+ */
|
|
|
#include <MyProject.h>
|
|
#include <MyProject.h>
|
|
|
|
|
|
|
|
CurrentOffset xdata mcCurOffset; ///< 电流采样偏置电压采集缓存
|
|
CurrentOffset xdata mcCurOffset; ///< 电流采样偏置电压采集缓存
|
|
@@ -48,8 +45,8 @@ void FOC_Init(void)
|
|
|
FOC_EK2 = OBS_K2T;
|
|
FOC_EK2 = OBS_K2T;
|
|
|
FOC_EK3 = OBS_K3T;
|
|
FOC_EK3 = OBS_K3T;
|
|
|
FOC_EK4 = OBS_K4T;
|
|
FOC_EK4 = OBS_K4T;
|
|
|
- /* -----AO/PLL/SMO ----- */
|
|
|
|
|
- #if (EstimateAlgorithm == AO)
|
|
|
|
|
|
|
+ /* -----AO/PLL/SMO ----- */
|
|
|
|
|
+ #if (EstimateAlgorithm == AO)
|
|
|
{
|
|
{
|
|
|
ClrBit(FOC_CR2, ESEL);
|
|
ClrBit(FOC_CR2, ESEL);
|
|
|
FOC_KSLIDE = OBS_KSLIDE;
|
|
FOC_KSLIDE = OBS_KSLIDE;
|
|
@@ -69,16 +66,16 @@ void FOC_Init(void)
|
|
|
FOC_KSLIDE = OBSE_PLLKP_GAIN;
|
|
FOC_KSLIDE = OBSE_PLLKP_GAIN;
|
|
|
FOC_EKLPFMIN = OBSE_PLLKI_GAIN;
|
|
FOC_EKLPFMIN = OBSE_PLLKI_GAIN;
|
|
|
}
|
|
}
|
|
|
- #else
|
|
|
|
|
|
|
+ #else
|
|
|
{
|
|
{
|
|
|
- #error " EstimateAlgorithm ERR"
|
|
|
|
|
|
|
+#error " EstimateAlgorithm ERR"
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
FOC_FBASE = OBS_FBASE; // 由速度计算角度增量的系数
|
|
FOC_FBASE = OBS_FBASE; // 由速度计算角度增量的系数
|
|
|
FOC_OMEKLPF = SPEED_KLPF; // 估算器内速度低通滤波系数
|
|
FOC_OMEKLPF = SPEED_KLPF; // 估算器内速度低通滤波系数
|
|
|
FOC_TGLI = PWM_TGLI_LOAD; // 死区配置
|
|
FOC_TGLI = PWM_TGLI_LOAD; // 死区配置
|
|
|
SetBit(FOC_CR1, SVPWMEN); // SVPWM模式
|
|
SetBit(FOC_CR1, SVPWMEN); // SVPWM模式
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (mcFocCtrl.FR == CW)
|
|
if (mcFocCtrl.FR == CW)
|
|
|
{
|
|
{
|
|
|
ClrBit(DRV_CR, DDIR); // 反转标志位
|
|
ClrBit(DRV_CR, DDIR); // 反转标志位
|
|
@@ -87,15 +84,15 @@ void FOC_Init(void)
|
|
|
{
|
|
{
|
|
|
SetBit(DRV_CR, DDIR); // 反转标志位
|
|
SetBit(DRV_CR, DDIR); // 反转标志位
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- /* 过调制 */
|
|
|
|
|
- #if (OverModulation == Enable)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /* 过调制 */
|
|
|
|
|
+ #if (OverModulation == Enable)
|
|
|
{
|
|
{
|
|
|
SetBit(FOC_CR1, OVMDL); // 过调制
|
|
SetBit(FOC_CR1, OVMDL); // 过调制
|
|
|
}
|
|
}
|
|
|
#endif // end OverModulation
|
|
#endif // end OverModulation
|
|
|
- /* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
|
|
|
|
|
- #if (Shunt_Resistor_Mode == Single_Resistor)
|
|
|
|
|
|
|
+ /* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
|
|
|
|
|
+ #if (Shunt_Resistor_Mode == Single_Resistor)
|
|
|
{
|
|
{
|
|
|
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
|
|
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
|
|
|
FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
|
|
FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
|
|
@@ -103,45 +100,44 @@ void FOC_Init(void)
|
|
|
// 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
|
|
// 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
|
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
|
|
|
}
|
|
}
|
|
|
- /* 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia Ib */
|
|
|
|
|
- #elif (Shunt_Resistor_Mode == Double_Resistor) // double resistor sample
|
|
|
|
|
|
|
+ /* 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia Ib */
|
|
|
|
|
+ #elif (Shunt_Resistor_Mode == Double_Resistor) // double resistor sample
|
|
|
{
|
|
{
|
|
|
SetReg(FOC_CR1, CSM0 | CSM1, CSM0);
|
|
SetReg(FOC_CR1, CSM0 | CSM1, CSM0);
|
|
|
FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
|
|
FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
|
|
|
FOC_TRGDLY = 0x07; // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同
|
|
FOC_TRGDLY = 0x07; // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同
|
|
|
// 如:0x83为下降沿结束前3个clock采样Ia 0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
// 如:0x83为下降沿结束前3个clock采样Ia 0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
|
FOC_TBLO = PWM_DLOWL_TIME; // 下桥臂最小脉冲,保证采样
|
|
FOC_TBLO = PWM_DLOWL_TIME; // 下桥臂最小脉冲,保证采样
|
|
|
- /*五段式或七段式选择*/
|
|
|
|
|
- #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
|
|
+ /*五段式或七段式选择*/
|
|
|
|
|
+ #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
{
|
|
{
|
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式
|
|
|
}
|
|
}
|
|
|
- #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
|
|
|
|
+ #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
{
|
|
{
|
|
|
SetBit(FOC_CR2, F5SEG); // 5段式
|
|
SetBit(FOC_CR2, F5SEG); // 5段式
|
|
|
}
|
|
}
|
|
|
- #endif
|
|
|
|
|
-
|
|
|
|
|
- #if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
|
|
|
|
|
+ #endif
|
|
|
|
|
+ #if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
|
{
|
|
{
|
|
|
ClrBit(FOC_CR2, DSS); // 7段式
|
|
ClrBit(FOC_CR2, DSS); // 7段式
|
|
|
}
|
|
}
|
|
|
- #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
|
|
|
|
|
|
|
+ #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
|
|
|
{
|
|
{
|
|
|
SetBit(FOC_CR2, DSS); // 5段式
|
|
SetBit(FOC_CR2, DSS); // 5段式
|
|
|
}
|
|
}
|
|
|
- #endif // end DouRes_Sample_Mode
|
|
|
|
|
|
|
+ #endif // end DouRes_Sample_Mode
|
|
|
}
|
|
}
|
|
|
- /*三电阻采样*/
|
|
|
|
|
- #elif (Shunt_Resistor_Mode == Three_Resistor) // signel resistor sample
|
|
|
|
|
|
|
+ /*三电阻采样*/
|
|
|
|
|
+ #elif (Shunt_Resistor_Mode == Three_Resistor) // signel resistor sample
|
|
|
{
|
|
{
|
|
|
SetReg(FOC_CR1, CSM0 | CSM1, CSM0 | CSM1); // 三电阻
|
|
SetReg(FOC_CR1, CSM0 | CSM1, CSM0 | CSM1); // 三电阻
|
|
|
FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
|
|
FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
|
|
|
FOC_TRGDLY = 0x06; // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同。
|
|
FOC_TRGDLY = 0x06; // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同。
|
|
|
// 如:0x83为下降沿结束前3个clock采样Ia,0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
// 如:0x83为下降沿结束前3个clock采样Ia,0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
|
FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
|
|
FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
|
|
|
- /* 五段式或七段式选择 */
|
|
|
|
|
- #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
|
|
+ /* 五段式或七段式选择 */
|
|
|
|
|
+ #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
{
|
|
{
|
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式
|
|
ClrBit(FOC_CR2, F5SEG); // 7段式
|
|
|
}
|
|
}
|
|
@@ -150,7 +146,6 @@ void FOC_Init(void)
|
|
|
SetBit(FOC_CR2, F5SEG); // 5段式
|
|
SetBit(FOC_CR2, F5SEG); // 5段式
|
|
|
}
|
|
}
|
|
|
#endif // end SVPMW_Mode
|
|
#endif // end SVPMW_Mode
|
|
|
-
|
|
|
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
|
{
|
|
{
|
|
|
ClrBit(FOC_CR2, DSS); // 7段式
|
|
ClrBit(FOC_CR2, DSS); // 7段式
|
|
@@ -162,12 +157,12 @@ void FOC_Init(void)
|
|
|
#endif // end DouRes_Sample_Mode
|
|
#endif // end DouRes_Sample_Mode
|
|
|
}
|
|
}
|
|
|
#endif // end Shunt_Resistor_Mode
|
|
#endif // end Shunt_Resistor_Mode
|
|
|
- /* 使能电流基准校正 */
|
|
|
|
|
- #if (CalibENDIS == Enable)
|
|
|
|
|
|
|
+ /* 使能电流基准校正 */
|
|
|
|
|
+ #if (CalibENDIS == Enable)
|
|
|
{
|
|
{
|
|
|
if (mcCurOffset.OffsetFlag == 1)
|
|
if (mcCurOffset.OffsetFlag == 1)
|
|
|
{
|
|
{
|
|
|
- #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻校正
|
|
|
|
|
|
|
+ #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻校正
|
|
|
{
|
|
{
|
|
|
/*set ibus current sample offset*/
|
|
/*set ibus current sample offset*/
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
@@ -178,7 +173,7 @@ void FOC_Init(void)
|
|
|
/*set ia, ib current sample offset*/
|
|
/*set ia, ib current sample offset*/
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
|
|
FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
|
|
FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
|
|
|
}
|
|
}
|
|
@@ -187,10 +182,10 @@ void FOC_Init(void)
|
|
|
/*set ibus current sample offset*/
|
|
/*set ibus current sample offset*/
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
|
|
FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
|
|
FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
|
FOC_CSO = mcCurOffset.Iw_busOffset; // 写入IC的偏置
|
|
FOC_CSO = mcCurOffset.Iw_busOffset; // 写入IC的偏置
|
|
|
}
|
|
}
|
|
@@ -230,44 +225,47 @@ void Motor_Charge(void)
|
|
|
ClrBit(DRV_CR, OCS);
|
|
ClrBit(DRV_CR, OCS);
|
|
|
mcFocCtrl.ChargeStep = 0;
|
|
mcFocCtrl.ChargeStep = 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count < CHARGE_TIME) && (mcFocCtrl.ChargeStep == 0))
|
|
if ((mcFocCtrl.State_Count < CHARGE_TIME) && (mcFocCtrl.ChargeStep == 0))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.ChargeStep = 1;
|
|
mcFocCtrl.ChargeStep = 1;
|
|
|
DRV_CMR |= 0x01; // U相下桥臂通
|
|
DRV_CMR |= 0x01; // U相下桥臂通
|
|
|
MOE = 1;
|
|
MOE = 1;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 20)) && (mcFocCtrl.ChargeStep == 1))
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 20)) && (mcFocCtrl.ChargeStep == 1))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.ChargeStep = 2;
|
|
mcFocCtrl.ChargeStep = 2;
|
|
|
DRV_CMR |= 0x04; // V相下桥臂通
|
|
DRV_CMR |= 0x04; // V相下桥臂通
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 40)) && (mcFocCtrl.ChargeStep == 2))
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 40)) && (mcFocCtrl.ChargeStep == 2))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.ChargeStep = 3;
|
|
mcFocCtrl.ChargeStep = 3;
|
|
|
DRV_CMR |= 0x10; // W相下桥臂通
|
|
DRV_CMR |= 0x10; // W相下桥臂通
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 60)) && (mcFocCtrl.ChargeStep == 3))
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 60)) && (mcFocCtrl.ChargeStep == 3))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.ChargeStep = 4;
|
|
mcFocCtrl.ChargeStep = 4;
|
|
|
-// DRV_CMR &= 0x0000;
|
|
|
|
|
-// DRV_CMR = 0x0ABF;
|
|
|
|
|
-// DRV_DR = 0.975 * DRV_ARR;
|
|
|
|
|
|
|
+ // DRV_CMR &= 0x0000;
|
|
|
|
|
+ // DRV_CMR = 0x0ABF;
|
|
|
|
|
+ // DRV_DR = 0.975 * DRV_ARR;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 75)) && (mcFocCtrl.ChargeStep == 4))
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 75)) && (mcFocCtrl.ChargeStep == 4))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.ChargeStep = 5;
|
|
mcFocCtrl.ChargeStep = 5;
|
|
|
DRV_CMR &= 0x0000;
|
|
DRV_CMR &= 0x0000;
|
|
|
DRV_CMR = 0x003f;
|
|
DRV_CMR = 0x003f;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 76)) && (mcFocCtrl.ChargeStep == 5))
|
|
if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 76)) && (mcFocCtrl.ChargeStep == 5))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.State_Count = 0;
|
|
mcFocCtrl.State_Count = 0;
|
|
|
mcFocCtrl.ChargeStep = 6;
|
|
mcFocCtrl.ChargeStep = 6;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
#if (IPMTEST == Enable)
|
|
#if (IPMTEST == Enable)
|
|
|
{
|
|
{
|
|
|
if (mcFocCtrl.ChargeStep == 6)
|
|
if (mcFocCtrl.ChargeStep == 6)
|
|
@@ -302,8 +300,8 @@ void Motor_Align(void)
|
|
|
FOC_EKI = OBSW_KI_GAIN_START;
|
|
FOC_EKI = OBSW_KI_GAIN_START;
|
|
|
/*配置预定位角度*/
|
|
/*配置预定位角度*/
|
|
|
FOC__THETA = Align_Theta;
|
|
FOC__THETA = Align_Theta;
|
|
|
- /*********PLL或SMO**********/
|
|
|
|
|
- #if (EstimateAlgorithm == SMO)
|
|
|
|
|
|
|
+ /*********PLL或SMO**********/
|
|
|
|
|
+ #if (EstimateAlgorithm == SMO)
|
|
|
{
|
|
{
|
|
|
FOC__ETHETA = FOC__THETA - 4096;
|
|
FOC__ETHETA = FOC__THETA - 4096;
|
|
|
}
|
|
}
|
|
@@ -325,17 +323,17 @@ void Motor_Align(void)
|
|
|
void Motor_FocTailWind_Open(void)
|
|
void Motor_FocTailWind_Open(void)
|
|
|
{
|
|
{
|
|
|
/* 启动方式选择 */
|
|
/* 启动方式选择 */
|
|
|
-// FOC_EFREQACC = 500;
|
|
|
|
|
-// FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
|
|
|
|
|
-// FOC_EFREQHOLD = MOTOR_OMEGA_RAMP_END;
|
|
|
|
|
- FOC_QKP = QKP;
|
|
|
|
|
- FOC_QKI = QKI;
|
|
|
|
|
- FOC_DKP = DKP;
|
|
|
|
|
- FOC_DKI = DKI;
|
|
|
|
|
|
|
+ // FOC_EFREQACC = 500;
|
|
|
|
|
+ // FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
|
|
|
|
|
+ // FOC_EFREQHOLD = MOTOR_OMEGA_RAMP_END;
|
|
|
|
|
+ FOC_QKP = QKP;
|
|
|
|
|
+ FOC_QKI = QKI;
|
|
|
|
|
+ FOC_DKP = DKP;
|
|
|
|
|
+ FOC_DKI = DKI;
|
|
|
mcFocCtrl.State_Count = 0; // 取消ATO爬坡
|
|
mcFocCtrl.State_Count = 0; // 取消ATO爬坡
|
|
|
FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
|
|
FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
|
|
|
FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
|
|
FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
|
|
|
- FOC_IQREF = IQ_RUN_CURRENT;
|
|
|
|
|
|
|
+ FOC_IQREF = IQ_RUN_CURRENT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -356,8 +354,8 @@ void Motor_Static_Open(void)
|
|
|
FOC_QKI = QKI_Start;
|
|
FOC_QKI = QKI_Start;
|
|
|
FOC_EKP = OBSW_KP_GAIN_START;
|
|
FOC_EKP = OBSW_KP_GAIN_START;
|
|
|
FOC_EKI = OBSW_KI_GAIN_START;
|
|
FOC_EKI = OBSW_KI_GAIN_START;
|
|
|
- /*启动方式选择*/
|
|
|
|
|
- #if (Open_Start_Mode == Omega_Start) // Omega 启动
|
|
|
|
|
|
|
+ /*启动方式选择*/
|
|
|
|
|
+ #if (Open_Start_Mode == Omega_Start) // Omega 启动
|
|
|
{
|
|
{
|
|
|
FOC_EFREQACC = MOTOR_OMEGA_RAMP_ACC;
|
|
FOC_EFREQACC = MOTOR_OMEGA_RAMP_ACC;
|
|
|
FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
|
|
FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
|
|
@@ -382,8 +380,8 @@ void Motor_Static_Open(void)
|
|
|
SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
|
|
SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
|
|
|
}
|
|
}
|
|
|
#endif // end Open_Start_Mode
|
|
#endif // end Open_Start_Mode
|
|
|
- /*不同启动方式下,切换到MCRUN状态*/
|
|
|
|
|
- #if (Open_Start_Mode == Open_Start) // OPEN状态启动时拖动多次
|
|
|
|
|
|
|
+ /*不同启动方式下,切换到MCRUN状态*/
|
|
|
|
|
+ #if (Open_Start_Mode == Open_Start) // OPEN状态启动时拖动多次
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.State_Count = 0;
|
|
mcFocCtrl.State_Count = 0;
|
|
|
FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
|
|
FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
|
|
@@ -391,8 +389,8 @@ void Motor_Static_Open(void)
|
|
|
}
|
|
}
|
|
|
#elif (Open_Start_Mode == Omega_Start)
|
|
#elif (Open_Start_Mode == Omega_Start)
|
|
|
{
|
|
{
|
|
|
- /*********PLL或SMO**********/
|
|
|
|
|
- #if (EstimateAlgorithm == SMO || EstimateAlgorithm == AO)
|
|
|
|
|
|
|
+ /*********PLL或SMO**********/
|
|
|
|
|
+ #if (EstimateAlgorithm == SMO || EstimateAlgorithm == AO)
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.State_Count = ATO_START_HOLDTIME + (ATO_RAMP_PERIOD << 2); // ATO 爬坡控制时间
|
|
mcFocCtrl.State_Count = ATO_START_HOLDTIME + (ATO_RAMP_PERIOD << 2); // ATO 爬坡控制时间
|
|
|
}
|
|
}
|
|
@@ -423,31 +421,6 @@ void MC_Break(void)
|
|
|
DRV_DR = 0.95 * DRV_ARR;// ARR+4为全开
|
|
DRV_DR = 0.95 * DRV_ARR;// ARR+4为全开
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- @brief 控制变量上电初始化,包括保护参数的初始化、电机状态初始化
|
|
|
|
|
- @brief 上电只运行一次
|
|
|
|
|
- @date 2022-07-14
|
|
|
|
|
-*/
|
|
|
|
|
-void MotorcontrolInit(void)
|
|
|
|
|
-{
|
|
|
|
|
- /*****电机状态机时序变量***********/
|
|
|
|
|
- McStaSet.SetMode = 0;
|
|
|
|
|
- /**********电机目标方向*************/
|
|
|
|
|
- #if (FR_MODE == CW)
|
|
|
|
|
- {
|
|
|
|
|
- mcFocCtrl.FR = CW;
|
|
|
|
|
- }
|
|
|
|
|
- #else
|
|
|
|
|
- {
|
|
|
|
|
- mcFocCtrl.FR = CCW;
|
|
|
|
|
- }
|
|
|
|
|
- #endif // end IRMODE
|
|
|
|
|
- /* -----电流偏置校准变量初始化----- */
|
|
|
|
|
- mcCurOffset.IuOffsetSum = 16383;
|
|
|
|
|
- mcCurOffset.IvOffsetSum = 16383;
|
|
|
|
|
- mcCurOffset.Iw_busOffsetSum = 16383;
|
|
|
|
|
- mcPwmInput.TimerARR = 65535;
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
@brief 初始化电机参数,每次电机启动均会被调用
|
|
@brief 初始化电机参数,每次电机启动均会被调用
|
|
@@ -464,7 +437,6 @@ void VariablesPreInit(void)
|
|
|
mcFocCtrl.Flg_ATORampEnd = 0;
|
|
mcFocCtrl.Flg_ATORampEnd = 0;
|
|
|
/* -----电机功率参数初始化----- */
|
|
/* -----电机功率参数初始化----- */
|
|
|
mcFocCtrl.sqrtUdq = 0;
|
|
mcFocCtrl.sqrtUdq = 0;
|
|
|
-
|
|
|
|
|
mcFocCtrl.NTCValueGatherFlag = 1; // 上电即采集NTC信号
|
|
mcFocCtrl.NTCValueGatherFlag = 1; // 上电即采集NTC信号
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -478,9 +450,9 @@ void VariablesPreInit(void)
|
|
|
void GetCurrentOffset(void)
|
|
void GetCurrentOffset(void)
|
|
|
{
|
|
{
|
|
|
SetBit(ADC_CR, ADCBSY); // 使能ADC
|
|
SetBit(ADC_CR, ADCBSY); // 使能ADC
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
while (ReadBit(ADC_CR, ADCBSY));
|
|
while (ReadBit(ADC_CR, ADCBSY));
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
#if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻模式
|
|
#if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻模式
|
|
|
{
|
|
{
|
|
|
mcCurOffset.Iw_busOffsetSum += ((ADC4_DR & 0x7ff8));
|
|
mcCurOffset.Iw_busOffsetSum += ((ADC4_DR & 0x7ff8));
|
|
@@ -513,7 +485,7 @@ void GetCurrentOffset(void)
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
mcCurOffset.OffsetCount++;
|
|
mcCurOffset.OffsetCount++;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (mcCurOffset.OffsetCount > Calib_Time)
|
|
if (mcCurOffset.OffsetCount > Calib_Time)
|
|
|
{
|
|
{
|
|
|
mcCurOffset.OffsetFlag = 1;
|
|
mcCurOffset.OffsetFlag = 1;
|
|
@@ -558,17 +530,13 @@ void Motor_Ready(void)
|
|
|
void Motor_Init(void)
|
|
void Motor_Init(void)
|
|
|
{
|
|
{
|
|
|
#if (Shunt_Resistor_Mode == Single_Resistor)
|
|
#if (Shunt_Resistor_Mode == Single_Resistor)
|
|
|
- {
|
|
|
|
|
- ClrBit(ADC_MASK, CH4EN); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ClrBit(ADC_MASK, CH4EN); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
|
|
|
#else
|
|
#else
|
|
|
- {
|
|
|
|
|
- ClrBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ClrBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
|
|
|
#endif
|
|
#endif
|
|
|
VariablesPreInit(); // 电机相关变量初始化
|
|
VariablesPreInit(); // 电机相关变量初始化
|
|
|
PI_Init(); // PI初始化
|
|
PI_Init(); // PI初始化
|
|
|
- // PI2_Init(); // PI初始化
|
|
|
|
|
|
|
+ // PI2_Init(); // PI初始化
|
|
|
PI3_Init(); // PI初始化
|
|
PI3_Init(); // PI初始化
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -582,15 +550,15 @@ void Motor_TailWind(void)
|
|
|
{
|
|
{
|
|
|
SetBit(DRV_CR, DRVEN); // 计数器使能 0-->Disable 1-->Enable
|
|
SetBit(DRV_CR, DRVEN); // 计数器使能 0-->Disable 1-->Enable
|
|
|
McStaSet.SetFlag.TailWindSetFlag = 1;
|
|
McStaSet.SetFlag.TailWindSetFlag = 1;
|
|
|
- #if (TAILWIND_MODE == RSDMethod)
|
|
|
|
|
|
|
+ #if (TAILWIND_MODE == RSDMethod)
|
|
|
RSDDetectInit();
|
|
RSDDetectInit();
|
|
|
- #elif (TAILWIND_MODE == BEMFMethod)
|
|
|
|
|
|
|
+ #elif (TAILWIND_MODE == BEMFMethod)
|
|
|
BEMFDetectInit();
|
|
BEMFDetectInit();
|
|
|
- #elif (TAILWIND_MODE == FOCMethod)
|
|
|
|
|
|
|
+ #elif (TAILWIND_MODE == FOCMethod)
|
|
|
FocDetectInit();
|
|
FocDetectInit();
|
|
|
- #endif
|
|
|
|
|
|
|
+ #endif
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
#if (TAILWIND_MODE == RSDMethod)
|
|
#if (TAILWIND_MODE == RSDMethod)
|
|
|
{
|
|
{
|
|
|
if (mcFocCtrl.State_Count > 0) // 顺逆风检测时间结束前判断转速
|
|
if (mcFocCtrl.State_Count > 0) // 顺逆风检测时间结束前判断转速
|
|
@@ -635,21 +603,20 @@ void Motor_TailWind(void)
|
|
|
{
|
|
{
|
|
|
if (mcFocCtrl.State_Count == 0) // 顺逆风检测时间结束判断转速
|
|
if (mcFocCtrl.State_Count == 0) // 顺逆风检测时间结束判断转速
|
|
|
{
|
|
{
|
|
|
-
|
|
|
|
|
- if ((mcFocCtrl.SpeedFlt >= S_Value(100))&&mcFocCtrl.EMFsquare>=400) // 需要增加 判断保持时间
|
|
|
|
|
|
|
+ if ((mcFocCtrl.SpeedFlt >= S_Value(100)) && mcFocCtrl.EMFsquare >= 400) // 需要增加 判断保持时间
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.Start_Mode = TAILWIND_START;
|
|
mcFocCtrl.Start_Mode = TAILWIND_START;
|
|
|
mcState = mcStart;
|
|
mcState = mcStart;
|
|
|
}
|
|
}
|
|
|
- else if ((mcFocCtrl.SpeedFlt < -S_Value(80))&&mcFocCtrl.EMFsquare>=400)
|
|
|
|
|
- {
|
|
|
|
|
|
|
+ else if ((mcFocCtrl.SpeedFlt < -S_Value(80)) && mcFocCtrl.EMFsquare >= 400)
|
|
|
|
|
+ {
|
|
|
McStaSet.SetFlag.TailWindSetFlag = 0; // 清除 顺逆风检测初始标志
|
|
McStaSet.SetFlag.TailWindSetFlag = 0; // 清除 顺逆风检测初始标志
|
|
|
mcFocCtrl.State_Count = 2000; // 逆风刹车时间,刹车结束会切回重新进行顺逆风检测
|
|
mcFocCtrl.State_Count = 2000; // 逆风刹车时间,刹车结束会切回重新进行顺逆风检测
|
|
|
mcFocCtrl.Start_Mode = HEADWIND_START; // 逆风启动
|
|
mcFocCtrl.Start_Mode = HEADWIND_START; // 逆风启动
|
|
|
mcState = mcStart; // 状态机切换到Start
|
|
mcState = mcStart; // 状态机切换到Start
|
|
|
}
|
|
}
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
mcFocCtrl.Start_Mode = STATIC_START;
|
|
mcFocCtrl.Start_Mode = STATIC_START;
|
|
|
mcState = mcStart;
|
|
mcState = mcStart;
|
|
|
}
|
|
}
|
|
@@ -677,7 +644,7 @@ void MC_Stop(void)
|
|
|
#else
|
|
#else
|
|
|
{
|
|
{
|
|
|
MOE = 0;
|
|
MOE = 0;
|
|
|
- MC_Break();
|
|
|
|
|
|
|
+ MC_Break();
|
|
|
mcState = mcBrake;
|
|
mcState = mcBrake;
|
|
|
mcFocCtrl.State_Count = StopWaitTime;
|
|
mcFocCtrl.State_Count = StopWaitTime;
|
|
|
}
|
|
}
|