细说STM32单片机通用定时器使用输出比较功能生成PWM波的方法

news2024/11/15 19:35:01

目录

一、本实例测试的目的

二、硬件和CubeMX项目配置

1、硬件开发板 

2、项目配置

(1)定时器TIM2_CH1

(2)时钟和Debug

三、使用比较功能生成PWM

1、启动定时器

2、TIM2_CH1通道GPIO初始化

3、下载与测试


一、本实例测试的目的

  • 使用TIM2_CH1的输出比较功能,控制PA5引脚翻转输出,使得LD2闪烁; 
  • LD2闪烁频率受CCR控制;
  • 通过输出比较生成的PWM的起始位置由CCR控制;

二、硬件和CubeMX项目配置

1、硬件开发板 

        本试验使用的硬件资源参考本文作者的文章:细说STM32单片机使用通用定时器生成固定占空比和可变占空比PWM波的方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/142212487icon-default.png?t=O83Ahttp:// https://wenchm.blog.csdn.net/article/details/142212487

2、项目配置

(1)定时器TIM2_CH1

        Channel1选择Output Compare CH1;Clock Source选择Internal Clock;

  •  One PulseMode复选框用于设置单脉冲模式,定时器输出比较的单脉冲模式是一种特殊模式,有一组以“HAL_TIM_OnePulse”为前缀的HAL 驱动函数。本例不使用单脉冲模式。
  • Counter Settings组用于设置定时器的基本参数,主要设置结果如下。
  •  PSC的值设置为16999,所以计数器时钟频率为10000Hz。
  • ARR的值设置为4999,所以定时器 UEV事件周期为500ms。
  • Output Compare Channel1组是通道1的输出比较参数,各个参数的意义和设定值如下。
  •  Mode,输出比较模式,有冻结、有效电平、翻转等多种选择。这里设置为Toggle on match,也就是在计数器的值与CCR的值相等时,使CH1输出翻转。
  •  Pulse,脉冲宽度,也就是CCR的值,这里设置为3000,所以脉冲宽度是300 ms。
  • Output compare preload,设置CCR是否使用预装载功能。本示例设置为Enable或Disable无影响。
  •  CH Polarity,通道极性。本示例模式设置为匹配时输出翻转,与此参数无关。

        如果CCR和计数器的值匹配,就会使CH1的输出翻转。从原理图上可以看出,CH1的输出是一个方波信号,且不管CCR的值为多少(需要小于ARR的值),方波的占空比总是50%,脉宽总是与ARR的值相等。


(2)时钟和Debug

        HSE选择外部晶振,24MHZ,APB1 = APB2 = 170MHz;

        Debug选择Serial Wire;

三、使用比较功能生成PWM

        自动定义表示定时器TIM2的外设对象变量htim2,在函数MX_TIM2_Init()中,设置htim2各参数的值之后,调用HAL_TIM_Base Init()进行定时器初始化,调用HAL_TIM_OC_Init() 进行输出比较初始化,然后使用TIM_OC_InitTypeDef类型的变量sConfigOC设置输出比较通道的参数,再调用函数HAL_TIM_OC_ConfigChannel()对TIM2的CH1进行输出比较配置。 

1、启动定时器

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2); 				//启动定时器TIM2
  HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_1);	//启动CH1的输出比较功�??
/* USER CODE END 2 */

2、TIM2_CH1通道GPIO初始化

        自动生成 :

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspPostInit 0 */

  /* USER CODE END TIM2_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM2 GPIO Configuration
    PA5     ------> TIM2_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM2_MspPostInit 1 */

  /* USER CODE END TIM2_MspPostInit 1 */
  }

}

3、下载与测试

        下载、运行,用眼睛观察到LD2以生成的PWM的频率闪烁。

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

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

相关文章

一,掌心里的智慧:我的 TinyML 学习之旅

从云端到掌心:TinyML 的故事 想象一下,有一天你起床,伸手去关闭窗边的小闹钟,却发现这个小家伙已经提前预判到你的醒来时间——因为它能够“听到”你昨晚的呼吸变化,分析出你什么时候会醒。这个场景可能听起来像科幻小…

OrionX vGPU 研发测试场景下最佳实践之Jupyter模式

在上周的文章中,我们讲述了OrionX vGPU研发测试场景下最佳实践之SSH模式,今天,让我们走进 Jupyter模式下的最佳实践。 • Jupyter模式:Jupyter是最近几年算法人员使用比较多的一种工具,很多企业已经将其改造集成开发工…

