定时器与PWM的LED控制

news2025/1/10 16:26:28

目录

    • 一、基础概念
      • 定时器
        • 定时器类型
        • 定时器特性
      • PWM
        • 定义
        • 占空比
        • 原理
    • 二、实验
      • 1.LED周期性亮灭
        • 定时器TIM2配置
        • GPIO引脚设置
        • 工程相关参数配置
        • Keil编写程序
      • 2.LED呼吸灯(PWM)
        • 呼吸灯原理
        • Keil编写程序
        • Keil虚拟示波器,观察 PWM输出波形
          • 设置
          • 点击setup,并设置观察引脚
        • 效果展示:
      • 总结

实验目的:深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。

一、基础概念

定时器

定时器类型

STM32定时器主要分为三类:

  1. 基本定时器(Basic Timer)

    基本定时器通常较为简单,比如STM32中的TIM6和TIM7。

    它们主要用于生成定时中断,适用于需要定时计数或驱动DAC等简单应用。

    基本定时器没有输入捕获、输出比较等复杂功能,通常只有一个16位的自动装载寄存器。

  2. 通用定时器(General Purpose Timer)

    包括TIM1到TIM4, TIM9到TIM14(具体数量依据不同系列的STM32型号而异)。

    提供更多功能,如输入捕获、输出比较(可用于PWM生成)、单脉冲模式(One Pulse Mode)、编码器接口等。

    可用于测量输入信号的脉冲宽度、生成精确的输出波形等复杂任务。

    支持多种时钟源,包括内部时钟、外部时钟、ETR引脚时钟等。

  3. 高级定时器(Advanced Timer)

    通常指TIM1和TIM8(在某些高端系列中可能更多),具有更高级的功能。

    集成了基本定时器和通用定时器的所有特性,还增加了死区控制、紧急刹车功能等,特别适合于电机控制中的PWM生成。

    高级定时器还可以与其他定时器同步工作,支持更复杂的控制策略。

定时器特性

时钟源多样性:可选择内部时钟(如HCLK经预分频后的时钟)、外部时钟(通过特定引脚输入)、或者其他定时器的触发信号作为时钟源。

计数模式:包括向上计数、向下计数和中央对齐模式。

预分频器:通过预分频器可以灵活调整定时器的时钟频率,从而实现更宽范围的计时周期。

中断和DMA:定时器可以配置为在特定事件(如计数溢出、比较匹配等)时产生中断或触发DMA传输。

主/从模式:定时器可以工作在主模式下,通过TRGO引脚输出触发信号给其他外设(如ADC)或另一个定时器;或者作为从模式,其计数受其他定时器或外设的触发信号控制。

PWM

定义

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

占空比

是一个脉冲周期内,高电平的时间与整个周期时间的比例

image-20240527222130419

比方说周期的时间是10ms,脉宽时间是7ms 那么低电平时间就是3ms 总的占空比70%

原理

以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平

假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号

我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压

比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V
image-20240528211222275

pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降

也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压

pwm就是通过这种原理实现D/A转换的。

PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压

二、实验

1.LED周期性亮灭

**内容:**使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。

image-20240527190343986

image-20240527191323634

image-20240527191432467

配置STM32的时钟系统,系统时钟配置为72MHz,APB1为72MHz。

image-20240527211025234

定时器TIM2配置

image-20240527201010499

TIM2在APB1总线上,实验要用定时器TIM2延时2s,STM32定时器时间计算公式如下:

image-20240527191841036

公式解释:

ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值

PSC(TIM_Prescaler):预分频值,是用来降低定时器时钟频率的参数

Tclk:定时器的输入时钟频率(单位Mhz),通常为系统时钟频率或者定时器外部时钟频率(STM32f103c8t6,系统主频72Mhz)

Tout:定时器溢出时间(单位us)。一定要注意这个单位是us

image-20240527202600428

Clock Source”设置为“Internal Clock”(内部时钟);

预分频系数Prescaler”设置为“36000-1”;“Counter Mode”设置为“Up”;

计数值“Counter Period”设置为“4000-1”;

“auto-reload preload”设置为“*Enable”。

则定时器TIM3精确定时2,000,000微秒(2s)。

image-20240527194504578

GPIO引脚设置

设置PA5引脚为GPIO_Output,用于本例的LED指示灯显示,并在“GPIO Mode and Configuration”中配置相应的参数

image-20240527191344860

image-20240527194900084

工程相关参数配置

image-20240527195242341

image-20240527195401005

Keil编写程序

在main.c文件中的/*USER CODE BEGIN2 */和/*USER CODE END2 */之间添加开启定时器TIM3中断的程序

