0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32CUBEIDE(12)----定时器TIM捕获PWM测量频率与占空比

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2022-11-30 16:08 次阅读

概述

本章STM32CUBEMX配置STM32F103输出PWM,并在示波器中查看效果。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:615061293 。

生成例程

使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板

在这里插入图片描述

查看原理图,PA2和PA3设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

查看原理图,PA8设置为PWM输出管脚,PA0设置为定时器输入捕获管脚。

在这里插入图片描述

配置时钟

配置时钟为64M。

在这里插入图片描述

配置PWM

配置定时器1输出pwm的频率为1K。

在这里插入图片描述

在这里插入图片描述

配置输入捕获

在这里插入图片描述

开启中断

在这里插入图片描述

STM32CUBEIDE配置

在这里插入图片描述

若需要打印浮点型,需要勾选下面的选项。

在这里插入图片描述

串口重定向

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
#ifdef __GNUC__                                    //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END PFP */

占空比与频率计算

占空比=(t1-t0)/(t2-t0) 频率=(t2-t0)/时钟频率= =(t2-t0)/(64M/(psc+1))

在这里插入图片描述

周期需要2个上升沿去判断,设定第一个上升沿time_flag由0->1,下降沿time_dowm_flag由0->1,此时就知道正占空比时间,当在产生上升沿时候,就可以计算出周期使用的时间。

在这里插入图片描述

变量定义

#define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
uint8_t time_up_flag=0;//上升沿标志位
uint8_t time_dowm_flag=0;//下降沿标志位

uint32_t time_up_num=0;//上升沿计数
uint32_t time_dowm_num=0;//下降沿计数
float time_frequency;//频率
float time_duty;//占空比

设置PWM占空比以及开启输入捕获

/* USER CODE BEGIN 2 */
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 300);
    HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
HAL_Delay(100);
  /* USER CODE END 2 */

回调函数

/* USER CODE BEGIN 4 */
// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    // 判断是否是定时器1的外部捕获口2
    if(htim->Instance == TIM2)
    {
        if(IR_IN1&&time_up_flag==0)//第一次上升
        {
            time_up_flag=1;
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
            __HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计

        }
        else if(IR_IN1==0&&time_dowm_flag==0)//下降
        {

            time_dowm_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); // 读取捕获计数,这个时间即为上升沿持续的时间
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿沿捕获
            time_dowm_flag=1;
        }        
        else if(IR_IN1&&time_dowm_flag==1)//第二次之后上升
        {        
            time_up_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); // 读取捕获计数,这个时间即为上升沿持续的时间
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
            time_dowm_flag=0;
            __HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计

        }    

    }    
}
/* USER CODE END 4 */

主函数

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
                    time_frequency=1000000/time_up_num;//频率
            time_duty = (float)time_dowm_num/(float)time_up_num;//占空比    
        printf("\\ntime_frequency=%.2f,time_duty=%.2f",time_frequency,time_duty*100);
//        __HAL_TIM_SET_AUTORELOAD(&htim1, 500-1);
//        __HAL_TIM_SET_PRESCALER(&htim1, 32-1);

        HAL_Delay(1000);
  }
  /* USER CODE END 3 */

测试结果

当输出1k频率,30%正占空比。

在这里插入图片描述

在这里插入图片描述

当输出4k频率,60%正占空比。

在这里插入图片描述

在这里插入图片描述
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5186

    浏览量

    213920
  • 定时器
    +关注

    关注

    23

    文章

    3248

    浏览量

    114792
  • Tim
    Tim
    +关注

    关注

    0

    文章

    81

    浏览量

    17899
  • stm32cubemx
    +关注

    关注

    5

    文章

    283

    浏览量

    14807
