STM32 CubeMX学习实验13:定时器输入捕获获取PWM频率

这篇具有很好参考价值的文章主要介绍了STM32 CubeMX学习实验13:定时器输入捕获获取PWM频率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、工程配置

使用定时器5作为输入捕获定时器,将通道1(PA0)设置为输入捕获,设置预分频器和计数值,这里设置为1us计数一次,最大可以捕获周期为0xFFFFFFFFus的PWM,所以一般不需要考虑溢出的问题,使能自动重装载。

stm32 采集pwm,stm32,学习,嵌入式硬件

使能定时器中断,选择合适的优先级, 

stm32 采集pwm,stm32,学习,嵌入式硬件

 将引脚设置下拉,保证没有信号输入时保持电压的稳定,最大输出速度选择高。stm32 采集pwm,stm32,学习,嵌入式硬件

 在这里在这里可以选择任意定时器输出PWM,便于检验输入捕获的准确性,将TIM14通道1设置为PWM输出,频率为100Hz,其他默认即可。

二、代码初始化和捕获实现

在主函数中开启定时器捕获和更新中断,更新中断本例未使用到,根据需求开启。开启TIM14通道1,用于输出PWM,这里设置占空比为32.7%。

stm32 采集pwm,stm32,学习,嵌入式硬件

初始化代码中,首先设置 为上升沿捕获,进入InputCap.flag==0,记录定时器计数值,并设置为下降沿捕获,随后等待PWM波形下降沿到来,再次记录定时器计数值,两次计数值的差值就为PWM正脉宽的时长。再将触发方式设置为上升沿触发,同样记录计数值,得到负脉宽的时长,就完成一次捕获。需要注意的是代码中的溢出,若第一次记录的计数值为4294967200,如果脉宽时长为100us,那么第二次的计数值就会溢出,变成5,因为计数值最大为4294967295,超过该值将重新从0开始计数,这时候计算出来的脉宽就会为负值。我们只需要判断两次计数值的大小,做简单的处理即可(InputCap.tim_n_l=InputCap.tim_n1+0xffffffff-InputCap.tim_n2;)。

//在tim.h文件中加入

//定义一个结构体
typedef struct
{
    uint32_t tim_n_h;
    uint32_t tim_n_l;
    uint32_t tim_n1;
    uint32_t tim_n2;
    uint32_t tim_n3;
    uint32_t T;//周期
    //uint16_t overflow;//溢出计数
    uint8_t flag;//捕获完成标志
}InputCapture;
extern InputCapture InputCap;


//在tim.c文件中实现捕获功能/

//重定义结构体
InputCapture InputCap;

//捕获中断(当发生上升/下降沿时进入该函数)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim==&htim5)
    {
        if(InputCap.flag==0)//上升沿
        {
            InputCap.flag=1;//记录索引
            InputCap.tim_n1=TIM5->CCR1;//获取计数值
            //切换为下降沿捕获
                        __HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);
        }
        else if(InputCap.flag==1)
        {
            InputCap.flag=2;//记录索引
            InputCap.tim_n2=TIM5->CCR1;//获取计数值
            
            //溢出
            if(InputCap.tim_n2<InputCap.tim_n1)
            {
                InputCap.tim_n_h=InputCap.tim_n2+0xffffffff-InputCap.tim_n1;
            }
            else
            {
                InputCap.tim_n_h=InputCap.tim_n2-InputCap.tim_n1;
            }
            
            //切换为上升沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
        }
        else if(InputCap.flag==2)
        {
            InputCap.flag=0;//记录索引
            InputCap.tim_n1=TIM5->CCR1;
            
            //溢出
            if(InputCap.tim_n2>InputCap.tim_n1)
            {
                InputCap.tim_n_l=InputCap.tim_n1+0xffffffff-InputCap.tim_n2;
            }
            else
            {
                InputCap.tim_n_l=InputCap.tim_n1-InputCap.tim_n2;
            }
            
            InputCap.T=InputCap.tim_n_l+InputCap.tim_n_h;
            
            //切换为上升沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
        }
    }
}

 之后,只要不关闭输入捕获功能,就可以持续捕获,可以在main函数中100ms输出一次捕获结果

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      printf("%dus  %dus  %0.3f%%  %fHz\r\n",
            InputCap.tim_n_h,//高电平时长
            InputCap.tim_n_l,//低电平时长
            100.0*InputCap.tim_n_h/(InputCap.tim_n_h+InputCap.tim_n_l),//占空比
            1.0/((InputCap.tim_n_h+InputCap.tim_n_l)*0.000001)//频率
            );
      HAL_Delay(100);
  }

