#include "gtest/gtest.h" #include #include #include "test_user.h" #include "hwsetup.h" #include "scope.h" class CadenceTest : public testing::Test { protected: static void SetUpTestSuite() { cadence_voCadenceInit(); } virtual void SetUp() override { } virtual void TearDown() override { } }; class CadenceTest1 : public CadenceTest, public testing::WithParamInterface {}; TEST_P(CadenceTest1, FreCal) { /* Coef Cal */ cadence_voCadenceCof(); cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES; int timerPrd = TIM1CLK_KHZ * 1000 / (1000 / 25); // cnt = 18000, same as STM32 int timerCnt = 0; int cadenceSignal = 0, cadCnt = 0, cadenceSignalLast = 0; int cadencePrd = GetParam(); int capValue = 0; /* Cadence Cal */ for(int i = 0; i < 100000000; i++) { /* Input Cadence Signal */ cadCnt++; if(cadCnt <= (cadencePrd/2)) // 50% duty { cadenceSignal = 0; } else { cadenceSignal = 1; if(cadCnt >= cadencePrd) { cadCnt = 0; } } /* Timer */ timerCnt ++ ; if(timerCnt >= timerPrd - 1) { timerCnt = 0; testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1; } /* Capture: rising and falling edge trigger*/ if(cadenceSignal - cadenceSignalLast != 0) { testCh2CapValue[TIMER1] = timerCnt; testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1; } cadenceSignalLast = cadenceSignal; /* Interrupt: update and capture */ if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP]) { cadence_voCadenceCal(1); testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0; } else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2]) { cadence_voCadenceCal(2); testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0; } //UdpScope::Send(0, cadence_stFreGetOut.uwFrequencyPu); } double cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadencePrd / FBASE / cadence_stFreGetCof.uwNumbersPulses; // Q20 if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt >= cadence_stFreGetCof.uwHfMaxTimeCnt) { EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1); } else { EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2); } } INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1, ::testing::Values(0, 500, 3000, 26000,100000,1000000));