test_cadence.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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<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 = GetParam();
  32. int capValue = 0;
  33. /* Cadence Cal */
  34. for(int i = 0; i < 100000000; i++)
  35. {
  36. /* Input Cadence Signal */
  37. cadCnt++;
  38. if(cadCnt <= (cadencePrd/2)) // 50% duty
  39. {
  40. cadenceSignal = 0;
  41. }
  42. else
  43. {
  44. cadenceSignal = 1;
  45. if(cadCnt >= cadencePrd)
  46. {
  47. cadCnt = 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 and falling edge trigger*/
  58. if(cadenceSignal - cadenceSignalLast != 0)
  59. {
  60. testCh2CapValue[TIMER1] = timerCnt;
  61. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1;
  62. }
  63. cadenceSignalLast = cadenceSignal;
  64. /* Interrupt: update and capture */
  65. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  66. {
  67. cadence_voCadenceCal(1);
  68. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  69. }
  70. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2])
  71. {
  72. cadence_voCadenceCal(2);
  73. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0;
  74. }
  75. //UdpScope::Send(0, cadence_stFreGetOut.uwFrequencyPu);
  76. }
  77. double cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadencePrd / FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20
  78. if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt >= cadence_stFreGetCof.uwHfMaxTimeCnt)
  79. {
  80. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
  81. }
  82. else
  83. {
  84. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
  85. }
  86. }
  87. INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1, ::testing::Values(0, 500, 3000, 26000,100000,1000000));