test_bikespeed.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "gtest/gtest.h"
  2. #include <gtest/gtest.h>
  3. #include <tuple>
  4. #include "scope.h"
  5. #include "test_user.h"
  6. class BikeSpeedTest : public testing::Test
  7. {
  8. protected:
  9. static void SetUpTestSuite()
  10. {
  11. bikespeed_voBikeSpeedInit();
  12. }
  13. virtual void SetUp() override
  14. {
  15. }
  16. virtual void TearDown() override
  17. {
  18. bikespeed_voBikeSpeedInit();
  19. }
  20. };
  21. class BikeSpeedTest1 : public BikeSpeedTest, public testing::WithParamInterface<int>
  22. {};
  23. TEST_P(BikeSpeedTest1, FreCal)
  24. {
  25. /* Coef Cal */
  26. bikespeed_voBikeSpeedCof();
  27. bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
  28. int timerPrd = TIM1CLK_KHZ * 1000 / (1000 / 25); // cnt = 18000, same as STM32
  29. int timerCnt = 0;
  30. int bikeSpeedSignal = 0, bikeSpeedCnt = 0, bikeSpeedSignalLast = 0;
  31. int bikeSpeedPrd = GetParam();
  32. int capValue = 0;
  33. /* BikeSpeed Freq Cal */
  34. int j = 0;
  35. for(int i = 0; i < 100000000; i++)
  36. {
  37. /* Input BikeSpeed Signal */
  38. bikeSpeedCnt++;
  39. if(bikeSpeedCnt <= (bikeSpeedPrd/10)) // 10% duty
  40. {
  41. bikeSpeedSignal = 0;
  42. }
  43. else
  44. {
  45. bikeSpeedSignal = 1;
  46. if(bikeSpeedPrd == 18000 && j == 0)
  47. {
  48. if(bikeSpeedCnt >= bikeSpeedPrd - 1)
  49. {
  50. bikeSpeedCnt = 0;
  51. j = 1;
  52. }
  53. }
  54. else
  55. {
  56. if(bikeSpeedCnt >= bikeSpeedPrd)
  57. {
  58. bikeSpeedCnt = 0;
  59. }
  60. }
  61. }
  62. /* Timer */
  63. timerCnt ++ ;
  64. if(timerCnt >= timerPrd)
  65. {
  66. timerCnt = 0;
  67. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
  68. }
  69. /* Capture: rising edge trigger*/
  70. if(bikeSpeedSignal - bikeSpeedSignalLast == -1)
  71. {
  72. testCh3CapValue[TIMER1] = timerCnt;
  73. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 1;
  74. }
  75. bikeSpeedSignalLast = bikeSpeedSignal;
  76. /* Interrupt: update and capture */
  77. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  78. {
  79. bikespeed_voBikeSpeedCal(1);
  80. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  81. }
  82. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3])
  83. {
  84. bikespeed_voBikeSpeedCal(3);
  85. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 0;
  86. }
  87. //UdpScope::Send(0, bikespeed_stFreGetOut.uwFrequencyPu);
  88. }
  89. double bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedPrd / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
  90. if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCnt)
  91. {
  92. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
  93. }
  94. else
  95. {
  96. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
  97. }
  98. }
  99. INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest1,
  100. ::testing::Values(0, 500, 3000, 18000, 100000,1000000));
  101. TEST_F(BikeSpeedTest, FreCal2)
  102. {
  103. /* Coef Cal */
  104. bikespeed_voBikeSpeedCof();
  105. bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
  106. /* Test conditions */
  107. bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
  108. bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
  109. bikespeed_stFreGetOut.uwCaputure1Cnt = 0;
  110. bikespeed_stFreGetOut.uwCaputureOverflowCnt = 3;
  111. double overflowCnt = bikespeed_stFreGetOut.uwCaputureOverflowCnt;
  112. double cap1Cnt = bikespeed_stFreGetOut.uwCaputure1Cnt;
  113. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
  114. testCh3CapValue[TIMER1] = 17900;
  115. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 1;
  116. /* Interrupt: update and capture */
  117. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  118. {
  119. bikespeed_voBikeSpeedCal(1);
  120. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  121. }
  122. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3])
  123. {
  124. bikespeed_voBikeSpeedCal(3);
  125. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 0;
  126. }
  127. double bikeSpeedFreqPu = overflowCnt * 18000 + bikespeed_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
  128. bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedFreqPu / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
  129. if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCnt)
  130. {
  131. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
  132. }
  133. else
  134. {
  135. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
  136. }
  137. }