The issue about FTM input capture for S32K114 and used SDK configuration

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

The issue about FTM input capture for S32K114 and used SDK configuration

2,116 Views
wangaoyuan
Contributor II

counter clock frequency is 16Mhz,

微信图片_20191023162043.jpg

It can be captured normally at high frequency,but the counter will overflow at low frequency.

as shown below, the left side is the generated frequency and the right side is the frequency at which the input is captured.

PWM frequency: 2 Measured frequency: 3472 [Hz]

PWM frequency: 3 Measured frequency: 642 [Hz]

PWM frequency: 4 Measured frequency: 6944 [Hz]

PWM frequency: 5 Measured frequency: 294 [Hz]

PWM frequency: 6 Measured frequency: 353 [Hz]

PWM frequency: 7 Measured frequency: 278 [Hz]

PWM frequency: 8 Measured frequency: 471 [Hz]

PWM frequency: 9 Measured frequency: 1926 [Hz]

PWM frequency: 10 Measured frequency: 589 [Hz]

Then initialized the counter overflow interrupt , but the program does not work properly.

微信图片_20191023162731.jpg

微信图片_20191023162737.jpg

6 Replies

961 Views
phantomgz
Contributor III

@wangaoyuan

This is my 'Dual Edge Capture mode' interrupt handler code working with MK22FN.

Cai.

 

 
 
 
 
 
 
 

 

static uint32_t CaptureCarry = 0;       // extend carry counter
volatile uint32_t CaptureTicks = 0;     // period of capture result


/* FTM3_IRQn interrupt handler */
void FTMCAPT_IRQHANDLER(void)
{
    uint32_t sc, status;
    uint32_t v1, v2;    // C2V, C3V

    testToggle();

    status = FTMCAPT_PERIPHERAL->STATUS;                // get capture FLAGs
    sc = FTMCAPT_PERIPHERAL->SC;                        // get overflow FLAG
    FTMCAPT_PERIPHERAL->SC = sc & ~FTM_SC_TOF_MASK;     // clear overflow FLAG   

    if ((status & FTM_STATUS_CH3F_MASK) != 0)           // check only second edge
    {   
        // testToggle();
        v1 = FTMCAPT_PERIPHERAL->CONTROLS[2].CnV;       // get first capture value
        v2 = FTMCAPT_PERIPHERAL->CONTROLS[3].CnV;       // get second capture value

        if (v2 & 0x8000)    // capture occur in 'last half period'
        {   
            // If there is overflow at this moment , it can only occur 'after' capture
            // do not need carry +1
            v2 +=  CaptureCarry;

            if (sc & FTM_SC_TOF_MASK)   // flag of overflow 
            {   
                // overflow occurs after the 'last half period' capture,
                // init with A carry
                CaptureCarry = 0x10000;
            }
            else
                CaptureCarry = 0;
        }
        else    // 'first' half period
        {   
            if (sc & FTM_SC_TOF_MASK)   // flag of overflow
            {   
                // If there is overflow at this moment , it can only occur 'before' capture
                v2 += CaptureCarry + 0x10000;
            }
            else 
            {
                // no overflow
                v2 += CaptureCarry;
            }

            CaptureCarry = 0;
        }

        CaptureTicks = v2 - v1; // the RESULT

        // clear second edge flag only.
        FTMCAPT_PERIPHERAL->STATUS = status & ~(FTM_STATUS_CH3F_MASK) ;
    }
    else if ((sc & FTM_SC_TOF_MASK))
    {   
        // just only 'overflow', no capture
        // Carry +1
        CaptureCarry += 0x10000;
    }    

    /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    #if defined __CORTEX_M && (__CORTEX_M == 4U)
        __DSB();
    #endif    
}

 

 

 

0 Kudos

1,796 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hello wangaoyuan@glb-auto.com,

Are you using the ftm_signal_measurement_s32k144 SDK 3.0.0 example?

If you have your own project, could you attach it here?

Thank you,

BR, Daniel

1,796 Views
wangaoyuan
Contributor II

Hello!Daniel Martynek,

yes,i used the ftm_signal_measurement_s32k144 SDK 3.0.0 example.

I'm sorry, because the computer is encrypted, the project can't be exported.

Here is the code I added to the existing example:

 

/*Flags for capture event completion are set in the callback function

*/

void IC_Callback(ic_event_t event, void *userData)
{
 if(event == IC_EVENT_MEASUREMENT_COMPLETE)
 {
  ic_flag = true;
 }
}

/*Enable counter overflow interrupt, when counter overflow, do accumulation.

*/

