cancel
Showing results for 
Search instead for 
Did you mean: 

PWM capture using Rising, falling EXTI

gladdy
Associate II

Hi all,

I am capturing 10 pwm pulses from proximity sensors by making the all pwm pins in rising falling interrupt mode.

PWM is captured by a timer at every 100us interrupt.

some times pulses are missing, I don't know why this is happening.

I am sharing code ISRs:

 
 
/*
 * @name        interrupts_Timer_50usCallback
 * @brief       Timer6 period elapsed Callback at every 50us
 * 				to capture the time of input pulses.
 * 				(50us will also be treated as resolution of input pulse capturing).
 * @param       none
 * @retvalue    none
 */
void interrupts_Timer_100usCallback(void){
	//====	For Pulse Input1	====
	if(pulseCaptureFlags.pulse1Present != 0){
		if(++pulse1_1ms_cntr > 17){
			pulse1_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse1TimerSet == 0){
				if(++pulse1_Capture_Thrshld > inputCaptureTime[0]){
					pulse1_Capture_Thrshld = 2;
					pulseCaptureFlags.pulse1TimerSet = 1;
					pulseInput_1.counter++;
					pulseInput_1.timer = pulseInput_1.timer + inputCaptureTime[0];
				}
 
			}
			else{
				pulseInput_1.timer++;
			}
		}
	}
 
	//====	For Pulse Input2	====
	if(pulseCaptureFlags.pulse2Present != 0){
		if(++pulse2_1ms_cntr > 17){
			pulse2_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse2TimerSet == 0){
				if(++pulse2_Capture_Thrshld > inputCaptureTime[1]){
					pulse2_Capture_Thrshld = 2;
					pulseCaptureFlags.pulse2TimerSet = 1;
					pulseInput_2.counter++;
					pulseInput_2.timer = pulseInput_2.timer + inputCaptureTime[1] - 2;
				}
 
			}
			else{
				pulseInput_2.timer++;
			}
		}
	}
 
	//====	For Pulse Input3	====
	if(pulseCaptureFlags.pulse3Present != 0){
		if(++pulse3_1ms_cntr > 17){
			pulse3_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse3TimerSet == 0){
				if(++pulse3_Capture_Thrshld > inputCaptureTime[2]){
					pulse3_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse3TimerSet = 1;
					pulseInput_3.counter++;
					pulseInput_3.timer = pulseInput_3.timer + inputCaptureTime[2] - 2;
				}
 
			}
			else{
				pulseInput_3.timer++;
			}
		}
	}
 
	//====	For Pulse Input4	====
	if(pulseCaptureFlags.pulse4Present != 0){
		if(++pulse4_1ms_cntr > 17){
			pulse4_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse4TimerSet == 0){
				if(++pulse4_Capture_Thrshld > inputCaptureTime[3]){
					pulse4_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse4TimerSet = 1;
					pulseInput_4.counter++;
					pulseInput_4.timer = pulseInput_4.timer + inputCaptureTime[3] - 2;
				}
 
			}
			else{
				pulseInput_4.timer++;
			}
		}
	}
 
	//====	For Pulse Input5	====
	if(pulseCaptureFlags.pulse5Present != 0){
		if(++pulse5_1ms_cntr > 17){
			pulse5_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse5TimerSet == 0){
				if(++pulse5_Capture_Thrshld > inputCaptureTime[4]){
					pulse5_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse5TimerSet = 1;
					pulseInput_5.counter++;
					pulseInput_5.timer = pulseInput_5.timer + inputCaptureTime[4] - 2;
				}
 
			}
			else{
				pulseInput_5.timer++;
			}
		}
	}
 
	//====	For Pulse Input6	====
	if(pulseCaptureFlags.pulse6Present != 0){
		if(++pulse6_1ms_cntr > 17){
			pulse6_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse6TimerSet == 0){
				if(++pulse6_Capture_Thrshld > inputCaptureTime[5]){
					pulse6_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse6TimerSet = 1;
					pulseInput_6.counter++;
					pulseInput_6.timer = pulseInput_6.timer + inputCaptureTime[5] - 2;
				}
 
			}
			else{
				pulseInput_6.timer++;
			}
		}
	}
 
	//====	For Pulse Input7	====
	if(pulseCaptureFlags.pulse7Present != 0){
		if(++pulse7_1ms_cntr > 17){
			pulse7_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse7TimerSet == 0){
				if(++pulse7_Capture_Thrshld > inputCaptureTime[6]){
					pulse7_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse7TimerSet = 1;
					pulseInput_7.counter++;
					pulseInput_7.timer = pulseInput_7.timer + inputCaptureTime[6] - 2;
				}
 
			}
			else{
				pulseInput_7.timer++;
			}
		}
	}
 
	//====	For Pulse Input8	====
	if(pulseCaptureFlags.pulse8Present != 0){
		if(++pulse8_1ms_cntr > 17){
			pulse8_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse8TimerSet == 0){
				if(++pulse8_Capture_Thrshld > inputCaptureTime[7]){
					pulse8_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse8TimerSet = 1;
					pulseInput_8.counter++;
					pulseInput_8.timer = pulseInput_8.timer + inputCaptureTime[7] - 2;
				}
 
			}
			else{
				pulseInput_8.timer++;
			}
		}
	}
 
	//====	For Pulse Input9	====
	if(pulseCaptureFlags.pulse9Present != 0){
		if(++pulse9_1ms_cntr > 17){
			pulse9_1ms_cntr = 0;
			if(pulseCaptureFlags.pulse9TimerSet == 0){
				if(++pulse9_Capture_Thrshld > inputCaptureTime[8]){
					pulse9_Capture_Thrshld = 1;
					pulseCaptureFlags.pulse9TimerSet = 1;
					pulseInput_9.counter++;
					pulseInput_9.timer = pulseInput_9.timer + inputCaptureTime[8] - 2;
				}
 
			}
			else{
				pulseInput_9.timer++;
			}
		}
	}
}
 
 
/*
 * @name        interrupts_FallingCallback
 * @brief       sets the flags that pulse is present when faling edge detected on a particular pin
 * @param       none
 * @retvalue    none
 */
