STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

news2024/11/24 16:43:32

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期


目录

  • STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期
      • 1、介绍
      • 2、STM32CubeMX配置
        • 2.1 基本配置
        • 2.2 PWM输出配置
        • 2.3 PWM输入捕获配置
      • 3、程序修改和测试


本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。

相关链接博文:

  • STM32CubeMX | STM32使用HAL库实现定时器PWM输出
  • STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量

1、介绍

以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适合测量某个脉冲或者测量按键按下时候的保持时间(见上面链接博客),不适合测量连续输出的脉冲场景。

STM32的定时器还存在一个PWM输入模式,只要将未知PWM波接入到定时器输入模式的引脚上,会自动算出占空比和周期,相当于示波器探针了。


2、STM32CubeMX配置

2.1 基本配置

使用的是STM32F103C8,时钟配置到72M主频:


使能串口1,用于调试打印:

2.2 PWM输出配置

想要测试PWM输入功能对不对,那么首先要让定时器生成一路用于测试的PWM脉冲,这里我利用TIM4的通道2输出一个10KHz、占空比50%的PWM波,PWM输出到PB6引脚上:

定时器分频系数设置为72,72MHz/72=1MHz的计数频率,重载值设置为100,则1MHz/100=10KHz的计数频率。

因为将重载设置为了100,设置脉冲0~100的范围就正好是占空比0%至100%。

Pulse设置的是有效电平的时间,

将Pulse设置为50,有效时间正好占用一半,此时的占空时间也就是50,占空比就为50/100=0.5=50%

如果将脉冲设置为80,那么有效时间是80,占空时间就是20,占空比就为20/100=0.2=20%

2.3 PWM输入捕获配置

将TIM2配置为PWM输入模式,我是使用的PWM输入通道2,也就是PA1引脚。

PWM输入模式开启后,会使用到通道一和通道2,一路用于捕获上升沿、一路用于捕获下降沿,这里要注意!

设置为72分频得到1MHz的计数频率,TIM2计一个数就是1us,这样设置比较好计算。

使能TIM2的全局中断:

生成代码即可~!


3、程序修改和测试

uint32_t uiDutyCycle;
uint32_t uiCycle;
uint32_t uiFrequency;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		switch(htim->Channel)
		{
			case HAL_TIM_ACTIVE_CHANNEL_1:
				uiDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);      /* 占空比 */
				break;
			case HAL_TIM_ACTIVE_CHANNEL_2:
				uiCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);          /* 周期 */
				break;
			default:break;
		}
	}
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM2_Init();
    MX_USART1_UART_Init();
    MX_TIM4_Init();

    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);   /* 使能定时器4通道1输出PWM波 */
	
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);  /* 使能定时器2通道1的PWM输入捕获 */
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);  /* 使能定时器2通道2的PWM输入捕获 */

    while(1)
    {
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
		HAL_Delay(500);
		uiFrequency = 1000000 / uiCycle;
		printf("占空:%dus    周期:%dus    频率:%dHz    \r\n", uiDutyCycle, uiCycle, uiFrequency);
    }
}

int fputc(int ch, FILE* fp)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
	return ch;
}

先用示波器接到PB6引脚上,看看TIM4输出的10KHz对不对:

验证后没问题,然后将PB6接到PA1引脚上。

再看串口输出的测量结果:

基本准确,但是存在误差!

在程序中将脉冲改为80,那么此时的PWM波,一个周期内的高电平时间是80,低电平时间是20,则占空比就是20%:

在看输出结果:

没问题,捕获的正确~!


ends…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium_交互 (谷歌浏览器驱动下载 xpath插件安装)

安装selenium (1)查看谷歌浏览器版本 谷歌浏览器右上角 ‐‐> 帮助 ‐‐> 关于 查看 浏览器版本: (2)操作谷歌浏览器驱动下载地址 http : // chromedriver . storage . googleapis . com / index . html 找到…

FPGA、 CPU、GPU、ASIC区别

一、为什么使用 FPGA? 众所周知,通用处理器(CPU)的摩尔定律已入暮年,而机器学习和 Web 服务的规模却在指数级增长。 人们使用定制硬件来加速常见的计算任务,然而日新月异的行业又要求这些定制的硬件可被重新…

2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解

写在前面 以下代码,目前均可通过民间OJ数据(dotcpp & New Online Judge), 两个OJ题目互补,能构成全集,可以到对应链接下搜题提交(感谢OJ对题目的支持) 如果发现任何问题&…

汽车制造数字化转型如何做?有哪些可行性案例?

引语:砥砺前行的先行者,为长期主义者带去曙光 国内制造企业亟需加速探索数字化转型之路。但是传统软件服务商提供的PLM、MES等系统已经无法满足企业个性化需求。通过传统软件服务商进行二次开发,成本高、周期长,难以适应迅速变化的…

少儿Python每日一题(25):岛屿问题

原题解答 本次的题目如下所示(题目来源:蓝桥杯): 编程实现: 有一片海域划分为N*M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。请问这片N*M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且…

