|
@@ -21,9 +21,7 @@ void FOC_Init(void)
|
|
|
FOC_RTHEACC = 0;
|
|
FOC_RTHEACC = 0;
|
|
|
FOC__RTHESTEP = 0;
|
|
FOC__RTHESTEP = 0;
|
|
|
FOC_RTHECNT = 0;
|
|
FOC_RTHECNT = 0;
|
|
|
- // FOC_THECOMP = Start_FOC_THECOMP; // SMO 估算补偿角
|
|
|
|
|
FOC_THECOR = 0x02; // 误差角度补偿
|
|
FOC_THECOR = 0x02; // 误差角度补偿
|
|
|
- mcFocCtrl.STT_FOC_THECOMP = Start_FOC_THECOMP;
|
|
|
|
|
// 电流环参数配置
|
|
// 电流环参数配置
|
|
|
FOC_DKP = DQKP;
|
|
FOC_DKP = DQKP;
|
|
|
FOC_DKI = DQKI;
|
|
FOC_DKI = DQKI;
|
|
@@ -38,16 +36,22 @@ void FOC_Init(void)
|
|
|
SetBit(FOC_CR0, ESCMS);
|
|
SetBit(FOC_CR0, ESCMS);
|
|
|
// 估算器配置
|
|
// 估算器配置
|
|
|
#if (EstimateAlgorithm == SMO)
|
|
#if (EstimateAlgorithm == SMO)
|
|
|
- ClrBit(FOC_CR2, ESEL);
|
|
|
|
|
- ClrBit(FOC_CR3, MFP_EN);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ ClrBit(FOC_CR2, ESEL);
|
|
|
|
|
+ ClrBit(FOC_CR3, MFP_EN);
|
|
|
|
|
+ }
|
|
|
#elif (EstimateAlgorithm == AO)
|
|
#elif (EstimateAlgorithm == AO)
|
|
|
- SetBit(FOC_CR3, MFP_EN);
|
|
|
|
|
- ClrBit(FOC_CR2, ESEL);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ SetBit(FOC_CR3, MFP_EN);
|
|
|
|
|
+ ClrBit(FOC_CR2, ESEL);
|
|
|
|
|
+ }
|
|
|
#elif (EstimateAlgorithm == PLL)
|
|
#elif (EstimateAlgorithm == PLL)
|
|
|
- ClrBit(FOC_CR3, MFP_EN);
|
|
|
|
|
- SetBit(FOC_CR2, ESEL);
|
|
|
|
|
- FOC_KSLIDE = OBSE_PLLKP_GAIN1;
|
|
|
|
|
- FOC_EKLPFMIN = OBSE_PLLKI_GAIN1;
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ ClrBit(FOC_CR3, MFP_EN);
|
|
|
|
|
+ SetBit(FOC_CR2, ESEL);
|
|
|
|
|
+ FOC_KSLIDE = OBSE_PLLKP_GAIN1;
|
|
|
|
|
+ FOC_EKLPFMIN = OBSE_PLLKI_GAIN1;
|
|
|
|
|
+ }
|
|
|
#endif
|
|
#endif
|
|
|
FOC_EK1 = OBS_K1T;
|
|
FOC_EK1 = OBS_K1T;
|
|
|
FOC_EK2 = OBS_K2T;
|
|
FOC_EK2 = OBS_K2T;
|
|
@@ -75,12 +79,8 @@ void FOC_Init(void)
|
|
|
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
|
|
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
|
|
|
FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
|
|
FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
|
|
|
FOC_TRGDLY = 0x3B; // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;3B
|
|
FOC_TRGDLY = 0x3B; // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;3B
|
|
|
- // SVPWM 配置
|
|
|
|
|
- #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
- ClrBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
|
|
- SetBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #endif
|
|
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.Iw_busOffset;
|
|
|
}
|
|
}
|
|
|
// 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia,配置81
|
|
// 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia,配置81
|
|
|
#elif (Shunt_Resistor_Mode == Double_Resistor)
|
|
#elif (Shunt_Resistor_Mode == Double_Resistor)
|
|
@@ -90,12 +90,10 @@ void FOC_Init(void)
|
|
|
FOC_TRGDLY = 0x05; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同
|
|
FOC_TRGDLY = 0x05; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同
|
|
|
// 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
// 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
|
FOC_TBLO = PWM_DLOWL_TIME; //下桥臂最小脉冲,保证采样
|
|
FOC_TBLO = PWM_DLOWL_TIME; //下桥臂最小脉冲,保证采样
|
|
|
- // SVPWM 配置
|
|
|
|
|
- #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
- ClrBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
|
|
- SetBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #endif
|
|
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.IuOffset;
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.IvOffset;
|
|
|
// 采样配置
|
|
// 采样配置
|
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
|
ClrBit(FOC_CR2, DSS);
|
|
ClrBit(FOC_CR2, DSS);
|
|
@@ -111,45 +109,25 @@ void FOC_Init(void)
|
|
|
FOC_TRGDLY = 0x08; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同。
|
|
FOC_TRGDLY = 0x08; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同。
|
|
|
// 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
// 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
|
|
|
FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
|
|
FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
|
|
|
- // SVPWM 配置
|
|
|
|
|
- #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
- ClrBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
|
|
- SetBit(FOC_CR2, F5SEG);
|
|
|
|
|
- #endif
|
|
|
|
|
// 采样配置
|
|
// 采样配置
|
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
#if (DouRes_Sample_Mode == DouRes_1_Cycle)
|
|
|
ClrBit(FOC_CR2, DSS);
|
|
ClrBit(FOC_CR2, DSS);
|
|
|
#elif (DouRes_Sample_Mode == DouRes_2_Cycle)
|
|
#elif (DouRes_Sample_Mode == DouRes_2_Cycle)
|
|
|
SetBit(FOC_CR2, DSS);
|
|
SetBit(FOC_CR2, DSS);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.IuOffset;
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.IvOffset;
|
|
|
|
|
+ SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
|
|
|
+ FOC_CSO = mcCurOffset.Iw_busOffset;
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
- // 写入电流偏置
|
|
|
|
|
- #if (CalibENDIS)
|
|
|
|
|
- {
|
|
|
|
|
- if (mcCurOffset.OffsetFlag)
|
|
|
|
|
- {
|
|
|
|
|
- #if (Shunt_Resistor_Mode == Single_Resistor)
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
|
|
|
- FOC_CSO = mcCurOffset.Iw_busOffset;
|
|
|
|
|
- #elif (Shunt_Resistor_Mode == Double_Resistor)
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
|
|
- FOC_CSO = mcCurOffset.IuOffset;
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
|
|
- FOC_CSO = mcCurOffset.IvOffset;
|
|
|
|
|
- #elif (Shunt_Resistor_Mode == Three_Resistor)
|
|
|
|
|
- {
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
|
|
|
|
|
- FOC_CSO = mcCurOffset.IuOffset;
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
|
|
|
|
|
- FOC_CSO = mcCurOffset.IvOffset;
|
|
|
|
|
- SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
|
|
|
|
|
- FOC_CSO = mcCurOffset.Iw_busOffset;
|
|
|
|
|
- }
|
|
|
|
|
- #endif
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // SVPWM 配置
|
|
|
|
|
+ #if (SVPMW_Mode == SVPWM_7_Segment)
|
|
|
|
|
+ ClrBit(FOC_CR2, F5SEG);
|
|
|
|
|
+ #elif (SVPMW_Mode == SVPWM_5_Segment)
|
|
|
|
|
+ SetBit(FOC_CR2, F5SEG);
|
|
|
#endif
|
|
#endif
|
|
|
SetBit(DRV_CR, DRVEN);
|
|
SetBit(DRV_CR, DRVEN);
|
|
|
SetBit(DRV_CR, OCS);
|
|
SetBit(DRV_CR, OCS);
|
|
@@ -166,28 +144,28 @@ void Motor_Align(void)
|
|
|
if (McStaSet.SetFlag.AlignSetFlag == 0)
|
|
if (McStaSet.SetFlag.AlignSetFlag == 0)
|
|
|
{
|
|
{
|
|
|
McStaSet.SetFlag.AlignSetFlag = 1;
|
|
McStaSet.SetFlag.AlignSetFlag = 1;
|
|
|
- // FOC初始化
|
|
|
|
|
- FOC_Init();
|
|
|
|
|
- // 配置预定位的电流、KP、KI
|
|
|
|
|
- FOC_IDREF = 0;
|
|
|
|
|
- FOC_IQREF = 0;
|
|
|
|
|
- FOC_DKP = DQKP_Alignment;
|
|
|
|
|
- FOC_DKI = DQKI_Alignment;
|
|
|
|
|
- FOC_QKP = DQKP_Alignment;
|
|
|
|
|
- FOC_QKI = DQKI_Alignment;
|
|
|
|
|
- FOC_EKP = OBSW_KP_GAIN;
|
|
|
|
|
- FOC_EKI = OBSW_KI_GAIN;
|
|
|
|
|
- // 配置预定位角度
|
|
|
|
|
- #if (EstimateAlgorithm == SMO)
|
|
|
|
|
- FOC__ETHETA = FOC__THETA - 4836;
|
|
|
|
|
- #elif (EstimateAlgorithm == PLL)
|
|
|
|
|
- FOC__ETHETA = FOC__THETA;
|
|
|
|
|
- #endif
|
|
|
|
|
- DRV_CMR |= 0x03F;
|
|
|
|
|
- MOE = 1;
|
|
|
|
|
|
|
+ // FOC初始化
|
|
|
|
|
+ FOC_Init();
|
|
|
|
|
+ // 配置预定位的电流、KP、KI
|
|
|
|
|
+ FOC_IDREF = 0;
|
|
|
|
|
+ FOC_IQREF = 0;
|
|
|
|
|
+ FOC_DKP = DQKP_Alignment;
|
|
|
|
|
+ FOC_DKI = DQKI_Alignment;
|
|
|
|
|
+ FOC_QKP = DQKP_Alignment;
|
|
|
|
|
+ FOC_QKI = DQKI_Alignment;
|
|
|
|
|
+ FOC_EKP = OBSW_KP_GAIN;
|
|
|
|
|
+ FOC_EKI = OBSW_KI_GAIN;
|
|
|
|
|
+ // 配置预定位角度
|
|
|
|
|
+ #if (EstimateAlgorithm == SMO)
|
|
|
|
|
+ FOC__ETHETA = FOC__THETA - 4836;
|
|
|
|
|
+ #elif (EstimateAlgorithm == PLL)
|
|
|
|
|
+ FOC__ETHETA = FOC__THETA;
|
|
|
|
|
+ #endif
|
|
|
|
|
+ DRV_CMR |= 0x03F;
|
|
|
|
|
+ MOE = 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (mcFocCtrl.State_Count > (AlignmentHoldTime1 + AlignmentHoldTime2))
|
|
|
|
|
|
|
+ if (mcFocCtrl.State_Count > (AlignmentHoldTime1 + AlignmentHoldTime2))
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.CurrentAlignStatus = 0;
|
|
mcFocCtrl.CurrentAlignStatus = 0;
|
|
|
FOC__THETA = Align_Angle1;
|
|
FOC__THETA = Align_Angle1;
|
|
@@ -227,7 +205,7 @@ void Motor_Open(void)
|
|
|
FOC__ETHETA = FOC__THETA;
|
|
FOC__ETHETA = FOC__THETA;
|
|
|
#endif
|
|
#endif
|
|
|
FOC__EOME = 0;
|
|
FOC__EOME = 0;
|
|
|
- // 配置参数
|
|
|
|
|
|
|
+ // 配置参数
|
|
|
FOC_IDREF = 0;
|
|
FOC_IDREF = 0;
|
|
|
FOC_DKP = DQKPStart;
|
|
FOC_DKP = DQKPStart;
|
|
|
FOC_DKI = DQKIStart;
|
|
FOC_DKI = DQKIStart;
|
|
@@ -237,59 +215,63 @@ void Motor_Open(void)
|
|
|
FOC_EKI = OBSW_KI_GAIN;
|
|
FOC_EKI = OBSW_KI_GAIN;
|
|
|
/// 启动方式选择
|
|
/// 启动方式选择
|
|
|
#if (Open_Start_Mode == Omega_Start)
|
|
#if (Open_Start_Mode == Omega_Start)
|
|
|
- FOC_EFREQACC = Motor_OMEGA_RAMP_ACC;
|
|
|
|
|
- FOC_EFREQMIN = MOTOR_OMEGA_ACC_MIN;
|
|
|
|
|
- FOC_EFREQHOLD = MOTOR_OMEGA_ACC_END;
|
|
|
|
|
- SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | ANGM);
|
|
|
|
|
- #if (IFFDebugg)
|
|
|
|
|
{
|
|
{
|
|
|
- // 估算器禁止输出
|
|
|
|
|
- ClrBit(FOC_CR1, EFAE); // 禁止估算器强制输出
|
|
|
|
|
- ClrBit(FOC_CR1, RFAE); // 使能强拉
|
|
|
|
|
- ClrBit(FOC_CR1, ANGM); // 禁止估算器输出
|
|
|
|
|
|
|
+ FOC_EFREQACC = MOTOR_OMEGA_RAMP_ACC;
|
|
|
|
|
+ FOC_EFREQMIN = MOTOR_OMEGA_ACC_MIN;
|
|
|
|
|
+ FOC_EFREQHOLD = MOTOR_OMEGA_ACC_END;
|
|
|
|
|
+ SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | ANGM);
|
|
|
|
|
+ #if (IFFDebugg)
|
|
|
|
|
+ {
|
|
|
|
|
+ // 估算器禁止输出
|
|
|
|
|
+ ClrBit(FOC_CR1, EFAE); // 禁止估算器强制输出
|
|
|
|
|
+ ClrBit(FOC_CR1, RFAE); // 使能强拉
|
|
|
|
|
+ ClrBit(FOC_CR1, ANGM); // 禁止估算器输出
|
|
|
|
|
+ }
|
|
|
|
|
+ #endif
|
|
|
|
|
+ // 切入启动
|
|
|
|
|
+ mcFocCtrl.State_Count = 1200;
|
|
|
|
|
+ mcState = mcRun;
|
|
|
}
|
|
}
|
|
|
- #endif
|
|
|
|
|
#elif (Open_Start_Mode == Open_Start)
|
|
#elif (Open_Start_Mode == Open_Start)
|
|
|
- FOC_RTHEACC = MOTOR_OPEN_ACC;
|
|
|
|
|
- FOC__RTHESTEP = MOTOR_OPEN_ACC_MIN;
|
|
|
|
|
- FOC_RTHECNT = MOTOR_OPEN_ACC_CNT;
|
|
|
|
|
- SetReg(FOC_CR1, EFAE | RFAE | ANGM, RFAE);
|
|
|
|
|
- #elif (Open_Start_Mode == Open_Omega_Start)
|
|
|
|
|
- FOC_RTHEACC = MOTOR_OPEN_ACC;
|
|
|
|
|
- FOC__RTHESTEP = MOTOR_OPEN_ACC_MIN;
|
|
|
|
|
- FOC_RTHECNT = MOTOR_OPEN_ACC_CNT;
|
|
|
|
|
- FOC_EFREQACC = Motor_OMEGA_RAMP_ACC;
|
|
|
|
|
- FOC_EFREQMIN = MOTOR_OMEGA_ACC_MIN;
|
|
|
|
|
- FOC_EFREQHOLD = MOTOR_OMEGA_ACC_END;
|
|
|
|
|
- SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
|
|
|
|
|
- #endif
|
|
|
|
|
- // 不同启动方式下,切换到MCRUN状态
|
|
|
|
|
- #if (Open_Start_Mode == Open_Start)
|
|
|
|
|
-
|
|
|
|
|
- if (OpenRampCycles < (MOTOR_OPEN_ACC_CYCLE - 1))
|
|
|
|
|
{
|
|
{
|
|
|
- if (!ReadBit(FOC_CR1, RFAE))
|
|
|
|
|
|
|
+ FOC_RTHEACC = MOTOR_OPEN_ACC;
|
|
|
|
|
+ FOC__RTHESTEP = MOTOR_OPEN_ACC_MIN;
|
|
|
|
|
+ FOC_RTHECNT = MOTOR_OPEN_ACC_CNT;
|
|
|
|
|
+ SetReg(FOC_CR1, EFAE | RFAE | ANGM, RFAE);
|
|
|
|
|
+
|
|
|
|
|
+ // 切入启动
|
|
|
|
|
+ if (OpenRampCycles < (MOTOR_OPEN_ACC_CYCLE - 1))
|
|
|
{
|
|
{
|
|
|
- SetBit(FOC_CR1, RFAE);
|
|
|
|
|
- OpenRampCycles++;
|
|
|
|
|
|
|
+ if (!ReadBit(FOC_CR1, RFAE))
|
|
|
|
|
+ {
|
|
|
|
|
+ SetBit(FOC_CR1, RFAE);
|
|
|
|
|
+ OpenRampCycles++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ mcFocCtrl.State_Count = 2;
|
|
|
|
|
+ mcState = mcRun;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ FOC_EKP = OBSW_KP_GAIN_RUN4;
|
|
|
|
|
+ FOC_EKI = OBSW_KI_GAIN_RUN4;
|
|
|
}
|
|
}
|
|
|
- else
|
|
|
|
|
|
|
+ #elif (Open_Start_Mode == Open_Omega_Start)
|
|
|
{
|
|
{
|
|
|
- mcFocCtrl.State_Count = 2;
|
|
|
|
|
|
|
+ FOC_RTHEACC = MOTOR_OPEN_ACC;
|
|
|
|
|
+ FOC__RTHESTEP = MOTOR_OPEN_ACC_MIN;
|
|
|
|
|
+ FOC_RTHECNT = MOTOR_OPEN_ACC_CNT;
|
|
|
|
|
+ FOC_EFREQACC = Motor_OMEGA_RAMP_ACC;
|
|
|
|
|
+ FOC_EFREQMIN = MOTOR_OMEGA_ACC_MIN;
|
|
|
|
|
+ FOC_EFREQHOLD = MOTOR_OMEGA_ACC_END;
|
|
|
|
|
+ SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
|
|
|
|
|
+ // 切入启动
|
|
|
|
|
+ mcFocCtrl.State_Count = 2600;
|
|
|
mcState = mcRun;
|
|
mcState = mcRun;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- FOC_EKP = OBSW_KP_GAIN_RUN4;
|
|
|
|
|
- FOC_EKI = OBSW_KI_GAIN_RUN4;
|
|
|
|
|
- #elif (Open_Start_Mode == Open_Omega_Start)
|
|
|
|
|
- mcFocCtrl.State_Count = 2600;
|
|
|
|
|
- mcState = mcRun;
|
|
|
|
|
- #elif (Open_Start_Mode == Omega_Start)
|
|
|
|
|
- mcFocCtrl.State_Count = 1200;
|
|
|
|
|
- mcState = mcRun;
|
|
|
|
|
#endif
|
|
#endif
|
|
|
- // Q轴启动电流
|
|
|
|
|
|
|
+ // Q轴启动电流
|
|
|
FOC_IQREF = IQ_Start_CURRENT ;
|
|
FOC_IQREF = IQ_Start_CURRENT ;
|
|
|
}
|
|
}
|
|
|
|
|
|