嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果

目录

  • 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果
    • 1. 任务要求
    • 2 PWM波介绍,
      • 2.1 什么是PWM(Pulse Width Modulation—脉冲宽度调制技术)
      • 2.2 分频-计数时钟
      • 2.3 计数器
      • 2.4 定时器输出PWM原理
      • 2.5 定时器初始化
    • 3. 配置STM32CubeMX
    • 4. keil5中代码编写
    • 5. 运行效果
    • 6. 总结

1. 任务要求

使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

这里我使用的是TIM2和TIM4,不知道怎么回事,相同的做法TIM3就是不呼吸,可能玄学吧,所以换了一个定时器。

2 PWM波介绍,

2.1 什么是PWM(Pulse Width Modulation—脉冲宽度调制技术)

在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。由于这个特性,我们在需要控制LED灯时,经常会看到PWM。

在没有PWM的电路中,我们通常会在电路上加电阻(滑动电阻器),改变LED的电压,控制LED的亮度。但如果有PWM的话,我们就可以直接控制PWM的占空比,控制LED导通时间,从而控制LED的亮度。

1、PWM的频率
指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),也就是说一秒钟PWM有多少个周期。
2、PWM的周期
T = 1 / f,周期 = 1 / 频率
如:50Hz = 20ms一个周期(如果频率为50Hz,也就是说一个周期20ms,那么一秒钟就有50次PWM周期)
3、占空比
是指一个脉冲周期内,高电平的时间与整个周期时间的比例
4、周期
一个脉冲信号的时间,1s内周期次数等于频率
5、脉宽时间
高电平时间,脉宽时间占总周期时间的比例,就是占空比
6、调节PWM
PWM就是通过脉冲宽度调制,通过调节占空比,就可以调节脉冲宽度(脉宽时间),而频率就是单位时间内脉冲信号的次数,频率越大,占空比越大。

在通用定时器框图中可以看到,除了基本的定时(基本定时的作用)功能以外,还支持信号的输入,信号的输出,也多了一个捕捉/比较寄存器。如果我们需要生成PWM波形输出,那么我们就需要用到基本定时器,捕捉/比较寄存器,输出控制。

基本定时用来定时PWM的周期,而捕捉/比较寄存器与基本定时功能中的计数寄存器作比较,如果比计数寄存器小或大,通道极性不同,PWM的模式不同,会输出不同的电平。

2.2 分频-计数时钟

定时器时钟提供较高的频率,计数器不需要这么高的频率来计数,所以会进行降频,使用一个合适的低频时钟来计数。
定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,可以对时钟TIMxCLK进行1~65536之间的任何一个数进行分频。
即:CK_CNT = TIMxCLK / (PSC+1)

比如,使用STM32F4的通用定时器2(TIM2CLK为APB1的时钟的两倍即84MHz),PSC设置为83,则计数时钟为84MHz/(83+1)=1MHz,即1ms计一个数。

2.3 计数器

计数器CNT是一个16位的计数器,只能往上计数,最大数值为65535。当计数达到自动重装载值时产生更新事件,并清零从头开始计数。

2.4 定时器输出PWM原理

假设定时器工作模式设置为向上计数PWM模式,且当CNT<CCRx时,输出1,当CNT>=CCRx时输出0,则:

  1. 当CNT值小于CCRx的时候,IO输出高电平(1)
  2. 当CNT值大于等于CCRx的时候,IO输出低电平(0)
  3. 当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。

因此,改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的周期(频率)

2.5 定时器初始化

时基初始化,主要是配置定时器的自动重装值(每次计数的周期,arr)和计数频率(psc),比如TIM3_PWM_Init(500-1,84-1);

这里将arr的值设置为500,即计数器每计够500个数就会重新从0开始计数,这个500再乘以计数器计数的周期,就是PWM真正的周期,那计数器计数的频率是多少呢(频率的倒数为周期)?

这里将psc的值设置为84-1,即TIM3的输入频率为84MHz再将频率降低1/84,即使用1MHz的频率计数(1s能计1,000,000个数,也即1us计1个数),那么PWM的真正周期就是500*1us=500us(0.5ms),通过改变占空比的值(CCR),就可以调节PWM的输出占空比。

3. 配置STM32CubeMX

如何新建工程文件请参考此博客:https://blog.csdn.net/qq_66144143/article/details/127309228

新建好之后,打开System core,点击RCC设置为外部时钟源,如图:

然后点击下面的SYS,选择串行通信serial wire,如图:

配置定时器:

打开下面的Timer,然后选择定时器(这里我选择的是TIM2、TIM4),具体参数如图所示:

这是TIM2的配置,TIM4同TIM2一样。

设置分频系数为71,计数周期为500,其它默认。

设置占空比初始值为10。

然后配置时钟,如图:

最后点击GENRATE CODE生成工程文件即可,参考博客:https://blog.csdn.net/qq_66144143/article/details/127309228

4. keil5中代码编写

打开生成的工程文件,在图中所示位置添加一个变量用来储存占空比,如图:

代码:

uint16_t duty_num = 10;  //定义变量储存占空比

