当前位置: 首页 > news >正文

【STM32入门学习】定时器与PWM的LED控制

目录

一、定时器与PWM介绍

1.1定时器

1.1.1定时器分类简介

1.1.2STM32定时器分类比较表

1.1.3定时器启动操作:

1.2 PWM

1.2.1  简介:

1.2.2PWM工作原理

1.2.3使用步骤:

二、定时器计数控制LED灯亮灭

2.1HAL库

2.1.1使用HAL库创建程序(熟悉HAL库使用)

​编辑

2.1.2计算定时器溢出时间

2.2烧录结果:

三、PWM驱动LED呼吸灯

3.1HAL库点灯

3.2烧录结果:

四、总结


一、定时器与PWM介绍

1.1定时器

1.1.1定时器分类简介

     STM32定时器种类多,功能强大,这些定时器完全独立、互不干扰,可以同步操作

1.SysTick定时器

SysTick系统时钟位于Cortex-M3内核,是一个24位的递减计数器,主要用于:精确延时,在多任务操作系统中为系统提供时间基准(时基);任务切换,为每个任务分配时间片。

2.WatchDog看门狗

作用:当微控制器受到外部干扰或程序中出现不可预知的逻辑故障导致应用程序脱离正常的执行流程时(俗称程序跑飞),在一定的时间间隔内使系统复位,回到初始状态;

看门狗设计是用来监视MCU程序运行状态的,是确保系统可靠稳定运行的一种有效措施。

1.1.2STM32定时器分类比较表

定时器

基本定时器

(TIM6TIM7)

通用定时器

TIMx(x=2~5)

高级定时器

(TIM1TIM8)

计数器类型

16位,向上

16位,

向上、

向下、

向上/向下

16位,

向上、

向下、

向上/向下

预分频系数

165535

之间的任意数

165535

之间的任意数

165535

之间的任意数

输入/捕获通道

四个独立通道:输入捕获、输出比较、

PWM生成、单脉冲模式输出

产生中断/DMA

可以

可以

可以

刹车(电机控制)

可以

1通用定时器:

     TIM2TIM3TIM4TIM5STM324个独立的16通用定时器,具有定时、测量输入信号的脉冲长度(输入捕获)、输出所需波形(输出比较、产生PWM、单脉冲输出等)等功能。

2.基本定时器:

STM32有2个基本定时器TIM6和TIM7,可用作:通用的16位计数器、产生DAC触发信号基本定时器的计数模式只有向上计数模式。

3.高级定时器

高级定时器相比基本定时器、通用定时器,功能更为强大

1.1.3定时器启动操作:

操作步骤:

1.时钟配置:配置定时器使用的时钟源和时钟分频器,确保定时器的工作频率符合应用需求。

2.定时器初始化:选择并初始化所需的定时器模块,设置计数模式、PWM模式、计数方向等。

3.定时器功能配置:根据应用需求配置定时器的比较器、捕获/比较通道、PWM输出等功能。

4.中断或DMA配置:如有需要,配置定时器的中断或DMA,以便在特定事件发生时执行相应的处理程序或数据传输操作。

5.启动定时器:启动定时器开始计数或PWM输出,监控定时器的状态并根据应用需要调整参数。

1.2 PWM

1.2.1  简介:

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

广泛应用于电力电子技术中,比如PWM控制技术在逆变电路中的应用; PWM还应用于直流电机调速,如变频空调的交直流变频调速,除实现调速外,还具有节能等特性

周期为10ms(频率为100Hz)PWM波形

1.2.2PWM工作原理

占空比Duty Cycle,是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值,是PWM工作中的重要环节。

占空比=Tp/T

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

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

1.2.3使用步骤:

1.选择合适的PWM频率:通常选择一个高频率的PWM,以确保控制精度和减少可听见的开关噪声。

2.设定周期:确定PWM信号的周期,即脉冲的重复频率。

3.设定占空比:根据需要设定高电平(ON时间)相对于总周期的比例,这决定了输出信号的平均功率或效果。

4.应用于输出设备:将PWM信号输出到需要控制的设备,如电机驱动电路、LED控制电路或音频放大器。

二、定时器计数控制LED灯亮灭

要求:使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。

2.1HAL库

2.1.1使用HAL库创建程序(熟悉HAL库使用)

在生成代码上进行修改和配置:

  HAL_TIM_Base_Start_IT(&htim2);
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_9);    //改变LED所接引脚的电平}}
}

2.1.2计算定时器溢出时间

2.2烧录结果:

LED闪烁

三、PWM驱动LED呼吸灯

要求:采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果,

3.1HAL库点灯

选择芯片F103C8T6

创建好文件后修改代码:

在tim.c中添加:

