Pārlūkot izejas kodu

fix: 增加测试工况

CN\guohui27 2 gadi atpakaļ
vecāks
revīzija
8041ceb92d

+ 6 - 75
User project/3.BasicFunction/Source/Cadence.c

@@ -104,56 +104,6 @@ static void cadence_voCadenceIdle(UWORD source)
     }
 }
 
-/***************************************************************
- Function: cadence_voFreGet;
- Description: cadence frequency get
- Call by: functions in main loop;
- Input Variables: N/A
- Output/Return Variables: N/A
- Subroutine Call: N/A;
- Reference: N/A
-****************************************************************/
-static void cadence_voCadenceLowFrequencyWork(UWORD source)
-{
-    if (source == 1)
-    {
-        cadence_stFreGetOut.uwCaputureOverflowCnt++;
-        if (cadence_stFreGetOut.uwCaputureOverflowCnt == cadence_stFreGetCof.uwLfRecordTimeCnt)
-        {
-            cadence_stFreGetOut.uwFrequencyPu = (UWORD)(((UQWORD)cadence_stFreGetOut.uwCaputureNumCnt << 20) * 1000 /
-                                                (cadence_stFreGetCof.uwLfRecordTimeCnt * cadence_stFreGetCof.uwTimerUnit) /
-                                                cadence_stFreGetCof.uwNumbersPulses / FBASE);
-            cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
-            cadence_stFreGetOut.uwCaputureNumCnt = 0;
-
-            if (cadence_stFreGetOut.uwFrequencyPu < (cadence_stFreGetCof.uwLfMinFrePu))
-            {
-                cadence_stFreGetOut.uwFrequencyPu = 0;
-                cadence_stFreGetOut.uwLPFFrequencyPu = 0;
-                cadence_stFreGetOut.blCadenceCalStartState = FALSE;
-                cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
-                cadence_stFreGetOut.uwCaputureNumCnt = 0;
-                cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
-            }
-        }
-    }
-    else
-    {
-        cadence_stFreGetOut.uwCaputureNumCnt++;
-    }
-
-    if (cadence_stFreGetOut.uwFrequencyPu > cadence_stFreGetCof.uwMaxCadenceFre)
-    {
-        cadence_stFreGetOut.uwFrequencyPu = 0;
-        cadence_stFreGetOut.blCadenceCalStartState = FALSE;
-        cadence_stFreGetOut.blCadenceSensorErrorFlg = TRUE;
-        cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
-        cadence_stFreGetOut.uwCaputureNumCnt = 0;
-        cadence_stFreGetOut.uwCaputure2Cnt = 0;
-        cadence_stFreGetOut.uwCaputure1Cnt = 0;
-        cadence_stFreGetOut.cadence_fsm = CADENCE_ERROR;
-    }
-}
 /***************************************************************
  Function: cadence_voFreGet;
  Description: cadence frequency get
@@ -184,16 +134,16 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
             if(cadence_stFreGetOut.uwOverflowfirst == 1)
             {
                 cadence_stFreGetOut.uwCaputureOverflowCnt -=1;
-                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) -
-                                cadence_stFreGetOut.uwCaputure1Cnt + cadence_stFreGetOut.uwCaputure2Cnt;
+                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
+                                    -cadence_stFreGetOut.uwCaputure1Cnt;
                 cadence_stFreGetOut.uwCaputureOverflowCnt = 1; 
                 cadence_stFreGetOut.uwOverflowfirst = 0;
                 
             }
             else
             {
-                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) -
-                                cadence_stFreGetOut.uwCaputure1Cnt + cadence_stFreGetOut.uwCaputure2Cnt;
+                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
+                                    -cadence_stFreGetOut.uwCaputure1Cnt;
                 cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
                 cadence_stFreGetOut.uwOverflowfirst = 0;
             }
@@ -304,7 +254,6 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
 ****************************************************************/
 static void cadence_voCadenceBackword(UWORD source)
 {
-
     if (source == 1)
     {
         cadence_stFreGetOut.uwCaputureOverflowCnt++;
@@ -319,27 +268,12 @@ static void cadence_voCadenceBackword(UWORD source)
         cadence_stFreGetOut.uwFreqPercent = 0;
         cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
         cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_CANDANCE;
-        cadence_stFreGetOut.uwFrequencyPu = 1 * CADENCESPEED_KMPERH2FREQPU;  
+        cad_pvt_ulCadFreqPu = 1 * CADENCESPEED_KMPERH2FREQPU;
+        cadence_stFreGetOut.uwFrequencyPu = (UWORD)cad_pvt_ulCadFreqPu;  
         cadence_stFreGetOut.uwLPFFrequencyPu = (cadence_stFreGetOut.uwLPFFrequencyPu * cadence_stFreGetCof.uwCadenceLPFgain +
                                                     cadence_stFreGetOut.uwFrequencyPu * (100 - cadence_stFreGetCof.uwCadenceLPFgain)) /
                                                    100;
     }
-
-    //    if (cadence_stFreGetOut.uwCaputureOverflowCnt >= cadence_stFreGetCof.uwHfMaxTimeCnt) // 100ms
-    //    {
-    //        cadence_stFreGetOut.uwFrequencyPu = 0;
-    //        cadence_stFreGetOut.uwLPFFrequencyPu = 0;
-    //        cadence_stFreGetOut.blCadenceCalStartState = FALSE;
-    //        cadence_stFreGetOut.blCadenceSensorErrorFlg = FALSE;
-    //        cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
-    //        cadence_stFreGetOut.uwCaputureNumCnt = 0;
-    //        cadence_stFreGetOut.uwCaputure2Cnt = 0;
-    //        cadence_stFreGetOut.uwCaputure1Cnt = 0;
-    //        cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
-    //        cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
-    //        cadence_stFreGetOut.uwFreqPercent = 0;
-
-    //    }
 }
 /***************************************************************
  Function: cadence_voFreGet;
@@ -426,9 +360,6 @@ void cadence_voCadenceCal(UWORD source)
     case CADENCE_IDLE:
         cadence_voCadenceIdle(source);
         break;
-    case CADENCE_LFreWork:
-        cadence_voCadenceLowFrequencyWork(source);
-        break;
     case CADENCE_HFreWork:
         cadence_voCadenceHighFrequencyWork(source);
         break;

+ 44 - 4
unit_test/test_cadence.cpp

@@ -22,7 +22,7 @@ protected:
     }
 };
 
-class CadenceTest1 : public CadenceTest, public testing::WithParamInterface<int>
+class CadenceTest1 : public CadenceTest, public testing::WithParamInterface<::std::tuple<int,int>>
 {};
 
 TEST_P(CadenceTest1, FreCal)
@@ -34,9 +34,11 @@ TEST_P(CadenceTest1, FreCal)
     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 cadencePrd = get<0>(GetParam());
     int capValue = 0; 
 
+    testGpioBValue[GPIOB] = get<1>(GetParam());
+
     /* Cadence Cal */
     for(int i = 0; i < 100000000; i++)
     {  
@@ -87,7 +89,7 @@ TEST_P(CadenceTest1, FreCal)
 
     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)
+    if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt >= cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
     {
         EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
     }
@@ -97,4 +99,42 @@ TEST_P(CadenceTest1, FreCal)
     }
 }
 
-INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1, ::testing::Values(0, 500, 3000, 26000,100000,1000000));
+INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1,
+                         ::testing::Combine(::testing::Values(0, 500, 3000, 18002, 100000,1000000), ::testing::Values(0,1)));
+
+TEST_F(CadenceTest, FreCal2)
+{
+    /* Coef Cal */
+    cadence_voCadenceCof();
+    cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+
+    /* Test conditions */
+    cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
+    cadence_stFreGetOut.uwCaputureNumCnt = 1;
+    cadence_stFreGetOut.uwCaputure1Cnt = 0;
+    cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
+
+    double overflowCnt = cadence_stFreGetOut.uwCaputureOverflowCnt;
+    double cap1Cnt = cadence_stFreGetOut.uwCaputure1Cnt;
+
+    testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
+    testCh2CapValue[TIMER1] = 17900;
+    testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1;
+
+    /* 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;
+    }        
+
+    double cadFreqPu =  overflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
+    cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadFreqPu / FBASE / cadence_stFreGetCof.uwNumbersPulses;  // Q20
+
+    EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, cadFreqPu, 2);
+}