image-20240527204001261

在mian.c文件的/ * USER CODE BEGIN4 */ 和 /*USER CODE END4 */之间添加TIM2的中断回调函数

image-20240527204435356

效果展示:

led44

2.LED呼吸灯(PWM)

**内容:**接上,采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。

呼吸灯原理

一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。

频率太小的话 看起来就会闪烁

那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯,

你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,

但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了 因为高电平时间(占空比)为50% 亮度也就为之前的50% ,

频率很高时,看不到闪烁,占空比越大,LED越亮;
频率很低时,可看到闪烁,占空比越大,LED越亮。
所以,在频率一定下,可以用不同占空比改变LED灯的亮度。 使其达到一个呼吸灯的效果

通过设置ARR 和PSC调整端口高低电平持续时间以及频率实现呼吸灯

image-20240528004007991

image-20240528004133965

image-20240528004247608

image-20240528004522248

image-20240528002805431

image-20240528004744116

image-20240528004849531

Keil编写程序
  /* 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 */

Keil虚拟示波器,观察 PWM输出波形
设置

关于keil虚拟示波器的一些设置可以参考我的上一篇博客HAL库LED点灯-CSDN博客的第三部分:波形分析

点击setup,并设置观察引脚

image-20240530203032574

效果展示:

可以看到随着占空比由小变大,由PWM原理可知,得到的实际电压由小变大,即灯泡逐渐由暗变亮;反之,则灯泡由亮变暗,从而达到了呼吸灯的效果

PWM_weave

总结

通过实验加深对HAL库代码结构的认识,学习了如何在STM32CubeMX中配置定时器的时钟源、预分频值、自动重载寄存器等,以设定合适的定时周期。还了解如何配置定时器的通道为PWM输出模式,包括设置占空比、频率等

参考链接:

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次-CSDN博客

PWM原理 PWM频率与占空比详解-CSDN博客

STM32CubeMX & Keil——STM32F103C8T6:PWM控制LED灯_stm32pwmled灯-CSDN博客

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

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

相关文章

贪心算法拓展(反悔贪心)

相信大家对贪心算法已经见怪不怪了&#xff0c;但是一旦我们的决策条件会随着我们的步骤变化&#xff0c;我们该怎么办呢&#xff1f;有没有什么方法可以反悔呢&#xff1f; 今天就来讲可以后悔的贪心算法&#xff0c;反悔贪心。 https://www.luogu.com.cn/problem/CF865Dhttp…

[图的搜索]5.图解狄克斯特拉算法及其代码演示

狄克斯特拉算法 与前面提到的贝尔曼-福特算法类似&#xff0c;狄克斯特拉&#xff08;Dijkstra&#xff09;算法也是求解最短路径问题的算法&#xff0c;使用它可以求得从起点到终点的路径中权重总和最小的那条路径路径。 图解 01 这里我们设A为起点、G为终点&#xff0c;来讲…

“揭秘乐园通行证:Spring JWT的魔法之旅

嗨&#xff0c;我将带你深入了解如何利用JWT打造一个既安全又高效的网络乐园。从基础概念到实战技巧&#xff0c;再到安全策略&#xff0c;每一步都充满惊喜。你将学会如何为乐园设置无状态的门票系统&#xff0c;如何通过RBAC和ABAC确保游客安全&#xff0c;以及如何在微服务架…

统计信号处理-匹配滤波器实现与验证(matlab仿真)

什么是匹配滤波器 匹配滤波器是一种信号处理技术&#xff0c;它用于从噪声中提取信号&#xff0c;特别是在信号与噪声比率较低的情况下。匹配滤波器之所以存在&#xff0c;是因为它在信号检测和估计方面具有几个关键的优势&#xff1a; 最大化信噪比&#xff1a;匹配滤波器设计…

数字化校园建设让学习更加广阔

校园构建数字化校园的亮点是什么&#xff1f;校园以智能服务、才智办理、数字讲堂为中心内容的智慧校园建造&#xff0c;不只使师生作业和日子更高效&#xff0c;并且使他们有更多的时刻投入到智能教育和智能学习中去&#xff0c;进步教育质量&#xff0c;使学生走出校门时紧跟…

项目管理主要文档介绍

1、商业论证&#xff1a;一般由项目发起人创建&#xff0c;用于论证项目是否对组织有财务方面的收益。商业论证创建于项日开始之前&#xff0c;用于判断项目是否需要被开展。 2、项目章程&#xff1a;一般由项日经理创建,并由发起入和关键相关力提供输人&#xff0c;最后经项目…

MATLAB函数模块光显示zeros/poles怎么办?

