123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- ///************************************************************************
- // Project: Welling FAN Motor Developing platform
- // Filename: fluxweaken.c
- // Partner Filename: fluxweaken.h
- // Description: Partner file of fluxweaken.h
- // Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems.
- // CPU TYPE : ST32F0xx
- //*************************************************************************
- // Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
- // All rights reserved.
- //*************************************************************************
- //*************************************************************************
- // Revising History (ECL of this file):
- // 20191225, by cyf, create this file;
- //************************************************************************/
- //
- ///************************************************************************
- // Beginning of File, do not put anything above here except notes
- // Compiler Directives:
- //*************************************************************************/
- //#ifndef _FWCTRL_C_
- // #define _FWCTRL_C_
- //#endif
- ///************************************************************************
- // Included File:
- //*************************************************************************/
- //#include "fluxweaken.h"
- ///************************************************************************
- // Exported Functions:
- //*************************************************************************/
- ///***************************************************************
- // Function: fw_voInit;
- // Description: flux weakening initialization
- // Call by: functions in main loop;
- // Input Variables: N/A
- // Output/Return Variables: N/A
- // Subroutine Call: N/A
- // Reference: N/A
- //****************************************************************/
- // void fw_voInit(void)
- //{
- // fw_stFluxWeakeningOutPu.uwUdcCnt = 0;
- // fw_stFluxWeakeningOutPu.uwUdcMinPu = 0;
- // fw_stFluxWeakeningOutPu.uwUdcPu = 0;
- // fw_stFluxWeakeningOutPu.swEnable = 0;
- //
- // fw_stFluxWeakeningOutPu.slIdFwoutPu = 0;
- // fw_stFluxWeakeningOutPu.swIdFwoutPu = 0;
- // fw_stFluxWeakeningOutPu.swVolErrPu = 0;
- // fw_stFluxWeakeningOutPu.swFwIqLimPu = cof_swIqMaxPu;
- //}
- ///***************************************************************
- // Function: fw_voFluxWeakeningCoef;
- // Description: flux weakening coefficient calculation
- // Call by: functions in main loop;
- // Input Variables: FW_COFIN
- // Output/Return Variables: FW_COF
- // Subroutine Call: N/A
- // Reference: N/A
- //****************************************************************/
- // void fw_voFluxWeakeningCoef(FW_COFIN *in,FW_COF *out)
- //{
- // out->uwKpPu = in->uwKpPu; //Q17
- // out->uwKitPu = in->uwKitPu; //Q17
- // out->swIdMinPu = in->swIdMinPu; //Q14
- // out->swIdCharacterPu = in->swIdCharacterPu; //Q14
- // out->swIqMinPu = in->swIqMinPu; //Q14
- // out->swIqMaxPu = in->swIqMaxPu; //Q14
- //}
- ///***************************************************************
- // Function: fw_voFluxWeakeningGen
- // Description: flux weakening calculation
- // Call by: functions in tbc;
- // Input Variables: FW_IN
- // Output/Return Variables: FW_OUT
- // Subroutine Call: N/A
- // Reference: N/A
- //****************************************************************/
- // void fw_voFluxWeakeningGen(FW_IN *in,FW_COF *coef,FW_OUT *out)
- //{
- // SWORD tmp_swDeltaVolErrPu,tmp_swVolErrPu;
- // SLONG tmp_slIdpPu,tmp_slIdiPu,tmp_slIdoutPu,tmp_slIdLimPu;
- // SWORD tmp_swThsIqlimPu,tmp_swNxtIqlimPu,tmp_swDltIqlimPu,tmp_swFwIqLimPu;
- // UWORD tmp_uwIqValPu,tmp_uwIdAbsPu,tmp_uwIndex;
- // SLONG tmp_slIdLowerLimPu;
- // SWORD tmp_swIdoutPu;
- // /*======================================================
- // Bus Voltage calculation because of fluctuation(100Hz)
- // ========================================================*/
- // if(out->swEnable == 0)
- // {
- // out->uwUdcPu = in->uwUdcPu;
- // out->uwUdcMinPu = in->uwUdcPu;
- // out->swEnable = 1;
- // }
- // if(out->uwUdcCnt > USER_BUS_VOL_PERIOD)
- // {
- // out->uwUdcCnt = 0;
- // out->uwUdcPu = out->uwUdcMinPu;
- // out->uwUdcMinPu = in->uwUdcPu;
- // }
- // else
- // {
- // if(in->uwUdcPu < out->uwUdcMinPu)
- // {
- // out->uwUdcMinPu = in->uwUdcPu;
- // }
- // }
- // out->uwUdcCnt++;
- // /*==========================================================================
- // Flux Weakening (error = k^2*Ubus^2/3 - Ualpha^2 - Ubeta^2)
- // ===========================================================================*/
- // if(abs(out->swIdFwoutPu) >= USER_FW_COEF_PU_MAX_ABSID_Q14)
- // {
- // out->uwFwCoefPu = USER_FW_COEF_PU_MAX_Q14;
- // }
- // else if(abs(out->swIdFwoutPu) > USER_FW_COEF_PU_MIN_ABSID_Q14)
- // {
- // out->uwFwCoefPu = USER_FW_COEF_PU_MIN_Q14 +
- // (((ULONG)abs(out->swIdFwoutPu)*(USER_FW_COEF_PU_MAX_Q14-USER_FW_COEF_PU_MIN_Q14))/(USER_FW_COEF_PU_MAX_ABSID_Q14 -
- // USER_FW_COEF_PU_MIN_ABSID_Q14));
- // }
- // else
- // {
- // out->uwFwCoefPu = USER_FW_COEF_PU_MIN_Q14;
- // }
- // tmp_swVolErrPu = ((((ULONG)out->uwUdcPu * out->uwUdcPu>>14)*out->uwFwCoefPu)>>14) - (((SLONG)in->swPwmalphaPu * in->swPwmalphaPu +
- // (SLONG)in->swPwmbetaPu * in->swPwmbetaPu)>>14); tmp_swDeltaVolErrPu = tmp_swVolErrPu - out->swVolErrPu; //Q14 out->swVolErrPu =
- // tmp_swVolErrPu;
- // /*I(k) = I(k-1) + Kp * (Err(k) - Err(k-1)) + Kit * Err(k)*/
- // tmp_slIdpPu = (SLONG)tmp_swDeltaVolErrPu * coef->uwKpPu; //calculate P, Q14+Q17=Q31
- // tmp_slIdiPu = (SLONG)tmp_swVolErrPu * coef->uwKitPu; //Q14+Q17=Q31
- // tmp_slIdoutPu = (out->slIdFwoutPu<<2) + tmp_slIdpPu + tmp_slIdiPu; //Q31
- // /*limit Id calculation between -8A~0A*/
- // tmp_slIdLowerLimPu = ((SLONG)coef->swIdMinPu)<<17; //Q17+Q14=Q31
- // if(tmp_slIdoutPu > 0)
- // {
- // tmp_slIdoutPu = 0;
- // }
- // else if(tmp_slIdoutPu < tmp_slIdLowerLimPu)
- // {
- // tmp_slIdoutPu = tmp_slIdLowerLimPu;
- // }
- // else
- // {
- // }
- // tmp_swIdoutPu = (SWORD)(tmp_slIdoutPu>>17);
- // /*Iq limit Correction when go into Field weakening Area II*/
- // tmp_slIdLimPu = ((SLONG)coef->swIdCharacterPu)<<17; //Q17+Q14=Q31
- // /*Id output less than Idlimit, limit Iq in MTPV line*/
- // if(tmp_swIdoutPu <= coef->swIdCharacterPu)
- // {
- // out->swFwIqLimPu = fw_swIqLimTab[FW_CNTS-1] + ((((tmp_slIdoutPu - tmp_slIdLimPu)>>17)*USER_DEEP_FW_COEF_Q10)>>10);
- // }
- // /*Id output greater than Idlimit, limit Iq inside the current circle*/
- // else if(tmp_swIdoutPu >= 0)
- // {
- // out->swFwIqLimPu = coef->swIqMaxPu; //Q14
- // }
- // else
- // {
- // tmp_uwIdAbsPu = abs(tmp_slIdoutPu>>17); //Q31-Q17=Q14
- // tmp_uwIndex = (tmp_uwIdAbsPu&0x3fff)>>7;//Q14-Q7=Q7=128=Ibase/0.025
- // tmp_swThsIqlimPu = fw_swIqLimTab[tmp_uwIndex];
- // tmp_swNxtIqlimPu = fw_swIqLimTab[tmp_uwIndex + 1];
- // tmp_swDltIqlimPu = tmp_swNxtIqlimPu - tmp_swThsIqlimPu;
- // tmp_uwIqValPu = tmp_uwIdAbsPu&0x007f; //Q14-Q7=Q7
- // tmp_swFwIqLimPu = (((SLONG)tmp_swDltIqlimPu*tmp_uwIqValPu)>>7) + tmp_swThsIqlimPu;
- // out->swFwIqLimPu = tmp_swFwIqLimPu; //Q14
- // }
- // if(out->swFwIqLimPu < coef->swIqMinPu)
- // {
- // out->swFwIqLimPu = coef->swIqMinPu;
- // }
- // /*limit Id output not less than the characteristic current*/
- // if(tmp_slIdoutPu < tmp_slIdLimPu)
- // {
- // tmp_slIdoutPu = tmp_slIdLimPu;
- // }
- // out->slIdFwoutPu = tmp_slIdoutPu>>2; //Q31-Q2=Q29
- // out->swIdFwoutPu = out->slIdFwoutPu>>15;//Q29-Q15=Q14
- //}
- ///************************************************************************
- // Local Functions:
- //*************************************************************************/
- //
- //#ifdef _FWCTRL_C_
- // #undef _FWCTRL_C_
- //#endif
- ///************************************************************************
- // Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
- // All rights reserved.
- //*************************************************************************
- // End of this File (EOF)!
- // Do not put anything after this part!
- //*************************************************************************/
|