/* USER CODE BEGIN 1 */
#include "usart.h"uint16_t CCR1, CCR2, CCR3;
uint8_t measure_flag = 0;
// 定时器3 捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{static uint8_t measure_cnt = 1;// 初始设置的是捕获上升沿if (htim == &htim3){// 1. 第一次发生中断肯定是上升沿if (measure_cnt == 1){// 2. 获取此时定时器计时数据CCR1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 3. 将定时器设置为捕获下降沿__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);measure_cnt = 2;}// 4. 捕获到下降延else if (measure_cnt == 2){// 5. 获取此时定时器计时数据CCR2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 6. 将定时器重新设置为捕获上升沿__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);measure_cnt = 3;}// 7. 再次捕获到上升沿,说明一个周期结束了。else if (measure_cnt == 3){// 8. 获取此时定时器计时的数据CCR3 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 9. 关闭定时器中断。HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);measure_cnt = 1;measure_flag = 1;}}
}// 捕获函数
void capture(void)
{// diff1:高电平持续时间// diff2:一个周期的时间uint16_t diff1 = 0, diff2 = 0;uint32_t freq;	// 频率uint8_t duty;	// 占空比if (measure_flag){measure_flag = 0;if (CCR1 < CCR2)diff1 = CCR2 - CCR1;elsediff1 = 0xffff + 1 + CCR2 - CCR1;	// 设置的最多能数65535,也就是0xffff + 1if (CCR1 < CCR3)diff2 = CCR3 - CCR1;elsediff2 = 0xffff + 1 + CCR3 - CCR1;// 每秒能数 1000000.一个周期是 diff2。freq = (72000000 / 72) / diff2;// 高电平持续时间/低电平持续时间 不让出现小数,所以*100duty = diff1 * 100 / diff2;}printf("freq: %d HZ,  duty: %d %% \r\n", freq, duty);
}
/* USER CODE END 1 */

主函数中:

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.2烧录结果:

PWM呼吸灯

四、总结

本次博客主要介绍了定时器和PWM,都是非常常用的模块,在单片机的使用过程中,通过计时器和PWM完成了很多延时、点灯、舵机旋转等工作,从中学习到很多东西。本人才疏学浅,还请各位友友批评指正。我们下期再见!

相关文章:

【STM32入门学习】定时器与PWM的LED控制

目录 一、定时器与PWM介绍 1.1定时器 1.1.1定时器分类简介 1.1.2STM32定时器分类比较表 1.1.3定时器启动操作&#xff1a; 1.2 PWM 1.2.1 简介&#xff1a; 1.2.2PWM工作原理 1.2.3使用步骤&#xff1a; 二、定时器计数控制LED灯亮灭 2.1HAL库 2.1.1使用HAL库创建…...

PyTorch实战:模型训练中的特征图可视化技巧

1.特征图可视化&#xff0c;这种方法是最简单&#xff0c;输入一张照片&#xff0c;然后把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可。 2.特征图可视化代码如下&#xff1a; def featuremap_visual(feature, out_dirNone, # 特征图保存路径文件save_feat…...

有人@你!神工坊知识问答第二期中奖名单新鲜出炉

六月作为伟大的物理学家—麦克斯韦的诞辰月 神工坊特别推出 “ 辨 ‘麦克斯韦妖’&#xff0c;赢百元好礼” 夏日知识问答主题活动 活动一经推出 反响热烈 第二期中奖名单公布&#xff01; 中奖的伙伴们速来兑奖&#xff01; 听说还有同学没有参与&#xff1f; 活动最后…...

数据结构篇:旋转操作在AVL树中的实现过程

本节课在线学习视频&#xff08;网盘地址&#xff0c;保存后即可免费观看&#xff09;&#xff1a; https://pan.quark.cn/s/06d5ed47e33b AVL树是平衡二叉搜索树的一种&#xff0c;它通过旋转操作来保持树的平衡。AVL树的特点是&#xff0c;任何节点的两个子树的高度最大差别…...

为什么Java默认使用UTF-16,Golang默认使用UTF-8呢?

Java 和 Go 语言在默认字符编码上做出了不同的选择&#xff0c;这是由它们的设计目标和使用场景决定的。下面是对 Java 默认使用 UTF-16 和 Go 默认使用 UTF-8 的原因进行的详细解释。 Java 默认使用 UTF-16 的原因 1. 历史背景和兼容性 Unicode 的发展: Java 诞生于 1995 年…...

JavaScript常见面试题(三)

文章目录 1.对原型、原型链的理解2.原型修改、重写3.原型链指向4.对闭包的理解5. 对作用域、作用域链的理解6.对执行上下文的理解7.对this对象的理解8. call() 和 apply() 的区别&#xff1f;9.异步编程的实现方式&#xff1f;10.setTimeout、Promise、Async/Await 的区别11.对…...

