test_cadence.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "gtest/gtest.h"
  2. #include <gtest/gtest.h>
  3. #include <tuple>
  4. #include "scope.h"
  5. #include "test_user.h"
  6. class CadenceTest : public testing::Test
  7. {
  8. protected:
  9. static void SetUpTestSuite()
  10. {
  11. cadence_voCadenceInit();
  12. iRt_Init();
  13. }
  14. virtual void SetUp() override
  15. {
  16. }
  17. virtual void TearDown() override
  18. {
  19. cadence_voCadenceInit();
  20. }
  21. };
  22. class CadenceTest1 : public CadenceTest, public testing::WithParamInterface<::std::tuple<int,int>>
  23. {};
  24. TEST_P(CadenceTest1, FreCal)
  25. {
  26. /* Coef Cal */
  27. cadence_voCadenceCof();
  28. cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
  29. int timerPrd = TIM1CLK_KHZ * 1000 / (1000 / 25); // cnt = 18000, same as STM32
  30. int timerCnt = 0;
  31. int cadenceSignal = 0, cadCnt = 0, cadenceSignalLast = 0;
  32. int cadencePrd = get<0>(GetParam());
  33. int capValue = 0;
  34. testGpioBValue[GPIOB] = get<1>(GetParam());
  35. /* Cadence Cal */
  36. for(int i = 0; i < 100000000; i++)
  37. {
  38. /* Input Cadence Signal */
  39. cadCnt++;
  40. if(cadCnt <= (cadencePrd/2)) // 50% duty
  41. {
  42. cadenceSignal = 0;
  43. }
  44. else
  45. {
  46. cadenceSignal = 1;
  47. if(cadCnt >= cadencePrd)
  48. {
  49. cadCnt = 0;
  50. }
  51. }
  52. /* Timer */
  53. timerCnt ++ ;
  54. if(timerCnt >= timerPrd - 1)
  55. {
  56. timerCnt = 0;
  57. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
  58. }
  59. /* Capture: rising and falling edge trigger*/
  60. if(cadenceSignal - cadenceSignalLast != 0)
  61. {
  62. testCh2CapValue[TIMER1] = timerCnt;
  63. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1;
  64. }
  65. cadenceSignalLast = cadenceSignal;
  66. /* Interrupt: update and capture */
  67. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  68. {
  69. cadence_voCadenceCal(1);
  70. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  71. }
  72. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2])
  73. {
  74. cadence_voCadenceCal(2);
  75. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0;
  76. }
  77. //UdpScope::Send(0, cadence_stFreGetOut.uwFrequencyPu);
  78. }
  79. double cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadencePrd / FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20
  80. if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
  81. {
  82. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
  83. }
  84. else
  85. {
  86. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
  87. }
  88. }
  89. INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1,
  90. ::testing::Combine(::testing::Values(0, 500, 3000, 18002, 100000,1000000), ::testing::Values(0,0x0004)));
  91. TEST_F(CadenceTest, FreCal2)
  92. {
  93. /* Coef Cal */
  94. cadence_voCadenceCof();
  95. cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
  96. /* Test conditions */
  97. cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
  98. cadence_stFreGetOut.uwCaputureNumCnt = 1;
  99. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  100. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  101. testGpioBValue[GPIOB] = 0;
  102. double overflowCnt = cadence_stFreGetOut.uwCaputureOverflowCnt;
  103. double cap1Cnt = cadence_stFreGetOut.uwCaputure1Cnt;
  104. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
  105. testCh2CapValue[TIMER1] = 17900;
  106. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1;
  107. /* Interrupt: update and capture */
  108. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  109. {
  110. cadence_voCadenceCal(1);
  111. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  112. }
  113. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2])
  114. {
  115. cadence_voCadenceCal(2);
  116. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0;
  117. }
  118. double cadFreqPu = overflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
  119. cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadFreqPu / FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20
  120. if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
  121. {
  122. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
  123. }
  124. else
  125. {
  126. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
  127. }
  128. }