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

相关文章

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

【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

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

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