【Effective Modern C++】第1章 型别推导

【Effective Modern C】第1章 型别推导 文章目录 【Effective Modern C】第1章 型别推导条款1&#xff1a;理解模板型别推导基础概念模板型别推导的三种情况情景一 ParamType 是一个指针或者引用&#xff0c;但非通用引用情景二 ParamType是一个通过引用情景三 ParamType既不是…...

服装连锁实体店bC一体化运营方案

一、引言 随着互联网的快速发展和消费者购物习惯的变化&#xff0c;传统服装连锁实体店在面对新的市场环境下亟需转型升级。BC&#xff08;Business to Consumer&#xff09;一体化运营方案的实施将成为提升服装连锁实体店竞争力和顾客体验的关键举掖。商淘云详细介绍服装连锁…...

IDEA中SpringMVC的运行环境问题

文章目录 一、IEAD 清理缓存二、用阿里云和spring创建 SpringMVC 项目中 pom.xml 文件的区别 一、IEAD 清理缓存 springMVC 运行时存在一些之前运行过的缓存导致项目不能运行&#xff0c;可以试试清理缓存 二、用阿里云和spring创建 SpringMVC 项目中 pom.xml 文件的区别 以下…...

Python初体验

# Java基础知识学的差不多了&#xff0c;项目上又没什么事&#xff0c;学学py&#xff0c;方便以后对接 1、打包flask应用&#xff08;好痛苦&#xff0c;在什么平台打包就只在那个平台可用想在linux用只能参考方法2了&#xff09; pyinstaller --onefile app.py -n myapp 2…...

从零开始如何学习人工智能?

说说我自己的情况&#xff1a;我接触AI的时候&#xff0c;是在研一。那个时候AlphaGo战胜围棋世界冠军李世石是大新闻&#xff0c;人工智能第一次出现我面前&#xff0c;当时就想搞清楚背后的原理以及这些技术有什么作用。 就开始找资料&#xff0c;看视频。随着了解的深入&am…...

【仿真建模-anylogic】动态生成ConveyorCustomStation

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-18 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 背景 直接使用Anylogic组件开发的模型无法动态改变运输网布局&#xff1b;目前需求是要将运输网布局配置化&#xff1b;运输网配置化…...

如何使用idea连接Oracle数据库?

idea版本&#xff1a;2021.3.3 Oracle版本&#xff1a;10.2.0.1.0&#xff08;在虚拟机Windows sever 2003 远程连接数据库&#xff09; 数据库管理系统&#xff1a;PLSQL Developer 在idea里面找到database&#xff0c;在idea侧面 选择左上角加号&#xff0c;新建&#xff…...

谈谈kafaka的并行处理,顺带讲讲rabbitmq

简介 Kafka 是一个分布式流处理平台,它支持高效的并行处理。Kafka 的并行处理能力主要体现在以下几个方面: 分区(Partition)并行 Kafka 将数据存储在称为"分区"的逻辑单元中。每个分区可以独立地并行地进行读写操作。生产者可以根据分区策略,将数据写入到指定的分…...

P3056 [USACO12NOV] Clumsy Cows S

[USACO12NOV] Clumsy Cows S 题目描述 Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the min…...

智赢选品,OZON数据分析选品利器丨萌啦OZON数据

在电商行业的激烈竞争中&#xff0c;如何快速准确地把握市场动态、洞察消费者需求、实现精准选品&#xff0c;是每个电商卖家都面临的挑战。而在这个数据驱动的时代&#xff0c;一款强大的数据分析工具无疑是电商卖家们的得力助手。今天&#xff0c;我们就来聊聊这样一款选品利…...

Canal自定义客户端

一、背景 在Canal推送数据变更信息至MQ&#xff08;消息队列&#xff09;时&#xff0c;我们遇到了特定问题&#xff0c;尤其是当消息体的大小超过了MQ所允许的最大限制。这种限制导致数据推送过程受阻&#xff0c;需要相应的调整或处理。 二、解决方法 采用Canal自定义客户…...

20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中

20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中 2024/6/21 17:15 开发板&#xff1a;飞凌OK3588-C SDK&#xff1a;Rockchip原厂的Buildroot 缘起&#xff1a;在凌OK3588-C的LINUX R4系统启动的时候&#xff0c;需要拉高GPIO4_B5、GPIO3_B7和GPIO3_D0。…...

掌握数据魔方:Xinstall引领ASA全链路数据归因新纪元

