/**
  * @brief  This function handles TIM14 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM14_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM14, TIM_IT_CC1) != RESET)
  {
    /* Clear TIM14 Capture Compare 1 interrupt pending bit */
    TIM_ClearITPendingBit(TIM14, TIM_IT_CC1);
    
    if(CaptureNumber == 0)
    {
      /* Get the Input Capture value */
      IC1ReadValue1 = TIM_GetCapture1(TIM14);
      CaptureNumber = 1;
    }
    else if(CaptureNumber == 1)
    {
       /* Get the Input Capture value */
       IC1ReadValue2 = TIM_GetCapture1(TIM14); 
       TIM_ITConfig(TIM14, TIM_IT_CC1, DISABLE);

       /* Capture computation */
       if (IC1ReadValue2 > IC1ReadValue1)
       {
         PeriodValue = (IC1ReadValue2 - IC1ReadValue1);
       }
       else
       {
         PeriodValue = ((0xFFFF - IC1ReadValue1) + IC1ReadValue2);
       }
       /* capture of two values is done */
       CaptureNumber = 2;
    }
  }
}
/*TIM5_CH1*/
void TIM5_IRQHandler( void )
{
	RCC_ClocksTypeDef RCC_Clocks;
	RCC_GetClocksFreq( &RCC_Clocks );

	TIM_ClearITPendingBit( TIM5, TIM_IT_CC2 );

	/* Get the Input Capture value */
	IC2Value = TIM_GetCapture2( TIM5 );

	if( IC2Value != 0 )
	{
		/* Duty cycle computation */
		//DutyCycle = ( TIM_GetCapture1( TIM5 ) * 100 ) / IC2Value;
		/* Frequency computation   TIM4 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
		//Frequency = (RCC_Clocks.HCLK_Frequency)/2 / IC2Value;
/*是不是反向电路?*/
		DutyCycle	= ( IC2Value * 100 ) / TIM_GetCapture1( TIM5 );
		Frequency	= ( RCC_Clocks.HCLK_Frequency ) / 2 / TIM_GetCapture1( TIM5 );
	}else
	{
		DutyCycle	= 0;
		Frequency	= 0;
	}
}
示例#3
0
/**
  * @brief  This function handles TIM14 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM14_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM14, TIM_IT_CC1) != RESET)
  {    
    if(CaptureNumber == 0)
    {
      /* Get the Input Capture value */
      IC1ReadValue1 = TIM_GetCapture1(TIM14);
    }
    else if(CaptureNumber == 1)
    {
      /* Get the Input Capture value */
      IC1ReadValue2 = TIM_GetCapture1(TIM14); 
      
      /* Capture computation */
      if (IC1ReadValue2 > IC1ReadValue1)
      {
        Capture = (IC1ReadValue2 - IC1ReadValue1); 
      }
      else
      {
        Capture = ((0xFFFF - IC1ReadValue1) + IC1ReadValue2); 
      }
      /* Frequency computation */ 
      LsiFreq = (uint32_t) SystemCoreClock / Capture;
      LsiFreq *= 8;
    }
    
    CaptureNumber++;
    
    /* Clear TIM14 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM14, TIM_IT_CC1);
  }
}
示例#4
0
void TIM4_IRQHandler(void)
{ 
  static u16 Drop_Capture = 0;
	static u16 Rise_Capture = 0;
	static u16 Rise1 = 0;
	static u16 Rise2 = 0;
	static u16 Distance1 = 0;
	static u16 Distance2 = 0;
	static u16 Delta_Distance = 0;
	static u8 i = 0;
	static u8 j = 0;
	if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)   //捕获1发生捕获事件
	{	
		TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); //清除中断标志位
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6) == 1) 
		{
				TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获
				Rise_Capture=TIM_GetCapture1(TIM4);
				if(i == 0)
				{
					Rise1 = Rise_Capture;
					i = 1;
				}
				else
				{
					Rise2 = Rise_Capture;
					i = 0;
				}
				pulse.period = (Rise1>Rise2)?(Rise1-Rise2):(Rise2-Rise1);//us
				//Delta.dis = 
				//Speed = Delta.dis/pulse.period
				Speed = Delta_Distance*1000/5069;//  um*1000/us == m/s*1000 == mm/s
		}
		else 
		{
				TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
				Drop_Capture=TIM_GetCapture1(TIM4);
				if(Rise_Capture>Drop_Capture)  pulse.width = 65535-Rise_Capture + Drop_Capture;
				else 	                         pulse.width = Drop_Capture - Rise_Capture;
				if(j == 0)
				{
					Distance1 = pulse.width;
					j = 1;
				}
				else
				{
					Distance2 = pulse.width;
					j = 0;
				}
				Delta_Distance = ((Distance1>Distance2)?(Distance1-Distance2):(Distance2-Distance1))*170;//um
		}
	}	
	 
}
示例#5
0
uint16_t Servo::readMicroseconds() const {
    if (!this->attached()) {
        return 0;
    }

    uint16_t SERVO_TIM_CCR = 0x0000;

    if(PIN_MAP[this->pin].timer_ch == TIM_Channel_1)
    {
    	SERVO_TIM_CCR = TIM_GetCapture1(PIN_MAP[this->pin].timer_peripheral);
    }
    else if(PIN_MAP[this->pin].timer_ch == TIM_Channel_2)
    {
    	SERVO_TIM_CCR = TIM_GetCapture2(PIN_MAP[this->pin].timer_peripheral);
    }
    else if(PIN_MAP[this->pin].timer_ch == TIM_Channel_3)
    {
    	SERVO_TIM_CCR = TIM_GetCapture3(PIN_MAP[this->pin].timer_peripheral);
    }
    else if(PIN_MAP[this->pin].timer_ch == TIM_Channel_4)
    {
    	SERVO_TIM_CCR = TIM_GetCapture4(PIN_MAP[this->pin].timer_peripheral);
    }

    //pulseWidth = (SERVO_TIM_CCR * 1000000) / ((SERVO_TIM_ARR + 1) * SERVO_TIM_PWM_FREQ);
    return SERVO_TIM_CCR;
}
示例#6
0
void __attribute__((used)) TIM8_TRG_COM_TIM14_IRQHandler()
{
  uint16_t capureVal;
  uint16_t capureValDiff;
  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

  if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_CC1) != RESET)
  {
    if (TIM_GetFlagStatus(CPPM_TIMER, TIM_FLAG_CC1OF) != RESET)
    {
      //TODO: Handle overflow error
    }

    capureVal = TIM_GetCapture1(CPPM_TIMER);
    capureValDiff = capureVal - prevCapureVal;
    prevCapureVal = capureVal;

    xQueueSendFromISR(captureQueue, &capureValDiff, &xHigherPriorityTaskWoken);

    captureFlag = true;
    TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_CC1);
  }

  if (TIM_GetITStatus(CPPM_TIMER, TIM_IT_Update) != RESET)
  {
    // Update input status
    isAvailible = (captureFlag == true);
    captureFlag = false;
    TIM_ClearITPendingBit(CPPM_TIMER, TIM_IT_Update);
  }
}
示例#7
0
/**
  * @brief  This function handles timer 8 capture/compare interrupt request.
  * @retval None
  */