void FTM1_IC_ISR(void)
{
 /* Clear FTM Timer Overflow flag */
 FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_IC1, (uint32_t)FTM_TIME_OVER_FLOW_FLAG);
 FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_IC1,(uint32_t)FTM_RELOAD_FLAG);
 if(FTM_TIME_OVER_FLOW_FLAG==0x00000200U)
 {
  ovf_num ++;
 }
// if(ic_flag == true)
// {
//  read_ovf_num = ovf_num;
//  ovf_num =0;
//  ic_flag = false;
// }
}
int main(void)
{
    ftm_state_t ftm1StateStruct;
    ftm_state_t ftm2StateStruct;
    /* Variables used to store PWM frequency,
     * input capture measurement value
     */
    uint16_t inputCaptureMeas = 0U;
    uint32_t frequency;
    bool conversionComplete = false;
    /* Buffer for string processing */
    char txBuff[255];
    /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
#ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
#endif
    /*** End of Processor Expert internal initialization.                    ***/

    /* Initialize and configure clocks
     *  -   see clock manager component for details
     */
    CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
                   g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
    /* Initialize pins
     *  -   See PinSettings component for more info
     */
    PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
    /* Initialize FTM instances, PWM and Input capture
     *  -   See ftm component for more details
     */
    FTM_DRV_Init(INST_FLEXTIMER_IC1, &flexTimer_ic1_InitConfig, &ftm1StateStruct);
    FTM_DRV_Init(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_InitConfig, &ftm2StateStruct);
//Enable counter overflow interrupt
 INT_SYS_InstallHandler(FTM1_Ovf_Reload_IRQn, &FTM1_IC_ISR, (isr_t *)0);
 INT_SYS_SetPriority(FTM1_Ovf_Reload_IRQn,6);
 INT_SYS_SetPriority(FTM1_Ch0_Ch1_IRQn,6);
    /* Initialize LPUART instance
     *  -   See LPUART component for configuration details
     */
    LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);
    /* Setup input capture for FTM 1 channel 0  - PTB2 */
    FTM_DRV_InitInputCapture(INST_FLEXTIMER_IC1, &flexTimer_ic1_InputCaptureConfig);
    /* Start PWM channel on FTM 0 channel 0 - PTC0 */
    FTM_DRV_InitPwm(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_PwmConfig);

    /* Get the FTM1 frequency to calculate
     * the frequency of the measured signal.
     */
    frequency = FTM_DRV_GetFrequency(INST_FLEXTIMER_IC1);
    print("This example will show you how to use FTM's signal measurement feature.\
            \rTo achieve that we will generate a modifiable frequency PWM and read \r\nit with Input Capture\r\n");
    /* Infinite loop
     *  -   Wait for user input
     *  -   Measure and calculate the signal frequency
     *  -   Send original and measured freq via LPUART
     *  -   Modify the PWM frequency
     */
    while (1)
    {
        print("Press any key to initiate a new conversion...\r\n");
        /* Wait for user input */
//        LPUART_DRV_ReceiveDataBlocking(INST_LPUART1, (uint8_t *)&txBuff[255], 1U, 1 << 31U);
        LPUART_DRV_ReceiveData(INST_LPUART1, (uint8_t *)&txBuff[255], 1U);
        conversionComplete = false;
        while(conversionComplete == false)

  //When the capture is complete, read the value of the counter overflow, as well as the value of the current counter.


        {
         if(ic_flag == true)
         {
     read_ovf_num = ovf_num;        //read the number of times the counter 
    /* Get values */
    inputCaptureMeas = FTM_DRV_GetInputCaptureMeasurement(INST_FLEXTIMER_IC1, 0U);
    /* Calculate the signal frequency using recorded data*/
    inputCaptureMeas = frequency / (inputCaptureMeas);
    /* Convert the integer to char array and send it*/
    sprintf(txBuff, "PWM frequency:\t%lu\tMeasured frequency:\t%u\t[Hz]ovf number:\t%u\t\r\n", \
      flexTimer_pwm1_PwmConfig.uFrequencyHZ, inputCaptureMeas,read_ovf_num);
    print(txBuff);
    ovf_num = 0;
    read_ovf_num = 0;
    ic_flag = false;
         }
            /* Stop PWM */
            FTM_DRV_DeinitPwm(INST_FLEXTIMER_PWM1);
            /* Increase frequency */
            if(flexTimer_pwm1_PwmConfig.uFrequencyHZ < 100U)
                flexTimer_pwm1_PwmConfig.uFrequencyHZ += 1U;
            else
            {
                flexTimer_pwm1_PwmConfig.uFrequencyHZ = 1U;
                conversionComplete = true;
            }
            /* Restart PWM with new settings */
            FTM_DRV_InitPwm(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_PwmConfig);
   /* Wait a number of cycles for the PWM to reach stability */
   delayCycles(0x20000U);

        }
    }
