test_pwrlim.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "gtest/gtest.h"
  2. #include <cmath>
  3. #include <gtest/gtest.h>
  4. #include <stdint.h>
  5. #include <tuple>
  6. #include "scope.h"
  7. #include "test_user.h"
  8. #include "PmsmSimUt.h"
  9. #include "motor_sim_helper.h"
  10. class PwrLimTest : public testing::Test
  11. {
  12. protected:
  13. PmsmSimUtModelClass *sys1;
  14. McStatus McStatus1;
  15. McPuBase McPuBase1;
  16. virtual void SetUp() override
  17. {
  18. sys1 = new PmsmSimUtModelClass();
  19. sys1->initialize();
  20. MotorSimHelper::RestoreDefaultParam(sys1);
  21. sys1->PmsmSimUt_P.Params.Ts = 1.0 / FTBC_HZ;
  22. sys1->PmsmSimUt_P.Params.SpdCtrl = 1;
  23. sys1->PmsmSimUt_P.Params.B = 0;
  24. sys1->PmsmSimUt_P.Params.Jm = M_JD * 1e-7;
  25. sys1->PmsmSimUt_P.Params.Pn = M_POLE_PAIRS;
  26. sys1->PmsmSimUt_P.Params.R = M_RS_OHM * 1e-5;
  27. sys1->PmsmSimUt_P.Params.Ld = M_LD_NOLOAD_MH * 1e-8;
  28. sys1->PmsmSimUt_P.Params.Lq = M_LQ_NOLOAD_MH * 1e-8;
  29. sys1->PmsmSimUt_P.Params.Flux = M_FLUX_WB * 1e-6;
  30. sys1->PmsmSimUt_P.Params.SKp = (sys1->PmsmSimUt_P.Params.Jm * 20 * 2 * 3.14 / sys1->PmsmSimUt_P.Params.Flux) / 30 * 3.14;
  31. sys1->PmsmSimUt_P.Params.SKi = 20 * 2 * 3.14 * sys1->PmsmSimUt_P.Params.SKp;
  32. sys1->PmsmSimUt_P.Params.CKpd = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Ld;
  33. sys1->PmsmSimUt_P.Params.CKid = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
  34. sys1->PmsmSimUt_P.Params.CKpq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Lq;
  35. sys1->PmsmSimUt_P.Params.CKiq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
  36. sys1->PmsmSimUt_reset();
  37. McPuBaseIn puBaseIn = {
  38. .Pairsb = MOTOR_PAIRS,
  39. .UbVt = VBASE,
  40. .IbAp = IBASE,
  41. .FbHz = FBASE,
  42. };
  43. McPuBaseInit(&McPuBase1, &puBaseIn);
  44. McStatusInit(&McStatus1, &McPuBase1);
  45. CodeParaInit();
  46. pwr_voPwrLimInit();
  47. asr_voSpdPIInit();
  48. }
  49. virtual void TearDown() override
  50. {
  51. sys1->terminate();
  52. delete sys1;
  53. pwr_voPwrLimInit();
  54. asr_voSpdPIInit();
  55. }
  56. };
  57. class PwrLimTest1 : public PwrLimTest, public testing::WithParamInterface<double>
  58. {};
  59. TEST_P(PwrLimTest1, BandCal)
  60. {
  61. }
  62. INSTANTIATE_TEST_SUITE_P(DiffBand, PwrLimTest1, testing::Values(20, 50, 100));
  63. class PwrLimTest2 : public PwrLimTest, public testing::WithParamInterface<int>
  64. {};
  65. TEST_P(PwrLimTest2, PwrLim)
  66. {
  67. /* Coef Cal */
  68. pwr_stPwrLimCofIn.swPwrLimW = cp_stControlPara.swPwrLimitValWt;
  69. pwr_stPwrLimCofIn.uwPwrErrW = cp_stControlPara.swPwrLimitErrWt;
  70. pwr_stPwrLimCofIn.swIqMaxAp = cp_stMotorPara.swIpeakMaxA;
  71. pwr_stPwrLimCofIn.uwIBaseAp = IBASE;
  72. pwr_stPwrLimCofIn.uwUbVt = VBASE;
  73. pwr_stPwrLimCofIn.uwPwrLimPIKp = cp_stControlPara.swPwrLimitKpPu;
  74. pwr_stPwrLimCofIn.uwPwrLimPIKi = cp_stControlPara.swPwrLimitKiPu;
  75. pwr_stPwrLimCofIn.uwPwrLimSTARTCe = cp_stControlPara.swAlmPwrLimitStartTempVal;
  76. pwr_stPwrLimCofIn.uwPwrLimENDCe = cp_stControlPara.swAlmOverHeatCeVal;
  77. pwr_voPwrLimCof(&pwr_stPwrLimCofIn, &pwr_stPwrLimCof);
  78. mth_voLPFilterCoef((1000000 / cp_stControlPara.swPwrLimitLPFFre), FTBC_HZ, &scm_stMotoPwrInLpf.uwKx);
  79. asr_stSpdPICoefIn.uwUbVt = VBASE;
  80. asr_stSpdPICoefIn.uwIbAp = IBASE;
  81. asr_stSpdPICoefIn.uwFbHz = FBASE;
  82. asr_stSpdPICoefIn.uwFTbsHz = FTBS_HZ;
  83. asr_stSpdPICoefIn.uwPairs = cp_stMotorPara.swMotrPolePairs;
  84. asr_stSpdPICoefIn.uwMtJm = cp_stMotorPara.swJD;
  85. asr_stSpdPICoefIn.uwMtFlxWb = cp_stMotorPara.swFluxWb;
  86. asr_stSpdPICoefIn.uwMcoef = cp_stControlPara.swAsrPIM;
  87. asr_stSpdPICoefIn.uwWvcHz = cp_stControlPara.swAsrPIBandwidth;
  88. asr_stSpdPICoefIn.uwRatioJm = cp_stControlPara.swAsrSpdInerRate;
  89. asr_voSpdPICoef(&asr_stSpdPICoefIn, &asr_stSpdPICoef);
  90. /* Custom Spd Ctrl */
  91. sys1->PmsmSimUt_P.Params.CustomSpdCtrl = 1;
  92. int16_t spdRefRpm = 3000;
  93. for (int i = 0; i < 10 / sys1->PmsmSimUt_P.Params.Ts; i++)
  94. {
  95. /* Speed Ref */
  96. // spdRefRpm += 1;
  97. // if(spdRefRpm > 3000)
  98. // {
  99. // spdRefRpm = 3000;
  100. // }
  101. int16_t spdRefPu = ((int32_t)spdRefRpm << 15) / McStatus1.Base->uwVbRpm;
  102. /* Motor Load Torque */
  103. // sys1->PmsmSimUt_U.CtrlIn.Tm += 0.001;
  104. // if(sys1->PmsmSimUt_U.CtrlIn.Tm > 2)
  105. // {
  106. // sys1->PmsmSimUt_U.CtrlIn.Tm = 2;
  107. // }
  108. sys1->PmsmSimUt_U.CtrlIn.Tm = 2;
  109. /* Pu Value to Named Value */
  110. MotorSimHelper::SetModelICmdPu(sys1, 0, asr_stSpdPIOut.swIqRefPu, McStatus1.Base);
  111. /* Motor Control */
  112. sys1->step();
  113. /* Named Value to Pu Value */
  114. MotorSimHelper::TransitModelOutput(sys1, &McStatus1);
  115. /* Power Cal */
  116. double ualpha = 0.6667 * (sys1->PmsmSimUt_Y.Out.Uabc[0] - 0.5 * sys1->PmsmSimUt_Y.Out.Uabc[1] - 0.5 * sys1->PmsmSimUt_Y.Out.Uabc[2]);
  117. double ubeta = 0.57735 * (sys1->PmsmSimUt_Y.Out.Uabc[1] - sys1->PmsmSimUt_Y.Out.Uabc[2]);
  118. double ud = ualpha * cos(sys1->PmsmSimUt_Y.Out.Theta) + ubeta * sin(sys1->PmsmSimUt_Y.Out.Theta);
  119. double uq = -ualpha * sin(sys1->PmsmSimUt_Y.Out.Theta) + ubeta * cos(sys1->PmsmSimUt_Y.Out.Theta);
  120. double udPu = ud * 10 * 16384 / VBASE;
  121. double uqPu = uq * 10 * 16384 / VBASE;
  122. //int16_t power1 = ((int32_t)McStatus1.Pu.swIalpha * McStatus1.Pu.swUalpha + (int32_t)McStatus1.Pu.swIbeta * McStatus1.Pu.swUbeta) >> 13; // Q15
  123. int16_t power = ((int32_t)udPu * McStatus1.Pu.swId + (int32_t)uqPu * McStatus1.Pu.swIq) >> 13; // Q15
  124. mth_voLPFilter(power, &scm_stMotoPwrInLpf);
  125. /* Power Limit Control */
  126. pwr_stPwrLimIn.swMotorPwrPu = scm_stMotoPwrInLpf.slY.sw.hi;
  127. pwr_stPwrLimIn.swIqrefPu = asr_stSpdPIOut.swIqRefPu;
  128. pwr_stPwrLimIn.PCBTemp = GetParam(); //adc_stUpOut.PCBTemp;
  129. pwr_voPwrLim2(&pwr_stPwrLimIn, &pwr_stPwrLimCof, &pwr_stPwrLimOut2); // Q14
  130. /* Speed Control */
  131. if(i % (FTBC_HZ / FTBS_HZ) == 0)
  132. {
  133. asr_stSpdPIIn.swSpdRefPu = spdRefPu;
  134. asr_stSpdPIIn.swSpdFdbPu = McStatus1.Pu.swElecOmega;
  135. asr_stSpdPIIn.swIqMaxPu = ABS(pwr_stPwrLimOut2.swIqLimPu);
  136. asr_stSpdPIIn.swIqMinPu = -ABS(pwr_stPwrLimOut2.swIqLimPu);
  137. asr_voSpdPI(&asr_stSpdPIIn, &asr_stSpdPICoef, &asr_stSpdPIOut);
  138. }
  139. UdpScope::Send(0, pwr_stPwrLimOut2.swMotorPwrLimitActualPu, power, pwr_stPwrLimOut2.swIqLimPu, asr_stSpdPIOut.swIqRefPu, spdRefPu, McStatus1.Pu.swElecOmega);
  140. }
  141. EXPECT_NEAR(pwr_stPwrLimOut2.swMotorPwrLimitActualPu, scm_stMotoPwrInLpf.slY.sw.hi, 2);
  142. }
  143. INSTANTIATE_TEST_SUITE_P(DiffTemp, PwrLimTest2, ::testing::Values(20, 90, 150));