Explorar el Código

无感运行异常,切换到ClzLook时无法转动

dd hace 2 meses
padre
commit
80fc92520c

+ 383 - 0
2.MotorDrive/Lib/obs.c

@@ -0,0 +1,383 @@
+/************************************************************************
+ Project:             Welling Motor Control Paltform
+ Filename:            obs.c
+ Partner Filename:    obs.h
+ Description:         The position and speed observer for PMSM
+ Complier:            IAR Embedded Workbench for ARM 7.80, IAR Systems.
+ CPU TYPE :           GD32F3x0
+*************************************************************************
+ Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
+ All rights reserved.
+*************************************************************************
+*************************************************************************
+Revising History (ECL of this file):
+
+************************************************************************/
+
+/************************************************************************
+ Beginning of File, do not put anything above here except notes
+ Compiler Directives:
+*************************************************************************/
+#ifndef _OBS_C_
+#define _OBS_C_
+#endif
+
+/************************************************************************
+ Included File:
+*************************************************************************/
+#include "syspar.h"
+#include "user.h"
+
+/************************************************************************
+ Private Variables
+*************************************************************************/
+SWORD obs_pvt_swEMFAlphaCompPu = 0; // Q14, Output stationary alfa-axis EMF value
+SWORD obs_pvt_swEMFBetaCompPu = 0;  // Q14, Output stationary beta-axis EMF value
+SLONG obs_pvt_slDeltaErrPu = 0;     // Q15, Last delta value for PLL PI control
+
+/************************************************************************
+ Constant Table (N/A)
+*************************************************************************/
+
+/************************************************************************
+ Exported Functions:
+*************************************************************************/
+/***************************************************************
+ Function: obs_voObsInit;
+ Description: observer output initialization
+ Call by:
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A;
+ Reference: N/A
+****************************************************************/
+void obs_voObsInit(void)
+{
+    obs_stObsOutPu.slFluxAlphaPu = 0;  // Q26
+    obs_stObsOutPu.slFluxBetaPu = 0;   // Q26
+    obs_stObsOutPu.swElecFreqPu = 0;   // Q15
+    obs_stObsOutPu.slElecFreqPu = 0;   // Q29
+    obs_stObsOutPu.uwElecThetaPu = 0;  // Q15
+    obs_stObsOutPu.slElecThetaPu = 0;  // Q29
+    obs_stObsOutPu.swActiveFluxPu = 0; // Q10
+    obs_stObsOutPu.swFluxAlphaPu = 0;  // Q10
+    obs_stObsOutPu.swFluxBetaPu = 0;   // Q10
+
+    obs_stFluxAlphaPIOut.slURefPu = 0;  // Q28
+    obs_stFluxAlphaPIOut.swURefPu = 0;  // Q14
+    obs_stFluxAlphaPIOut.swErrZ1Pu = 0; // Q10
+
+    obs_stFluxBetaPIOut.slURefPu = 0;  // Q28
+    obs_stFluxBetaPIOut.swURefPu = 0;  // Q14
+    obs_stFluxBetaPIOut.swErrZ1Pu = 0; // Q10
+
+    obs_pvt_swEMFAlphaCompPu = 0;
+    obs_pvt_swEMFBetaCompPu = 0;
+    obs_pvt_slDeltaErrPu = 0;
+}
+
+/***************************************************************
+ Function: obs_voObsCoef;
+ Description: Coefficient calculation for "asr_voSpdPI"
+ Call by: functions in main loop;
+ Input Variables: ASR_SPDPI_COFIN
+ Output/Return Variables: ASR_SPDPI_COF
+ Subroutine Call: N/A;
+ Reference: N/A
+****************************************************************/
+void obs_voObsCoef(OBS_COF_IN *in, OBS_COF *out)
+{
+    UWORD uwWebRadps;
+    UWORD uwMvcPu;
+    ULONG ulDamper;
+    UWORD uwDamper;
+    ULONG ulKp;
+    ULONG ulKi;
+    UWORD uwDampingRatio;
+    UWORD uwCrossFreq;
+
+    if (in->uwRbOm < 10)
+    {
+        in->uwRbOm = 10;
+    }
+
+    if (in->uwLbHm < 10)
+    {
+        in->uwLbHm = 10;
+    }
+
+    if (in->uwFluxbWb < 10)
+    {
+        in->uwFluxbWb = 10;
+    }
+
+    if (in->uwFbHz < 10)
+    {
+        in->uwFbHz = 10;
+    }
+    else if (in->uwFbHz > 10000)
+    {
+        in->uwFbHz = 10000;
+    }
+
+    if (in->uwFreqTbcHz < 10)
+    {
+        in->uwFreqTbcHz = 10;
+    }
+
+    if (in->uwSpdPllMcoef > 100)
+    {
+        in->uwSpdPllMcoef = 100;
+    }
+
+    if ((in->uwFluxWb >> 5) > in->uwFluxbWb)
+    {
+        in->uwFluxWb = (in->uwFluxbWb << 5);
+    }
+
+    if (in->uwRsOm > in->uwRbOm)
+    {
+        in->uwRsOm = in->uwRbOm;
+    }
+
+    if ((in->uwLqHm >> 5) > in->uwLbHm)
+    {
+        in->uwLqHm = (in->uwLbHm << 5);
+    }
+
+    if ((in->uwLdHm >> 5) > in->uwLbHm)
+    {
+        in->uwLdHm = (in->uwLbHm << 5);
+    }
+
+    if (in->uwFbHz > ((ULONG)in->uwFreqTbcHz * 0x2AAA >> 15))
+    {
+        in->uwFbHz = (ULONG)in->uwFreqTbcHz * 0x2AAA >> 15;
+    }
+
+    uwWebRadps = (ULONG)2 * 31416 * in->uwFbHz / 10000; // unit: rad/s, Electrical radian frequency base
+
+    if (in->uwFluxDampingRatio < 1)
+    {
+        in->uwFluxDampingRatio = 1;
+    }
+    else if (in->uwFluxDampingRatio > 100)
+    {
+        in->uwFluxDampingRatio = 100;
+    }
+
+    if (in->uwFluxCrossFreqHz < 1)
+    {
+        in->uwFluxCrossFreqHz = 1;
+    }
+    else if (in->uwFluxCrossFreqHz > 100)
+    {
+        in->uwFluxCrossFreqHz = 100;
+    }
+
+    out->uwFluxPPu = ((ULONG)in->uwFluxWb << 10) / in->uwFluxbWb;    // Q10
+    out->uwRsPu = ((ULONG)in->uwRsOm << 15) / in->uwRbOm;            // Q15
+    out->uwLqPu = ((ULONG)in->uwLqHm << 10) / in->uwLbHm;            // Q10
+    out->uwLdPu = ((ULONG)in->uwLdHm << 10) / in->uwLbHm;            // Q10
+    out->uwCurTsPu = ((ULONG)205887 * in->uwFbHz) / in->uwFreqTbcHz; // Q15, Q15(2pi)-->205887
+    out->uwCurTs = ((ULONG)in->uwFbHz << 10) / in->uwFreqTbcHz;      // Q10, TBC time
+
+    /************************Speed PLL Coefficient*****************************/
+    uwMvcPu = ((ULONG)in->uwSpdPllWvcHz << 10) / in->uwFbHz; // Q10
+
+    /* PLL Kp=M*w/sqrt(1+M^2) */
+    ulDamper = (1 + in->uwSpdPllMcoef * in->uwSpdPllMcoef) << 8;              // Q8
+    uwDamper = mth_slSqrt(ulDamper);                                          // Q4
+    out->uwSpdPllKpPu = ((ULONG)in->uwSpdPllMcoef * uwMvcPu / uwDamper) << 8; // Q10-Q4+Q8=Q14
+
+    /* PLL Ki=w^2*T_cnt_ctrl/sqrt(1+M^2) */
+    out->uwSpdPllKiPu = ((((ULONG)uwMvcPu * out->uwCurTsPu) / uwDamper) * uwMvcPu) >> 17; // Q10+Q15-Q4+Q10-Q17=Q14
+
+    /**************************Flux PI Coefficient*****************************/
+    /* Flux PI regulator Kp=2*k*w */
+    uwDampingRatio = ((ULONG)in->uwFluxDampingRatio << 12) / 10;           // Q12
+    uwCrossFreq = ((ULONG)2 * 31416 * in->uwFluxCrossFreqHz / 10000) << 8; // Q8
+
+    ulKp = (ULONG)uwDampingRatio * uwCrossFreq * 2; // Q12+Q8=Q20
+    out->uwFluxKpPu = ulKp / uwWebRadps >> 2;       // Q20-Q2=Q18
+
+    /* Flux PI regulator Ki=w^2 */
+    ulKi = (ULONG)uwCrossFreq * uwCrossFreq;                                   // Q8+Q8=Q16
+    out->uwFluxKitPu = (ulKi / uwWebRadps * out->uwCurTsPu / uwWebRadps) >> 3; // Q16+Q15-Q3=Q28
+}
+
+/***************************************************************
+ Function: obs_voObsCalc
+ Description: speed and position caculate
+ Call by: tbc_it
+ Input Variables:
+ Output/Return Variables:
+ Subroutine Call:
+ Reference: N/A
+****************************************************************/
+void obs_voObsCalc(OBS_IN *in, OBS_COF *coef, OBS_OUT *out)
+{
+    SWORD  swEMFAlphaPu, swEMFBetaPu;
+    SWORD  swRtFluxAlphaPu, swRtFluxBetaPu;
+    SINCOS sincosTmp; //, sincosTmp1;
+    SLONG  slDeltaTmpPu, slDeltaErrTmpPu;
+    SLONG  slKpTmpPu, slKitTmpPu;
+    SLONG  slSpdRefPu;
+    SLONG  slPreRtPosPu, slActRtPosPu;
+    UWORD  uwPreRtPosPu;
+    SWORD  swFluxDPu, swFluxQPu;
+    SWORD  swMaxVsPu;
+
+    /*****************************Current Model*****************************/
+    /* Predict the rotor Angle according to last rotor angle and speed */
+    slPreRtPosPu = out->slElecThetaPu + ((out->slElecFreqPu >> 10) * coef->uwCurTs); // Q29-Q10+Q10=Q29
+    if (slPreRtPosPu >= 0x20000000)                                                  // Q29
+    {
+        slPreRtPosPu -= 0x20000000;
+    }
+    else if (slPreRtPosPu < 0)
+    {
+        slPreRtPosPu += 0x20000000;
+    }
+    uwPreRtPosPu = (UWORD)(slPreRtPosPu >> 14); // Q29-Q14=Q15
+    mth_voSinCos(uwPreRtPosPu, &sincosTmp);
+
+    /* Current Park (I_alpha I_beta -> Id Iq) */
+    obs_stParkInPu.swAlphaPu = in->swIalphaPu; // Q14
+    obs_stParkInPu.swBetaPu = in->swIbetaPu;   // Q14
+    obs_stParkInPu.uwThetaPu = uwPreRtPosPu;   // Q15
+    crd_voPark(&obs_stParkInPu, &obs_stFluxParkPu);
+
+    /* Flux_D = Ld*id+Flux_PM; Flux_Q = Lq*iq */
+    swFluxDPu = coef->uwFluxPPu + (((SLONG)obs_stFluxParkPu.swDPu * coef->uwLdPu) >> 14); // Q14+Q10-Q14=Q10
+    swFluxQPu = ((SLONG)obs_stFluxParkPu.swQPu * coef->uwLqPu) >> 14;                     // Q14+Q10-Q14=Q10
+
+    /* Flux IPark (Fluxd Fluxq -> Fluxalpha Fluxbeta) */
+    obs_stIParkInPu.swDPu = swFluxDPu;        // Q10
+    obs_stIParkInPu.swQPu = swFluxQPu;        // Q10
+    obs_stIParkInPu.uwThetaPu = uwPreRtPosPu; // Q15
+    crd_voIPark(&obs_stIParkInPu, &obs_stFluxIParkPu);
+
+    /*****************************Voltage Model*****************************/
+    swEMFAlphaPu = in->swUalphaPu - (in->swIalphaPu * coef->uwRsPu >> 15); // Q14+Q15-Q15=Q14
+    swEMFBetaPu = in->swUbetaPu - (in->swIbetaPu * coef->uwRsPu >> 15);    // Q14+Q15-Q15=Q14
+
+    obs_pvt_swEMFAlphaCompPu = swEMFAlphaPu + obs_stFluxAlphaPIOut.swURefPu; // Q14
+    obs_pvt_swEMFBetaCompPu = swEMFBetaPu + obs_stFluxBetaPIOut.swURefPu;    // Q14
+
+    out->slFluxAlphaPu = out->slFluxAlphaPu + ((SLONG)obs_pvt_swEMFAlphaCompPu * coef->uwCurTsPu >> 3); // Q14+Q15-Q3=Q26
+    out->slFluxBetaPu = out->slFluxBetaPu + ((SLONG)obs_pvt_swEMFBetaCompPu * coef->uwCurTsPu >> 3);    // Q14+Q15-Q3=Q26
+    out->swFluxAlphaPu = out->slFluxAlphaPu >> 16;                                                      // Q26-Q16=Q10
+    out->swFluxBetaPu = out->slFluxBetaPu >> 16;                                                        // Q26-Q16=Q10
+
+    swMaxVsPu = ((SLONG)in->uwVdcPu * 0x5555) >> 15; // Q14+Q15-Q15=Q14
+
+    /* Flux alpha PI regulator */
+    obs_stFluxAlphaPIIn.swRefPu = obs_stFluxIParkPu.swAlphaPu; // Q10
+    obs_stFluxAlphaPIIn.swFdbPu = out->swFluxAlphaPu;          // Q10
+    obs_stFluxAlphaPIIn.swUmaxPu = swMaxVsPu;                  // Q14
+    obs_stFluxAlphaPIIn.swUminPu = -swMaxVsPu;                 // Q14
+    obs_stFluxAlphaPICoef.uwFluxKpPu = coef->uwFluxKpPu;       // Q18
+    obs_stFluxAlphaPICoef.uwFluxKitPu = coef->uwFluxKitPu;     // Q28
+    obs_voFluxPI(&obs_stFluxAlphaPIIn, &obs_stFluxAlphaPICoef, &obs_stFluxAlphaPIOut);
+
+    /* Flux beta PI regulator */
+    obs_stFluxBetaPIIn.swRefPu = obs_stFluxIParkPu.swBetaPu; // Q10
+    obs_stFluxBetaPIIn.swFdbPu = out->swFluxBetaPu;          // Q10
+    obs_stFluxBetaPIIn.swUmaxPu = swMaxVsPu;                 // Q14
+    obs_stFluxBetaPIIn.swUminPu = -swMaxVsPu;                // Q14
+    obs_stFluxBetaPICoef.uwFluxKpPu = coef->uwFluxKpPu;      // Q18
+    obs_stFluxBetaPICoef.uwFluxKitPu = coef->uwFluxKitPu;    // Q28
+    obs_voFluxPI(&obs_stFluxBetaPIIn, &obs_stFluxBetaPICoef, &obs_stFluxBetaPIOut);
+
+    /* Stator Flux -> Rotor Flux */
+    swRtFluxAlphaPu = out->swFluxAlphaPu - (((SLONG)in->swIalphaPu * coef->uwLqPu) >> 14); // Q14+Q10-Q14=Q10
+    swRtFluxBetaPu = out->swFluxBetaPu - (((SLONG)in->swIbetaPu * coef->uwLqPu) >> 14);    // Q14+Q10-Q14=Q10
+
+    /* PLL to trace the latest speed */
+    slDeltaTmpPu = (((SLONG)swRtFluxBetaPu * sincosTmp.swCosPu) - ((SLONG)swRtFluxAlphaPu * sincosTmp.swSinPu)) >> 10; // Q10+Q15-Q10=Q15
+    slDeltaErrTmpPu = slDeltaTmpPu - obs_pvt_slDeltaErrPu;                                                             // Q15
+    obs_pvt_slDeltaErrPu = slDeltaTmpPu;                                                                               // Q15
+    slKpTmpPu = slDeltaErrTmpPu * coef->uwSpdPllKpPu;                                                                  // Q15+Q14=Q29
+    slKitTmpPu = slDeltaTmpPu * coef->uwSpdPllKiPu;                                                                    // Q15+Q14=Q29
+    slSpdRefPu = slKpTmpPu + slKitTmpPu + out->slElecFreqPu;                                                           // Q29
+
+    /* Limit the speed value to avoid overflow */
+    if (slSpdRefPu >= 0x20000000)
+    {
+        slSpdRefPu = 0x20000000 - 1; // Q29
+    }
+    else if (slSpdRefPu <= -0x20000000)
+    {
+        slSpdRefPu = -0x20000000; // Q29
+    }
+    out->slElecFreqPu = slSpdRefPu;              // Q29
+    out->swElecFreqPu = out->slElecFreqPu >> 14; // Q29-Q14=Q15
+    /* Electrical speed to Electrical position */
+    // slActRtPosPu = out->slElecThetaPu + ((((slSpdRefPu + out->slElecFreqPu) >> 1) >> 10) * coef->uwCurTs); 			//Q29+Q10-Q10=Q29
+    slActRtPosPu = out->slElecThetaPu + (((SLONG)out->swElecFreqPu * coef->uwCurTs) << 4);
+    if (slActRtPosPu >= 0x20000000)
+    {
+        slActRtPosPu -= 0x20000000; // Q15+Q14=Q29
+    }
+    else if (slActRtPosPu < 0)
+    {
+        slActRtPosPu += 0x20000000; // Q15+Q14=Q29
+    }
+    out->slElecThetaPu = slActRtPosPu;             // Q29
+    out->uwElecThetaPu = out->slElecThetaPu >> 14; // Q29-Q14=Q15
+
+    // mth_voSinCos(out->uwElecThetaPu, &sincosTmp1);
+    // slActiveFluxPu = (SLONG)swRtFluxAlphaPu * sincosTmp1.swCosPu + (SLONG)swRtFluxBetaPu * sincosTmp1.swSinPu; 		//Q10+Q15=Q25
+    // out->swActiveFluxPu = slActiveFluxPu >> 15; 																	    //Q25-Q15=Q10
+    // //Q29-Q14=Q15
+}
+/***************************************************************
+ Function: obs_voFluxPI;
+ Description: Flux PI regulator;
+ Call by: functions in TBC;
+ Input Variables: ACR_CURPI_IN,ACR_CURPI_COF
+ Output/Return Variables: ACR_CURPI_OUT
+ Subroutine Call: N/A;
+ Reference: N/A
+****************************************************************/
+void obs_voFluxPI(OBS_FLUXPI_IN *in, OBS_FLUXPI_COF *coef, OBS_FLUXPI_OUT *out)
+{
+    SWORD tmp_swErrPu, tmp_swDeltaErrPu;
+    SLONG tmp_slUpPu, tmp_slUiPu, tmp_slURefPu;
+    SLONG tmp_slUmaxPu, tmp_slUminPu;
+
+    /* U(k) = U(k-1) + Kp * (Err(k) - Err(k-1)) + Kit * Err(k) */
+    tmp_swErrPu = in->swRefPu - in->swFdbPu;                     // Q10
+    tmp_swDeltaErrPu = tmp_swErrPu - out->swErrZ1Pu;             // Q10
+    tmp_slUpPu = (SLONG)tmp_swDeltaErrPu * coef->uwFluxKpPu;     // Q10+Q18=Q28
+    tmp_slUiPu = ((SLONG)tmp_swErrPu * coef->uwFluxKitPu) >> 10; // Q10+Q28-Q10=Q28
+    tmp_slURefPu = out->slURefPu + tmp_slUpPu + tmp_slUiPu;      // Q28
+    tmp_slUmaxPu = (SLONG)in->swUmaxPu << 14;                    // Q14+Q14=Q28
+    tmp_slUminPu = (SLONG)in->swUminPu << 14;                    // Q14+Q14=Q28
+    if (tmp_slURefPu > tmp_slUmaxPu)
+    {
+        tmp_slURefPu = tmp_slUmaxPu;
+    }
+    else if (tmp_slURefPu < tmp_slUminPu)
+    {
+        tmp_slURefPu = tmp_slUminPu;
+    }
+    else
+    {}
+    out->swURefPu = tmp_slURefPu >> 14; // Q28-Q14=Q14
+    out->slURefPu = tmp_slURefPu;       // Q28
+    out->swErrZ1Pu = tmp_swErrPu;       // Q10
+}
+
+/************************************************************************
+ Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
+ All rights reserved.
+*************************************************************************/
+#ifdef _OBS_C_
+#undef _OBS_C_
+#endif
+/*************************************************************************
+ End of this File (EOF):
+ !!!!!!Do not put anything after this part!!!!!!!!!!!
+*************************************************************************/

