【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;
		else
			diff1 = 0xffff + 1 + CCR2 - CCR1;	// 设置的最多能数65535,也就是0xffff + 1

		if (CCR1 < CCR3)
			diff2 = CCR3 - CCR1;
		else
			diff2 = 0xffff + 1 + CCR3 - CCR1;
		// 每秒能数 1000000.一个周期是 diff2。
		freq = (72000000 / 72) / diff2;
		// 高电平持续时间/低电平持续时间 不让出现小数,所以*100
		duty = 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完成了很多延时、点灯、舵机旋转等工作,从中学习到很多东西。本人才疏学浅,还请各位友友批评指正。我们下期再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【背包题解】DP代表了走到阶段i 的所有路线的最优解

目录 1889:【提高】多重背包(2) 二维费用背包 2075 - 最大卡路里 1928 - 采购礼品 背包容量&#xff1a;&#xff08;c&#xff09; 6 重量 weight 2 2 4 6 2 1 2 3 4 5 价值 value 3 6 5 5 8 1 2 3 4 5 wvdp数组&#xff1a;记录有i件…

作业管理系统

摘 要 随着网络的发展&#xff0c;信息化时代的到来&#xff0c;在教学工作的过程中作用越来越明显&#xff0c;作业的及时发布&#xff0c;学生的及时提交&#xff0c;以及通过网上的批改和评分&#xff0c;都大大促进教学质量的发展&#xff0c;充分的利用网络来加强管理&am…

vue2动态横条图(横条图样式定时切换)

每次切换成新图后会清除定时器和图&#xff08;重新加载&#xff0c;否则要么会重复加载定时器。清除定时器之后要先调用一次index为0的数据&#xff09; 数据样例 acrossBarDatas:{data: ["80", "80"],sunffix: [单位, "单位"],title: "标…

可信启动Trusted Board Boot

TBB Trusted Board Boot&#xff08;TBB&#xff09;对所有固件镜像&#xff08;包括普通世界的bootloader&#xff09;进行身份验证&#xff0c;以防止恶意固件在平台上运行。TBB使用公钥加密标准 &#xff08;PKCS&#xff09;来建立信任链&#xff08;Chain of Trust&#…

Log4j2异步打印可变对象的问题

现象 应用代码如下&#xff1a; Test test new Test();test.setA(1);test.setB("1");log.info("before modification: {} \t ",test);test.setA(2);test.setB("2");log.info("after modification: {} \t ",test);问题应用的日志控制…

怎么添加网页到桌面快捷方式?

推荐用过最棒的学习网站&#xff01;https://offernow.cn 添加网页到桌面快捷方式&#xff1f; 很简单&#xff0c;仅需要两步&#xff0c;接下来以chrome浏览器为例。 第一步 在想要保存的网页右上角点击设置。 第二步 保存并分享-创建快捷方式&#xff0c;保存到桌面即可…

使用VisualBox+Vagrant搭建Centos虚拟机环境

1.下载并安装VisualBox&#xff1b; 2.下载并安装Vagrant; 3.打开cmd窗口&#xff0c;执行命令vagrant init centos/7&#xff0c;初始化centos环境&#xff0c;该步骤受网络带宽影响&#xff0c;可能挂级30分钟到1个小时&#xff1b; 4.启动虚拟机&#xff1a;vagrant up&…

C# yolov8 OpenVINO 同步、异步接口视频推理

C# yolov8 OpenVINO 同步、异步接口视频推理 目录 效果 项目 代码 下载 效果 同步推理效果 异步推理效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Windows.Form…

慢阻肺患者为何容易营养不良?朗格力教你轻松改善

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 慢阻肺是我国常见的、高患病率的慢性呼吸系统疾病,会对肺结构和功能产生影响,从而引起各种不良反应,其中营养不良是常见并发症之一。慢阻肺为什么会发生营养不良?营养不良又是怎么伤害慢阻肺的呢?为什么像班古精准…

