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

news2024/12/23 9:20:05

目录

一、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.coloradmin.cn/o/1717710.html

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

相关文章

跨境电商多店铺:怎么管理?风险如何规避?

跨境电商的市场辽阔&#xff0c;有非常多的商业机会。你可能已经在Amazon、eBay、Etsy等在线平台向潜在客户销售产品了。为了赚更多的钱&#xff0c;你可能还在经营多个店铺和品牌。 但是&#xff0c;像Amazon、eBay、Etsy等知名平台会有自己的规则&#xff0c;他们开发了很多…

风电功率预测 | 基于TCN-GRU时间卷积门控循环单元的风电功率预测(附matlab完整源码)

完整代码 clc; clear close allX = xlsread(风电场预测.xlsx); X = X(5665:8640,:); %选取3月份数据 num_samples =

linux系统——性能检测工具glances

在linux系统中&#xff0c;由python开发的glances工具是一个功能强大的性能检测工具 可以通过yum进行安装 安装glances后&#xff0c;进入命令界面 glance支持网站模式&#xff0c;将监控到的数据以网站形式显示出来 这里需要用python包管理命令 使用glances -w开放…

STM32 HAL库USART的接收数据方法实现(STM32Cube_FW_F1_V1.8.5)

目录 概述 1 使用STM32Cube生成项目 1.1 软件版本信息 1.2 配置串口相关参数 1.3 生成工程 2 问题描述 3 解决问题 3.1 修改代码 3.2 编写新的回调函数 4 测试 概述 本文主要介绍STM32 HAL库USART的接收数据方法实现&#xff0c;笔者使用的HAL库为STM32Cube_FW_F1_V1.…

声音的归宿:恢复手机录音的3个步骤与策略

“手机录音删除了怎么恢复&#xff0c;没有云备份。本人平时喜欢用手机录音机录一些唱的歌&#xff0c;上次录过之后就再也没有打开&#xff0c;今天一打开发现上个月的录音都没了&#xff01;里面都是我的歌&#xff0c;还有期末重点&#xff0c;还有声乐课的录的音频&#xf…

R语言绘图 | 双Y轴截断图

教程原文&#xff1a;双Y轴截断图绘制教程 本期教程 本期教程&#xff0c;我们提供的原文的译文&#xff0c;若有需求请回复关键词&#xff1a;20240529 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组…

JS脚本打包成一个 Chrome 扩展(CRX 插件)

受这篇博客 如何把CSDN的文章导出为PDF_csdn文章怎么导出-CSDN博客 启发&#xff0c;将 JavaScript 代码打包成一个 Chrome 扩展&#xff08;CRX 插件&#xff09;。 步骤&#xff1a; 1.创建必要的文件结构和文件&#xff1a; manifest.jsonbackground.jscontent.js 2.编写…

每日一题——Python实现PAT甲级1035 Password(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑分析&#xff1a; 时间复杂度分析&#xff1a; 空间复杂度分析&a…

CDH6.3.2集成Flink1.12.2

一、Linux下载httpd服务并开启 yum install y httpd systemctl start httpd systemctl enable httpd 二、获取已制作好的安装包 flink-1.12.2-bin-scala_2.11.tar ​ FLINK_ON_YARN-1.12.2.jar ​ flink-shaded-hadoop-2-uber-3.0.0-cdh6.3.2-10.0.jar 三、集成CM 1.上传编…

「多客」圈子论坛社区交友系统开源版小程序源码|圈子社区系统

简述 社交圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、点赞等互…

Windows系统安装openvino(2024.1.0)

一、openvino下载&#xff1a; 下载地址&#xff1a;下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压&#xff0c;然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例&#xff1a;&#xff08;建议使用moniconda虚拟环境来安装&am…

springboot中抽象类无法注入到ioc容器

1、背景 在写代码时&#xff0c;发现service接口有两个实现类&#xff0c;并且两个实现类中没有对类名重命名&#xff0c;属性注入的时候也没有使用byName或Qualifier&#xff0c;正确情况下会发生多实现报错的问题&#xff0c;以前对这个问题进行解析过。 2、调试过程 我想…

Swift 中 @preconcurrency 修饰符使用浅谈

概述 Swift 6.0 与我们越来越近了&#xff0c;如何将旧范儿的并发代码装换为严格遵守 Swift 6.0 并发模型&#xff08; Strict Concurrency&#xff09;的新代码&#xff0c;这往往使得秃头码农们又要多抓掉几根头发了。 所以&#xff0c;为了最大限度的保持新旧两个并发世界暂…

视频删除怎么恢复?这2个方法或许能帮到你

随着科技的发展&#xff0c;手机视频的拍摄和存储技术也不断提高&#xff0c;在我们的生活中也扮演着越来越重要的角色&#xff0c;或是作为新媒体工作者的工作内容&#xff0c;或是成为我们分享生活的途径&#xff0c;视频占据的分量越来越重。然而&#xff0c;由于各种原因&a…

10- Redis 键值对数据库是怎么实现的?

在开始将数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型的对象&#xff0c;比如 List 对象&#xf…

JAVA应用服务器如何快速定位CPU问题

如果服务器上部署了多个Java站点服务和Java微服务&#xff0c;并且突然接收到CPU异常告警&#xff0c;我们需要逐步确定是哪个服务进程造成了CPU过载&#xff0c;接着是哪个线程&#xff0c;并最终定位到是哪段代码导致了这个问题 简要步骤如下&#xff1a; 步骤一、找到最耗C…

用Idea 解决Git冲突

https://intellijidea.com.cn/help/idea/resolving-conflicts.html https://www.jetbrains.com/help/idea/resolve-conflicts.html idea 官方文档 当您在团队中工作时&#xff0c;您可能会遇到这样的情况:有人对您当前正在处理的文件进行更改。如果这些更改没有重叠(也就是说…

深入分析 Android Service (一)

文章目录 深入分析 Android Service (一)1. Android Service 设计说明1.1. Service 的类型1.2. Service 的生命周期1.3. 创建和启动 Service1.4. 绑定 Service1.5. ServiceConnection1.6. 前台 Service1.7. IntentService示例&#xff1a;创建和使用 IntentService 2. Service …

视频汇聚EasyCVR平台GA/T 1400视图库应用:助力社会治安防控效能提升

在信息化、智能化的时代浪潮下&#xff0c;公安视频图像信息应用系统的发展与应用显得尤为重要。GA/T 1400标准&#xff0c;全称为《公安视频图像信息应用系统》&#xff0c;作为公安行业的一项重要标准&#xff0c;其视图库的应用在提升公安工作效能、加强社会治安防控等方面发…

通过强化学习彻底改变大型数据集特征选择

文章目录 一、说明二、强化学习&#xff1a;特征选择的马尔可夫决策问题三、用于使用强化学习进行特征选择的 python 库3.1. 数据预处理3.2. 安装和导入FSRLearning库 四、结论和参考文献 一、说明 了解强化学习如何改变机器学习模型的特征选择。通过实际示例和专用的 Python 库…