///************************************************************************ // 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! //*************************************************************************/