[stm32]——定时器与PWM的LED控制

目录

一、stm32定时器

1、定时器简介

2、定时器分类

3、通用定时器介绍

二、PWM相关介绍

1、工作原理

2、PWM的一般步骤

三、定时器控制LED亮灭

1、工程创建

2、代码编写

3、实现效果

四、采用PWM模式,实现呼吸灯效果

 1、工程创建

2、代码编写

3、实现效果


一、stm32定时器

1、定时器简介

定时器就是用来定时的机器,是存在于STM32单片机中的一个外设。其本质就是计数器,只不过 计数器 记录的是STM32的外部情况,所接收的也是外部脉冲,而 定时器 则是由STM32自身提供的一个非常稳定的计数器,这个稳定的计数器就是STM32上连接的晶振部件。

定时器主要功能如下:

2、定时器分类

STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6 )

三种定时器的主要区别如下:

3、通用定时器介绍

STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括:

位于低速的APB1总线上(APB1)
16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
        ① 输入捕获 

        ② 输出比较

        ③ PWM 生成(边缘或中间对齐模式) 

        ④ 单脉冲模式输出 

可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 
        ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 

        ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 

        ③输入捕获 

        ④输出比较 

        ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 

        ⑥触发输入作为外部时钟或者按周期的电流管理

STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。   
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

二、PWM相关介绍

  PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。

  占空比(Duty Cycle),是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值: 占空比=Tp/T。

1、工作原理

(1)STM32的定时器除了TIM6和TIM7,其他定时器都可以用来产生PWM输出;

(2)高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出;

(3)通用定时器能同时产生多达4路的PWM输出; STM32中每个定时器有4个输入通道:TIMx_CH1~TIMx_CH4;

(4)每个通道对应1个捕获/比较寄存器TIMx_CRRx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到PWM信号;

(5)脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

 如上图所示:在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出低电平; 在t1-t2时间段,定时器计数器TIMx_CNT值大于TIMx_CCRx值,输出高电平; 当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。

2、PWM的一般步骤

使能定时器和相关IO口时钟。调用函数:RCC_APB1PeriphClockCmd()
RCC_APB2PeriphClockCmd();
初始化IO口为复用功能输出。调用函数:GPIO_Init();
这里是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开- 启AFIO时钟,同时设置重映射;调用函数:RCC_APB2PeriphClockCmd();GPIO_PinRemapConfig();
初始化定时器。调用函数:ARR,PSC等:TIM_TimeBaseInit();
初始化输出比较参数。调用函数:TIM_OC2Init();
使能预装载寄存器。调用函数:TIM_OC2PreloadConfig();
使能定时器。调用函数:TIM_Cmd();
不断改变比较值CCRx,达到不同的占空比效果;调用函TIM_SetCompare2()

三、定时器控制LED亮灭

1、工程创建

打开外部时钟,点击 System Core,选择RCC,在右侧弹出的菜单栏中选择Crystal/Ceramic Resonator

选择调试接口,点击 System Core,选择SYS,在右侧弹出的菜单栏中选 Serial Wire

 配置IO口,选择 PB7 作为 LED 灯的阴极输入,将其设置为 GPIO-Output,并改名为LED

配置定时器,选择定时器2来实现定时的功能。选中 TIM2,将定时器2的时钟源设置为内部时钟;设置分频系数为71,向上计数模式,计数周期为50000。
这里将分频系数设置为71,系统处理的时候会自动加1,所以此处进行的是72分频。由于时钟设置为为72MHZ,所以72分频后得到1MHZ的时钟;1MHZ的时钟,计数50000次,得到时间50000/1000000=0.05秒;每隔0.05秒,定时器2产生一次定时中断。这里要设置灯周期性的亮灭,周期为两秒,即亮一秒,灭一秒,则中断产生20次后,改变led的引脚电平。 

配置中断,允许定时器2的中断

配置时钟,将HCLK修改为 72MHz

最后就可生成项目

2、代码编写

在main主函数里面添加定时器启动代码

HAL_TIM_Base_Start_IT(&htim2);