+ 20 - 20
2.MotorDrive/Source/spdctrFSM.c

@@ -38,6 +38,7 @@ Include File
 #include "AngleObserver_discrete.h"
 #include "canAppl.h"
 #include "obs.h"
+#include "glbcof.h"
 /************************************************************************
  Constant Table:
 ************************************************************************/
@@ -231,8 +232,7 @@ void StartUp_TbcdownHook(void)
     {
       //  mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
     }
-    else
-        if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
+    else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
     {
         scm_stSpdFbkLpf.slY.sw.hi = switchhall_stOut.swLowSpdLpfPu;
     }
@@ -289,9 +289,9 @@ void Open2Clz_TbcdownHook(void)
     acr_stUdqDcpOut.swUdPu = 0;
     acr_stUdqDcpOut.swUqPu = 0;
 }
-SWORD thetaoffset=0;
-SLONG temptheta=0;
-SWORD SwitchFlg=0;
+SWORD thetaoffset = 0;
+SLONG temptheta = 0;
+SWORD SwitchFlg = 0;
 UWORD uwAngRefPu = 0;
 UWORD uwAngSwitchK = 0;
 _Bool blAngSwitchOvrFlg = FALSE;
@@ -315,19 +315,19 @@ void ClzLoop_TbcdownHook(void)
         obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
         obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
         mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
