test_torqobs.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. class TorqObsTest : public testing::Test
  10. {
  11. protected:
  12. PmsmSimUtModelClass *sys1;
  13. McStatus McStatus1;
  14. McPuBase McPuBase1;
  15. virtual void SetUp() override
  16. {
  17. sys1 = new PmsmSimUtModelClass();
  18. sys1->initialize();
  19. MotorSimHelper::RestoreDefaultParam(sys1);
  20. sys1->PmsmSimUt_P.Params.Ts = 1.0 / FTBC_HZ;
  21. sys1->PmsmSimUt_P.Params.SpdCtrl = 1;
  22. sys1->PmsmSimUt_P.Params.B = 0;
  23. sys1->PmsmSimUt_P.Params.Jm = M_JD * 1e-7;
  24. sys1->PmsmSimUt_P.Params.Pn = M_POLE_PAIRS;
  25. sys1->PmsmSimUt_P.Params.R = M_RS_OHM * 1e-5;
  26. sys1->PmsmSimUt_P.Params.Ld = M_LD_NOLOAD_MH * 1e-8;
  27. sys1->PmsmSimUt_P.Params.Lq = M_LQ_NOLOAD_MH * 1e-8;
  28. sys1->PmsmSimUt_P.Params.Flux = M_FLUX_WB * 1e-6;
  29. sys1->PmsmSimUt_P.Params.SKp = (sys1->PmsmSimUt_P.Params.Jm * 15 * 2 * 3.14 / sys1->PmsmSimUt_P.Params.Flux) / 30 * 3.14;
  30. sys1->PmsmSimUt_P.Params.SKi = 15 * 2 * 3.14 * sys1->PmsmSimUt_P.Params.SKp;
  31. sys1->PmsmSimUt_P.Params.CKpd = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Ld;
  32. sys1->PmsmSimUt_P.Params.CKid = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
  33. sys1->PmsmSimUt_P.Params.CKpq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Lq;
  34. sys1->PmsmSimUt_P.Params.CKiq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
  35. McPuBaseIn puBaseIn = {
  36. .Pairsb = MOTOR_PAIRS,
  37. .UbVt = VBASE,
  38. .IbAp = IBASE,
  39. .FbHz = FBASE,
  40. };
  41. McPuBaseInit(&McPuBase1, &puBaseIn);
  42. McStatusInit(&McStatus1, &McPuBase1);
  43. torqobs_voInit();
  44. }
  45. virtual void TearDown() override
  46. {
  47. sys1->terminate();
  48. delete sys1;
  49. torqobs_voInit();
  50. }
  51. };
  52. class TorqObsTest1 : public TorqObsTest, public testing::WithParamInterface<::std::tuple<double, double, double>>
  53. {};
  54. TEST_P(TorqObsTest1, TorqObs)
  55. {
  56. double torqPuMax1 = 0, torqPuMax2 = 0;
  57. double mod = get<1>(GetParam());
  58. double freq = get<2>(GetParam());
  59. double band = 50;
  60. /* Coef Cal */
  61. torqobs_stCoefIn.uwUbVt = VBASE;
  62. torqobs_stCoefIn.uwIbAp = IBASE;
  63. torqobs_stCoefIn.uwFbHz = FBASE;
  64. torqobs_stCoefIn.uwFTbsHz = FTBS_HZ;
  65. torqobs_stCoefIn.uwPairs = M_POLE_PAIRS;
  66. torqobs_stCoefIn.uwMtJm = M_JD;
  67. torqobs_stCoefIn.uwMtFlxWb = M_FLUX_WB;
  68. torqobs_stCoefIn.uwWtcHz = band;
  69. torqobs_stCoefIn.uwRatioJm = 0; // ASR_SPD_INER_RATE;
  70. torqobs_voCoef(&torqobs_stCoefIn, &torqobs_stCoef);
  71. /* Speed Ref */
  72. sys1->PmsmSimUt_P.Params.CustomSpdCtrl = 0;
  73. sys1->PmsmSimUt_U.CtrlIn.WmRpm = get<0>(GetParam());
  74. for (int i = 0; i < 10 / sys1->PmsmSimUt_P.Params.Ts; i++)
  75. {
  76. /* Motor Load Torque */
  77. double phase = 2 * 3.14 * freq * i * sys1->PmsmSimUt_P.Params.Ts;
  78. sys1->PmsmSimUt_U.CtrlIn.Tm = 1 + mod * sin(phase);
  79. /* Motor Control */
  80. sys1->step();
  81. /* Named Value to Pu Value */
  82. MotorSimHelper::TransitModelOutput(sys1, &McStatus1);
  83. /* Torque Observer */
  84. if(i % (FTBC_HZ / FTBS_HZ) == 0)
  85. {
  86. torqobs_stCalIn.swIqMaxPu = 55 * 100 * 16384 / IBASE;
  87. torqobs_stCalIn.swIqMinPu = -55 * 100 * 16384 / IBASE;
  88. torqobs_stCalIn.swIqfbkPu = McStatus1.Pu.swIq;
  89. torqobs_stCalIn.swSpdPu = McStatus1.Pu.swElecOmega;
  90. torqobs_voCal(&torqobs_stCalIn, &torqobs_stCoef, &torqobs_stCalOut);
  91. }
  92. double torqPu = (double)sys1->PmsmSimUt_U.CtrlIn.Tm * 1000 * 16384 / McStatus1.Base->uwTqbNm;
  93. /* Get Torque Max */
  94. if(i > 1 / sys1->PmsmSimUt_P.Params.Ts)
  95. {
  96. if(torqPuMax1 < torqobs_stCalOut.swTorqObsPu)
  97. {
  98. torqPuMax1 = torqobs_stCalOut.swTorqObsPu;
  99. }
  100. if(torqPuMax2 < torqPu)
  101. {
  102. torqPuMax2 = torqPu;
  103. }
  104. }
  105. //UdpScope::Send(0, torqobs_stCalOut.swSpdObsPu, McStatus1.Pu.swElecOmega, torqPu, torqobs_stCalOut.swTorqObsPu, torqobs_stCalOut.swIqLoadPu);
  106. }
  107. if(freq <= band)
  108. {
  109. EXPECT_TRUE((torqPuMax1 / torqPuMax2) >= 0.707 && (torqPuMax1 / torqPuMax2) <= 1.01); ///< band处为-3dB(0.707), P控制无超调小于0dB(1)
  110. }
  111. }
  112. INSTANTIATE_TEST_SUITE_P(DiffTorq, TorqObsTest1, ::testing::Combine(::testing::Values(500, 5000), ::testing::Values(0, 0.5, 1), ::testing::Values(1, 16, 50)));