鸿蒙 登录界面示例

1.b站登录界面 我的b站教学视频&#xff1a;https://www.bilibili.com/video/BV1LQgQexEGm/?spm_id_from333.999.0.0&vd_sourced0ea58f1127eed138a4ba5421c577eb1 最终实现效果&#xff1a; 需要准备2张图片&#xff0c;分别是向下和向右边的图标 代码&#xff1a; En…

(2024,Vision-RWKV,线性复杂度双向注意力,四向标记移位)通过类似 RWKV 的架构实现高效且可扩展的视觉感知

Vision-RWKV: Efficient and Scalable Visual Perception with RWKV-Like Architectures 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 特征聚合机制 3. Vision-RWKV 3.…

一问搞懂Linux信号【上】

Linux信号在Linux系统中的地位仅此于进程间通信&#xff0c;其重要程度不言而喻。本文我们将从信号产生&#xff0c;信号保存&#xff0c;信号处理三个方面来讲解信号。 &#x1f6a9;结合现实认识信号 在讲解信号产生之前&#xff0c;我们先做些预备的工作。 现实生活中信号…

2024.6最最新版MySQL数据库安装(保姆级教程,不懂你捶我)

1.MySQL数据库下载 1.打开MySQL官网 如下页面 2.下翻网页到最底部,找到Download,点击第一个MySQL Community Server 3.选择自己需要的版本以及系统的MySQL: 4.跳转页面会有一个登录/注册页面,这里我们不鸟他,直接开始下载 2.MySQL数据库安装 1.双击我们刚刚下载的安装包 2.勾…

音乐管理系统

摘 要 现如今&#xff0c;在信息快速发展的时代&#xff0c;互联网已经成了人们在日常生活中进行信息交流的重要平台。看起来&#xff0c;听歌只是一种消遣和消遣&#xff0c;其实&#xff0c;只要你选对了曲子&#xff0c;就会产生许多不同的作用。音乐能舒缓身心&#xff0c…

上海交大阿里巴巴推出虚拟试衣新里程碑式工作——AnyFit:任意场景、任意组合!

文章链接&#xff1a;https://arxiv.org/pdf/2405.18172 工程链接&#xff1a;https://colorful-liyu.github.io/anyfit-page/ 今天和大家一起学习的是一种名为AnyFit的新型虚拟试穿系统&#xff0c;旨在解决现有技术在处理不同场景和服饰组合时出现的衣物风格不匹配和质量下…

量化系统--开源强大的qmt交易系统,提供源代码

经过的3天终于写完了qmt_trader的文档了开源直接使用我开源了全部源代码 文档地址 https://gitee.com/li-xingguo11111/qmt_trader 源代码from qmt_trader.qmt_trader import qmt_trader from qmt_trader.xtquant.xttype import StockAccountfrom qmt_trader.xtquant import …

opencascade AIS_InteractiveContext源码学习2

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

C语言练习03-字符串

一、遍历字符 #include<stdio.h>int main() {char str[100];//录入字符串printf("请输入一串字符&#xff1a;\n");scanf("%s",str);//遍历字符串char* p str;while(1){char c *p;if(c \0){//如果遍历到结束标记&#xff0c;则循环结束break;}//…

雷池社区版自动SSL

正常安装雷池&#xff0c;并配置站点&#xff0c;暂时不配置ssl 不使用雷池自带的证书申请。 安装&#xff08;acme.sh&#xff09;&#xff0c;使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…

应用案例 | 冷藏集装箱基于云的WiFi无线温度监测系统COMET Cloud

一、集装箱的作用和分类 集装箱运输是国际贸易货物多式联运过程中的重要运输方式。由于集装箱运输具有标准化高、密封性好&#xff0c;破损率低、集约化、规模化、班轮化、成本低、质量好等优点&#xff0c;大大提高了货物运输的安全和效率。 集装箱种类很多&#xff0c;按所…