test_torqobs.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "gtest/gtest.h"
  2. #include <gtest/gtest.h>
  3. #include <stdint.h>
  4. #include <tuple>
  5. #include "scope.h"
  6. #include "test_user.h"
  7. #include "PmsmSimUt.h"
  8. #include "motor_sim_helper.h"
  9. #include <cmath>
  10. class TorqObsTest : 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 * 15 * 2 * 3.14 / sys1->PmsmSimUt_P.Params.Flux) / 30 * 3.14;
  31. sys1->PmsmSimUt_P.Params.SKi = 15 * 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. McPuBaseIn puBaseIn = {
  37. .Pairsb = MOTOR_PAIRS,
  38. .UbVt = VBASE,
  39. .IbAp = IBASE,
  40. .FbHz = FBASE,
  41. };
  42. McPuBaseInit(&McPuBase1, &puBaseIn);
  43. McStatusInit(&McStatus1, &McPuBase1);
  44. torqobs_voInit();
  45. }
  46. virtual void TearDown() override
  47. {
  48. sys1->terminate();
  49. delete sys1;
  50. torqobs_voInit();
  51. }
  52. };
  53. class TorqObsTest1 : public TorqObsTest, public testing::WithParamInterface<::std::tuple<double, double, double>>
  54. {};
  55. TEST_P(TorqObsTest1, TorqObs)
  56. {
  57. double torqPuMax1 = 0, torqPuMax2 = 0;
  58. double mod = get<1>(GetParam());
  59. double freq = get<2>(GetParam());
  60. double band = 50;
  61. /* Coef Cal */
  62. torqobs_stCoefIn.uwUbVt = VBASE;
  63. torqobs_stCoefIn.uwIbAp = IBASE;
  64. torqobs_stCoefIn.uwFbHz = FBASE;
  65. torqobs_stCoefIn.uwFTbsHz = FTBS_HZ;
  66. torqobs_stCoefIn.uwPairs = M_POLE_PAIRS;
  67. torqobs_stCoefIn.uwMtJm = M_JD;
  68. torqobs_stCoefIn.uwMtFlxWb = M_FLUX_WB;
  69. torqobs_stCoefIn.uwWtcHz = band;
  70. torqobs_stCoefIn.uwRatioJm = 0; // ASR_SPD_INER_RATE;
  71. torqobs_voCoef(&torqobs_stCoefIn, &torqobs_stCoef);
  72. /* Speed Ref */
  73. sys1->PmsmSimUt_P.Params.CustomSpdCtrl = 0;
  74. sys1->PmsmSimUt_U.CtrlIn.WmRpm = get<0>(GetParam());
  75. for (int i = 0; i < 10 / sys1->PmsmSimUt_P.Params.Ts; i++)
  76. {
  77. /* Motor Load Torque */
  78. double phase = 2 * 3.14 * freq * i * sys1->PmsmSimUt_P.Params.Ts;
  79. sys1->PmsmSimUt_U.CtrlIn.Tm = 1 + mod * sin(phase);
  80. /* Motor Control */
  81. sys1->step();
  82. /* Named Value to Pu Value */
  83. MotorSimHelper::TransitModelOutput(sys1, &McStatus1);
  84. /* Torque Observer */
  85. if(i % (FTBC_HZ / FTBS_HZ) == 0)
  86. {
  87. torqobs_stCalIn.swIqMaxPu = 55 * 100 * 16384 / IBASE;
  88. torqobs_stCalIn.swIqMinPu = -55 * 100 * 16384 / IBASE;
  89. torqobs_stCalIn.swIqfbkPu = McStatus1.Pu.swIq;
  90. torqobs_stCalIn.swSpdPu = McStatus1.Pu.swElecOmega;
  91. torqobs_voCal(&torqobs_stCalIn, &torqobs_stCoef, &torqobs_stCalOut);
  92. }
  93. double torqPu = (double)sys1->PmsmSimUt_U.CtrlIn.Tm * 1000 * 16384 / McStatus1.Base->uwTqbNm;
  94. /* Get Torque Max */
  95. if(i > 1 / sys1->PmsmSimUt_P.Params.Ts)
  96. {
  97. if(torqPuMax1 < torqobs_stCalOut.swTorqObsPu)
  98. {
  99. torqPuMax1 = torqobs_stCalOut.swTorqObsPu;
  100. }
  101. if(torqPuMax2 < torqPu)
  102. {
  103. torqPuMax2 = torqPu;
  104. }
  105. }
  106. //UdpScope::Send(0, torqobs_stCalOut.swSpdObsPu, McStatus1.Pu.swElecOmega, torqPu, torqobs_stCalOut.swTorqObsPu, torqobs_stCalOut.swIqLoadPu);
  107. }
  108. if(freq <= band)
  109. {
  110. EXPECT_TRUE((torqPuMax1 / torqPuMax2) >= 0.707 && (torqPuMax1 / torqPuMax2) <= 1.01); ///< band处为-3dB(0.707), P控制无超调小于0dB(1)
  111. }
  112. }
  113. INSTANTIATE_TEST_SUITE_P(DiffTorq, TorqObsTest1, ::testing::Combine(::testing::Values(500, 5000), ::testing::Values(0, 0.5, 1), ::testing::Values(1, 16, 50)));