test_bikespeed.cpp 4.4 KB

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