And the following is the data printed through the serial port:

On the left is the frequency of generation, in the middle is the captured value, and on the right is the number of counter overflows.

PWM frequency: 1 Measured frequency: 1745 [Hz]ovf number: 1

PWM frequency: 2 Measured frequency: 118 [Hz]ovf number: 1

PWM frequency: 3 Measured frequency: 177 [Hz]ovf number: 1

PWM frequency: 4 Measured frequency: 237 [Hz]ovf number: 0

PWM frequency: 5 Measured frequency: 296 [Hz]ovf number: 0

PWM frequency: 6 Measured frequency: 355 [Hz]ovf number: 0

PWM frequency: 7 Measured frequency: 85 [Hz]ovf number: 1

PWM frequency: 8 Measured frequency: 97 [Hz]ovf number: 1

PWM frequency: 9 Measured frequency: 78 [Hz]ovf number: 1

PWM frequency: 10 Measured frequency: 592 [Hz]ovf number: 1

PWM frequency: 11 Measured frequency: 111 [Hz]ovf number: 1

PWM frequency: 12 Measured frequency: 711 [Hz]ovf number: 1

PWM frequency: 13 Measured frequency: 88 [Hz]ovf number: 1

PWM frequency: 14 Measured frequency: 170 [Hz]ovf number: 1

PWM frequency: 15 Measured frequency: 888 [Hz]ovf number: 1

PWM frequency: 16 Measured frequency: 75 [Hz]ovf number: 1

PWM frequency: 17 Measured frequency: 103 [Hz]ovf number: 1

PWM frequency: 18 Measured frequency: 156 [Hz]ovf number: 1

PWM frequency: 19 Measured frequency: 288 [Hz]ovf number: 1

PWM frequency: 20 Measured frequency: 1184 [Hz]ovf number: 1

PWM frequency: 21 Measured frequency: 67 [Hz]ovf number: 1

PWM frequency: 22 Measured frequency: 79 [Hz]ovf number: 1

PWM frequency: 23 Measured frequency: 93 [Hz]ovf number: 1

PWM frequency: 24 Measured frequency: 112 [Hz]ovf number: 1

PWM frequency: 25 Measured frequency: 139 [Hz]ovf number: 1

PWM frequency: 26 Measured frequency: 176 [Hz]ovf number: 1

PWM frequency: 27 Measured frequency: 235 [Hz]ovf number: 1

PWM frequency: 28 Measured frequency: 341 [Hz]ovf number: 1

PWM frequency: 29 Measured frequency: 586 [Hz]ovf number: 1

PWM frequency: 30 Measured frequency: 1776 [Hz]ovf number: 0

PWM frequency: 31 Measured frequency: 63 [Hz]ovf number: 0

PWM frequency: 32 Measured frequency: 67 [Hz]ovf number: 0

PWM frequency: 33 Measured frequency: 72 [Hz]ovf number: 1

PWM frequency: 34 Measured frequency: 77 [Hz]ovf number: 1

PWM frequency: 35 Measured frequency: 82 [Hz]ovf number: 1

PWM frequency: 36 Measured frequency: 88 [Hz]ovf number: 1

PWM frequency: 37 Measured frequency: 94 [Hz]ovf number: 1

PWM frequency: 38 Measured frequency: 101 [Hz]ovf number: 1

PWM frequency: 39 Measured frequency: 108 [Hz]ovf number: 1

PWM frequency: 40 Measured frequency: 116 [Hz]ovf number: 1

PWM frequency: 41 Measured frequency: 125 [Hz]ovf number: 1

PWM frequency: 42 Measured frequency: 135 [Hz]ovf number: 1

PWM frequency: 43 Measured frequency: 146 [Hz]ovf number: 1

PWM frequency: 44 Measured frequency: 158 [Hz]ovf number: 1

PWM frequency: 45 Measured frequency: 172 [Hz]ovf number: 1

PWM frequency: 46 Measured frequency: 187 [Hz]ovf number: 1

PWM frequency: 47 Measured frequency: 205 [Hz]ovf number: 1

PWM frequency: 48 Measured frequency: 225 [Hz]ovf number: 1

PWM frequency: 49 Measured frequency: 249 [Hz]ovf number: 1

PWM frequency: 50 Measured frequency: 278 [Hz]ovf number: 1

PWM frequency: 51 Measured frequency: 311 [Hz]ovf number: 1

PWM frequency: 52 Measured frequency: 353 [Hz]ovf number: 1

PWM frequency: 53 Measured frequency: 404 [Hz]ovf number: 1

