123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /************************************************************************
- Project: Welling Motor Control Paltform
- Filename: asr.c
- Partner Filename: asr.h
- Description: Automatic speed regulator
- 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 _ASR_NEW_C_
- #define _ASR_NEW_C_
- #endif
- /************************************************************************
- Included File:
- *************************************************************************/
- #include "syspar.h"
- #include "user.h"
- /************************************************************************
- Constant Table:
- *************************************************************************/
- /************************************************************************
- Exported Functions:
- *************************************************************************/
- /***************************************************************
- Function: asr_voSpdPIInit;
- Description: Speed PI initialization
- Call by: functions in main loop;
- Input Variables: N/A
- Output/Return Variables: N/A
- Subroutine Call: N/A;
- Reference: N/A
- ****************************************************************/
- void asrnew_voSpdPIInit(void)
- {
- asr_stSpdPIOut.slIqiPu = 0;
- asr_stSpdPIOut.slIqSumPu = 0;
- asr_stSpdPIOut.slIqRefPu = 0;
- asr_stSpdPIOut.swIqRefPu = 0;
- asr_stSpdPIOut.swErrZ1Pu = 0;
- }
- /***************************************************************
- Function: asr_voSpdPICoef;
- Description: Coefficient calculation for "asr_voSpdPICoef"
- 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 asrnew_voSpdPICoef(ASRNEW_SPDPI_COFIN *in, ASRNEW_SPDPI_COF *out)
- {
- ULONG ulWebRadps;
- UWORD uwPbWt;
- UWORD uwWmb;
- UWORD uwTbUs;
- UWORD uwTbNm;
- UWORD uwJb;
- UWORD uwJmPu;
- UWORD uwFluxbWb;
- UWORD uwFluxPu;
- UWORD uwWvcPu;
- UWORD uwTCtrPu;
- ULONG ulJmPu;
- if (in->uwFbHz < 1)
- {
- in->uwFbHz = 1;
- }
- if (in->uwUbVt < 1)
- {
- in->uwUbVt = 1;
- }
- if (in->uwIbAp < 1)
- {
- in->uwIbAp = 1;
- }
- if (in->uwPairs < 1)
- {
- in->uwPairs = 1;
- }
- if (in->uwMtJm < 1)
- {
- in->uwMtJm = 1;
- }
- if (in->uwMtFlxWb < 1)
- {
- in->uwMtFlxWb = 1;
- }
- if (in->uwFTbsHz < 1)
- {
- in->uwFTbsHz = 1;
- }
- if (in->uwRatioJm > 10)
- {
- in->uwRatioJm = 10;
- }
- if (in->uwWvcHz > 30)
- {
- in->uwWvcHz = 30;
- }
- if (in->uwMcoef > 20)
- {
- in->uwMcoef = 20;
- }
- ulWebRadps = (ULONG)2 * 31416 * in->uwFbHz / 1000; /* unit: 0.1rad/s, Electrical radian frequency base */
- uwPbWt = (ULONG)3 * in->uwUbVt * in->uwIbAp / 100 >> 1; /* unit: 0.1w, Power base */
- uwWmb = ulWebRadps / in->uwPairs; /* unit: 0.1rad/s, Mechanical radian frequency base */
- uwTbUs = (ULONG)100000000 / ulWebRadps; /* unit: 0.1us, Time base */
- uwTbNm = (ULONG)uwPbWt * 1000 / uwWmb; /* unit: mNm, Torque base */
- uwJb = ((ULONG)uwTbNm * uwTbUs * 10) / uwWmb; /* unit: 10^-10*kg*m2, Rotational inertia base */
- uwJmPu = ((ULONG)in->uwMtJm * 1000) / uwJb; /* Q0, Rotational inertia */
- uwFluxbWb = ((ULONG)in->uwUbVt * 1000000) / ulWebRadps; /* unit: 0.01mWb, Flux linkage base */
- uwFluxPu = ((ULONG)in->uwMtFlxWb << 12) / uwFluxbWb; /* Q12, Flux linkage */
- uwTCtrPu = (ULONG)2 * 12868 * in->uwFbHz / in->uwFTbsHz; /* Q12, Speed control period Pu, pi(Q12)=12868 */
- /* Jm */
- ulJmPu = (ULONG)(in->uwRatioJm + 1) * uwJmPu; // Q0
- /* Kp = Wvc*Jm/FluxF */
- uwWvcPu = (((ULONG)in->uwWvcHz << 15) / in->uwFbHz); // Q15 BW_HZ2PU(x)
- // out->uwKpPu = (ulJmPu * uwWvcPu << 3) / uwFluxPu; // Q0+Q15+Q3-Q12=Q6
- // // out->uwKpPu = (ulJmPu * uwWvcPu ) / uwFluxPu;
- // /* Kit = Kp*T_spd_ctrl*Wvc/M */
- // out->uwKitPu = ((((ULONG)uwWvcPu * uwTCtrPu) >> 18) * out->uwKpPu) / in->uwMcoef; // Q15+Q12-Q18+Q6=Q15
- // if (out->uwKitPu < 1)
- // {
- // out->uwKitPu = 1;
- // }
- //
- // /* Kb = 1/Kp */
- // out->uwKbPu = ((ULONG)1 << 15) / out->uwKpPu; // Q15-Q6=Q9
- //
- // /* Kb = Ki/Kp */
- // out->uwKsPu = uwWvcPu / in->uwMcoef; //Q15
-
- out->uwKpPu = 1000;
- out->uwKitPu = 100;
- out->uwKsPu = 0;
-
-
- }
- /***************************************************************
- Function: asr_voSpdPI;
- Description: speed PI regulator;
- Call by: functions in TBS;
- Input Variables: ASR_SPDPI_IN,SPD_SPDPI_COF
- Output/Return Variables: ASR_SPDPI_OUT
- Subroutine Call: N/A;
- Reference: N/A
- ****************************************************************/
- SQWORD IqiPu;
- SQWORD IqiPuZ1;
- SQWORD IqiAnti;
- SWORD tstIq;
- void asrnew_voSpdPI(ASRNEW_SPDPI_IN *in, ASRNEW_SPDPI_COF *cof, ASRNEW_SPDPI_OUT *out)
- {
- SLONG slIqMaxPu; // Q30
- SLONG slIqMinPu; // Q30
- SLONG slSpdErrPu; // Q15
- SQWORD sqIqRefPu;
- SQWORD sqIqpPu;
- SQWORD sqIqiPu;
- /* Coefficient get */
- slIqMaxPu = (SLONG)in->swIqMaxPu << 16; // Q14+Q16=Q30
- slIqMinPu = (SLONG)in->swIqMinPu << 16; // Q14+Q16=Q30
- /* Calculate the error */
- slSpdErrPu = (SLONG)in->swSpdRefPu - in->swSpdFdbPu; // Q15
- if (slSpdErrPu > 32767)
- {
- slSpdErrPu = 32767;
- }
- else if (slSpdErrPu < -32767)
- {
- slSpdErrPu = -32767;
- }
- else
- {
- /* Nothing */
- }
- sqIqpPu = ((SQWORD)slSpdErrPu * cof->uwKpPu) << 9; // Q30
- /* Calculate the integral output */
- sqIqiPu = (SQWORD)slSpdErrPu * cof->uwKitPu; // Q30
-
- // if (sqIqiPu > 32768)
- // {
- // sqIqiPu = 32768;
- // }
- // else if (sqIqiPu < -32768)
- // {
- // sqIqiPu = -32768;
- // }
- // else
- // {}
- IqiPu = sqIqiPu + IqiPuZ1 + (IqiAnti * cof->uwKsPu >> 15); //Q30
- // if (IqiPu > slIqMaxPu)
- // {
- // IqiPu = slIqMaxPu;
- // }
- // else if (IqiPu < slIqMinPu)
- // {
- // IqiPu = slIqMinPu;
- // }
- // else
- // {}
- IqiPuZ1 = IqiPu;
-
- /* Calculate the Controller output */
- sqIqRefPu = sqIqpPu + IqiPu; // Q30
- tstIq = sqIqRefPu >> 16;
-
- /* Iq output limit */
- if (sqIqRefPu > slIqMaxPu)
- {
- out->slIqRefPu = slIqMaxPu;
- }
- else if (sqIqRefPu < slIqMinPu)
- {
- out->slIqRefPu = slIqMinPu;
- }
- else
- {
- out->slIqRefPu = (SLONG)sqIqRefPu;
- }
- /* Anti-Windup */
- IqiAnti = (SQWORD)out->slIqRefPu - sqIqRefPu; //Q30
-
- out->swIqRefPu = out->slIqRefPu >> 16; // Q30-Q16=Q14
- out->swErrZ1Pu = (SWORD)slSpdErrPu;
- }
- /************************************************************************
- Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
- *************************************************************************/
- #ifdef _ASR_C_
- #undef _ASR_C_
- #endif
- /*************************************************************************
- End of this File (EOF)��
- Do not put anything after this part!
- *************************************************************************/
|