STM32定时器及输出PWM完成呼吸灯
文章目录
- 一、STM32定时器原理
- 1、基本定时器
- 2、通用定时器
- (1)时钟源
- (2)预分频器PSC
- (3)计数器CNT
- (4)自动装载寄存器ARR
- 3、高级定时器
- 二、PWM工作原理
- 三、控制LED以2s的频率周期性地亮-灭
- 1、STM32CubeMX建立项目
- 2、代码编写
- 3、运行结果
- 四、STM32输出PWM完成呼吸灯
- 1、STM32CubeMX建立项目
- 2、代码编写
- 3、运行结果
- 4、逻辑分析仪
- 总结
- 参考资料
一、STM32定时器原理
定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形,编码器计数等。
STM32的定时器分为基本定时器、通用定时器和高等定时器。
1、基本定时器
功能:作为时基,定时功能。
2、通用定时器
STM32通用定时器TIMx(x=2,3,4,5)主要由时钟源、时钟单元、捕获和比较通道等构成,核心是可编程预分频驱动的16位自动装载计数器。
(1)时钟源
当定时器使用内部时钟时,定时器的时钟源统称为TIMxCLK。虽然在系统默认的配置中,TIMxCLK的时钟频率都是72MHz,但其时钟来源并不相同。
- 定时器TIM2~TIM7挂接在APB1上
- 定时器TIM1和TIM8挂接在APB2上
若外部晶振的频率为8MHz,则系统默认的时钟频率为72MHz
- APB1预分频器的分频系数设置为2,则PCLK1=36MHz;
- APB2预分频系数设置为1,则PCLK2=72MHz,TIM1和TIM8的时钟频率TIMxCLK=72MHz;
- Cortex系统时钟由AHB时钟(HCLK)8分频得到,即SysTick的频率为9MHz。
(2)预分频器PSC
可以以1~65535之间的任意数值对时钟源CK_PSC的时钟频率进行分频,输出CK_CNT脉冲供计数器CNT进行计数。
(3)计数器CNT
TIMxCNT是一个16位的寄存器,计数范围为1~65535,可以向上计数、向下计数或向下向上双向计数。
要得到想要的计数值,需要对输入时钟频率进行分频。
当计数值达到设定值时,便产生溢出事件,溢出时产生中断或DMA请求,然后再由自动装载寄存器进行重新加载或更新。
计数器溢出中断属于软件中断,执行相应的定时器中断服务程序。
(4)自动装载寄存器ARR
定时器的定时时间主要取决于定时周期和预分频因子,计算公式为:
定时时间=(ARR+1)×(预分频值PSC+1)/输入时钟频率
或 T=(TIM_Period +1)*(TIM_Prescaler +1)/TIMxCLK
这里ARR+1是因为计数器都是从0开始计数的。
3、高级定时器
功能:除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能 (可用于电机控制、数字电源设计等)。
二、PWM工作原理
PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。
占空比(Duty Cycle),是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值:
占空比=Tp/T
- STM32的定时器除了TIM6和TIM7,其他定时器都可以用来产生PWM输出;
- STM32中每个定时器有4个输入通道:TIMx_CH1~TIMx_CH4;
- 每个通道对应1个捕获/比较寄存器TIMx_CRRx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到PWM信号;
- 脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出低电平;
在t1-t2时间段,定时器计数器TIMx_CNT值大于TIMx_CCRx值,输出高电平;
当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。
三、控制LED以2s的频率周期性地亮-灭
使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
引脚:GPIOB14
定时器:Tim2
1、STM32CubeMX建立项目
(1)配置RCC
(2)配置SYS
(3)选择GPIO引脚
(4)配置定时器Timer
(5)配置时钟树
由上文定时器定时时间的计算方法可知:
T=(ARR+1)×(预分频值PSC+1)/输入时钟频率
此处 ARR=6399 PSC=4999 输入时钟频率=16
T=5000 x 6400/16=2000000us=2s
(6)创建文件
2、代码编写
(1)在main文件的main函数中 "/* USER CODE BEGIN 2 / … / USER CODE END 2 */"之间加入该代码(省略号部分)
HAL_TIM_Base_Start_IT(&htim2);
(2)在main文件的main函数中 "/* USER CODE BEGIN 4 / … / USER CODE END 4 */"之间加入该代码(省略号部分)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static unsigned char ledState = 0;if (htim == (&htim2)){if (ledState == 0)HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);ledState = !ledState;}
}
3、运行结果
四、STM32输出PWM完成呼吸灯
接上,采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。
1、STM32CubeMX建立项目
(1)配置RCC
(2)配置SYS(前两步与上述一致)
(3)配置定时器Timer3
(4)配置时钟树
(5)创建文件
2、代码编写
main文件
占空比初始值为0,如果小于500(也就是PWM周期),设置每隔1毫秒,占空比加1;如果大于500,每隔一毫秒减1。
/* USER CODE BEGIN 1 */uint16_t pwmVal=0; //PWM占空比 uint8_t dir=1; /* USER CODE END 1 */
/* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);/* USER CODE END 2 */
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */while (pwmVal< 500){pwmVal++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同HAL_Delay(1);}while (pwmVal){pwmVal--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同HAL_Delay(1);}HAL_Delay(200);}/* USER CODE END 3 */
3、运行结果
4、逻辑分析仪
波形
由波形变化可知:
波形宽度由宽变窄,又由窄变宽对应着LED灯的亮度由暗变亮,又从亮变暗,与实践结果一致
总结
通过本次实验,了解到了可以使用定时器实现时间的控制和如何用PWM完成呼吸灯的设置,开心!!!
参考资料
https://blog.csdn.net/Morzart/article/details/134123197?spm=1001.2014.3001.5506
https://blog.csdn.net/superSmart_Dong/article/details/134565102?spm=1001.2014.3001.5506
https://blog.csdn.net/weixin_55376063/article/details/127595225?spm=1001.2014.3001.5502
相关文章:

STM32定时器及输出PWM完成呼吸灯
文章目录 一、STM32定时器原理1、基本定时器2、通用定时器(1)时钟源(2)预分频器PSC(3)计数器CNT(4)自动装载寄存器ARR 3、高级定时器 二、PWM工作原理三、控制LED以2s的频率周期性地…...
海外仓管理系统费用解析:如何选择高性价比的海外仓系统
海外仓作为链接国内商家和海外市场的重要环节,其重要性自然是不言而喻的。 对于众多中小型海外仓来说,如何在保证服务质量的同时降低运营成本,就成了大家关注的焦点。今天我们就从海外仓管理系统的费用这个角度,来帮助大家分析一…...
深度学习之学习率调度器Scheduler介绍
调度器是深度学习训练过程中非常重要的一部分,它用于动态调整模型的学习率,从而提高训练效率和最终性能。 1. 为什么需要学习率调度器? 深度学习训练中,学习率是一个非常关键的超参数。合适的学习率可以确保模型快速收敛并获得良好的性能。 但是在训练过程中,最优的学习率会随…...

蓝桥杯-AB路线(详细原创)
问题描述: 有一个由 N M 个方格组成的迷宫,每个方格写有一个字母 A 或者 B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。 由于特殊的原因,小蓝的路线必须先走 K 个 A 格子、再…...
计算机字符编码的发展
目录 背景 发展 第一阶段:ASCII编码 第二阶段:扩展ASCII编码 第三阶段:各国编码 第四阶段:Unicode编码 第五阶段:UTF系列编码方式 相关扩展 背景 在计算机诞生初期,所有的数据都是基于二进制数&am…...

Java(六)——抽象类与接口
文章目录 抽象类和接口抽象类抽象类的概念抽象类的语法抽象类的特性抽象类的意义 接口接口的概念接口的语法接口的特性接口的使用实现多个接口接口与多态接口间的继承抽象类和接口的区别 抽象类和接口 抽象类 抽象类的概念 Java使用类实例化对象来描述现实生活中的实体&…...

【4.vi编辑器使用(下)】
一、vi编辑器的光标移动 二、vi编辑器查找命令 1、命令::/string 查找字符串 n:继续查找 N:反向继续查找 /^the 查找以the开头的行 /end 查找以 查找以 查找以结尾的行 三、vi编辑器替换命令 1、语法: : s[范围,范围]str1/str2[g] g表示全…...

【数据结构】探索树中的奇妙世界
专栏介绍: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累…...

搭建YOLOv10环境 训练+推理+模型评估
文章目录 前言一、环境搭建必要环境1. 创建yolov10虚拟环境2. 下载pytorch (pytorch版本>1.8)3. 下载YOLOv10源码4. 安装所需要的依赖包 二、推理测试1. 将如下代码复制到ultralytics文件夹同级目录下并运行 即可得到推理结果2. 关键参数 三、训练及评估1. 数据结构介绍2. 配…...

c++(一)
c(一) C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别? C与C有什么区别 <1>都是…...
java面试中高频问题----1
一、乐观锁和悲观锁定义、场景怎么判断用什么? 1.乐观锁: 定义:乐观锁假设大多数情况下,资源不会发生冲突。因此,允许多个线程同时访问资源。 场景:读操作多,写操作少,数据冲突概率…...

ABB 控制柜
1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴…...

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )
文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…...

使用C语言openssl库实现 RSA加密 和 消息验证
Q:什么是RSA? A:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥(public key)和私钥(private key&…...
海外投放面试手册
海外投放面试手册 岗位职责: 负责Google 、Facebook、TikTok、Twitter等海外主流广告平台的自主投放操作及合作渠道沟通;负责海外合作渠道媒体的广告投放管理、媒体数据监测、效果分析、优化调整等工作; 3.了解海外各渠道&…...

第十三章 进程与线程
第十三章 进程与线程 程序与进程的概念 程序: 英文单词为Program,是指一系列有序指令的集合,使用编程语言所编写,用于实现一定的功能。 进程: 进程则是指启动后的程序,系统会为进程分配内存空间。 函数式…...
Flink面试整理-对Flink的高级特性如CEP(复杂事件处理)、状态后端选择和调优等有所了解
Apache Flink 提供了一系列高级特性,使其成为一个强大的实时数据处理框架,特别适用于复杂的数据处理场景。其中,复杂事件处理(CEP)、状态后端的选择和调优是其中重要的几个方面。 复杂事件处理(CEP) CEP 概念:CEP 是用于在数据流中识别复杂模式的技术。它允许用户指定事…...

算法:树状数组
文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…...

Kafka SASL_SSL集群认证
背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka SASL_SSL安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详…...

同城交友论坛静态页面app Hbuild
关注...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...