PWM frequency: 54 Measured frequency: 471 [Hz]ovf number: 1

PWM frequency: 55 Measured frequency: 559 [Hz]ovf number: 1

PWM frequency: 56 Measured frequency: 682 [Hz]ovf number: 0

PWM frequency: 57 Measured frequency: 866 [Hz]ovf number: 0

PWM frequency: 58 Measured frequency: 1173 [Hz]ovf number: 0

PWM frequency: 59 Measured frequency: 1779 [Hz]ovf number: 0

PWM frequency: 60 Measured frequency: 3558 [Hz]ovf number: 1

PWM frequency: 61 Measured frequency: 45575 [Hz]ovf number: 3

PWM frequency: 62 Measured frequency: 62 [Hz]ovf number: 1

PWM frequency: 63 Measured frequency: 63 [Hz]ovf number: 1

PWM frequency: 64 Measured frequency: 64 [Hz]ovf number: 1

PWM frequency: 65 Measured frequency: 65 [Hz]ovf number: 1

PWM frequency: 66 Measured frequency: 66 [Hz]ovf number: 1

PWM frequency: 67 Measured frequency: 67 [Hz]ovf number: 1

PWM frequency: 68 Measured frequency: 68 [Hz]ovf number: 1

PWM frequency: 69 Measured frequency: 69 [Hz]ovf number: 1

PWM frequency: 70 Measured frequency: 70 [Hz]ovf number: 1

PWM frequency: 71 Measured frequency: 71 [Hz]ovf number: 1

PWM frequency: 72 Measured frequency: 72 [Hz]ovf number: 1

PWM frequency: 73 Measured frequency: 73 [Hz]ovf number: 1

PWM frequency: 74 Measured frequency: 74 [Hz]ovf number: 0

PWM frequency: 75 Measured frequency: 75 [Hz]ovf number: 0

PWM frequency: 76 Measured frequency: 76 [Hz]ovf number: 0

PWM frequency: 77 Measured frequency: 77 [Hz]ovf number: 1

PWM frequency: 78 Measured frequency: 78 [Hz]ovf number: 1

PWM frequency: 79 Measured frequency: 79 [Hz]ovf number: 1

PWM frequency: 80 Measured frequency: 80 [Hz]ovf number: 1

PWM frequency: 81 Measured frequency: 81 [Hz]ovf number: 1

PWM frequency: 82 Measured frequency: 82 [Hz]ovf number: 1

PWM frequency: 83 Measured frequency: 83 [Hz]ovf number: 1

PWM frequency: 84 Measured frequency: 84 [Hz]ovf number: 1

PWM frequency: 85 Measured frequency: 85 [Hz]ovf number: 1

PWM frequency: 86 Measured frequency: 86 [Hz]ovf number: 1

PWM frequency: 87 Measured frequency: 87 [Hz]ovf number: 1

PWM frequency: 88 Measured frequency: 88 [Hz]ovf number: 1

PWM frequency: 89 Measured frequency: 89 [Hz]ovf number: 1

PWM frequency: 90 Measured frequency: 90 [Hz]ovf number: 1

PWM frequency: 91 Measured frequency: 91 [Hz]ovf number: 1

PWM frequency: 92 Measured frequency: 92 [Hz]ovf number: 1

PWM frequency: 93 Measured frequency: 93 [Hz]ovf number: 1

PWM frequency: 94 Measured frequency: 94 [Hz]ovf number: 1

PWM frequency: 95 Measured frequency: 95 [Hz]ovf number: 1

PWM frequency: 96 Measured frequency: 96 [Hz]ovf number: 1

PWM frequency: 97 Measured frequency: 97 [Hz]ovf number: 1

PWM frequency: 98 Measured frequency: 98 [Hz]ovf number: 1

PWM frequency: 99 Measured frequency: 99 [Hz]ovf number: 0

PWM frequency: 100 Measured frequency: 100 [Hz]ovf number: 0

0 Kudos

1,796 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hello wangaoyuan@glb-auto.com,

I'm sorry for the delay.

As you know, the current IC driver does not support this feature.

The frequency range that can be measured is given by the FTM configuration. 

pastedImage_2.png

It would require modifying the driver to get the number of overflows between the two edges which is something we don't have. If you need to capture low frequencies, you can reconfigure the FTM.

BR, Daniel

 

  

0 Kudos

1,796 Views
wangaoyuan
Contributor II

Hello,Daniel Martynek,

Thank you for your answer.I'll try other ways to solve this problem.

0 Kudos

1,796 Views
1462993357
Contributor I

Hello,Daniel wang aoyuan

How to solve this problem in the end, can you share the method.

0 Kudos