在main主函数后面添加定时器回调中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//这里灯亮一秒,灭一秒,则中断产生20次改变一次电平static uint32_t time_cnt =0;   //记录中断次数if(htim->Instance == TIM2)   {if(++time_cnt >= 20)   //判断是否已经达到一秒{time_cnt =0;       //点灯用的中断次数归零HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);    //改变LED所接引脚的电平}}}

3、实现效果

点亮LED

四、采用PWM模式,实现呼吸灯效果

 1、工程创建

打开外部时钟,点击 System Core,选择RCC,在右侧弹出的菜单栏中选择Crystal/Ceramic Resonator

选择调试接口,点击 System Core,选择SYS,在右侧弹出的菜单栏中选 Serial Wire

配置TIM2
clock source选择internal clock
将 Channel2 设置为 PWM Generation CH2(PWM输出通道2)
Prtscaler (定时器分频系数) 设置为71,即72分频——1MHz
Counter Mode(计数模式)设置为Up(向上计数模式)
Counter Period(自动重装载值) 设置为500,计数器从0向上计数(递增)到自动装载值,然后再次回到0开始计数,并产生一个计数溢出事件.
CKD(时钟分频因子) 设置为No Division (不分频 )

配置USART 

 配置时钟,将 HCLK 设置为 72MHz

 然后就可生成项目

2、代码编写

在 main.c 文件中定义一个变量来记录 pwm 波形的占空比

uint16_t pwm=10; 

在main主函数中添加如下代码

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

在主函数 while 循环里加入如下代码

 while(pwm<500){pwm = pwm + 10;__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,pwm);HAL_Delay(20);//延时20毫秒}while(pwm>0){pwm = pwm - 10;__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,pwm);HAL_Delay(20);}

3、实现效果

呼吸灯


总结

定时器的学习,让我更加深入的了解到stm32的工作原理,同时实现呼吸灯的效果也感觉很有趣。

参考链接:

定时器&PWM应用编程-CSDN博客

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

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

相关文章

STM32 IIC协议

本文代码使用 HAL 库。 文章目录 前言一、什么是IIC协议二、IIC信号三、IIC协议的通讯时序1. 写操作2. 读操作 四、上拉电阻作用总结 前言 从这篇文章开始为大家介绍一些通信协议&#xff0c;包括 UART&#xff0c;SPI&#xff0c;IIC等。 UART串口通讯协议 SPI通信协议 一、…

B端系统:角色与权限界面设计,一文读懂。

一、什么是角色与权限系统 角色与权限系统是一种用于管理和控制用户在系统中的访问和操作权限的机制。它通过将用户分配到不同的角色&#xff0c;并为每个角色分配相应的权限&#xff0c;来实现对系统资源的权限控制和管理。 在角色与权限系统中&#xff0c;通常会定义多个角色…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比&#xff1a;从GPT-3到GPT-4&#xff0c;再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力&#xff1a;GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

el-table中的信息数据过长 :show-overflow-tooltip=‘true‘**

可以在 el-table-column中添加 :show-overflow-tooltip‘true’

Kotlin 2.0 重磅发布! 性能提升!新功能上线!开发者必看!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Java面试】六、Spring框架相关

文章目录 1、单例Bean不是线程安全的2、AOP3、Spring中事务的实现4、Spring事务失效的场景4.1 情况一&#xff1a;异常被捕获4.2 情况二&#xff1a;抛出检查异常4.3 注解加在非public方法上 5、Bean的生命周期6、Bean的循环引用7、Bean循环引用的解决&#xff1a;Spring三级缓…

软考随记(二)

I/O系统的5种不同的工作方式&#xff1a; 程序控制方式&#xff1a; 无条件查询&#xff1a;I/O端口总是准备好接受主机的输出数据&#xff0c;或是总是准备好向主机输入数据&#xff0c;而CPU在需要时随时直接利用I/O指令访问相应的I/O端口&#xff0c;实现与外设的数据交换 …

python-求点积

