AnsweredAssumed Answered

RTC vs FTM measurement

Question asked by therealfreegeek on Feb 14, 2016
Latest reply on Jan 2, 2018 by M I

I have the RTC set up to give an interrupt every second, in the interrupt I reset the FTM counter and my software FTM overflow counter and then wait for an input capture. When I get the input capture I print (over USB-CDC) the time in hours, minutes, seconds and then the time to the input capture event in nano-seconds. The FTM is set up to be clocked at 50MHz so the tick is 20nS.

 

Thus the highest value I would expect to see in my "software" overflow counter before the "seconds" interrupt cleared it, would be 1/(65334 x 20nS) = 762

 

However I regularly see values over this, can anyone say why this would happen?

 

Here  is the main code created with KSDK 1.3

 

//turns on seconds interrupt;

RTC_DRV_SetSecsIntCmd(rtcTimer1_IDX, true);

 

//Turn on the FTM counter in free running mode and enable overflow int

FTM_DRV_CounterStart(flexTimer1_IDX, kCounting_FTM_UP, 0x00, 0xFFFF, true);

 

//Turn on the FTM0 input capture

FTM_DRV_SetupChnInputCapture(flexTimer1_IDX, kFtmFallingEdge, FTM0_channel_1, input_filter_off);

 

 

for(;;){

       if (FTM0_Ch1_ICflag == 1 )

                {

                     FTM0_Ch1_ICflag = 0;                          // clears "input capture" flag set in FTM interrupt routine

                     cmd_get_datetime();                           // prints the current date time

                     Ch1_nanoseconds_value =(((FTM0_Ch1_timer_overflow_count_store <<16) + FTM0_Ch1_capture_value)*20);  // calculates the ns position of pulse this second

                     PRINTF("capture value%d\r\n", FTM0_Ch1_capture_value);

                     PRINTF("overflowcount %d\r\n", FTM0_Ch1_timer_overflow_count_store);

                     PRINTF("overflowcount x 65536 = %d\r\n", (FTM0_Ch1_timer_overflow_count_store<<16));

                     PRINTF("and %dns\r\n\n",Ch1_nanoseconds_value);

                }
}

.....and here is the terminal view, with a couple of examples (second and last) with the overflow count significantly above 762, any thoughts?

 

terminal.jpg

 

Here are the two interrupt routines.

 

void RTC_Seconds_IRQHandler(void)

{

       FTM0_timer_overflow_count= 0;     //Resets my timer overflow counter back to zero

       FTM_HAL_SetCounter(g_ftmBase[flexTimer1_IDX],0);   //Resets the FTM counter back to zero

}

 

void FTM0_IRQHandler(void)

{

   //checking the interrupt flag source and clearing

        if(FTM_HAL_HasTimerOverflowed(g_ftmBase[flexTimer1_IDX]))

               {

               FTM_HAL_ClearTimerOverflow(g_ftmBase[flexTimer1_IDX]);

               FTM0_timer_overflow_count++;

               }

    if(FTM_HAL_HasChnEventOccurred(g_ftmBase[flexTimer1_IDX],CHAN1_IDX))

              {

              FTM_HAL_ClearChnEventFlag(g_ftmBase[flexTimer1_IDX],CHAN1_IDX);

              FTM0_Ch1_timer_overflow_count_store = FTM0_timer_overflow_count;

              FTM0_Ch1_capture_value=FTM_HAL_GetChnCountVal(g_ftmBase[flexTimer1_IDX],CHAN1_IDX);

              FTM0_Ch1_ICflag = true;

              }

}

 

Thanks!

Outcomes