|
@@ -9,16 +9,25 @@ class BikeSpeedTest : public testing::Test
|
|
|
protected:
|
|
|
static void SetUpTestSuite()
|
|
|
{
|
|
|
- bikespeed_voBikeSpeedInit();
|
|
|
- iRt_Init();
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
virtual void SetUp() override
|
|
|
{
|
|
|
+ iRt_Init();
|
|
|
+ iCap_BindDeviceInterrupt(0,IC_CountMaxISR);
|
|
|
+ iCap_EnableDeviceInterrupt(0);
|
|
|
+ iCap_BindChannelInterrupt(0,CAP_CH(3),IC_BikeSpdISR);
|
|
|
+ iCap_EnableChannelInterrupt(0,CAP_CH(3));
|
|
|
+ iCap_BindChannelInterrupt(0,CAP_CH(2),IC_CadenceISR);
|
|
|
+ iCap_EnableChannelInterrupt(0,CAP_CH(2));
|
|
|
|
|
|
+ cadence_voCadenceInit();
|
|
|
+ bikespeed_voBikeSpeedInit();
|
|
|
}
|
|
|
virtual void TearDown() override
|
|
|
{
|
|
|
- bikespeed_voBikeSpeedInit();
|
|
|
+
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -112,36 +121,41 @@ TEST_P(BikeSpeedTest1, FreCal)
|
|
|
INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest1,
|
|
|
::testing::Values(0, 500, 3000, 18000, 100000,10000000));
|
|
|
|
|
|
-TEST_F(BikeSpeedTest, FreCal2)
|
|
|
+class BikeSpeedTest2 : public BikeSpeedTest, public testing::WithParamInterface<int>
|
|
|
+{};
|
|
|
+
|
|
|
+TEST_P(BikeSpeedTest2, IntSimultFreCal)
|
|
|
{
|
|
|
/* Coef Cal */
|
|
|
bikespeed_voBikeSpeedCof();
|
|
|
bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
|
|
|
+ switch_flg.SysCoef_Flag = TRUE;
|
|
|
|
|
|
/* Test conditions */
|
|
|
bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
|
|
|
bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
|
|
|
- bikespeed_stFreGetOut.uwCaputure1Cnt = 0;
|
|
|
+ bikespeed_stFreGetOut.uwCaputure1Cnt = 100;
|
|
|
bikespeed_stFreGetOut.uwCaputureOverflowCnt = 3;
|
|
|
|
|
|
double overflowCnt = bikespeed_stFreGetOut.uwCaputureOverflowCnt;
|
|
|
double cap1Cnt = bikespeed_stFreGetOut.uwCaputure1Cnt;
|
|
|
|
|
|
- testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
|
|
|
- testCh3CapValue[TIMER1] = 17900;
|
|
|
- testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 1;
|
|
|
|
|
|
- /* Interrupt: update and capture */
|
|
|
- if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])
|
|
|
+ testCh3CapValue[TIMER1] = GetParam();
|
|
|
+
|
|
|
+ /* Interrupt flag */
|
|
|
+ testTimerIntFlag2[TIMER1] = 0x0011;
|
|
|
+
|
|
|
+ /* Interrupt: update and capture */
|
|
|
+ if(testTimerIntFlag2[TIMER1] != 0)
|
|
|
{
|
|
|
- bikespeed_voBikeSpeedCal(1);
|
|
|
- testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
|
|
|
- }
|
|
|
- else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3])
|
|
|
+ iRtCap_Isr(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
{
|
|
|
- bikespeed_voBikeSpeedCal(3);
|
|
|
- testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH3] = 0;
|
|
|
- }
|
|
|
+ overflowCnt++;
|
|
|
+ }
|
|
|
|
|
|
double bikeSpeedFreqPu = overflowCnt * 18000 + bikespeed_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
|
|
|
bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedFreqPu / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
|
|
@@ -153,5 +167,118 @@ TEST_F(BikeSpeedTest, FreCal2)
|
|
|
else
|
|
|
{
|
|
|
EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
|
|
|
+ if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
+ {
|
|
|
+ EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 1);
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest2,
|
|
|
+ ::testing::Values(200, 17900));
|
|
|
+
|
|
|
+
|
|
|
+class BikeSpeedTest3 : public BikeSpeedTest, public testing::WithParamInterface<::std::tuple<int,int>>
|
|
|
+{};
|
|
|
+
|
|
|
+TEST_P(BikeSpeedTest3, IntSimultFreCal)
|
|
|
+{
|
|
|
+ /* Coef Cal */
|
|
|
+ bikespeed_voBikeSpeedCof();
|
|
|
+ bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
|
|
|
+ switch_flg.SysCoef_Flag = TRUE;
|
|
|
+ cadence_voCadenceCof();
|
|
|
+ cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
|
|
|
+ bikespeed_voBikeSpeedCof(); ///< timer更新中断函数中有bikespeed函数,防止运行时除0
|
|
|
+
|
|
|
+ /* Test conditions */
|
|
|
+ bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
|
|
|
+ bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
|
|
|
+ bikespeed_stFreGetOut.uwCaputure1Cnt = 100;
|
|
|
+ bikespeed_stFreGetOut.uwCaputureOverflowCnt = 3;
|
|
|
+
|
|
|
+ /* Test conditions */
|
|
|
+ cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
|
|
|
+ cadence_stFreGetOut.uwCaputureNumCnt = 1;
|
|
|
+ cadence_stFreGetOut.uwCaputure1Cnt = 100;
|
|
|
+ cadence_stFreGetOut.uwCaputureOverflowCnt = 1; ///< OverflowCnt cant be 0
|
|
|
+ testGpioBValue[GPIOB] = 0;
|
|
|
+
|
|
|
+ double BSoverflowCnt = bikespeed_stFreGetOut.uwCaputureOverflowCnt;
|
|
|
+ double BScap1Cnt = bikespeed_stFreGetOut.uwCaputure1Cnt;
|
|
|
+
|
|
|
+ double CDoverflowCnt = cadence_stFreGetOut.uwCaputureOverflowCnt;
|
|
|
+ double CDcap1Cnt = cadence_stFreGetOut.uwCaputure1Cnt;
|
|
|
+
|
|
|
+ testCh2CapValue[TIMER1] = get<1>(GetParam());
|
|
|
+ testCh3CapValue[TIMER1] = get<0>(GetParam());
|
|
|
+
|
|
|
+ /* Interrupt flag */
|
|
|
+ testTimerIntFlag2[TIMER1] = 0x0019;
|
|
|
+
|
|
|
+ /* Interrupt: update and capture */
|
|
|
+ if(testTimerIntFlag2[TIMER1] != 0)
|
|
|
+ {
|
|
|
+ iRtCap_Isr(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
+ {
|
|
|
+ BSoverflowCnt++;
|
|
|
+ }
|
|
|
+ if(testCh2CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
+ {
|
|
|
+ CDoverflowCnt++;
|
|
|
+ }
|
|
|
+
|
|
|
+ double bikeSpeedFreqPu = BSoverflowCnt * 18000 + bikespeed_stFreGetOut.uwCaputure2Cnt - BScap1Cnt;
|
|
|
+ bikeSpeedFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / bikeSpeedFreqPu / FBASE / bikespeed_stFreGetCof.uwNumbersPulses; // Q20
|
|
|
+
|
|
|
+ if(bikeSpeedFreqPu > bikespeed_stFreGetCof.uwMaxBikeSpeedFre || bikespeed_stFreGetOut.uwCaputureOverflowCnt > bikespeed_stFreGetOut.uwCaputureOverflowMinCnt)
|
|
|
+ {
|
|
|
+ EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, 0, 0.1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EXPECT_NEAR(bikespeed_stFreGetOut.uwFrequencyPu, bikeSpeedFreqPu, 2);
|
|
|
+ if(testCh3CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
+ {
|
|
|
+ EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EXPECT_EQ(bikespeed_stFreGetOut.uwCaputureOverflowCnt, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ double capValErrLast = 0, capValErr = 0, cadFreqPu = 0;
|
|
|
+ capValErrLast = capValErr;
|
|
|
+ capValErr = CDoverflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - CDcap1Cnt;
|
|
|
+ cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / ((capValErr + capValErrLast) / 2)/ FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20
|
|
|
+
|
|
|
+ if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
|
|
|
+ {
|
|
|
+ EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
|
|
|
+ if(testCh2CapValue[TIMER1] < (iCap_GetPeriod(0) >> 1))
|
|
|
+ {
|
|
|
+ EXPECT_EQ(cadence_stFreGetOut.uwCaputureOverflowCnt, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ EXPECT_EQ(cadence_stFreGetOut.uwCaputureOverflowCnt, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+INSTANTIATE_TEST_SUITE_P(DiffBikeSpeedPeriod, BikeSpeedTest3,
|
|
|
+ ::testing::Combine(::testing::Values(200, 17900), ::testing::Values(199, 201, 17800,17901)));
|