【问题描述】&#xff1a;给出两个数组&#xff0c;并求它们的点积。 【问题描述】&#xff1a;输入A[1,1,1],B[2,2,2]&#xff0c;输出6,即1*21*21*26。输入A[3,2],B[2,3,3],输出-1&#xff0c;没有点积。 完整代码如下&#xff1a; alist(map(int,input().split())) blist(…

vscode 默认终端(Terminal) 为CMD,但是新建是powerShell

☆ 问题描述 vscode 默认终端&#xff08;Terminal&#xff09; 为CMD&#xff0c;但是新建是powerShell ★ 解决方案 随便设置其他为默认&#xff0c;然后再设置回来CMD为默认就行了&#xff0c;实在不行就重装vscode吧… ✅ 总结 应该是vscode的小bug

redis windows环境下的部署安装

2024Redis windows安装、部署与环境变量 一、下载 Redis官网目前暂不支持Windows版本&#xff0c;只能从github中下载。 windows 64位系统下载redis路径&#xff1a;https://github.com/tporadowski/redis/releases&#xff0c;下载zip包。 目前Windows版本只更新到5.0的版本…

香橙派OriengePi AiPro 华为昇腾芯片开发板开箱测评

香橙派OriengePi AiPro 华为昇腾芯片开发板开箱测评 文章目录 前言OrangePi AIpro硬件相关及配置外观接口配置虚拟桌面网络配置拓展swap内存 软件相关及配置docker基础镜像搭建pytorch安装及匹配 软件测试使用yolo v8测试使用模型转换 总结 前言 博主有幸受邀CSDN测评香橙派与…

我喜欢的vscode插件

有个更全的&#xff1a;提高编程效率的30个VScode插件 Image preview&#xff08;图片预览&#xff09; any-rule&#xff08;正则表达式大全&#xff09; px to rem & rpx & vw(cssrem)&#xff08;px和rem之间转换&#xff09; 小程序开发助手 Auto Close Tag A…

Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型&#xff0c;是开发过程中最常用的类型。 String类型的声明及初始化与基本数据类型非常相似&#xff1a; String name "lcy";但是String类型是引用类型&#xff0c;有着非常丰富的处理字符串的方法。正是因为其重…

连锁美容机构行业:如何利用用友BIP收入云实现收入增长

随着消费市场的不断升级和消费者需求的日益多样化&#xff0c;连锁美容机构行业正面临着前所未有的机遇与挑战。在这个竞争激烈的市场环境中&#xff0c;如何有效地利用技术手段提升管理效率、优化客户体验&#xff0c;进而实现收入的持续增长&#xff0c;成为了众多美容机构关…

Javaweb第九次作业

采用XML映射文件的形式来映射sql语句&#xff1b;采用动态sql语句的方式&#xff0c;实现条件查询的分页。 controller Slf4j RestController RequestMapping("supermarket111") public class SupermarketFenyeController {AutowiredSupermarketFenyeService super…

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…

【免费Web系列】JavaWeb实战项目案例五

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 新增员工 前面我们已经实现了员工信息的条件分页查询。 那今天我们要实现的是新增员工的功能实现&#xff0c;页面原型如下&#xff1a; ​ 首先我们先完成"新增员工"的功能开发&#xff0…

[Redis]Hash类型

基本命令 hset命令 设置 hash 中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09; 返回值&#xff1a;添加的字段的个数&#xff08;注意是添加的个数&#xff0c;而不包括修改的&#xff09; hset key field value [field value ...] hget命令 …

InnoDB Data Locking - Part 2 “Locks“

什么是数据库“锁”&#xff1f; 当我熟悉数据库术语时&#xff0c;我发现非常困惑的一件事是“锁【lock】”这个词在数据库中的含义与在编程中的含义不同。 在编程中&#xff0c;如果你有一个“锁”&#xff0c;那么它就是内存中存储在某个地址下的单个对象&#xff0c;然后有…

【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 vim编辑器 Linux编译器&#xff1a;gcc/g使用 gcc和g的选项 编译过程 动静态库的链接 Linux项目的自动化构建 生成可执行程序 清理可执行程序 Linux调试器-gdb使用 git和git…