void TIM8_CC_IRQHandler(void) {
    if (TIM_GetITStatus(TIM8, TIM_IT_CC1) != RESET) {
        TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);
        if(TIM_Handler[TIM8CH1] != NULL) {
            TIM_Handler[TIM8CH1]();
        }
        TIM_SetCompare1(TIM8, TIM_GetCapture1(TIM8) + TIM_IRQ_period[TIM8CH1]);
    }
    else if (TIM_GetITStatus(TIM8, TIM_IT_CC2) != RESET) {
        TIM_ClearITPendingBit(TIM8, TIM_IT_CC2);
        if(TIM_Handler[TIM8CH2] != NULL) {
            TIM_Handler[TIM8CH2]();
        }
        TIM_SetCompare2(TIM8, TIM_GetCapture2(TIM8) + TIM_IRQ_period[TIM8CH2]);
    }
    else if (TIM_GetITStatus(TIM8, TIM_IT_CC3) != RESET) {
        TIM_ClearITPendingBit(TIM8, TIM_IT_CC3);
        if(TIM_Handler[TIM8CH3] != NULL) {
            TIM_Handler[TIM8CH3]();
        }
        TIM_SetCompare3(TIM8, TIM_GetCapture3(TIM8) + TIM_IRQ_period[TIM8CH3]);
    }
    else if (TIM_GetITStatus(TIM8, TIM_IT_CC4) != RESET) {
        TIM_ClearITPendingBit(TIM8, TIM_IT_CC4);
        if(TIM_Handler[TIM8CH4] != NULL) {
            TIM_Handler[TIM8CH4]();
        }
        TIM_SetCompare4(TIM8, TIM_GetCapture4(TIM8) + TIM_IRQ_period[TIM8CH4]);
    }
}
static void pwmTIMxHandler(TIM_TypeDef *tim, uint8_t portBase)
{
    int8_t port;

    // Generic CC handler for TIM2,3,4
    if (TIM_GetITStatus(tim, TIM_IT_CC1) == SET)
    {
        port = portBase + 0;
        TIM_ClearITPendingBit(tim, TIM_IT_CC1);
        pwmPorts[port].callback(port, TIM_GetCapture1(tim));
    }
    else if (TIM_GetITStatus(tim, TIM_IT_CC2) == SET)
    {
        port = portBase + 1;
        TIM_ClearITPendingBit(tim, TIM_IT_CC2);
        pwmPorts[port].callback(port, TIM_GetCapture2(tim));
    }
    else if (TIM_GetITStatus(tim, TIM_IT_CC3) == SET)
    {
        port = portBase + 2;
        TIM_ClearITPendingBit(tim, TIM_IT_CC3);
        pwmPorts[port].callback(port, TIM_GetCapture3(tim));
    }
    else if (TIM_GetITStatus(tim, TIM_IT_CC4) == SET)
    {
        port = portBase + 3;
        TIM_ClearITPendingBit(tim, TIM_IT_CC4);
        pwmPorts[port].callback(port, TIM_GetCapture4(tim));
    }
}
示例#9
0
文件: pwm.c 项目: sedulity11/pdb
void TIM4_IRQHandler(void) {
#ifdef PWM_IRQ_TIM4_CH1
    if (TIM_GetITStatus(TIM4, TIM_IT_CC1) == SET) {
	int8_t pwmPort = PWM_IRQ_TIM4_CH1;
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
	pwmData[pwmPort].callback(TIM_GetCapture1(TIM4), GPIO_ReadInputDataBit((GPIO_TypeDef *)pwmPorts[pwmPort], (uint16_t)pwmPins[pwmPort]));
    }
#endif
#ifdef PWM_IRQ_TIM4_CH2
    if (TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET) {
	int8_t pwmPort = PWM_IRQ_TIM4_CH2;
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
	pwmData[pwmPort].callback(TIM_GetCapture2(TIM4), GPIO_ReadInputDataBit((GPIO_TypeDef *)pwmPorts[pwmPort], (uint16_t)pwmPins[pwmPort]));
    }
    else
#endif
#ifdef PWM_IRQ_TIM4_CH3
    if (TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET) {
	int8_t pwmPort = PWM_IRQ_TIM4_CH3;
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
	pwmData[pwmPort].callback(TIM_GetCapture3(TIM4), GPIO_ReadInputDataBit((GPIO_TypeDef *)pwmPorts[pwmPort], (uint16_t)pwmPins[pwmPort]));
    }
#endif
#ifdef PWM_IRQ_TIM4_CH4
    if (TIM_GetITStatus(TIM4, TIM_IT_CC4) == SET) {
	int8_t pwmPort = PWM_IRQ_TIM4_CH4;
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
	pwmData[pwmPort].callback(TIM_GetCapture4(TIM4), GPIO_ReadInputDataBit((GPIO_TypeDef *)pwmPorts[pwmPort], (uint16_t)pwmPins[pwmPort]));
    }
#endif
}
示例#10
0
void TIM2_IRQHandler()
{
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET) {
    /* Clear TIM2 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

      /* Get the Input Capture value */
    timebaseCapture_prev = timebaseCapture_current;
    timebaseCapture_current = TIM_GetCapture1(TIM2);

    if(TIM_ICInitStructure.TIM_ICPolarity == TIM_ICPolarity_Rising){

      TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
      TIM_ICInit(TIM2, &TIM_ICInitStructure);

    }
    else if(TIM_ICInitStructure.TIM_ICPolarity == TIM_ICPolarity_Falling){

      TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
      TIM_ICInit(TIM2, &TIM_ICInitStructure);

      if(timebaseCapture_current > timebaseCapture_prev){

        timebaseCapture_output = (timebaseCapture_current - timebaseCapture_prev);//*5/18;

      }
      else{
        timebaseCapture_output  = (20000 - timebaseCapture_prev + timebaseCapture_current);//*5/18;
      }
    }      
  }
}
示例#11
0
文件: timer.c 项目: japina/koduino
void timerISR(uint8_t timer) {
  TIM_TypeDef *TIMx = TIMER_MAP[timer].TIMx;
  TimerInfo *cfg = &TIMER_MAP[timer];

  // Update for rollover
  if (TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET) {
    TIM_ClearITPendingBit(TIMx, TIM_IT_Update);
    cfg->numRollovers++;
  }

  // CCx for pwmIn
  if (TIM_GetITStatus(TIMx, TIM_IT_CC1) != RESET) {
    TIM_ClearITPendingBit(TIMx, TIM_IT_CC1);
    timerCCxISR(TIMx, &cfg->channelData[0], TIM_GetCapture1(TIMx), cfg->numRollovers);
  }
  if (TIM_GetITStatus(TIMx, TIM_IT_CC2) != RESET) {
    TIM_ClearITPendingBit(TIMx, TIM_IT_CC2);
    timerCCxISR(TIMx, &cfg->channelData[1], TIM_GetCapture2(TIMx), cfg->numRollovers);
  }
  if (TIM_GetITStatus(TIMx, TIM_IT_CC3) != RESET) {
    TIM_ClearITPendingBit(TIMx, TIM_IT_CC3);
    timerCCxISR(TIMx, &cfg->channelData[2], TIM_GetCapture3(TIMx), cfg->numRollovers);
  }
  if (TIM_GetITStatus(TIMx, TIM_IT_CC4) != RESET) {
    TIM_ClearITPendingBit(TIMx, TIM_IT_CC4);
    timerCCxISR(TIMx, &cfg->channelData[3], TIM_GetCapture4(TIMx), cfg->numRollovers);
  }
}
示例#12
0
/**
  * @brief  This function handles TIM2 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM2_IRQHandler(void)
{
  RCC_ClocksTypeDef RCC_Clocks;
  RCC_GetClocksFreq(&RCC_Clocks);

  /* Clear TIM2 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM2);

  if (IC2Value != 0)
  {
    /* Duty cycle computation */
    DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;

    /* Frequency computation 
       TIM2 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */

    Frequency = RCC_Clocks.HCLK_Frequency / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}