void interrupts_FallingCallback(u32 PulsePin){
	switch(PulsePin){
	case PULSE_INPUT_1_Pin:
		pulseCaptureFlags.pulse1Present = 1;
		break;
 
	case PULSE_INPUT_2_Pin:
		pulseCaptureFlags.pulse2Present = 1;
		break;
 
	case PULSE_INPUT_3_Pin:
		pulseCaptureFlags.pulse3Present = 1;
		break;
 
	case PULSE_INPUT_4_Pin:
		pulseCaptureFlags.pulse4Present = 1;
		break;
 
	case PULSE_INPUT_5_Pin:
		pulseCaptureFlags.pulse5Present = 1;
		break;
 
	case PULSE_INPUT_6_Pin:
		pulseCaptureFlags.pulse6Present = 1;
		break;
 
	case PULSE_INPUT_7_Pin:
		pulseCaptureFlags.pulse7Present = 1;
		break;
 
	case PULSE_INPUT_8_Pin:
		pulseCaptureFlags.pulse8Present = 1;
		break;
 
	case PULSE_INPUT_9_Pin:
		pulseCaptureFlags.pulse9Present = 1;
		break;
 
	default:
		break;
	}
}
 
 
 
/*
 * @name        interrupts_RisingCallback
 * @brief       Resets the flags that pulse has gone when rising edge detected on a particular pin
 * @param       PulsePin: input device pins at which pulse is present
 * @retvalue    none
 */
void interrupts_RisingCallback(u32 PulsePin){
	switch(PulsePin){
	case PULSE_INPUT_1_Pin:
		pulseCaptureFlags.pulse1Present = 0;
		pulseCaptureFlags.pulse1TimerSet = 0;
		pulse1_1ms_cntr = 0;
		pulse1_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_2_Pin:
		pulseCaptureFlags.pulse2Present = 0;
		pulseCaptureFlags.pulse2TimerSet = 0;
		pulse2_1ms_cntr = 0;
		pulse2_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_3_Pin:
		pulseCaptureFlags.pulse3Present = 0;
		pulseCaptureFlags.pulse3TimerSet = 0;
		pulse3_1ms_cntr = 0;
		pulse3_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_4_Pin:
		pulseCaptureFlags.pulse4Present = 0;
		pulseCaptureFlags.pulse4TimerSet = 0;
		pulse4_1ms_cntr = 0;
		pulse4_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_5_Pin:
		pulseCaptureFlags.pulse5Present = 0;
		pulseCaptureFlags.pulse5TimerSet = 0;
		pulse5_1ms_cntr = 0;
		pulse5_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_6_Pin:
		pulseCaptureFlags.pulse6Present = 0;
		pulseCaptureFlags.pulse6TimerSet = 0;
		pulse6_1ms_cntr = 0;
		pulse6_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_7_Pin:
		pulseCaptureFlags.pulse7Present = 0;
		pulseCaptureFlags.pulse7TimerSet = 0;
		pulse7_1ms_cntr = 0;
		pulse7_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_8_Pin:
		pulseCaptureFlags.pulse8Present = 0;
		pulseCaptureFlags.pulse8TimerSet = 0;
		pulse8_1ms_cntr = 0;
		pulse8_Capture_Thrshld = 2;
		break;
 
	case PULSE_INPUT_9_Pin:
		pulseCaptureFlags.pulse9Present = 0;
		pulseCaptureFlags.pulse9TimerSet = 0;
		pulse9_1ms_cntr = 0;
		pulse9_Capture_Thrshld = 2;
		break;
 
/*	case PULSE_INPUT_10_Pin:
		pulseCaptureFlags.pulse10Present = 0;
		pulseCaptureFlags.pulse10TimerSet = 0;
		pulse10_1ms_cntr = 0;
		pulse10_Capture_Thrshld = 1;
		break;*/
 
	default:
		break;
	}
 
}
 
 

I have to measure both no. of pulses counts as well as how much time the pulse was high.

Please help me out.

Thanks.

10 REPLIES 10

So basically during ISR execution, I can monitor multiple pin's state.

Due to which can avoid interrupt missing problem.

Am I right?