【手把手做ROS2机器人系统开发六】创建用户自定义msg和srv文件

创建用户自定义msg和srv文件 目录 创建用户自定义msg和srv文件 一、程序编写 1、创建软件包 2、创建msg消息和srv服务文件夹 3、定义msg消息示例 4、定义srv服务示例 5、修改和添加编译选项 6、软件包设置 二、程序测试 1、编译软件包 2、测试查询信息 3、测试查询服务…

EasyCVR视频融合平台黑名单功能更新,防止设备恶意注册平台

为了防止别人恶意注册国标设备,EasyCVR视频融合平台也具备拦截设备注册的功能,即通过国标设备ID和注册IP地址进行拦截,也就是黑名单功能。 在3.1版本之前,黑名单的设置是在配置中心—平台接入中,在输入框中添加黑名单I…

在阿里做测试开发的这5年,收获与感悟...

正好在离职交接空档期,就抽空简单分享自己的一些个人经历给大家,希望对刚毕业不久或者工作三五年的同学能有一些帮助。 测试新人 我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试。那时候在一家电商公司做测试,做…

湿法冶金以及铼提取工艺,湿法冶金工艺特点及工艺流程

湿法冶金是利用浸出剂在一定温度压力下与矿石接触,把矿石中有用的金属溶解后再从溶液中回收有价金属的一种工艺,因为其过程大都是在水溶液中进行,所以又被称为“水法冶金”。 01 湿法冶金工艺特点及工艺流程 湿法冶金作为解决我国金属矿产资…

SpringBoot第 17 讲:SpringBoot+JWT

关于JWT的讲解请参考:SpringCloud第14讲:(番外篇)JWT 一、项目演示 没有登陆直接请求列表接口,系统会要求先进行登录 登录成功后请求列表接口,可以正常响应数据 二、后台开发 2.1、pom.xml 添加redis…

迪赛智慧数——柱状图(堆叠柱状图):各年龄段人群服装消费频次

效果图 你多久买一次新衣服? 70后买得“精”,90后换得“勤”,90后已成为服装消费者主力!90后中平均每周1次或更多的占比达12%。当买衣服的理由越来越感性,服装貌似已不再是“这届” 消费者的基础刚需。 数据源&#…

数据库系统-查询优化

文章目录 一、查询优化概述二、优化的基本思路2.1 语义优化-内容等价性2.2 语义优化-语法等价性2.3 执行优化(物理层优化)2.4 优化在整个DBMS的位置 三、逻辑查询优化3.1 逻辑优化整体思路3.2 关系代数操作次序交换的等价性定理1 连接&连接 积&积 交换律定理2 连接&…

Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

吾心信其可行,则移山填海之难,终有成功之日。 --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 🍉一.删除链…

DataGridView 真·列头不高亮 真·列头合并

高亮BUG VB.Net,在 .NET Framework 4.8 的 WinForm 下(即不是 WPF 的绘图模式、也不是 Core 或 Mono 的开发框架),使用 DataGridView 行模式,还是有个列头表现为高亮显示: 查找各种解决方式: 设置 ColumnHeadersDefaultCellSty…

Python3语法笔记(前篇)

文章目录 前言基础杂项变量和数据变量与运算数值字符串列表(list)、元组(tuple)和range序列类型(sequence types)和切片(slicing)集合(set)和字典&#xff08…

PS批量给图片加水印

一、打开PS,导入图片 点击菜单栏-文件-打开-载入一张需要设置文字水印的图片 二、点击菜单栏-窗口-动作,打开Photshop的动作组工作台窗口 先点击新建组图标新建一个组类别,再点击新建动作图标新建一个动作,新建后自动开始录制 …

DASFAA 2023|创邻周研博士分享前沿图数据库观点

4月17-20日,2023年第28届高级应用数据库系统国际会议(DASFAA2023)在天津成功举行。创邻科技CTO周研博士受邀参会,围绕Galaxybase国产高性能图数据库进行精彩分享。 DASFAA 2023由DASFAA指导委员会(DASFAA Steering Co…

CVPR 2023 | 语义分割新范式:点监督遇上隐式场

密集预测(dense prediction)网络是解决诸如语义分割和图像本征分解(intrinsic decomposition)等场景理解问题的基本框架。现有工作[1-2] 通常使用像素级标注作为训练密集预测模型的监督。但是像素级别的密集标注非常昂贵, 对一些任务也无法给出精准的像素标注&#…

Linux-初学者系列3——虚拟光驱使用mount挂载操作

虚拟光驱使用mount挂载操作 一、mount挂载操作1、利用图形将光盘镜像文件,放入光驱设备中2、找到Linux光驱设备(青色) 1、挂载光盘和分区mount命令语法:示例:卸载(注意事项) 二、Linux快捷键 一…

Vue(绑定样式、条件渲染、列表渲染)

一、绑定样式 1. class绑定样式名 标签中使用 :class"xxx" xxx可以是字符串,对象,数组 字符串:适用于类名不确定,动态获取 数组:适用于绑定多个样式,个数不确定,字数不确定 对象&…