示例#13
0
/**
  * @brief  This function handles TIM3 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM3_IRQHandler(void)
{
  /* TIM3_CH1 toggling with frequency = 256.35 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
    uhCapture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, uhCapture + uhCCR1_Val );
  }

  /* TIM3_CH2 toggling with frequency = 512.7 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    uhCapture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, uhCapture + uhCCR2_Val);
  }

  /* TIM3_CH3 toggling with frequency = 1025.4 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
    uhCapture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, uhCapture + uhCCR3_Val);
  }

  /* TIM3_CH4 toggling with frequency = 2050.78 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
    uhCapture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, uhCapture + uhCCR4_Val);
  }
}
示例#14
0
/**
  * @brief  This function handles TIM3 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM3_IRQHandler(void)
{
  /* TIM3_CH1 toggling with frequency = 585.9 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, capture + CCR1_Val );
  }

  /* TIM3_CH2 toggling with frequency = 1171.8 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2_Val);
  }

  /* TIM3_CH3 toggling with frequency = 2343.75 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, capture + CCR3_Val);
  }

  /* TIM3_CH4 toggling with frequency = 4687.5 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, capture + CCR4_Val);
  }
}
示例#15
0
void TIM2_IRQHandler(void)
{
  vu16 vu16_IC2Value = 0;

  /* Get the Input Capture value */
  vu16_IC2Value = TIM_GetCapture2(TIM2);

  if(vu16_IC2Value != 0)
  {
    /* Duty cycle computation */
    vu16_DutyCycle = (TIM_GetCapture1(TIM2) * 100) / vu16_IC2Value;

    /* Frequency computation */
    f32_Frequency = ((float)u32_TimerFrequency) / ((float)vu16_IC2Value);

    /* TIM  counter disable */
    TIM_Cmd(TIM2, DISABLE);
    /* Disable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2, DISABLE);
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
  }
  else
  {
    vu16_DutyCycle = 0;
    f32_Frequency = 0;
  }
}
示例#16
0
static void ppmIRQHandler(TIM_TypeDef *tim)
{
    uint16_t diff;
    static uint16_t now;
    static uint16_t last = 0;
    static uint8_t chan = 0;

    if (TIM_GetITStatus(tim, TIM_IT_CC1) == SET) {
        last = now;
        now = TIM_GetCapture1(tim);
        rcActive = true;
    }

    TIM_ClearITPendingBit(tim, TIM_IT_CC1);

    if (now > last) {
        diff = (now - last);
    } else {
        diff = ((0xFFFF - last) + now);
    }

    if (diff > 4000) {
        chan = 0;
    } else {
        if (diff > 750 && diff < 2250 && chan < 8) {   // 750 to 2250 ms is our 'valid' channel range
            Inputs[chan].capture = diff;
        }
        chan++;
        failsafeCnt = 0;
    }
}
示例#17
0
/**
  * @brief  This function handles TIM3 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM3_IRQHandler(void)
{
  /* TIM3_CH1 toggling with frequency = 183.1 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, capture + CCR1_Val );
  }

  /* TIM3_CH2 toggling with frequency = 366.2 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2_Val);
  }

  /* TIM3_CH3 toggling with frequency = 732.4 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, capture + CCR3_Val);
  }

  /* TIM3_CH4 toggling with frequency = 1464.8 Hz */
  if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, capture + CCR4_Val);
  }
}
示例#18
0
void TIM4_IRQHandler(void)
{
  RCC_ClocksTypeDef RCC_Clocks;
  RCC_GetClocksFreq(&RCC_Clocks);

  /* Clear TIM4 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM4);
	IC1Value = TIM_GetCapture1(TIM4);
  if (IC2Value != 0)
  {
        /* Duty cycle computation */
        DutyCycle = (IC1Value* 100+1 ) / IC2Value;//

        /* Frequency computation 
           TIM4 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */

        Frequency = (1780000)/2 / IC2Value;//RCC_Clocks.HCLK_Frequency
     
	   GUI_DispDecAt(Frequency,0,0,6);
	   GUI_DispDecAt(DutyCycle,40,0,3);
  }
  else
  {
        DutyCycle = 0;
        Frequency = 0;
  }