一、引言 在数字化时代&#xff0c;数据是App推广和运营的核心驱动力。然而&#xff0c;如何准确获取、分析并应用这些数据&#xff0c;却成为了许多开发者和营销人员面临的痛点。Xinstall作为一款专业的App全渠道统计服务商&#xff0c;致力于提供精准、高效的数据解决方案&a…...

IIS代理配置-反向代理

前后端分离项目&#xff0c;前端在开发中使用proxy代理解决跨域问题&#xff0c;打包之后无效。 未配置前无法访问 部署环境为windows IIS&#xff0c;要在iis设置反向代理 安装代理模块 需要在iis中实现代理&#xff0c;需要安装Application Request Routing Cache和URL重…...

告别盲选!深入解读5G NR中UCI偏置值(beta_offset)的配置策略与索引选择

5G NR中UCI偏置值配置的工程实践指南 在5G新空口(NR)系统中&#xff0c;上行控制信息(UCI)通过物理上行共享信道(PUSCH)传输时&#xff0c;其资源分配直接影响到系统性能和用户体验。作为网络优化工程师&#xff0c;我们经常需要面对各种复杂的配置场景&#xff0c;而UCI偏置值…...

Cadence 17.4导出Gerber文件保姆级避坑指南(附TMC2300电机驱动板实战)

Cadence 17.4导出Gerber文件保姆级避坑指南&#xff08;附TMC2300电机驱动板实战&#xff09; 第一次用Cadence Allegro 17.4导出Gerber文件的新手&#xff0c;大概率会在某个环节卡住——要么是钻孔文件莫名报错&#xff0c;要么是板厂反馈光绘层对不齐。这种挫败感我太熟悉了…...

动态自适应网络:让AI模型根据输入复杂度智能调节算力与精度

1. 项目概述&#xff1a;当计算机视觉遇见能效瓶颈在边缘计算和移动设备上部署深度神经网络&#xff08;DNN&#xff09;进行计算机视觉任务&#xff0c;比如人脸识别、物体检测&#xff0c;已经不是什么新鲜事了。但一个老生常谈的痛点始终横在那里&#xff1a;算力、功耗和精…...

独立开发者如何借助Taotoken应对大模型API调用波动

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken应对大模型API调用波动 对于独立开发者而言&#xff0c;项目的稳定性和可控成本是生存与发展的关键。在…...

C语言编写轻量爬虫工具

当我们要使用C语言编写一个定制化轻量爬虫工具&#xff0c;得需要结合网络请求、HTML解析和数据处理等步骤。由于是轻量级&#xff0c;正常情况下我们将使用C语言标准库以及一些第三方库来简化开发。这样省时省力&#xff0c;生态丰富可以帮助大家少走很多弯路。具体细节可以看…...

别再只写客户端了!用C语言搞定聊天室全栈开发:客户端+服务端联调避坑指南

别再只写客户端了&#xff01;用C语言搞定聊天室全栈开发&#xff1a;客户端服务端联调避坑指南 在C语言全栈开发中&#xff0c;客户端和服务端的联调往往是开发者最容易踩坑的环节。很多初学者能够独立完成客户端或服务端的代码编写&#xff0c;但当两者需要协同工作时&#x…...

WarcraftHelper:魔兽争霸III终极兼容性修复工具,5大核心功能全面优化游戏体验

WarcraftHelper&#xff1a;魔兽争霸III终极兼容性修复工具&#xff0c;5大核心功能全面优化游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper …...

2026点评餐饮数据

数据名称&#xff1a;大众点评美食&#xff08;餐饮&#xff09;数据、美团商家全量数据、大众平台综合数据 数据时间&#xff1a;2026年最新爬虫数据&#xff0c;美食商家全品类商家全覆盖&#xff0c;同步平台最新信息&#xff0c;不拿旧数据充数 数据分类&#xff1a;上百个…...

Unsloth框架解析:如何用4-bit量化与Triton内核加速大模型微调

1. 项目概述&#xff1a;为什么我们需要一个“不偷懒”的AI训练框架&#xff1f;如果你最近在尝试微调大语言模型&#xff0c;比如Llama、Mistral或者Qwen&#xff0c;大概率已经体会过什么叫“望眼欲穿”。动辄几个小时甚至几天的训练时间&#xff0c;对显存的贪婪吞噬&#x…...

LaTeX引用中文文献总出乱码?可能是你BibTeX引擎和编码没选对(XeLaTeX+BibTeX实战)

LaTeX中文文献引用乱码全解析&#xff1a;从编码原理到XeLaTeX实战方案 当你熬夜赶论文时&#xff0c;参考文献列表突然变成一堆乱码方块&#xff0c;引用标记全部显示为"??"——这种崩溃瞬间&#xff0c;每个用LaTeX写过中文论文的人都经历过。传统解决方案往往停…...