test_bikespeed.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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. }
  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(3),IC_BikeSpdISR);
  18. iCap_EnableChannelInterrupt(0,CAP_CH(3));
  19. iCap_BindChannelInterrupt(0,CAP_CH(2),IC_CadenceISR);
  20. iCap_EnableChannelInterrupt(0,CAP_CH(2));
  21. cadence_voCadenceInit();
  22. bikespeed_voBikeSpeedInit();
  23. }
  24. virtual void TearDown() override
  25. {
  26. }
  27. };
  28. class BikeSpeedTest1 : public BikeSpeedTest, public testing::WithParamInterface<int>
  29. {};
  30. TEST_P(BikeSpeedTest1, FreCal)
  31. {
  32. /* Coef Cal */
  33. bikespeed_voBikeSpeedCof();
  34. bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
  35. int timerPrd = TIM1CLK_KHZ * 1000 / (1000 / 25); // cnt = 18000, same as STM32
  36. int timerCnt = 0;
  37. int bikeSpeedSignal = 0, bikeSpeedCnt = 0, bikeSpeedSignalLast = 0;
  38. int bikeSpeedPrd = GetParam();
  39. int capValue = 0;
  40. /* BikeSpeed Freq Cal */
  41. int j = 0;
  42. for(int i = 0; i < 100000000; i++)
  43. {
  44. /* Input BikeSpeed Signal */
  45. bikeSpeedCnt++;
  46. if(bikeSpeedCnt <= (bikeSpeedPrd/10)) // 10% duty
  47. {
  48. bikeSpeedSignal = 0;
  49. }
  50. else
  51. {
  52. bikeSpeedSignal = 1;
  53. if(bikeSpeedPrd == 18000 && j == 0)
  54. {
  55. if(bikeSpeedCnt >= bikeSpeedPrd - 1)
  56. {
  57. bikeSpeedCnt = 0;
  58. j = 1;
  59. }
  60. }
  61. else
  62. {
  63. if(bikeSpeedCnt >= bikeSpeedPrd)
  64. {
  65. bikeSpeedCnt = 0;
  66. }
  67. }
  68. }
  69. /* Timer */
  70. timerCnt ++ ;
  71. if(timerCnt >= timerPrd)
  72. {
  73. timerCnt = 0;
  74. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
  75. }
  76. /* Capture: rising edge trigger*/
  77. if(bikeSpeedSignal - bikeSpeedSignalLast == -1)
  78. {
  79. testCh3CapValue[TIMER1] = timerCnt;
  80. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 1;
  81. }
  82. bikeSpeedSignalLast = bikeSpeedSignal;
  83. /* Interrupt: update and capture */
  84. if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
  85. {
  86. bikespeed_voBikeSpeedCal(1);
  87. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
  88. }
  89. else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3])
  90. {
  91. bikespeed_voBikeSpeedCal(3);
  92. testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 0;
  93. }
  94. //UdpScope::Send(0, bikespeed_stFreGetOut.uwFrequencyPu);
  95. }
  96. double bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedPrd / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
  97. if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCntTest)
  98. {
  99. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
  100. }
  101. else
  102. {
  103. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
  104. }
  105. }
  106. INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest1,
  107. ::testing::Values(0, 500, 3000, 18000, 100000,10000000));
  108. class BikeSpeedTest2 : public BikeSpeedTest, public testing::WithParamInterface<int>
  109. {};
  110. TEST_P(BikeSpeedTest2, IntSimultFreCal)
  111. {
  112. /* Coef Cal */
  113. bikespeed_voBikeSpeedCof();
  114. bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
  115. switch_flg.SysCoef_Flag = TRUE;
  116. /* Test conditions */
  117. bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
  118. bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
  119. bikespeed_stFreGetOut.uwCaputure1Cnt = 100;
  120. bikespeed_stFreGetOut.uwCaputureOverflowCnt = 3;
  121. double overflowCnt = bikespeed_stFreGetOut.uwCaputureOverflowCnt;
  122. double cap1Cnt = bikespeed_stFreGetOut.uwCaputure1Cnt;
  123. testCh3CapValue[TIMER1] = GetParam();
  124. /* Interrupt flag */
  125. testTimerIntFlag2[TIMER1] = 0x0011;
  126. /* Interrupt: update and capture */
  127. if(testTimerIntFlag2[TIMER1] != 0)
  128. {
  129. iRtCap_Isr(0);
  130. }
  131. if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  132. {
  133. overflowCnt++;
  134. }
  135. double bikeSpeedFreqPu = overflowCnt * 18000 + bikespeed_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
  136. bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedFreqPu / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
  137. if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCnt)
  138. {
  139. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
  140. }
  141. else
  142. {
  143. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
  144. if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  145. {
  146. EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 0);
  147. }
  148. else
  149. {
  150. EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 1);
  151. }
  152. }
  153. }
  154. INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest2,
  155. ::testing::Values(200, 17900));
  156. class BikeSpeedTest3 : public BikeSpeedTest, public testing::WithParamInterface<::std::tuple<int,int>>
  157. {};
  158. TEST_P(BikeSpeedTest3, IntSimultFreCal)
  159. {
  160. /* Coef Cal */
  161. switch_flg.SysCoef_Flag = TRUE;
  162. bikespeed_voBikeSpeedCof();
  163. bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
  164. cadence_voCadenceCof();
  165. cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
  166. /* Test conditions */
  167. bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
  168. bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
  169. bikespeed_stFreGetOut.uwCaputure1Cnt = 100;
  170. bikespeed_stFreGetOut.uwCaputureOverflowCnt = 3;
  171. cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
  172. cadence_stFreGetOut.uwCaputureNumCnt = 1;
  173. cadence_stFreGetOut.uwCaputure1Cnt = 100;
  174. cadence_stFreGetOut.uwCaputureOverflowCnt = 1; ///< OverflowCnt cant be 0
  175. testGpioBValue[GPIOB] = 0;
  176. double bsOverflowCnt = bikespeed_stFreGetOut.uwCaputureOverflowCnt;
  177. double bsCap1Cnt = bikespeed_stFreGetOut.uwCaputure1Cnt;
  178. double cadOverflowCnt = cadence_stFreGetOut.uwCaputureOverflowCnt;
  179. double cadCapCnt = cadence_stFreGetOut.uwCaputure1Cnt;
  180. /* Capture value */
  181. testCh2CapValue[TIMER1] = get<1>(GetParam());
  182. testCh3CapValue[TIMER1] = get<0>(GetParam());
  183. /* Interrupt flag */
  184. testTimerIntFlag2[TIMER1] = 0x0019;
  185. /* Interrupt: update and capture */
  186. if(testTimerIntFlag2[TIMER1] != 0)
  187. {
  188. iRtCap_Isr(0);
  189. }
  190. if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  191. {
  192. bsOverflowCnt++;
  193. }
  194. if(testCh2CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  195. {
  196. cadOverflowCnt++;
  197. }
  198. double bikeSpeedFreqPu = bsOverflowCnt * 18000 + bikespeed_stFreGetOut.uwCaputure2Cnt - bsCap1Cnt;
  199. bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedFreqPu / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
  200. if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCnt)
  201. {
  202. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
  203. }
  204. else
  205. {
  206. EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
  207. if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  208. {
  209. EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 0);
  210. }
  211. else
  212. {
  213. EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 1);
  214. }
  215. }
  216. double capValErrLast = 0, capValErr = 0, cadFreqPu = 0;
  217. capValErrLast = capValErr;
  218. capValErr = cadOverflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - cadCapCnt;
  219. cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / ((capValErr + capValErrLast) / 2)/ FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20
  220. if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
  221. {
  222. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
  223. }
  224. else
  225. {
  226. EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
  227. if(testCh2CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
  228. {
  229. EXPECT_EQ(cadence_stFreGetOut.uwCaputureOverflowCnt, 0);
  230. }
  231. else
  232. {
  233. EXPECT_EQ(cadence_stFreGetOut.uwCaputureOverflowCnt, 1);
  234. }
  235. }
  236. }
  237. INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest3,
  238. ::testing::Combine(::testing::Values(200, 17900), ::testing::Values(199, 201, 17800,17901)));