TIM3和TIM4输出PWM波形实现2个LED呼吸灯

2023-11-02 14:31

本文主要是介绍TIM3和TIM4输出PWM波形实现2个LED呼吸灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、原理
    • 1、PWM模式
    • 2、主要参数
    • 3. PWM的一般步骤
  • 二、示例实现
    • (1)使用CubeMX配置代码
    • (2)在keil中进行代码编写
    • (3)线路连接
    • (4)结果展示
  • 总结
  • 参考

一、原理

1、PWM模式

PWM输入模式:
该模式是输入捕获模式的一个特例,除下列区别外,工作过程与输入捕获模式相同:
● 两个ICx信号被映射同一个TIx输入。
● 这2个ICx信号为边沿有效,但是极性相反。
● 其中一个TIxFP信号被作为触发输入信号,并且从模式控制器被配置成复位模式。
PWM 边沿对齐模式
脉冲宽度调制模式可以产生一个由TIM1_ARR寄存器确定频率、由TIM1_CCRx寄存器确定占空比的信号。
● 向上计数配置 当TIM1_CR1寄存器中的DIR位为低的时候执行向上计数
●当TIM1_CR1寄存器的DIR位为高时执行向下计数。
PWM 中央对齐模式
当TIM1_CR1寄存器中的CMS位不为00时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位的设置,比较标志可能在计数器向上计数时被置1、在计数器向下计数时被置1、或在计数器向上和向下计数时被置1。TIM1_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。
使用中央对齐模式的提示
● 进入中央对齐模式时,当前的上-下配置被使用;这就意味着计数器向上还是向下计数取决于TIM1_CR1寄存器中DIR位的当前值。此外,DIR和CMS位不能同时被软件修改。
● 不推荐当运行在中央对齐模式时改写计数器,因为会产生不可预知的结果。特别地: − 如果写入计数器的值大于自动重加载的值(TIM1_CNT>TIM1_ARR),则方向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。 − 如果将0或者TIM1_ARR的值写入计数器,方向被更新,但不产生更新事件UEV。 使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIM1_EGR 位中的UG位),不要在计数进行过程中修改计数器的值。

2、主要参数

PWM占空比:
PWM信号保持高电平的时间百分比称为占空比。如果信号始终为高电平,则它处于100%占空比,如果它始终处于低电平,则占空比为0%。如图1所示,T1为占空比,T为一个PWM周期
PWM的频率:
PWM信号的频率决定PWM完成一个周期的速度。STM32的MDK编译器可以选择5MHZ,10MHZ,20MHZ和50MHZ

3. 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()

二、示例实现

(1)使用CubeMX配置代码

创建项目:在STMCubeMX主界面,点击ACCEE TO MCU SELECTOR:
芯片确定:在Part Number里选择STM32F103C8T6,选中芯片,点击start project:
配置RCC与SYS
System Cor,选择RCC,在右侧弹出的菜单栏中选Crystal/Ceramic Resonator
在这里插入图片描述
选择调试接口,点System Cor,选择SYS。,在右侧弹出的菜单栏中选Serial Wire
在这里插入图片描述

配置TIM3
选Internal Clock(内部时钟)
通道1选择:PWM Generation CH1(PWM输出通道1)
Prtscaler (定时器分频系数) : 71
Counter Mode(计数模式):Up(向上计数模式)
Counter Period(自动重装载值) : 500
CKD(时钟分频因子) :No Division (不分频 )
第一次将通道ch1选错了,无法实现呼吸效果。后面发现是通道
在这里插入图片描述

在这里插入图片描述
配置TIM4
类比TIM3
在这里插入图片描述
在这里插入图片描述

配置时钟树
在这里插入图片描述
配置完成,生成代码,在keil中进行代码的编写
在这里插入图片描述

在这里插入图片描述

(2)在keil中进行代码编写

main.c添加全局变量

uint16_t pwm=0;   //占空比

在这里插入图片描述
开启TIM3和TIM4的PWM的通道

	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 

在这里插入图片描述
在while中写入调用函数

while (pwm< 500){pwm++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  			HAL_Delay(1);}while (pwm){pwm--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  HAL_Delay(1);}HAL_Delay(200);

在这里插入图片描述
编译无错
在这里插入图片描述
烧录

(3)线路连接

3V33V3
GNDGRD
RXDA9
TXDA10
LED短脚A6
LED长脚3V3
B6C13

(4)结果展示

在这里插入图片描述

总结

最开始两个灯只能亮,无法达到呼吸灯的效果,我首先检查代码有没有问题,后面发现是ch1通道有问题,选错了,后面改了之后就可以实现了。

参考

https://i.csdn.net/#/user-center/collection-list?type=1&folder=23451328&key=1
https://blog.csdn.net/qq_53112972/article/details/127577995
https://blog.csdn.net/Qxiaofei_/article/details/119059623
https://blog.csdn.net/dgut13432976621/article/details/120062700

这篇关于TIM3和TIM4输出PWM波形实现2个LED呼吸灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331265

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、