[C++] 剖析多态的原理及实现

文章目录 多态的概念及定义编译时多态(静态多态)运行时多态(动态多态)动态多态的原理示例:运行时多态 两种多态的区别 多态的实现基本条件虚函数虚函数的重写与覆盖虚函数重写的其他问题协变析构函数的重写 C11 中的 o…

【数据结构】8——图3,十字链表,邻接多重表

数据结构8——图3,十字链表,邻接多重表 文章目录 数据结构8——图3,十字链表,邻接多重表前言一、十字链表结构例子 复杂例子 二、邻接多重表(Adjacency Multilist)例子 前言 除了之前的邻接矩阵和邻接表 …

Kubernetes部署及示例

目录 一、实验环境 二、部署 1、添加解析 2、安装docker,确保登录成功 3、所有禁用swap和本地解析 4、 安装K8S部署工具 5、集群初始化 6、安装flannel网络插件 7、节点扩容 三、kubernetes 中的资源 1、资源管理介绍 2、资源管理方式 (…

【Kubernetes】服务账号 Service Account

《K8s 的安全认证》系列,共包含以下文章: K8s 的安全框架和用户认证K8s 的鉴权管理(一):基于角色的访问控制(RBAC 鉴权)K8s 的鉴权管理(二):基于属性 / 节点…

Mac导入iPhone的照片怎么删除?快速方法讲解

随着Apple生态系统的高度整合,Mac与iPhone之间的照片同步和导入变得异常便捷。但这种便利有时也会带来一些管理上的困扰,比如Mac导入iPhone的照片怎么删除? 从iPhone直接删除照片 Mac导入iPhone的照片怎么删除?如果你的照片是通…

思维商业篇(1)—如何判断商业效率

思维商业篇(1)—如何判断商业效率 我们评价一个公司,很大程度上其实就是看其商业效率高不高以及规模大不大。 规模是一个企业的大小,效率是一个企业的节奏。 一个小企业如果效率很高,在未来就会有很多的机会。只要其所在行业在&#xff0c…

深入理解Python中的魔法参数 *args 和 **kwargs

在Python编程中,函数的灵活性是其强大之处之一。其中,*args 和 **kwargs 是实现函数参数可变性的重要工具。 无论我们是Python初学者还是经验丰富的开发者,充分理解这两个概念都有助于编写更加灵活、高效的代码。 本文将深入探讨*args和**kw…

【JavaScript】数据结构之树

什么是树形结构? 一种分层数据的抽象模型,用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索(遍历)- 递归 从根出发,尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…

三、(JS)JS中常见的表单事件

一、onfocus、onblur事件 这个很容易理解&#xff0c;就不解释啦。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

【JS|第27期】网页文件传输:Blob与Base64的对决

日期&#xff1a;2024年9月12日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【SQL】百题计划:SQL最基本的判断和查询。

[SQL]百题计划 Select product_id from Products where low_fats "Y" and recyclable "Y";

java重点学习-JVM组成

十二 JVM 12.1 JVM运行原理 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 12.2 什么是程序计数器? 程序计数器:线程私有的&#xff08;不存在线程安全问题&#xff09;&…

美团图床设置教程

大厂图床&#xff0c;CDN加速 项目地址&#xff1a;https://github.com/woniu336/mt-img 使用方法 在mt.php填上你的token即可&#xff0c;然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/发布视频&#xff0c;上传封面&#xff0c;注意在上传封面后…

java项目之企业级工位管理系统源码(springboot)

项目简介 企业级工位管理系统实现了以下功能&#xff1a; 企业级工位管理系统的主要使用者管理员功能有个人中心&#xff0c;部门信息管理&#xff0c;工位信息管理&#xff0c;使用情况管理&#xff0c;工位分配管理。员工可以查看个人中心&#xff0c;部门信息&#xff0c;…

linux第二课(docker的安装使用)

目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql ​编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP服务端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;服务端包链接&#xff1a;https://download.csdn.net/download/AirIT/89747026&#xff09; 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;客户端包链接&#xff1a;https://downloa…

List<Map<String, Object>>汇总统计排序

开发环境&#xff1a;jdk 1.8 需求一&#xff1a; 1、统计每个小时(升序)不同事件的产品产量 2、统计不同事件&#xff08;OK 、NG&#xff09;的总产量 public static void main(String[] args) {//数据源List<Map<String, Object>> list new ArrayList<Map…

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹&#xff0c;显示数据 # 3 可以显示如下&#xff0c;不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值&#xff0c;js中…