收藏 人收藏

    评论

    相关推荐

    STM32CubeIDE下配置STM32F103输出带死区的互补PWM

    STM32F103的TIM1和TIM8是高级定时器,可以产生嵌入死区时间的互补PWM波,使用STM32C
    的头像 发表于 11-01 09:41 7576次阅读
    <b class='flag-5'>STM32CubeIDE</b>下配置<b class='flag-5'>STM32</b>F103输出带死区的互补<b class='flag-5'>PWM</b>波

    stm32定时器pwm模式输入捕获功能

    stm32定时器pwm模式输入捕获##stm32中的定时器,除了
    发表于 08-18 07:41

    浅析stm32定时器pwm模式输入捕获

    stm32定时器pwm模式输入捕获stm32中的定时器,除了
    发表于 08-19 07:33

    STM32定时器的输入捕获模式测量脉冲宽度或者测量频率

    概述在前面几章中简单的讲解了定时器用作定时PWM输出时的基本原理和配置,在这一章中讲解定时器的另一种用法输入捕获是输入
    发表于 01-06 08:02

    stm32定时器输入捕获

    不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 一、输入
    发表于 10-13 09:13 2.4w次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>

    基于STM32定时器输入捕获解析

    输入捕获模式可以用来测量脉冲宽度或者测量频率STM32定时器,除了
    发表于 09-04 11:00 6019次阅读

    stm32 定时器 捕获

    输入捕获模式可以用来测量脉冲宽度或者测量频率STM32定时器,除了
    发表于 09-08 17:07 2392次阅读

    关于定时器输出的PWM频率范围及占空比精度

    定时器输出的PWM频率范围及占空比精度
    的头像 发表于 03-12 10:37 1.4w次阅读

    基于STM32定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32定时器
    的头像 发表于 01-02 18:17 1.3w次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>捕获</b><b class='flag-5'>测量</b>脉宽的应用示例

    STM32-通用定时器-PWM输出

    捕获、输出比较、PWM输出、单脉冲模式输出等。STM32定时器除了TIM6和TIM7(基本
    发表于 11-26 15:36 23次下载
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定时器</b>-<b class='flag-5'>PWM</b>输出

    STM32-定时器输入捕获实验(捕获PWM方波的频率占空比

    STM32-定时器输入捕获实验(捕获PWM方波的频率占空比
    发表于 12-14 18:55 26次下载
    <b class='flag-5'>STM32</b>-<b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>实验(<b class='flag-5'>捕获</b><b class='flag-5'>PWM</b>方波的<b class='flag-5'>频率</b>和<b class='flag-5'>占空比</b>)

    STM32定时器输入捕获实验

    概述输入捕获模式可以用来测量脉冲宽度或者测量频率STM32定时器,除了
    发表于 12-14 18:58 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>实验

    STM32CUBEMX开发GD32F303(13)----定时器TIM捕获PWM测量频率占空比

    和PA10设置为开发板的串口。 配置串口 查看原理图,PB0设置为PWM输出管脚,PB10设置为定时器输入捕获管脚。 配置时钟树 配置时钟为64M。 配置PWM 配置
    的头像 发表于 12-07 10:15 3540次阅读
    <b class='flag-5'>STM32</b>CUBEMX开发GD32F303(13)----<b class='flag-5'>定时器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕获</b><b class='flag-5'>PWM</b><b class='flag-5'>测量</b><b class='flag-5'>频率</b>与<b class='flag-5'>占空比</b>

    GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率占空比

    本章配置GD32F303输出PWM,同时使用TIM测量PWM频率和正占空比。 查阅手册可以得知,
    的头像 发表于 12-07 10:19 6102次阅读
    GD32F303固件库开发(13)----<b class='flag-5'>定时器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕获</b><b class='flag-5'>PWM</b><b class='flag-5'>测量</b><b class='flag-5'>频率</b>与<b class='flag-5'>占空比</b>

    STM32 TIM—基本定时器

    STM32F4xx系列控制有共有14个TIM定时器。其中2个高级控制定时器TIM1和
    的头像 发表于 07-22 17:05 5060次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>TIM</b>—基本<b class='flag-5'>定时器</b>