三、效果验证

把单片机的PA0(捕获)和PF9(PWM,也可以使用外部的波形发生器),连接起来,打开串口调试助手即可看到PWM相关信息,如正负脉宽,频率,占空比等。

stm32 采集pwm,stm32,学习,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-839880.html

下期一起学习使用定时器读取正交编码器的值,控制PWM的占空比 

到了这里,关于STM32 CubeMX学习实验13:定时器输入捕获获取PWM频率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HAL库】STM32CubeMX开发----非阻塞延时实验----SysTick(滴答定时器)中断

    STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录 HAL库 有自带的 ms级 延时函数: HAL_Delay(); 缺点: 这是 阻塞延时 方式,就是延时期间,什么都不能干,这样很浪费资源。 这篇文章主要介绍,利用 SysTick(滴答定时器)中断 实现 非阻塞延时 的实验

    2024年02月16日
    浏览(26)
  • STM32CubeMX学习四 之定时器配置

    记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。 如何使用STM32CubeMX以及工程创建在之前的博客有提到,这里就直接从定时器讲起。 编译环境:KEIL 代码生成:STM32CubeMX 库:HAL MCU:STM32F072 假设你的cubeMX工程已经建好,这里我们开始配置定时器2(TIM2),

    2024年02月01日
    浏览(20)
  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

    (部分图引自于ATK) 前情提要(基本定时器) 点此进入 通用定时器类别 通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如: 外部输入捕获 输出比较 输出PWM 时钟源 CubeMX为我们提供了配置时钟的非常方便的工

    2024年04月15日
    浏览(49)
  • 2.基于正点原子STM32F103的定时器中断实验(HAL库实现)(cubeMX)

      基本上每一款MCU都会配备定时器这个外设,STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 同样,STM32F1系列的定时器功能也很强大,包括: TIM1和TIM8两个高级定时器; TIM2~TIM5是个通用寄存器; TIM7,TIM8,两个基本定时器。 由于本次实验适用于新手入门

    2023年04月26日
    浏览(138)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(31)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(22)
  • STM32学习笔记 & 通用定时器TIM3~TIM5 13

    通用定时器是一个通过可编程预分频器驱动的 16 位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间

    2024年02月05日
    浏览(41)
  • STM32 HAL库 CubeMX配置 定时器学习 F103C8T6

    开发板: STM32F103C8T6最小系统板 编译环境: Keil5 MDK 辅助软件: STM32 CubeMX 课程教学: 基于正点原子HAL库学习教程 其余配件: 江科大STM32配件包 和 示波器一台 备注:  因为这块开发板没有基本定时器,所以本文也 没有基本定时器的内容             本文1.3和2.1部分的

    2024年04月26日
    浏览(18)
  • STM32CubeMX——定时器配置

    本文将会以STM32F103C8T6为例配置定时器2定时5 ms SMT32F1系列共有8个定时器: 基本定时器(TIM6、TIM7) 通用定时器(TIM2、TIM3、TIM4、TIM5) 高级定时器(TIM1、TIM8) 16位向上、向下、向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~6553

    2023年04月10日
    浏览(27)
  • 最详细STM32,cubeMX 定时器

    这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 cubeMX 定时器 的配置和使用。 实验:使用定时器控制 led 闪烁。 STM32的定时器是用于时间测量和事件生成的复杂工具。可以使用内部或外部时钟源。时

    2024年02月07日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包