Esempio n. 1
0
void PWM_IRQ_HANDLER(void) {
    uint16_t pwmValue;
    uint16_t periodValue;
    uint8_t edge;

    edge = !(PWM_TIM->SR & TIM_IT_CC2);

    periodValue = PWM_TIM->CCR1;
    pwmValue = PWM_TIM->CCR2;

    // is this an OW reset pulse?
    if (state == ESC_STATE_DISARMED && edge == 1 && (periodValue - pwmValue) > OW_RESET_MIN && (periodValue - pwmValue) < OW_RESET_MAX) {
	owReset();
    }
    // look for good RC PWM input
    else if (inputMode == ESC_INPUT_PWM && periodValue >= pwmMinPeriod && periodValue <= pwmMaxPeriod && pwmValue >= pwmMinValue && pwmValue <= pwmMaxValue) {
	if (edge == 0) {
	    pwmValidMicros = timerMicros;
	    runNewInput(pwmValue);
	}
    }
    // otherwise if already in OW mode, pass control to OW
    else if (inputMode == ESC_INPUT_OW) {
	owEdgeDetect(edge);
    }
}
Esempio n. 2
0
//timer1 TIM1_CC_IRQHandler中断
void PWM_IRQ_HANDLER(void) {
	uint16_t pwmValue;
	uint16_t periodValue;
	uint8_t edge;

	edge = !(PWM_TIM->SR & TIM_IT_CC2);

	periodValue = PWM_TIM->CCR1; //IO 输入PA8  周期
	pwmValue = PWM_TIM->CCR2;    //IO 输入(但是没有看到配置了使用哪个IO做为输入了)  脉宽长度

	// is this an OW reset pulse?
	if (state == ESC_STATE_DISARMED && 
		edge == 1 && 
		(periodValue - pwmValue) > OW_RESET_MIN && 
		(periodValue - pwmValue) < OW_RESET_MAX) 
	{
		owReset();//ow的初始化,在调用owEdgeDetect前一定要先调用
	}
	// look for good RC PWM input
	else if (inputMode == ESC_INPUT_PWM &&  //PWM输入模式
			periodValue >= pwmMinPeriod && periodValue <= pwmMaxPeriod &&  //pa8输入的周期范围
			pwmValue >= pwmMinValue && pwmValue <= pwmMaxValue             //脉宽长度
			)
	{
		if (edge == 0) {
			pwmValidMicros = timerMicros;
			runNewInput(pwmValue); //PWM正确.输入
		}
	}
	// otherwise if already in OW mode, pass control to OW
	else if (inputMode == ESC_INPUT_OW) {
		//是1wire通讯协议
		owEdgeDetect(edge);
	}
}