|
@@ -456,8 +456,7 @@ static void AssitCuvApplPerVolt(void)
|
|
|
SWORD swSpdKpPu = 500; //Q10
|
|
|
UWORD uwVoltAccStep = 1, uwVoltDecStep = 3;
|
|
|
UWORD uwTmpStopCnt = 0;
|
|
|
- ORIG_COEF stStopOrigCoef = {-100, 0, 0};
|
|
|
- POLY_COEF stStopCoef;
|
|
|
+
|
|
|
// SLONG slTmp_a1, slTmp_b1, slTmp_c1;
|
|
|
|
|
|
|
|
@@ -554,14 +553,19 @@ static void AssitCuvApplPerVolt(void)
|
|
|
switch (Ass_FSM)
|
|
|
{
|
|
|
case Startup:
|
|
|
- ass_stCalCoef.swSmoothGain = Q12_1;
|
|
|
+// ass_stCalCoef.swSmoothGain = Q12_1;
|
|
|
+ ass_stCalCoef.swSmoothGain += ass_stParaSet.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;
|
|
|
+ if(ass_stCalCoef.swSmoothGain >= Q12_1)
|
|
|
+ {
|
|
|
+ ass_stCalCoef.swSmoothGain = Q12_1;
|
|
|
+ }
|
|
|
+
|
|
|
swSpdKpPu = 2000; //ass_stParaSet.uwStartUpCadNm;
|
|
|
slSpdErr = (SLONG)ass_stCalOut.swCadSpd2MotSpd - (SLONG)ass_stCalIn.uwSpdFbkAbsPu;
|
|
|
if(slSpdErr < 0)
|
|
|
{
|
|
|
slSpdErr = 0;
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
// ass_stCalCoef.StartFlag = 1;
|
|
|
/* Open Voltage Limit according SpdErr*/
|
|
|
if(ass_stCalCoef.StartFlag == 0)
|
|
@@ -571,15 +575,19 @@ static void AssitCuvApplPerVolt(void)
|
|
|
{
|
|
|
slTmpVoltLim = scm_swVsDcpLimPu;
|
|
|
}
|
|
|
- else if(slTmpVoltLim <= 0)
|
|
|
+ else if(slTmpVoltLim <= swTmpVoltPu)
|
|
|
{
|
|
|
- slTmpVoltLim =0;
|
|
|
+ slTmpVoltLim = swTmpVoltPu;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
ass_stCalOut.swVoltLimitPu = slTmpVoltLim;
|
|
|
|
|
|
- if(slSpdErr <= 800)
|
|
|
+ if(slSpdErr <= 1000)
|
|
|
{
|
|
|
- ass_stCalCoef.StartFlag=1;
|
|
|
+ ass_stCalCoef.StartFlag = 1;
|
|
|
}
|
|
|
}
|
|
|
else if(ass_stCalCoef.StartFlag ==1 )
|
|
@@ -609,7 +617,8 @@ static void AssitCuvApplPerVolt(void)
|
|
|
if(ass_pvt_swVoltCnt > 30)
|
|
|
{
|
|
|
Ass_FSM = TorqueAssit;
|
|
|
- //ass_stCalCoef.StartFlag=0;
|
|
|
+ ass_stCalCoef.StartFlag=0;
|
|
|
+ ass_pvt_swVoltCnt=0;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -617,30 +626,11 @@ static void AssitCuvApplPerVolt(void)
|
|
|
if((ass_stCalIn.uwcadancePer == 0) || (ass_stCalIn.uwGearSt == 0))
|
|
|
{
|
|
|
/* When CandanceFreq=0 or BikeGear=0*/
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
Ass_FSM = ReduceCurrent;
|
|
|
}
|
|
|
else if(ass_stCalIn.uwtorquePer <= (ass_stCalCoef.uwAssStopThreshold))
|
|
|
- {
|
|
|
- /* When InstantTorq < StopTorq and hold half circle */
|
|
|
-// if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
-// {
|
|
|
-// ass_stCalCoef.swAss2SpdCNT++;
|
|
|
-// }
|
|
|
-// if (ass_stCalCoef.swAss2SpdCNT > (ass_stParaCong.uwCadPulsePerCirc >> 1))
|
|
|
-// {
|
|
|
-// ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
-// asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
-// asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
-// ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
-// ass_stCalCoef.sw2StopCNT = 0;
|
|
|
-// Ass_FSM = ReduceCurrent;
|
|
|
-// }
|
|
|
-
|
|
|
+ {
|
|
|
ass_stCalCoef.swAss2SpdCNT++;
|
|
|
uwTmpStopCnt = ass_stCalIn.uwcadance;//((ULONG)1000<<20)/(ass_CalIn.uwcadance * FBASE) ;
|
|
|
if(uwTmpStopCnt < 300)
|
|
@@ -653,11 +643,7 @@ static void AssitCuvApplPerVolt(void)
|
|
|
}
|
|
|
if(ass_stCalCoef.swAss2SpdCNT > uwTmpStopCnt)
|
|
|
{
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
Ass_FSM = ReduceCurrent;
|
|
|
}
|
|
|
}
|
|
@@ -668,35 +654,34 @@ static void AssitCuvApplPerVolt(void)
|
|
|
|
|
|
break;
|
|
|
case TorqueAssit:
|
|
|
+
|
|
|
+ /* 启动系数 */
|
|
|
+ ass_stCalCoef.swSmoothGain += ass_stParaSet.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;
|
|
|
+ if(ass_stCalCoef.swSmoothGain >= Q12_1)
|
|
|
+ {
|
|
|
+ ass_stCalCoef.swSmoothGain = Q12_1;
|
|
|
+ }
|
|
|
+
|
|
|
/* Reduce Voltage Limit When LPFTorq < Switch1TorqThreshold */
|
|
|
- if(ass_stCalIn.uwtorquelpf >= ass_stCalCoef.uwSwitch1TorqThreshold)
|
|
|
- {
|
|
|
+// if(ass_stCalIn.uwtorquelpf >= ass_stCalCoef.uwSwitch1TorqThreshold)
|
|
|
+// {
|
|
|
ass_stCalOut.swVoltLimitPu += uwVoltAccStep; //ass_stCalCoef.uwStartUpGainAddStep;
|
|
|
- }
|
|
|
- else if (ass_stCalIn.uwtorquelpf <= ass_stCalCoef.uwSwitch1TorqThreshold)
|
|
|
- {
|
|
|
- ass_stCalOut.swVoltLimitPu -= uwVoltDecStep; //ass_stCalCoef.uwSpeedConstantCommand;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
+// }
|
|
|
+// else if (ass_stCalIn.uwtorquelpf <= ass_stCalCoef.uwSwitch1TorqThreshold)
|
|
|
+// {
|
|
|
+// ass_stCalOut.swVoltLimitPu -= uwVoltDecStep; //ass_stCalCoef.uwSpeedConstantCommand;
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// }
|
|
|
if (ass_stCalOut.swVoltLimitPu > scm_swVsDcpLimPu)
|
|
|
{
|
|
|
ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
}
|
|
|
- else if (ass_stCalOut.swVoltLimitPu <= (swTmpVoltPu + ass_stParaSet.uwStartUpCadNm))
|
|
|
- {
|
|
|
- ass_stCalOut.swVoltLimitPu = swTmpVoltPu + ass_stParaSet.uwStartUpCadNm;
|
|
|
- }
|
|
|
-
|
|
|
- /* Torque Clzloop Test */
|
|
|
-// if(ass_stCalOut.swVoltLimitPu < (scm_swVsDcpLimPu - uwVoltAccStep))
|
|
|
-// {
|
|
|
-// ass_stCalOut.swVoltLimitPu += uwVoltAccStep;//ass_stCalCoef.uwStartUpGainAddStep;
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
-// }
|
|
|
+// else if (ass_stCalOut.swVoltLimitPu <= (swTmpVoltPu + ass_stParaSet.uwStartUpCadNm))
|
|
|
+// {
|
|
|
+// ass_stCalOut.swVoltLimitPu = swTmpVoltPu + ass_stParaSet.uwStartUpCadNm;
|
|
|
+// }
|
|
|
|
|
|
/* TorqueRef Select Coef */
|
|
|
ass_stCalCoef.swTorqFilterGain += 4; // Q14 转矩滤波方式切换系数
|
|
@@ -709,40 +694,12 @@ static void AssitCuvApplPerVolt(void)
|
|
|
if((ass_stCalIn.uwcadancePer == 0) || (ass_stCalIn.uwGearSt == 0))
|
|
|
{
|
|
|
/* When CandanceFreq=0 or BikeGear=0*/
|
|
|
- ass_pvt_swVoltCnt=0;
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
ass_stCalOut.blTorqPIFlg = FALSE;
|
|
|
ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
Ass_FSM = ReduceCurrent;
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
else if(ass_stCalIn.uwtorquePer <= (ass_stCalCoef.uwAssStopThreshold))
|
|
|
- {
|
|
|
- /* When InstantTorq < StopTorq and hold half circle */
|
|
|
-// if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
-// {
|
|
|
-// ass_stCalCoef.swAss2SpdCNT++;
|
|
|
-// }
|
|
|
-// if (ass_stCalCoef.swAss2SpdCNT > (ass_stParaCong.uwCadPulsePerCirc >> 1 ) || ass_stCalIn.uwcadancePer == 0)
|
|
|
-// {
|
|
|
-// ass_pvt_uwTorqAccCnt=0;
|
|
|
-// ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
-// asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
-// asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
-// ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
-// ass_stCalCoef.sw2StopCNT = 0;
|
|
|
-// stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
-// stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
-// ass_stCalOut.blTorqPIFlg = FALSE;
|
|
|
-// Ass_FSM = ReduceCurrent;
|
|
|
-// }
|
|
|
-
|
|
|
+ {
|
|
|
ass_stCalCoef.swAss2SpdCNT++;
|
|
|
uwTmpStopCnt = ass_stCalIn.uwcadance;//((ULONG)1000<<20)/(ass_CalIn.uwcadance * FBASE) ;
|
|
|
if(uwTmpStopCnt < 300)
|
|
@@ -754,12 +711,8 @@ static void AssitCuvApplPerVolt(void)
|
|
|
uwTmpStopCnt = 1000;
|
|
|
}
|
|
|
if(ass_stCalCoef.swAss2SpdCNT > uwTmpStopCnt)
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
+ {
|
|
|
ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
ass_stCalOut.blTorqPIFlg = FALSE;
|
|
|
Ass_FSM = ReduceCurrent;
|
|
|
}
|
|
@@ -770,199 +723,21 @@ static void AssitCuvApplPerVolt(void)
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
- case SpeedAssit:
|
|
|
- ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
- /*电机速度指令斜坡,保证低速运行不停机*/
|
|
|
- if (ass_stCalOut.swSpeedRef >= 0) //ass_stCalCoef.uwSpeedConstantCommand) // Q15
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef -= 100;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef += 10;
|
|
|
- }
|
|
|
- if(ass_stCalOut.swSpeedRef < 0)
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = 0;
|
|
|
- }
|
|
|
|
|
|
- asr_stTorqSpdPIIn.swSpdRefPu = ass_stCalIn.swDirection*ass_stCalOut.swSpeedRef;
|
|
|
- asr_stTorqSpdPIIn.swSpdFdbPu = ass_stCalIn.swSpdFbkPu; // Q15
|
|
|
- asr_stTorqSpdPIIn.swIqMaxPu = ass_stCalCoef.swSpdLoopAbsCurMax; // ass_stCalCoef.uwCurrentMaxPu;
|
|
|
- asr_stTorqSpdPIIn.swIqMinPu = -ass_stCalCoef.swSpdLoopAbsCurMax; // ass_stCalCoef.uwCurrentMaxPu;
|
|
|
- asr_voSpdPI(&asr_stTorqSpdPIIn, &asr_stTorqSpdPICoef, &asr_stTorqSpdPIOut);
|
|
|
- ass_stCalOut.swTorSpdLoopCurrentTemp = abs(asr_stTorqSpdPIOut.swIqRefPu);
|
|
|
-
|
|
|
- /* Switch to StopAssit FSM */
|
|
|
- if(abs(ass_stCalIn.swSpdFbkPu) < SPD_RPM2PU(200))
|
|
|
- {
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- ass_stCalCoef.StartFlag = 0;
|
|
|
- ass_stCalCoef.uwStartUpTargetGain = 0;
|
|
|
- Ass_FSM = StopAssit;
|
|
|
- ass_voMoveAverageFilterClear(&ass_stTorqMafValue);
|
|
|
- stStopOrigCoef.k = 0;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
- ass_stCalCoef.swCoefStep = 0;
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- case Spd2Torq:
|
|
|
- /*加速啮合,速度指令斜坡快速追踪踏频*/
|
|
|
- if (ass_stCalIn.uwSpdFbkAbsPu < ((ass_stCalOut.swCadSpd2MotSpd*3) >> 1))
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef += 100;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-// ass_stCalOut.swSpeedRef -= 4;
|
|
|
- }
|
|
|
- if (ass_stCalOut.swSpeedRef > ((ass_stCalOut.swCadSpd2MotSpd*3) >> 1))
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ((ass_stCalOut.swCadSpd2MotSpd*3) >> 1);
|
|
|
- }
|
|
|
- asr_stTorqSpdPIIn.swSpdRefPu = ass_stCalIn.swDirection*ass_stCalOut.swSpeedRef;
|
|
|
- asr_stTorqSpdPIIn.swSpdFdbPu = ass_stCalIn.swSpdFbkPu; // Q15
|
|
|
- asr_stTorqSpdPIIn.swIqMaxPu = ass_stCalCoef.swSpdLoopAbsCurMax; // Q14
|
|
|
- asr_stTorqSpdPIIn.swIqMinPu = -ass_stCalCoef.swSpdLoopAbsCurMax; // Q14
|
|
|
- asr_voSpdPI(&asr_stTorqSpdPIIn, &asr_stTorqSpdPICoef, &asr_stTorqSpdPIOut);
|
|
|
- ass_stCalOut.swTorSpdLoopCurrentTemp = abs(asr_stTorqSpdPIOut.swIqRefPu);
|
|
|
- /*啮合后切换至带速启动*/
|
|
|
- ass_pvt_uwSpd2TorqCnt++;
|
|
|
- if (ass_pvt_uwSpd2TorqCnt > 150)//ass_stCalIn.uwSpdFbkAbsPu > ass_stCalOut.swCadSpd2MotSpd )// && ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssStopThreshold) // Q15
|
|
|
- {
|
|
|
- ass_stCalCoef.StartFlag = 0;
|
|
|
- ass_stCalCoef.uwStartUpTargetGain = 0;
|
|
|
- swTmpSpdtoTorqCur = ass_swTorq2CurPu(swTeTorAssitPu1);
|
|
|
- slTmpSmoothCur = ((ULONG)abs(asr_stTorqSpdPIOut.swIqRefPu) << 12) /
|
|
|
- swTmpSpdtoTorqCur; // abs(asr_stTorqSpdPIOut.swIqRefPu)/ass_swTorq2CurPu(swTeTorAssitPu1)
|
|
|
- if (slTmpSmoothCur > Q12_1)
|
|
|
- {
|
|
|
- slTmpSmoothCur = Q12_1;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
- ass_stCalCoef.swSmoothGain = 0;//Q12_1 >> 1;
|
|
|
- ass_pvt_uwSpd2TorqCnt = 0;
|
|
|
-
|
|
|
- Ass_FSM = StartupCruise;
|
|
|
- }
|
|
|
-
|
|
|
- /* Switch to ReduceCurrent FSM */
|
|
|
- if((ass_stCalIn.uwcadancePer == 0) || (ass_stCalIn.uwGearSt == 0))
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- Ass_FSM = ReduceCurrent;
|
|
|
- stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
- }
|
|
|
- else if ((ass_stCalIn.uwtorquePer <= ass_stCalCoef.uwAssStopThreshold)) // Q14
|
|
|
- {
|
|
|
- if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
- {
|
|
|
- ass_stCalCoef.swAss2SpdCNT++;
|
|
|
- }
|
|
|
- if (ass_stCalCoef.swAss2SpdCNT > (ass_stParaCong.uwCadPulsePerCirc >> 1)|| ass_stCalIn.uwcadance == 0)
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- Ass_FSM = ReduceCurrent;
|
|
|
- stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case StartupCruise:
|
|
|
- if (ass_stCalCoef.StartFlag == 0)
|
|
|
- {
|
|
|
- ass_stCalCoef.swSmoothGain += ass_stCalCoef.uwStartUpGainAddStep;// / ass_stCalIn.uwGearSt; //助力比斜坡,与用户设置以及档位相关
|
|
|
- if (ass_stCalCoef.swSmoothGain >= ass_stCalCoef.uwStartupCruiseGain)
|
|
|
- {
|
|
|
- ass_stCalCoef.StartFlag = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ass_stCalCoef.StartFlag == 1)
|
|
|
- {
|
|
|
- ass_stCalCoef.swSmoothGain -= ass_stCalCoef.uwStartUpGainAddStep;// / ass_stCalIn.uwGearSt; //助力比斜坡,与用户设置以及档位相关
|
|
|
- if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
- {
|
|
|
- ass_stCalCoef.swCadanceCNT++;
|
|
|
- }
|
|
|
- if (ass_stCalCoef.swSmoothGain < Q12_1)
|
|
|
- {
|
|
|
- ass_stCalCoef.swSmoothGain = Q12_1;
|
|
|
- if (ass_stCalCoef.swCadanceCNT > ass_stCalCoef.uwStartUpTimeCadenceCnt)
|
|
|
- {
|
|
|
- Ass_FSM = TorqueAssit;
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.swCadanceCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- /* Switch to ReduceCurrent FSM */
|
|
|
- if((ass_stCalIn.uwcadancePer == 0) || (ass_stCalIn.uwGearSt == 0))
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- Ass_FSM = ReduceCurrent;
|
|
|
- stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
- }
|
|
|
- else if(ass_stCalIn.uwtorquePer <= (ass_stCalCoef.uwAssStopThreshold))
|
|
|
- {
|
|
|
- if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
- {
|
|
|
- ass_stCalCoef.swAss2SpdCNT++;
|
|
|
- }
|
|
|
- if (ass_stCalCoef.swAss2SpdCNT > (ass_stParaCong.uwCadPulsePerCirc >> 1) || ass_stCalIn.uwcadancePer == 0)
|
|
|
- {
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- Ass_FSM = ReduceCurrent;
|
|
|
- stStopOrigCoef.k = (SLONG)ass_stCalCoef.swSmoothGain;
|
|
|
- stStopCoef = ass_stPolynomialcenter(&stStopOrigCoef);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalCoef.swAss2SpdCNT = 0;
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
case ReduceCurrent:
|
|
|
/* Switch to StopAssit FSM */
|
|
|
if(ass_stCalCoef.swSmoothGain <= 0)
|
|
|
{
|
|
|
ass_stCalCoef.swSmoothGain = 0;
|
|
|
ass_stCalCoef.swTorqFilterGain = 0;
|
|
|
- ass_voMoveAverageFilterClear(&ass_stTorqMafValue);
|
|
|
ass_stCalCoef.swCadanceGain = 0;
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu; // Q15 Q10 (9.625)
|
|
|
- asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_stCalOut.swTorAssistCurrent) << 16;
|
|
|
- asr_stTorqSpdPIOut.swIqRefPu = ass_stCalOut.swTorAssistCurrent;
|
|
|
Ass_FSM = StopAssit;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/* Reduce Curret Coef to Zero*/
|
|
|
ass_stCalCoef.swSmoothGain -=40;
|
|
|
+ ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
}
|
|
|
|
|
|
/* Switch to Startup FSM */
|
|
@@ -970,11 +745,11 @@ static void AssitCuvApplPerVolt(void)
|
|
|
{
|
|
|
Ass_FSM = Startup;
|
|
|
ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu;
|
|
|
- ass_stCalCoef.sw2StopCNT = 0;
|
|
|
ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
+
|
|
|
case StopAssit:
|
|
|
ass_stCalOut.swTorSpdLoopCurrentTemp = 0;
|
|
|
/* Switch to Startup FSM */
|
|
@@ -983,8 +758,7 @@ static void AssitCuvApplPerVolt(void)
|
|
|
if (ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadance > 0)
|
|
|
{
|
|
|
ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- ass_pvt_swVoltCnt = 0;
|
|
|
- ass_stCalOut.swVoltLimitPu = swTmpVoltPu;
|
|
|
+ ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
ass_pvt_stCurLpf.slY.sw.hi = 0;
|
|
|
Ass_FSM = Startup;
|
|
|
}
|
|
@@ -992,12 +766,9 @@ static void AssitCuvApplPerVolt(void)
|
|
|
else
|
|
|
{
|
|
|
if (ass_stCalIn.uwtorquelpf > ((ass_stCalCoef.uwAssThreshold * 3)>>3) && ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadance > 0)
|
|
|
- {
|
|
|
- ass_pvt_uwSpd2TorqCnt = 0;
|
|
|
- ass_stCalOut.swSpeedRef = ass_stCalIn.uwSpdFbkAbsPu;
|
|
|
+ {
|
|
|
ass_stCalCoef.sw2StopCNT = 0;
|
|
|
- ass_pvt_swVoltCnt = 0;
|
|
|
- ass_stCalOut.swVoltLimitPu = swTmpVoltPu;
|
|
|
+ ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
|
|
|
ass_pvt_stCurLpf.slY.sw.hi = 0;
|
|
|
Ass_FSM = Startup;
|
|
|
}
|
|
@@ -1142,68 +913,7 @@ static void AssitCuvApplPerVolt(void)
|
|
|
ass_stCalOut.swTorAssistCurrentTemp = ass_stCalIn.swDirection *(ass_stCalOut.swTorAss2CurrentTemp + ass_stCalOut.swCadAss2CurrentTemp);
|
|
|
#endif
|
|
|
break;
|
|
|
- case StartupCruise:
|
|
|
- swTeTorAssitPu2 = swTeTorAssitPu1 ; // Q14+Q12-Q12+Q12-Q12=Q14
|
|
|
- swTeCadAssitPu2 = swTeCadAssitPu1 ; // Q14+Q12-Q12+Q12-Q12=Q14
|
|
|
- ass_stCalOut.swTorAss2CurrentTemp = ass_swTorq2CurPu(swTeTorAssitPu2); // Q14 电流指令计算
|
|
|
- ass_stCalOut.swCadAss2CurrentTemp = ass_swTorq2CurPu(swTeCadAssitPu2); // Q14 电流指令计算
|
|
|
- if (ass_stCalOut.swTorAss2CurrentTemp > ass_stCalCoef.swCurrentmax_torAssPu)
|
|
|
- {
|
|
|
- ass_stCalOut.swTorAss2CurrentTemp = ass_stCalCoef.swCurrentmax_torAssPu;
|
|
|
- }
|
|
|
- if (ass_stCalOut.swCadAss2CurrentTemp > ass_stCalCoef.swCurrentmax_cadAssPu)
|
|
|
- {
|
|
|
- ass_stCalOut.swCadAss2CurrentTemp = ass_stCalCoef.swCurrentmax_cadAssPu;
|
|
|
- }
|
|
|
-#if CURSWITCH
|
|
|
- /* Ajust CurrentRef growth and decline rate */
|
|
|
- ass_stCalOut.swTorRefTarget = ass_stCalOut.swTorAss2CurrentTemp + ass_stCalOut.swCadAss2CurrentTemp;
|
|
|
- if((ass_stCalOut.swTorRefTarget - ass_stCalOut.swTorRefEnd) > 2)
|
|
|
- {
|
|
|
- ass_pvt_uwTorqAccCnt++;
|
|
|
- if(ass_pvt_uwTorqAccCnt >= 1)
|
|
|
- {
|
|
|
- ass_stCalOut.swTorRefEnd += uwTorqAccStep;
|
|
|
- ass_pvt_uwTorqAccCnt = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(((ass_stCalOut.swTorRefTarget - ass_stCalOut.swTorRefEnd) < (-1)))
|
|
|
- {
|
|
|
- if (ass_stCalIn.uwcadance != ass_stCalIn.uwcadancelast)
|
|
|
- {
|
|
|
- ass_stCalOut.swTorRefEnd -= uwTorqDecStep;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalOut.swTorRefEnd = ass_stCalOut.swTorRefTarget;
|
|
|
- }
|
|
|
-
|
|
|
- if(ass_stCalOut.swTorRefEnd < ass_stCalOut.swTorSpdLoopCurrentTemp)
|
|
|
- {
|
|
|
- ass_stCalOut.swTorRefEnd = ass_stCalOut.swTorSpdLoopCurrentTemp;
|
|
|
- //ass_stCalOut.swTorSpdLoopCurrentTemp = 0; // 启动前电流最小为速度环电流,启动后最小电流为0
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalOut.swTorRefEnd = ass_stCalOut.swTorRefEnd;
|
|
|
- }
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = ass_stCalIn.swDirection * ass_stCalOut.swTorRefEnd;
|
|
|
-
|
|
|
-#else
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = ass_stCalOut.swTorAss2CurrentTemp + ass_stCalOut.swCadAss2CurrentTemp;
|
|
|
- if(ass_stCalOut.swTorAssistCurrentTemp < ass_stCalOut.swTorSpdLoopCurrentTemp)
|
|
|
- {
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = ass_stCalIn.swDirection*ass_stCalOut.swTorSpdLoopCurrentTemp;
|
|
|
- //ass_stCalOut.swTorSpdLoopCurrentTemp = 0; // 启动前电流最小为速度环电流,启动后最小电流为0
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = ass_stCalIn.swDirection * ass_stCalOut.swTorAssistCurrentTemp;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- break;
|
|
|
+
|
|
|
case ReduceCurrent:
|
|
|
swTeTorAssitPu2 = swTeTorAssitPu1; // Q14+Q12-Q12+Q12-Q12=Q14
|
|
|
swTeCadAssitPu2 = swTeCadAssitPu1; // Q14+Q12-Q12+Q12-Q12=Q14
|
|
@@ -1219,13 +929,7 @@ static void AssitCuvApplPerVolt(void)
|
|
|
}
|
|
|
ass_stCalOut.swTorAssistCurrentTemp = ass_stCalIn.swDirection *(ass_stCalOut.swTorAss2CurrentTemp + ass_stCalOut.swCadAss2CurrentTemp);
|
|
|
break;
|
|
|
- case SpeedAssit:
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_stCalOut.swTorSpdLoopCurrentTemp;
|
|
|
- break;
|
|
|
- case Spd2Torq:
|
|
|
- ass_stCalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_stCalOut.swTorSpdLoopCurrentTemp;
|
|
|
- ass_stCalOut.swTorRefEnd = ass_stCalOut.swTorAssistCurrentTemp;
|
|
|
- break;
|
|
|
+
|
|
|
case StopAssit:
|
|
|
ass_stCalOut.swTorAssistCurrentTemp = 0;
|
|
|
ass_stCalOut.swTorRefEnd = 0;
|