//  Stop_Tim4IT();
}
示例#19
0
void TIM1_CC_IRQHandler(void)
{
    uint16_t diff;
    static uint16_t now;
    static uint16_t last = 0;
    static uint8_t  chan = 0;

    if (TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)
    {
        last = now;
        now = TIM_GetCapture1(TIM1);
        rcActive = true;
    }

    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    diff = now - last;

    if (diff > 2700 * 2)   // Per http://www.rcgroups.com/forums/showpost.php?p=21996147&postcount=3960
    {                      // "So, if you use 2.5ms or higher as being the reset for the PPM stream start,
        chan = 0;          // you will be fine. I use 2.7ms just to be safe."
    }
    else
    {
        if (diff > 1500 && diff < 4500 && chan < 8)    // 750 to 2250 ms is our 'valid' channel range
        {
            pulseWidth[chan] = diff;
        }
        chan++;
    }
}
示例#20
0
static void timCCxHandler(TIM_TypeDef *tim)
{
    uint16_t capture;
    timerConfig_t *timerConfig;

    if (TIM_GetITStatus(tim, TIM_IT_CC1) == SET) {
        TIM_ClearITPendingBit(tim, TIM_IT_CC1);

        timerConfig = findTimerConfig(tim, TIM_Channel_1);
        capture = TIM_GetCapture1(tim);
    } else if (TIM_GetITStatus(tim, TIM_IT_CC2) == SET) {
        TIM_ClearITPendingBit(tim, TIM_IT_CC2);

        timerConfig = findTimerConfig(tim, TIM_Channel_2);
        capture = TIM_GetCapture2(tim);
    } else if (TIM_GetITStatus(tim, TIM_IT_CC3) == SET) {
        TIM_ClearITPendingBit(tim, TIM_IT_CC3);

        timerConfig = findTimerConfig(tim, TIM_Channel_3);
        capture = TIM_GetCapture3(tim);
    } else if (TIM_GetITStatus(tim, TIM_IT_CC4) == SET) {
        TIM_ClearITPendingBit(tim, TIM_IT_CC4);

        timerConfig = findTimerConfig(tim, TIM_Channel_4);
        capture = TIM_GetCapture4(tim);
    } else {
        return; // avoid uninitialised variable dereference
    }

    if (!timerConfig->callback) {
        return;
    }
    timerConfig->callback(timerConfig->reference, capture);
}
示例#21
0
/*******************************************************************************
* Function Name  : TIM3_IRQHandler
* Description    : This function handles TIM3 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{
	vu16  capture = 0; 			/* 当前捕获计数值局部变量 */
	printf("SR = %x\r\n", TIM3->SR);
	/* 
	*	TIM2 时钟 = 72 MHz, 分频数 = 7299 + 1, TIM2 counter clock = 10KHz
	*	CC1 更新率 = TIM2 counter clock / CCRx_Val
	*/
	
	if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
	{
		//GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)));		
		PA_PIN_NOT(4);
		/* 读出当前计数值 */
		capture = TIM_GetCapture1(TIM3);
		//printf("capture1 = %d\r\n", capture);
		/* 根据当前计数值更新输出捕获寄存器 */
		TIM_SetCompare1(TIM3, capture + 40000);

		TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
	}
	else if(TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
	{
		//GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));
		PA_PIN_NOT(5);
		capture = TIM_GetCapture2(TIM3);
		//printf("capture2 = %d\r\n", capture);
		TIM_SetCompare2(TIM3, capture + 20000);

		TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
	}
	else if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
	{
		//GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6)));
		PA_PIN_NOT(6);
		capture = TIM_GetCapture3(TIM3);
		//printf("capture3 = %d\r\n", capture);
		TIM_SetCompare3(TIM3, capture + 10000);

		TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
	}
	else if(TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
	{
		//GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_7)));
		PA_PIN_NOT(7);
		capture = TIM_GetCapture4(TIM3);
		//printf("capture4 = %d\r\n", capture);
		TIM_SetCompare4(TIM3, capture + 5000);

		TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
	}
	else if(TIM3->SR & 0x0001)
	{
		//capture = TIM_GetCapture4(TIM3);
		//printf("capture5 = %d\r\n", capture);
		//printf("SR = %x\r\n", TIM3->SR);
		TIM3->SR &= ~(1 << 0);	// 清除中断标志位
	}
}
示例#22
0
文件: drv_agl.c 项目: Ga1j1n/FF32mini
void TIM1_UP_TIM16_IRQHandler(void)
{
    uint32_t inputCaptureValue = 0;
    uint16_t tmpccer = 0;

    if (TIM_GetITStatus(TIM16, TIM_IT_CC1) == SET)
    {
        inputCaptureValue = (uint16_t)TIM_GetCapture1(TIM16);

        TIM_ClearITPendingBit(TIM16, TIM_IT_CC1);

        if (aglState == 0)
        {
            // inputCaptureValue has rising edge timer value

            aglRiseTime = inputCaptureValue;

            // Switch states
            aglState = 1;

            // Disable CC Channel 1, Reset the CC1E Bit
            TIM16->CCER &= (uint16_t)~TIM_CCER_CC1E;

            tmpccer  = TIM16->CCER;

            // Select the Polarity and set the CC1E Bit
			tmpccer &= (uint16_t)~(TIM_CCER_CC1P            | TIM_CCER_CC1NP);
            tmpccer |= (uint16_t) ((TIM_ICPolarity_Falling) | TIM_CCER_CC1E);

            // Write to TIM1 CCER registers
			TIM16->CCER = tmpccer;
        }
        else
        {
            // inputCaptureValue has falling edge timer value

            // Compute capture
            if (inputCaptureValue > aglRiseTime)
                aglPulseWidth = (inputCaptureValue - aglRiseTime);
            else
                aglPulseWidth = ((0xFFFF - aglRiseTime) + inputCaptureValue);

            // Switch state
            aglState = 0;

            // Disable CC Channel 1, Reset the CC1E Bit
            TIM16->CCER &= (uint16_t)~TIM_CCER_CC1E;

            tmpccer = TIM16->CCER;

            // Select the Polarity and set the CC1E Bit
			tmpccer &= (uint16_t)~(TIM_CCER_CC1P           | TIM_CCER_CC1NP);
            tmpccer |= (uint16_t) ((TIM_ICPolarity_Rising) | TIM_CCER_CC1E);

            // Write to TIM16 CCER registers
			TIM16->CCER = tmpccer;
        }
    }
}
void SONAR_MAXBOTIX12_IRQ_HANDLER(void)
{
  if (TIM_GetITStatus(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1) == SET)
    {
      TIM_ClearITPendingBit(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1);
      int32_t sonar_meas = TIM_GetCapture1(SONAR_MAXBOTIX12_TIM);
      /* pulse_cnts to actual pulse width in us:
       *   pulse width = pulse_cnts * (prescaler+1)/(actual clock)
       *   with 58us per centimeter, the alt in cm is:
       */
      //int32_t alt_mm = pulse_cnts * 10 * (69/72) / 58;
      //sonar_alt

      //if ((sonar_meas > (sonar_filter_val + 1500) || sonar_meas < (sonar_filter_val - 1500))
      if ((sonar_meas > (sonar_filter_val + 3000) || sonar_meas < (sonar_filter_val - 3000))
          && (sonar_spike_cnt < 5)) {
        sonar_spike_cnt++;
        sonar_meas = sonar_filter_val;
      }
      else {
          sonar_spike_cnt = 0;
      }

      //@TODO: check for angle > 10 deg ==> don't use value

      sonar_filter_val = SONAR_MAXBOTIX12_BUTTER_NUM_1*sonar_meas
      + SONAR_MAXBOTIX12_BUTTER_NUM_2*sonar_meas_prev
    //  + SONAR_MAXBOTIX12_BUTTER_NUM_3*sonar_meas_prev_prev
      - SONAR_MAXBOTIX12_BUTTER_DEN_2*sonar_filter_val_prev;
    //  - SONAR_MAXBOTIX12_BUTTER_DEN_3*sonar_filter_val_prev_prev;

      sonar_meas_prev_prev = sonar_meas_prev;
      sonar_meas_prev = sonar_meas;
      sonar_filter_val_prev_prev = sonar_filter_val_prev;
      sonar_filter_val_prev = sonar_filter_val;

      /** using float
      float factor_cm = 0.0165229885;
      float alt_cm_flt = sonar_meas * factor_cm * (1<<8);
      sonar_meas_real = alt_cm_flt;*/


      //((69 / 72) / 58) * (2^16) = 1082.85057
      //uint16_t conv_factor_cm = 1083;
      //sonar_alt_cm_bfp = conv_factor_cm*sonar_filter_val;
      //sonar_filtered = conv_factor_cm*sonar_filter_val;

      //((69 / 72) / 58) / 100 * (2^8) = 0.0422988506
      float conv_factor_m = 0.0422988506;
      float alt_m_bfp_fl = conv_factor_m*sonar_filter_val;
      sonar_filtered = alt_m_bfp_fl;
      //ins_sonar_initialised = TRUE;
      ins_update_sonar();
      //sonar_filtered = conv_factor_cm*sonar_filter_val;
      //DOWNLINK_SEND_VFF(DefaultChannel, &alt_mm_flt,0,0,0,0,0,0);
      DOWNLINK_SEND_INS_Z(DefaultChannel, &sonar_filtered,&sonar_spike_cnt,0, 0);
    }
}
示例#24
0
文件: pwm.c 项目: sedulity11/pdb
void TIM1_TRG_COM_TIM11_IRQHandler(void) {
    int8_t pwmPort;

    if (TIM_GetITStatus(TIM11, TIM_IT_CC1) == SET) {
	pwmPort = PWM_IRQ_TIM11_CH1;
	TIM_ClearITPendingBit(TIM11, TIM_IT_CC1);
	pwmData[pwmPort].callback(TIM_GetCapture1(TIM11), GPIO_ReadInputDataBit((GPIO_TypeDef *)pwmPorts[pwmPort], (uint16_t)pwmPins[pwmPort]));
    }
}
/*
 * @brief Capacitor VFC Counter
 */
void TIM8_BRK_TIM12_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM12, TIM_IT_CC1) == SET)
	{
		//Voltage Capacitor
		CapVoltage = TIM_GetCapture1(TIM12);
		CapVoltage /= 100;
		TIM_ClearITPendingBit(TIM12, TIM_IT_CC1);
	}

}
示例#26
0
/**
  * @brief  Return the angle value related to the specified servo.
  * @param  servo: pointer to a ausbeeServo structure that contains the
  *         configuration information for the specified servo.
  * @retval angle: the servo angle
  */
