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