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

2024-01-29 07:50

本文主要是介绍STM32CUBEIDE(12)----定时器TIM捕获PWM测量频率与占空比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 概述
  • 样品申请
  • 视频教学
  • csdn课程
  • 生成例程
  • 配置时钟树
  • 配置PWM
  • 配置输入捕获
  • 开启中断
  • STM32CUBEIDE配置
  • 串口重定向
  • 占空比与频率计算
  • 变量定义
  • 设置PWM占空比以及开启输入捕获
  • 回调函数
  • 主函数
  • 测试结果

概述

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

样品申请

https://www.wjx.top/vm/ejaAT1c.aspx#

视频教学

https://www.bilibili.com/video/BV1PB4y1n724/

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

csdn课程

课程更加详细。
https://download.csdn.net/course/detail/35611

生成例程

使用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的外部捕获口2if(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 */

交流Q_qun:615061293。
或者关注『记帖』,持续更新文章和学习资料!
在这里插入图片描述

主函数

  /* 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%正占空比。
在这里插入图片描述
在这里插入图片描述

这篇关于STM32CUBEIDE(12)----定时器TIM捕获PWM测量频率与占空比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656231

相关文章

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀

R语言统计分析——重复测量方差分析

参考资料:R语言实战【第2版】         所谓重复测量方差分析,即受试者被测量不止一次。本例使用数据集市co2数据集:因变量是二氧化碳吸收量(uptake),自变量是植物类型(Type)和七种水平的二氧化碳浓度(conc)。Type是组间因子,conc是组内因子。Type已经被存储为一个因子变量,还需要将conc转换为因子变量。分析过程如下: # 将conc变量转化为因子变量CO2$c

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h

八、我们应当怎样做需求调研:需求捕获(下)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

七、我们应当怎样做需求调研:需求捕获(上)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

【JavaScript】在循环体中了解定时器工作机制

for (var i = 0; i < 5; i++) {setTimeout(function() {console.log(i);}, 1000);}console.log(i);   如果我们约定,用箭头表示其前后的两次输出之间有 1 秒的时间间隔,而逗号表示其前后的两次输出之间的时间间隔可以忽略,代码实际运行的结果该如何描述?会有下面两种答案: A. :5 -> 5 -> 5 ->

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

block对变量捕获的方式

之前见很多文章对block捕获变量的方法,会进行诸如此类的描述:“block会捕获被引用的变量, 并对其进行copy操作, 因此, 可能会导致其引用计数加1,如果处理不好, 可能因循环引用导致内存泄漏。” 实际上, 这种说法并不严谨。block对变量的捕获, 根据变量类型的不同,会采用不同的捕获方式。 (1)静态或者全局变量, 在block中直接是指针传递的方式传入block中,对其进行的操作