精华内容
下载资源
问答
  • pwm输入捕获

    2019-02-21 16:18:41
    pwm输入捕获
  • 本文是关于stm32PWM输入捕获模式详解。
  • PWM输入捕获PWM实验

    2021-04-11 17:19:51
    PWM输入捕获PWM实验 所用芯片:STM32F407 库:HAL库 实验过程: 使用通用定时器2的输出通道1产生PWM波,使用高级定时器8的输入通道1来输入产生的PWM波,设置捕获通道1来测量周期,通道2来测量占空比,使用基本定时器...

    PWM输入捕获PWM实验

    所用芯片:STM32F407

    库:HAL库

    实验过程:

    使用通用定时器2的输出通道1产生PWM波,使用高级定时器8的输入通道1来输入产生的PWM波,设置捕获通道1来测量周期,通道2来测量占空比,使用基本定时器6定时1s再通过串口1来输出测量值。

    引脚设置:

    高级定时器TIM8的通道1使用PC6
    在这里插入图片描述
    通用定时器TIM2的通道1使用PA15
    在这里插入图片描述
    基本定时器TIM6没有对应的外设引脚。

    时钟设置:

    TIM2和TIM6使用APB1 Timer clocks,时钟频率为84MHz
    TIM8使用APB2 Timer clocks,时钟频率为168MHz
    在这里插入图片描述

    TIM2设置:

    TIM2模式和配置
    在这里插入图片描述
    参数设置
    在这里插入图片描述
    中断设置
    在这里插入图片描述
    GPIO设置
    在这里插入图片描述

    TIM6设置:

    TIM6模式和配置
    在这里插入图片描述
    参数设置
    在这里插入图片描述
    中断设置在这里插入图片描述

    TIM8设置:

    TIM8模式和配置
    在这里插入图片描述

    在这里插入图片描述
    参数设置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    GPIO设置
    在这里插入图片描述
    默认设置即可。

    系统核心设置:

    在这里插入图片描述
    在NVIC中可设置中断优先级
    在这里插入图片描述

    在RCC中可设置系统时钟源以及系统的相关参数
    在这里插入图片描述

    编写代码

    timer2.c

    /*
       * @ name    Timer1_Start_IT
       * @ brief   定时器2以PWM模式启动
       * @ param   None
       * @ retval  None
    */
    static void Timer2_Start_PWM(void)  //定时器2以中断模式启动	  
    {
    		HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); //启动定时器2,通道1输出PWM
    }
    

    timer6.c

    /*
       * @ name    Timer6_Start_IT
       * @ brief   定时器6以中断模式启动
       * @ param   None
       * @ retval  None
    */
    static void Timer6_Start_IT(void)  //定时器6以中断模式启动	  
    {
    	HAL_TIM_Base_Start_IT(&htim6); //启动定时器6 
    }
    

    timer8.c

    /*
       * @ name    Timer8_Start_Capture
       * @ brief   // 使能定时器8捕获/比较通道1/2的中断请求
       * @ param   None
       * @ retval  None
    */
    static void Timer8_Start_Capture(void)  
    {
    	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
    	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
    }
    

    定时器6的中断处理函数

    /*
     * @ name     HAL_TIM_PeriodElapsedCallback
     * @ brief		定时器6中断回调函数
     * @ param		*htim -> 处理定时器的结构体指针
     * @ retval 	None
    */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
      if(htim->Instance == htim6.Instance)
    	{
    		// 每间隔 1s 测量值
    		if(++Timer6.usMCU_Run_Timer >= TIMER6_1s)
    		{
    			Timer6.usMCU_Run_Timer = 0;
    			printf("IC1Value = %d  IC2Value = %d ", IC1Value, IC2Value);
    			printf("占空比:%0.2f%%   频率:%0.2fHz\n", DutyCycle, Frequency);
    		}
    	}
    }
    

    定时器8的中断处理函数
    在这里插入图片描述
    在这里插入图片描述

    /*
     * @ name     HAL_TIM_IC_CaptureCallback
     * @ brief		定时器8捕获回调函数
     * @ param		*htim -> 处理定时器的结构体指针
     * @ retval 	None
    */
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    	if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    	{
    		/* 获取输入捕获值 */
    		IC1Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_1);
    		IC2Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_2);  
    		if (IC1Value != 0)
    		{
    			/* 占空比计算 百分数占空比是百分数,所以要乘以100. */
    			/* 因为IC1Value和IC2Value都是从0开始计数的,所以都要加1 */
    			DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
    			/* 频率计算 */
    			Frequency = 168000000/168/(float)(IC1Value+1);
    		}
    		else
    		{
    			DutyCycle = 0;
    			Frequency = 0;
    		}
    	}
    }
    

    对这三个定时器进行初始化

    /*
     * @name   Peripheral_Set
     * @brief  外设初始化设置
     * @param	None
     * @retval None
     */ 		
    static void Peripheral_Set(void)
    {
      __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); /*使能串口接收中断 */ 
    	
    	Timer6.Timer6_Start_IT(); 			// 启动定时器6
    	Timer2.Timer2_Start_PWM(); 			// 启动定时器2,通道1输出PWM
    	Timer8.Timer8_Start_Capture();	// 使能定时器8捕获/比较通道1/2的中断请求
    
    //	TestSRAMWork();
    	
    	printf("System Init Finish.\r\n");
    }
    

    结束

    展开全文
  • STM32PWM输入捕获模式源码,采用的是STM32F103系列的单片机
  • 在STM32F103单片机上给PA6口输入PWM波,利用STM32单片机的PWM输入捕获模式测量输入PWM波的频率和站空比。
  • 电子-超声波测距PWM输入捕获.zip,单片机/嵌入式STM32-F3/F4/F7/H7
  • stm32 pwm输入捕获

    2018-12-02 01:38:03
    PWM输入捕获 由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。

    PWM输入捕获

    由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1
    /TIMx_CH2信号。

    展开全文
  • 电子-超声波控制LEDPWM输入捕获.zip,单片机/嵌入式STM32-F3/F4/F7/H7
  • PWM输入捕获模式

    2016-11-12 17:40:24
    PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可以设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx...

    一、概念理解

    PWM输入捕获模式是输入捕获模式的特例,自己理解如下

    1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可以设置管脚和寄存器的对应关系

    2. 同一个TIx输入映射了两个ICx信号。

    3. 这两个ICx信号分别在相反的极性边沿有效

    4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

    5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM

        时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

    6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

    7. 由此可以计算出PWM的时钟周期和占空比了

        frequency=f(TIM时钟频率)/n。

        duty cycle=(高电平计数个数/n),

        若m为高电平计数个数,则duty cycle=m/n

        若m为高电平计数个数,则duty cycle=(n-m)/n

    注:因为计数器为16位,所以一个周期最多技术65535个,所以测得的 最小频率= TIM时钟频率/65535。

     

    二、程序设计与分析

    1. 程序概述:选择TIM3作为PWM输入捕获。IC2设置为上升沿,并设置为有效的触发输入信号。所以IC2的捕获寄存器捕获PWM周期,

                       IC1的捕获寄存器捕获PWM的高电平周期。

    2.程序代码如下:

      /* TIM3 clock enable */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);      //时钟配置

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

     

     

    /* TIM3 channel 2 pin (PA.01) configuration */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                               //GPIO配置
      PIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOA, &GPIO_InitStructure);

     

     

     

     /* Enable the TIM3 global Interrupt */
      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     //NVIC配置
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

     

     

    /*TIM配置*/ 

      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;           //输入预分频。意思是控制在多少个输入周期做一次捕获,如果

    //输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,

    //可以减少软件被不断中断的次数。
      TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF

      TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);                 //根据参数配置TIM外设信息

      /* Select the TIM3 Input Trigger: TI2FP2 */
      TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);                //选择IC2为始终触发源

      /* Select the slave Mode: Reset Mode */
      TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件

      /* Enable the Master/Slave Mode */
      TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发

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

      /* Enable the CC2 Interrupt Request */        
      TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //打开中断 

     

    中断处理函数

     

    void TIM3_IRQHandler(void)
    {
      /* Clear TIM3 Capture compare interrupt pending bit */
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);                //清楚TIM的中断待处理位

      /* Get the Input Capture value */
      IC2Value = TIM_GetCapture2(TIM3);                         //读取IC2捕获寄存器的值,即为PWM周期的计数值

      if (IC2Value != 0)
      {
        /* Duty cycle computation */
        DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;         //读取IC1捕获寄存器的值,并计算占空比

        /* Frequency computation */
        Frequency = 72000000 / IC2Value;                                          //计算PWM频率。
      }
      else
      {
        DutyCycle = 0;
        Frequency = 0;
      }
    }

     

     

    注(一):若想改变测量的PWM频率范围,可将TIM时钟频率做分频处理

     TIM_TimeBaseStructure.TIM_Period = 0xFFFF;     //周期0~FFFF
      TIM_TimeBaseStructure.TIM_Prescaler = 5;       //时钟分频,分频数为5+1即6分频
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //时钟分割
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
      TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化
    注注(二):定时器TIM的倍频器X1或X2。在APB分频为1时,倍频值为1,否则为2。

    展开全文
  • STM32学习总结-定时器PWM输入捕获测量脉冲的最小和最大频率计算公式PWM输入捕获能捕获的最小频率为 72MHZ/{ (ARR+1)*(PSC+1) }=1HZ //PWM输入捕获能捕获的最大频率为 72MHZ/{ (PSC+1) }=1MHZpsc=72-1时...

    STM32学习总结-定时器PWM输入捕获测量脉冲的最小和最大频率计算公式

    PWM输入捕获捕获最小频率为 72MHZ/{ (ARR+1)*(PSC+1) }=1HZ //PWM输入捕获捕获的最大频率为 72MHZ/{ (PSC+1) }=1MHZ
    psc=72-1时
    展开全文
  •   STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获模式用以测量矩形波的频率和占空比。   下载工程文件:   ...
  • 一般要求一路的话直接就直接用标准库的PWM输入捕获例程了,可以把它看成一种特殊的输入捕获。两路的话就需要使用输入捕获在例程的基础上修改一下(标准库例程只能计算一路频率),不过思路是一样的。 一般捕获都需要...
  • STM32系列单片机的定时器PWM输入捕获模式,判断频率和占空比只适用于频率相当稳定的情况下,假如是通过计算频率的方式捕获霍尔原理的编码器的信号,由于电机运行在非理想状态,转速时刻在变化,导致霍尔传感器输出...
  • AT32F421-低频PWM输入捕获 /*********************************************************************/ 1.使用AT32F421捕获低至0.5khzPWM波形,可自动计算占空比和PWM频率; 2.使用时,需将附件解压在AT32BSP的如下...
  • 前言:STM32 为了方便用户使用,设置了专门的PWM输入捕获模式,在这种模式下,输入捕获更加快捷,而且相比于普通的输入捕获模式,该模式的代码量更小,能够快速实现对PWM周期,占空比,频率的测量。 定时器的PWM输入...
  • stm32 定时器pwm输入捕获

    千次阅读 2015-07-10 18:03:21
    stm32 定时器pwm输入捕获 输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。 如果要测量低电平的宽度,你应该在捕捉到下降沿...
  • 首先我们确认好的输出PWM引脚是 PA1 TIM2 CH2 作为输出1 PA2 TIM2 CH3 作为输出2 PA2 TIM2 CH4 作为输出2 我们要用的固件库是路径是 \STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\...首先两个输入捕获会用的
  • 利用STM32的PWM输入模式测量PWM波的占空比及频率,实现PWM波的准确捕获,在某些情况下,频繁的高低电平转换即为PWM波,此模式可用于转速的测量。
  • STM32F3-PWM输入捕获测量频率脉宽…

    千次阅读 2016-11-27 19:53:17
    利用STM32的PWM输入捕获功能,可以测方波的占空比和(或)频率 使用时将相应的输入配置为对应定时器对应的复用功能,外部待测量波形从该引脚输入 再配置定时器输入捕获功能相应参数,选择主从模式,最后打开中断或者...
  • PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx...
  • TIM通用定时器:PWM输入捕获模式

    千次阅读 2013-08-05 13:46:28
    PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx...
  • STM32F1PWM输入捕获

    2020-09-05 10:42:23
    于是我尝试着使用STM32的定时器捕获功能来测量PWM波。 配置PWM波 由于要测量PWM波形,那么首先要产生一个PWM波。 PWM配置代码如下: //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_...
  • PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx...
  • 前言 上一篇文章介绍了使用《STM32参考手册》上 PWM 输入模式捕获的 PWM 波,这种方法简单且准确,但是它占用的资源太多了,因为它...本文介绍了另一种捕获 PWM 的方法,只使用任何一路定时器的输入捕获,就可以测 PW

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 780
精华内容 312
关键字:

pwm输入捕获