-        scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
-//        temptheta = (SWORD)obs_stObsOutPu.uwElecThetaPu + thetaoffset;
-//
-//        if (temptheta >= cof_sl360DegreePu)
-//        {
-//            temptheta -= cof_sl360DegreePu;
-//        }
-//        else if (temptheta < (-(cof_sl360DegreePu)))
-//        {
-//            temptheta += cof_sl360DegreePu;
-//        }
-//        scm_uwAngRefPu=temptheta;
-//        tstThetaCorrect=scm_uwAngRefPu - rtY.Angle_Filtered;
+//        scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
+        temptheta = (SWORD)obs_stObsOutPu.uwElecThetaPu + thetaoffset;
+
+        if (temptheta >= cof_sl360DegreePu)
+        {
+            temptheta -= cof_sl360DegreePu;
+        }
+        else if (temptheta < (-(cof_sl360DegreePu)))
+        {
+            temptheta += cof_sl360DegreePu;
+        }
+        scm_uwAngRefPu=temptheta;
+        tstThetaCorrect = scm_uwAngRefPu - rtY.Angle_Filtered;
     }
     else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
     {
@@ -430,7 +430,7 @@ void Clz2Stop_TbcdownHook(void)
         obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
         obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
         mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
-        scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
+//        scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
         temptheta = (SWORD)obs_stObsOutPu.uwElecThetaPu + thetaoffset;
 
         if (temptheta >= cof_sl360DegreePu)
@@ -442,7 +442,7 @@ void Clz2Stop_TbcdownHook(void)
             temptheta += cof_sl360DegreePu;
         }
         scm_uwAngRefPu=temptheta;
