test_cadence.cpp 4.1 KB

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