uint8_t ausbeeGetAngleServo(ausbeeServo* servo)
{
  if(servo->CHANx == TIM_Channel_1)
    return (uint8_t)( (TIM_GetCapture1(servo->TIMx)-servo->minValue)*100/(servo->maxValue-servo->minValue));
  else if(servo->CHANx == TIM_Channel_2)
    return (uint8_t)( (TIM_GetCapture2(servo->TIMx)-servo->minValue)*100/(servo->maxValue-servo->minValue));
  else if(servo->CHANx == TIM_Channel_3)
    return (uint8_t)( (TIM_GetCapture3(servo->TIMx)-servo->minValue)*100/(servo->maxValue-servo->minValue));
    else
      return (uint8_t)( (TIM_GetCapture4(servo->TIMx)-servo->minValue)*100/(servo->maxValue-servo->minValue));
}
void TIM3_IRQHandler(void)
{
  /* "Read" all sensors sequence and execute the BLDC coils commutation */
  commutate ();

  /* Save current time between each hall sensor signal change */
  hall_sensors_time = TIM_GetCapture1(TIM3);

  // clear interrupt flag
  TIM_ClearITPendingBit (TIM3, TIM_IT_Trigger);
}
示例#28
0
void TIM4_IRQHandler(void)
{

                if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//??1??????
                        {        
                                duty_TIM4    =   TIM_GetCapture1(TIM4);          //?????                
               if  (TIM_GetCapture2(TIM4)>600)         period_TIM4        =        TIM_GetCapture2(TIM4);//?????
                                CollectFlag_TIM4 = 0;                        
        }        
                TIM_ClearITPendingBit(TIM4, TIM_IT_CC2|TIM_IT_Update); //???????
}
示例#29
0
文件: pwm_in.c 项目: xydang/Sender
void TIM3_IRQHandler(void)
{
	uint16_t val =0,i=0;
	for(i=0;i<4;i++){
		if (Channels[i+2].tim == TIM3 && (TIM_GetITStatus(TIM3, Channels[i+2].cc) == SET)){
			TIM_ClearITPendingBit(TIM3, Channels[i+2].cc);
			switch (Channels[i+2].channel)
			{
				case TIM_Channel_1:
					val = TIM_GetCapture1(TIM3);
					break;
				case TIM_Channel_2:
					val = TIM_GetCapture2(TIM3);
					break;
				case TIM_Channel_3:
					val = TIM_GetCapture3(TIM3);
					break;
				case TIM_Channel_4:
					val = TIM_GetCapture4(TIM3);
					break;
			}
			if (Inputs[i+2].state == 0)
				Inputs[i+2].rise = val;
			else
				Inputs[i+2].fall = val;
			if (Inputs[i+2].state == 0) {
				Inputs[i+2].state = 1;
				TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
				TIM_ICInitStructure.TIM_Channel = Channels[i+2].channel;
				TIM_ICInit(TIM3, &TIM_ICInitStructure);
			}else{
				if(Inputs[i+2].fall > Inputs[i+2].rise ){
					val = (Inputs[i+2].fall - Inputs[i+2].rise);
					if(val < 2100 && val>900)
						Inputs[i+2].capture = val;
				}else{
					val = ((0xffff - Inputs[i+2].rise) + Inputs[i+2].fall);
					if(val < 2100 && val>900)
					Inputs[i+2].capture = val;
				}
				Inputs[i+2].state = 0;
				TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
				TIM_ICInitStructure.TIM_Channel = Channels[i+2].channel;
				TIM_ICInit(TIM3, &TIM_ICInitStructure);
			}
		}
	}
	rc_in.thr=Inputs[0].capture;
	rc_in.roll=Inputs[1].capture;
	rc_in.pitch=Inputs[2].capture;
	rc_in.yaw=Inputs[3].capture;
	rc_in.mode=Inputs[4].capture;
	rc_in.serve=Inputs[5].capture;
}
/*
 * @brief Battery VFC Counter
 */
void TIM1_BRK_TIM9_IRQHandler(void)
{

	if(TIM_GetITStatus(TIM9, TIM_IT_CC1) == SET)
	{
		//Voltage Battery
		BattVoltage = TIM_GetCapture1(TIM9);
		BattVoltage /= 100;
		TIM_ClearITPendingBit(TIM9, TIM_IT_CC1);
	}
}