出现下面这种图了怎么办&#xff1f;是做错了吗&#xff1f; 这种图就是它显示不完整了&#xff0c;把它拉大点就可以完全显示了。

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 &#x1f4d2;1. 引言&#x1f4d2;2. 多种机器学习算法的应用&#x1f4d2;3. 机器学习在股票价格预测中的应用现状&#x1f389;数据收集与预处理&#x1f389;模型构建与训练&#x1f308;模型评估与预测&#x1f31e;模型评估&#x1f319;模型预测⭐注意事项 &…

检定记录内容解析:非红外二氧化硫气体检测仪的维护与验证

在工业生产与环境保护中&#xff0c;二氧化硫作为一种常见的有害气体&#xff0c;其浓度的监测和控制显得尤为重要。 非红外二氧化硫气体检测仪以其独特的检测原理和高灵敏度&#xff0c;在二氧化硫监测领域发挥着不可或缺的作用。 在这篇文章中&#xff0c;佰德将详细介绍非…

【原创】springboot+mysql校园通讯录管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

MongoDB CRUD操作:插入文档

MongoDB CRUD操作&#xff1a;插入文档 文章目录 MongoDB CRUD操作&#xff1a;插入文档使用MongoDB Atlas UI插入文档插入单个文档插入多个文档插入行为自动创建集合_id字段原子性写确认 在MongoDB中插入文档的集中方式&#xff1a; 使用编程语言提供的驱动程序&#xff0c;在…

【第七节】C++的STL基本使用

目录 前言 一、STL简介 1.1 STL基本概念 1.2 STL六大组件 1.3 STL优点 二、STL三大组件 2.1 容器 2.2 算法 2.3 迭代器 三、STL常见的容器 3.1 string容器 3.1.1 string容器基本概念 3.1.2 string容器的常用操作 3.1.2.1 string 构造函数 3.1.2.2 string 基本赋…

U盘格式化怎么操作?快来学这4种法

U盘格式化怎么操作&#xff1f;在计算机领域中&#xff0c;格式化通常指对存储设备&#xff08;如硬盘、U盘&#xff09;进行格式化操作&#xff0c;清空其中的数据并重新建立文件系统&#xff0c;以便进行数据存储和管理。 U盘格式化一共有哪些方法&#xff1f;在格式化U盘之…

SJ701-II安全帽耐冲击穿刺测试仪

一、主要用途 主要用于安全帽耐冲击性能和耐穿刺性能试验。 二、仪器特征 整机创新全新结构&#xff0c;并获得国家专利&#xff08;专利号201420182139.8&#xff09; 1、整机结构&#xff1a;首创采用欧标型材组装成型&#xff0c;内藏式线路折叠式结构。结构美观耐用&…

07.爬虫---使用session发送请求

07.使用session发送请求 1.目标网站2.代码实现 1.目标网站 我们以这个网站作为目标网站 http://www.360doc.com/ 注册用户 注册后从登录界面获取到这些信息 2.代码实现 import requestssession requests.Session() url http://www.360doc.com/ajax/login/login.ashx u…

基于SSM框架的手机商城项目

后端: 订单管理 客户管理&#xff1a; 商品管理 类目管理 前端&#xff1a; 首页&#xff1a;

windows 在cmd 使用cd命令无法进入指定目录解决方法

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用cmd命令想要快速进入某个目录&#xff0c;发现没有跳转&#xff0c;如下&#xff1a; 二、原因分析 cmd 切换目录跨磁盘的话&#xff0c;需要先进行磁盘的转换&#xff0c;也就是要进入到另外一…

码蹄集部分题目(2024OJ赛17期;二分+差分+ST表+单调队列+单调栈)

1&#x1f40b;&#x1f40b;小码哥处理订单&#xff08;钻石&#xff1b;二分差分&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;题目思路 【码蹄集进阶塔全题解07】算法基础&#xff1a;二分 MT2070 – MT2079_哔哩…

Kafka系列之高频面试题

基础 简介 特点&#xff1a; 高吞吐、低延迟&#xff1a;kafka每秒可以处理几十万条消息&#xff0c;延迟最低只有几毫秒&#xff0c;每个Topic可以分多个Partition&#xff0c;Consumer Group对Partition进行Consumer操作可扩展性&#xff1a;Kafka集群支持热扩展持久性、可…

JavaScript解构赋值

一、数组解构 以上要么不好记忆&#xff0c;要么书写麻烦&#xff0c;此时可以使用解构赋值的方法让代码更简洁。 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法。 基本语法&#xff1a; 1、赋值运算符左侧的[]用于批量声明变量&#xff0c;右侧数组的单元值将…