-        tstThetaCorrect=scm_uwAngRefPu - rtY.Angle_Filtered;
+        tstThetaCorrect = scm_uwAngRefPu - rtY.Angle_Filtered;
     }
     else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
     {

+ 1 - 1
2.MotorDrive/Source/spdctrmode.c

@@ -171,7 +171,7 @@ void scm_voSpdCtrMdCoef(void)
 {
     ULONG ulLpfTm; // unit: us
     UWORD uwLqPu = 0;
-    ULONG ulAccel100rpmpsPu = USER_MOTOR_240RPMPS2PU_Q29;
+    ULONG ulAccel100rpmpsPu = USER_MOTOR_75RPMPS2PU_Q29;//USER_MOTOR_240RPMPS2PU_Q29;
 
     if (abs(scm_swIqRefPu) < mn_swIqTurn1Pu)
     {

+ 2 - 2
3.BasicFunction/Include/Cadence.h

@@ -30,7 +30,7 @@
 #define TORQUE_LF_MINFRE                25   // Min frequency of human foot in Low frequency method, 0.01Hz
 #define TORQUE_HF_MAXTIME_MS            150  // 3000             //Min time of valid pulses, ms
 #define TORQUE_ERROR_RESETTIME_MS       5000 // TIMER PERIOD,ms
-#define TORQUE_TIM_TIMERUNIT_US         ((SLONG)500000/FTBS_HZ)   //25   // TIMER PERIOD,ms    us
+#define TORQUE_TIM_TIMERUNIT_US         ((SLONG)1000000/FTBS_HZ)   //25   // TIMER PERIOD,ms    us
 #define TORQUE_LPF_GAIN                 80   //%
 #define TORQUE_MAX_FREQUENCY            5    // Hz, human foot
 //#elif (ASSIST_MODE == CADENCE_ASSIST)
@@ -42,7 +42,7 @@
 #define CADENCE_LF_MINFRE                25   // Min frequency of human foot in Low frequency method, 0.01Hz
 #define CADENCE_HF_MAXTIME_MS            ((800*12)/CADENCE_NUMBERS_PULSES)  // 3000             //Min time of valid pulses, ms
 #define CADENCE_ERROR_RESETTIME_MS       5000 // TIMER PERIOD,ms
-#define CADENCE_TIM_TIMERUNIT_US         ((SLONG)500000/FTBS_HZ)   //25   // TIMER PERIOD,ms    us
+#define CADENCE_TIM_TIMERUNIT_US         ((SLONG)1000000/FTBS_HZ)   //25   // TIMER PERIOD,ms    us
 #define CADENCE_LPF_GAIN                 80   //%
 #define CADENCE_MAX_FREQUENCY            5    // Hz, human foot
 //#endif

+ 1 - 1
3.BasicFunction/Include/bikespeed.h

@@ -27,7 +27,7 @@ typedef _Bool  BOOL;
 #define BIKESPEED_NUMBERS_VALIDPULSE2START 1  // numbers of valid pulses that needed to start
 #define BIKESPEED_HF_MINTIME_MS               5000  // Min time of valid pulses, ms
 #define BIKESPEED_ERROR_RESETTIME_MS          5000  // TIMER PERIOD,ms
-#define BIKESPEED_TIM_TIMERUNIT_US            ((SLONG)500000/FTBS_HZ)    // TIMER PERIOD,us
+#define BIKESPEED_TIM_TIMERUNIT_US            ((SLONG)1000000/FTBS_HZ)    // TIMER PERIOD,us
 #define BIKESPEED_LPF_GAIN                 80    //
 #define BIKESPEED_MAX_FREQUENCY            20    // Hz, ebike wheel
 

+ 2 - 2
4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/syspar.h

@@ -216,12 +216,12 @@ Update Time
 *=======================================================================*/
 #define FPWM_HZ        16000
 #define FTBC_HZ        8000
-#define FTBS_HZ        4000
+#define FTBS_HZ        8000
 #define FSYSTICK_HZ    1000
 #define PWM_PERIOD_CNT 4500
 #define PWM_PERIOD_US  625
 #define TBC_PERIOD_US  1250
-#define TBS_PERIOD_US  5000
+#define TBS_PERIOD_US  1250
 #define EVENT_1MS_HZ   1000
 
 /*======================================================================*

+ 3 - 1
4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h

@@ -932,7 +932,7 @@ Update Time
 /* Drag speed & current */
 #define DRAG_CUR_AP         1000 // 1500          // 1500 //100 Huawei      // unit: 0.01A, Drag current value
 #define DRAG_VOL_AP         20   // 0.1v
-#define DRAG_SPD_HZ         10   // unit: Hz, Final speed of drag
+#define DRAG_SPD_HZ         20   // unit: Hz, Final speed of drag
 #define DRAG_SPD_RAMP_TM_MS 4000 // unit: ms, Time of speed from 0Hz to target Hz
 
 /* Open to close */
@@ -1192,6 +1192,8 @@ Update Time
 #define USER_MOTOR_1500RPM2PU       SPD_RPM2PU(1500) // 6000rpm,Q15
 #define USER_MOTOR_4000RPM2PU       SPD_RPM2PU(4000) // 6000rpm,Q15
 #define USER_MOTOR_5500RPM2PU       SPD_RPM2PU(5500)
+#define USER_MOTOR_50RPMPS2PU_Q29   SPD_ACC_RPM2PU(50)   // 50rpm/s,
+#define USER_MOTOR_75RPMPS2PU_Q29   SPD_ACC_RPM2PU(75)   // 75rpm/s,
 #define USER_MOTOR_100RPMPS2PU_Q29  SPD_ACC_RPM2PU(100)  // 100rpm/s,(0x40000000/FTBS_Hz/cof_uwVbRpm*100)
 #define USER_MOTOR_240RPMPS2PU_Q29  SPD_ACC_RPM2PU(200)  // 240rpm/s
 #define USER_MOTOR_1000RPMPS2PU_Q29 SPD_ACC_RPM2PU(1000) // 1000rpm/s

+ 6 - 6
m0g3507_int.c

@@ -569,7 +569,7 @@ void MOTOR_PWM_INST_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(voi
     break;
         case DL_TIMER_IIDX_ZERO:
 
-            ECnt++;
+//            ECnt++;
 
 //            if(( Samp_Step==0) ||( Samp_Step>=4))
 //                 Samp_Step=1;
@@ -1413,8 +1413,6 @@ void TIMA1_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
 
         case DL_TIMER_IIDX_ZERO:
 
-            ECnt++;
-
             if(( Samp_Step==0) ||( Samp_Step>=4))
                  Samp_Step=1;
             else
@@ -1428,7 +1426,7 @@ void TIMA1_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
                 //TMR1->c4dt= 108;//108;//pwm_stGenOut.uwRDSONTrig;//  TIM_SetCompare4(TIM1, pwm_stGenOut.uwRDSONTrig); //pwm鏈�澶у嚡90%锛屽湪娉㈣胺3us浣嶇疆閲囬泦姣嶇嚎鐢甸樆鐢垫祦
                     /* ADC1 regular channel trigger */
 //                         adc_ordinary_software_trigger_enable(ADC1,TRUE);//  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
-
+//                 ECnt++;
                  tbc_voUpIsr();
                 // DL_GPIO_togglePins(LED_PORT, LED_LED1_PIN);
              break;
@@ -1443,6 +1441,7 @@ void TIMA1_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
                  if(cadence_stFreGetOut.uwCaputureOverflowCnt<60000)
                  cadence_stFreGetOut.uwCaputureOverflowCnt++;
                  tbs_voIsr();//20241017
+                 ECnt++;
 //                 if(BikeLedGloFun.blBike_ForwardLedSta==TRUE)
 //                 {
 //                     BikeLedGloFun.uwBikeLight_L_PWM +=100;
@@ -1490,7 +1489,7 @@ void TIMA1_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
 
         case DL_TIMER_IIDX_LOAD:
 
-            GCnt++;
+//            GCnt++;
 
 //            DL_GPIO_togglePins(LED_PORT, LED_LED2_PIN);
             Samp_Step++;
@@ -1501,7 +1500,8 @@ void TIMA1_IRQHandler(void) //void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
                   // gpio_bits_set(GPIOB,GPIO_PINS_11);
         //                    adc_enable(ADC1,FALSE);//
                    tbc_voDownIsr(); //鐢垫祦 /鐢靛帇鑾峰彇 锛岃绠楁牎鍑嗙數娴侀噰鏍风偣  TMR1->c4dt=1000;// tmpSigRTrigZ1;
-                  // gpio_bits_reset(GPIOB,GPIO_PINS_11);
+                   GCnt++;
+                   // gpio_bits_reset(GPIOB,GPIO_PINS_11);
             #if(JSCOPE_EN!=0)
                   Jscope_WtiteData();
            #endif