第十一届蓝桥杯嵌入式组别底层驱动程序11(PWM④)

第十一届蓝桥杯嵌入式组别底层驱动程序11(PWM④)

捕获两路PWM的频率和占空比
比如通过输入捕获得到PA6和PA7的频率和占空比:

void capture_Init()
{
    
    
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	 NVIC_InitTypeDef NVIC_InitStructure;
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7|GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);;
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	 TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
	
	
  
  TIM_Cmd(TIM3, ENABLE);

  
  TIM_ITConfig(TIM3, TIM_IT_Update|TIM_IT_CC2|TIM_IT_CC1, ENABLE);

}


__IO uint16_t IC3ReadValue12 = 0, IC3ReadValue22 = 0;
__IO uint16_t CaptureNumber2 = 0;
__IO uint32_t Capture2 = 0;
__IO uint32_t TIM3Freq2 = 0;
u8 eage2=0;
u16 rising2=0,falling2=0;
float zhankong2=0;

__IO uint16_t IC3ReadValue11 = 0, IC3ReadValue21 = 0;
__IO uint16_t CaptureNumber1 = 0;
__IO uint32_t Capture1 = 0;
__IO uint32_t TIM3Freq1 = 0;
u8 eage1=0;
u16 rising1=0,falling1=0;
float zhankong1=0;

void TIM3_IRQHandler(void)
{
    
     
  if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET) 
  {
    
    
		if(eage2==0)
		{
    
    
			
			if(CaptureNumber2 == 0)
			{
    
    
				
				IC3ReadValue12 = TIM_GetCapture2(TIM3);
				CaptureNumber2 = 1;
			}
			else if(CaptureNumber2 == 1)
			{
    
    
				
				IC3ReadValue22 = TIM_GetCapture2(TIM3); 
				
				
				if (IC3ReadValue22 > IC3ReadValue12)
				{
    
    
					Capture2= (IC3ReadValue22 - IC3ReadValue12); 
				}
				else
				{
    
    
					Capture2 = ((0xFFFF - IC3ReadValue12) + IC3ReadValue22); 
				}
				
				TIM3Freq2 = (uint32_t) SystemCoreClock /72/ Capture2;
				CaptureNumber2 = 0;
			}
			
			rising2=TIM_GetCapture2(TIM3);
			TIM_OC2PolarityConfig(TIM3, TIM_ICPolarity_Falling);
			eage2=1;
		}
		else if(eage2==1)
		{
    
    
			falling2=TIM_GetCapture2(TIM3);
			if(falling2>rising2)
			{
    
    
				zhankong2=(float)(falling2-rising2)/Capture2;
			}
			else if(falling2<rising2)
			{
    
    
				zhankong2=(float)(0xFFFF-falling2+rising2)/Capture2;
			}
			eage2=0;
			TIM_OC2PolarityConfig(TIM3, TIM_ICPolarity_Rising);
		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update|TIM_IT_CC2);
  }
	
	if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET) 
  {
    
    
		if(eage1==0)
		{
    
    
			
			if(CaptureNumber1 == 0)
			{
    
    
				
				IC3ReadValue11 = TIM_GetCapture1(TIM3);
				CaptureNumber1 = 1;
			}
			else if(CaptureNumber1 == 1)
			{
    
    
				
				IC3ReadValue21 = TIM_GetCapture1(TIM3); 
				
				
				if (IC3ReadValue21 > IC3ReadValue11)
				{
    
    
					Capture1= (IC3ReadValue21 - IC3ReadValue11); 
				}
				else
				{
    
    
					Capture1 = ((0xFFFF - IC3ReadValue11) + IC3ReadValue21); 
				}
				
				TIM3Freq1 = (uint32_t) SystemCoreClock /72/ Capture1;
				CaptureNumber1 = 0;
			}
			
			rising1=TIM_GetCapture1(TIM3);
			TIM_OC1PolarityConfig(TIM3, TIM_ICPolarity_Falling);
			eage1=1;
		}
		else if(eage1==1)
		{
    
    
			falling1=TIM_GetCapture1(TIM3);
			if(falling1>rising1)
			{
    
    
				zhankong1=(float)(falling1-rising1)/Capture1;
			}
			else if(falling1<rising1)
			{
    
    
				zhankong1=(float)(0xFFFF-falling1+rising1)/Capture1;
			}
			eage1=0;
			TIM_OC1PolarityConfig(TIM3, TIM_ICPolarity_Rising);
		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update|TIM_IT_CC1);
  }
}

频率就是TIM3Freq1和TIM3Freq2
占空比就是zhankong1和zhankong2

V3.5库的"Project->STM32F10x_StdPeriph_Examples->TIM-InputCapture"文件夹下,"main.c"和"stm32f10x_it.c"分别有着输入捕获模式初始化和中断服务程序相关代码:

原文链接:https://blog.csdn.net/Zach_z/article/details/80548423

猜你喜欢

转载自blog.csdn.net/weixin_43352501/article/details/103354150