counter clock frequency is 16Mhz,
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.
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
}
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
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
*/
/*Enable counter overflow interrupt, when counter overflow, do accumulation.
*/
//When the capture is complete, read the value of the counter overflow, as well as the value of the current counter.
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
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.
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
Hello,Daniel Martynek,
Thank you for your answer.I'll try other ways to solve this problem.
Hello,Daniel wang aoyuan
How to solve this problem in the end, can you share the method.