嵌入式蓝桥杯PWM输入捕获的

首先我们确认好的输出PWM引脚是
在这里插入图片描述

PA1 TIM2 CH2 作为输出1
PA2 TIM2 CH3 作为输出2
PA2 TIM2 CH4 作为输出2
我们要用的固件库是路径是
\STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input\main.c
然后我们找到这一串代码
【很好找的 因为名字上写了pwm input】

输入捕获的一些知识储备
首先两个输入捕获会用的寄存器配置

		TIM_GetCapture1(TIM2);
		得到高电平 也就是上升沿触发的次数
	    TIM_GetCapture2(TIM2);
	    得到低电平 也就是下升沿触发的次数

然后 周期就是主频频率除以上升沿触发的次数(中间注意类型转换)

   采集频率  =    (float)(72000/TIM_GetCapture1(TIM2)));

占空比就是 高电平 除以低电平的次数 (中间注意类型转换)
Channerl_2," Channerl(2):%.3fKHZ ",(float)(72000/DutyCycle_2)

 占空比=	(float)(TIM_GetCapture1(TIM2);*100/TIM_GetCapture2(TIM2);));
 /* TIM3 configuration: PWM Input mode ------------------------
     The external signal is connected to TIM3 CH2 pin (PA.01), 
     The Rising edge is used as active edge,
     The TIM3 CCR2 is used to compute the frequency value 
     The TIM3 CCR1 is used to compute the duty cycle value
  ------------------------------------------------------------ */

  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_PWMIConfig(TIM3, &TIM_ICInitStructure);

  /* Select the TIM3 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
	

最后把结构体加上去就好了

	TIM_ICInitTypeDef  TIM_ICInitStructure;

接下来把时钟 和GPIO配置加上去 都不用改的直接复制粘贴加上去就好了

  /* TIM3 channel 2 pin (PA.07) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

然后这个main.c就已经复制完了
出门右拐去复制it.c中断处理函数的
tim3的中断处理函数

void TIM3_IRQHandler(void)
{
    
    
  /* Clear TIM3 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

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

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

    /* Frequency computation */
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    
    
    DutyCycle = 0;
    Frequency = 0;
  }
}

最后把变量给他补上去就ok了

__IO uint16_t IC2Value = 0;
__IO uint16_t DutyCycle = 0;
__IO uint32_t Frequency = 0;

那么到这里PWM的输入就算是配置完成了
可以看出没上面难度
这里提两个重要的参数 一个是占空比 一个是频率

DutyCycle = 0;
Frequency = 0;

这两个将帮助我们得到输入的值


2020 - 10 -3 修改
最近在做 “双通道方波频率检测与倍频输出”设计任务书 时候
做定时器可以两个输入
需要把通道的初始化函数


  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

改成

  TIM_ICInit(TIM2, &TIM_ICInitStructure); //CH3  

其他的 GPIO IC2 IRQ再加多一个通道就好了
下面是双通道的配置的代码(实现1个定时器两个通道输入捕获)

#include "mypwm.h"
extern  __IO uint16_t IC2Value ;
extern __IO uint16_t IC3Value ;
extern __IO uint16_t DutyCycle_CH2 ;
extern __IO uint32_t Frequency_CH2 ;
extern __IO uint16_t DutyCycle_CH3 ;
extern __IO uint32_t Frequency_CH3 ;

extern uint16_t CCR1_Val ;
extern uint16_t CCR2_Val ;
extern uint16_t PrescalerValue;
void TIM3_PWM_Output(void)  // PA6 TIM3 CH1 PA7 TIM3 CH2  
{
    
    
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */ 
 GPIO_InitTypeDef GPIO_InitStructure;	
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;    
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

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

  GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* -----------------------------------------------------------------------
    TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
    The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter
    clock at 24 MHz the Prescaler is computed as following:
     - Prescaler = (TIM3CLK / TIM3 counter clock) - 1
    SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density
    and Connectivity line devices and to 24 MHz for Low-Density Value line and
    Medium-Density Value line devices

    The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)
                                                  = 24 MHz / 666 = 36 KHz
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  ----------------------------------------------------------------------- */
  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 665;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_ARRPreloadConfig(TIM3, ENABLE);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);
	
	
}

void TIM2_PWM_Input(void)  // PA1 TIM2 CH2  pwmÊäÈë //PA2 TIM2 CH3  pwmÊäÈë
{
    
    
		TIM_ICInitTypeDef  TIM_ICInitStructure;
	  GPIO_InitTypeDef GPIO_InitStructure;
	  NVIC_InitTypeDef NVIC_InitStructure;
	
	  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* TIM2 channel 2 pin (PA.07) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);	


  /* Enable the TIM2 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

	 /* TIM2 configuration: PWM Input mode ------------------------
     The external signal is connected to TIM2 CH2 pin (PA.01), 
     The Rising edge is used as active edge,
     The TIM2 CCR2 is used to compute the frequency value 
     The TIM2 CCR1 is used to compute the duty cycle value
  ------------------------------------------------------------ */

  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(TIM2, &TIM_ICInitStructure);  //CH2
	
	  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  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(TIM2, &TIM_ICInitStructure); //CH3  

  /* Select the TIM2 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM2, ENABLE);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
	
	TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);
	
	
}

void TIM2_IRQHandler(void)
{
    
    
	
	

	
					TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
					IC2Value = TIM_GetCapture2(TIM2);
					if (IC2Value != 0)
			{
    
    
				/* Duty cycle computation */
				DutyCycle_CH2 = (TIM_GetCapture2(TIM2) * 100) / IC2Value;

				/* Frequency computation */
				Frequency_CH2 = SystemCoreClock / IC2Value;
			}
			else
			{
    
    
				DutyCycle_CH2 = 0;
				Frequency_CH2 = 0;
			}
	

	

		
				TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
				/* Get the Input Capture value */

				IC3Value = TIM_GetCapture3(TIM2);

				
					if (IC3Value != 0)
				{
    
    
					/* Duty cycle computation */
					DutyCycle_CH3 = (TIM_GetCapture3(TIM2) * 100) / IC3Value;

					/* Frequency computation */
					Frequency_CH3 = SystemCoreClock / IC3Value;
				}
				else
				{
    
    
					DutyCycle_CH3 = 0;
					Frequency_CH3 = 0;
				}
    
}


猜你喜欢

转载自blog.csdn.net/m0_46179894/article/details/108905077