然后在图示位置,添加启动定时器TIM2和管道2以及定时器TIM4和管道4的代码,输出PWM,如图:

代码:

  HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);  //开启定时器4和4号通道HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);   //开启定时器2和2号通道

然后在下图位置添加执行呼吸灯程序的代码,如图:

每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.

      //每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.HAL_Delay(50);duty_num = duty_num + 10;if(duty_num > 500){duty_num = 0;}__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,duty_num); __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,duty_num);

然后点击运行,在烧录,连接电路即可。

5. 运行效果

波形如图所示:

波形会呈现出一快一慢的规律性变化。

6. 总结

PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,锯齿波从比较器的反相端端输入,当大于参考电压时输出与锯齿波相反的极性,而当锯齿波从比较器同相端输入,当大于参考电压时输出与锯齿波相同极性。

参考链接:

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-pwm-huxideng/
https://blog.csdn.net/m0_54711064/article/details/126648576

嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果相关推荐

  1. 嵌入式学习--使用定时器输出PWM波形,实现LED呼吸灯的效果

    目录 1.任务要求 2.PWM介绍 关于PWM的定义 分频-计数时钟 计数器 定时器输出PWM的原理 定时器的初始化 3.配置STM32CubeMX 4.keil5的代码 5.运行结果 6.心得与体会 ...

  2. STM32输出PWM波形及LED呼吸灯

    目录 一.PWM的介绍 1.概述 2.优点 3.主要产生方法 SPWM法 1.等面积法 2.硬件调制法 3.软件生成法 4.PWM电路图 5.PWM基本原理 二.cubemx项目的建立 1.选择芯片S ...

  3. STM32输出PWM波形并实现呼吸灯

    文章目录 一.环境配置 二.PWM简介 三.使用STM32CubeMX配置工程 四.使用Keil配置代码 五.运行效果 六.用Keil自带的逻辑仿真器观察占空比 七.总结 八.参考资料 一.环境配置 ...

  4. 输出一个PWM并实现 LED呼吸灯的效果

    前言 本篇博客使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸 ...

  5. 嵌入式学习——使用定时器同时实现串口通信和LED流水灯

    一.定时器的概念以及作用 1.定时器的概念以及作用 在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作. 定时器的主要作用是产生一个 ...

  6. 使用STM32输出PWM波形LED呼吸灯的效果

    文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...

  7. 嵌入式——使用定时器输出PWM波形,实现 LED呼吸灯的效果

    一.实验要求: 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼 ...

  8. STM32F103C8T6核心开发板下,通过TIM3和TIM4输出PWM波形实现2个 LED呼吸灯的效果

    使用TIM3和TIM4,分别输出一个PWM波形,驱动一个外接的LED灯以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 文章目录 使用TIM3和TIM4 ...

  9. stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速

    概述:stm32的每个引脚都有其自带的特殊功能,有定时器输出功能的引脚可以输出pwm.如果没有的也可以io口模拟输出,如果非要较真的话,理论上可以算是每个引脚都能输出PWM,但一般我们都使用带定时器输 ...

最新文章

  1. jar打包混淆上传全自动日志
  2. C++ 11 中的POD
  3. pythonssl双向认证_Python 上的 ssl 提示验证失败,有什么办法深究具体失败的原因么?...
  4. 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
  5. NullReferenceException C#中的异常
  6. 深度剖析Java数据结构之表(二)——List接口
  7. java折叠自行车x1-auto,java入门第三季 7-1 简易扑克练习
  8. 在linux下设置开机自动启动程序的方法
  9. laravel中修改默认时区
  10. 使用Python采集淘宝类目数据并进行数据分析
  11. Newifi3(新路由3)刷潘多拉(Pandora)固件
  12. Go程序设计语言pdf
  13. H5 video 播放器demo代码
  14. (2.1)【经典木马-冰河木马】详细介绍,原理、使用方法
  15. c语言可编写的游戏,占卜子女兴盛大全篇
  16. H3C CAS 5.0 虚拟机备份与还原
  17. error: device unauthorized.This adb server's $ADB_VENDOR_KEYS is not set
  18. 华为手机 从服务器获取安装包信息,华为openGauss 获取并校验安装包
  19. MATLAB 绘制论文图片格式设置万能代码模板
  20. windows10 录音机内录、外录、内外混合录的方法

热门文章

  1. 什么是DAS、NAS、SAN、IP-SAN,它们之间有什么区别?
  2. Undefined control sequence. 解决
  3. 计算机多媒体课件设计,多媒体课件设计与制作 教师课件制作平台
  4. 线性(时不变)系统 非线性系统
  5. 【项目总结】基于SpringBoot+Ansj分词+正倒排索引的Java文档搜索引擎项目总结
  6. 十行 js 获取带有双字节字符的字符串长度
  7. JavaScript、jQuery实现“社区便利店收银系统”(1+X Web前端开发初级 例题)
  8. java system.nanotime_java - System.nanoTime()完全没用吗?
  9. 国家信息安全水平考试NISP一级模拟题(02)
  10. 当区块链是数字经济和数字社会的基石时,我们如何发现机遇?