嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果
嵌入式学习——使用定时器输出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,则:
- 当CNT值小于CCRx的时候,IO输出高电平(1)
- 当CNT值大于等于CCRx的时候,IO输出低电平(0)
- 当 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呼吸灯的效果相关推荐
- 嵌入式学习--使用定时器输出PWM波形,实现LED呼吸灯的效果
目录 1.任务要求 2.PWM介绍 关于PWM的定义 分频-计数时钟 计数器 定时器输出PWM的原理 定时器的初始化 3.配置STM32CubeMX 4.keil5的代码 5.运行结果 6.心得与体会 ...
- STM32输出PWM波形及LED呼吸灯
目录 一.PWM的介绍 1.概述 2.优点 3.主要产生方法 SPWM法 1.等面积法 2.硬件调制法 3.软件生成法 4.PWM电路图 5.PWM基本原理 二.cubemx项目的建立 1.选择芯片S ...
- STM32输出PWM波形并实现呼吸灯
文章目录 一.环境配置 二.PWM简介 三.使用STM32CubeMX配置工程 四.使用Keil配置代码 五.运行效果 六.用Keil自带的逻辑仿真器观察占空比 七.总结 八.参考资料 一.环境配置 ...
- 输出一个PWM并实现 LED呼吸灯的效果
前言 本篇博客使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸 ...
- 嵌入式学习——使用定时器同时实现串口通信和LED流水灯
一.定时器的概念以及作用 1.定时器的概念以及作用 在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作. 定时器的主要作用是产生一个 ...
- 使用STM32输出PWM波形LED呼吸灯的效果
文章目录 前言 一.PWM简介 1.1 关于PWM 1.2 使用步骤 二.使用STM32CUBEMX实现2个 LED呼吸灯的效果 2.1.配置环境 2.2 代码配置 2.3.输出PWM波形 2.4 呼 ...
- 嵌入式——使用定时器输出PWM波形,实现 LED呼吸灯的效果
一.实验要求: 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼 ...
- STM32F103C8T6核心开发板下,通过TIM3和TIM4输出PWM波形实现2个 LED呼吸灯的效果
使用TIM3和TIM4,分别输出一个PWM波形,驱动一个外接的LED灯以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 文章目录 使用TIM3和TIM4 ...
- stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速
概述:stm32的每个引脚都有其自带的特殊功能,有定时器输出功能的引脚可以输出pwm.如果没有的也可以io口模拟输出,如果非要较真的话,理论上可以算是每个引脚都能输出PWM,但一般我们都使用带定时器输 ...
最新文章
- jar打包混淆上传全自动日志
- C++ 11 中的POD
- pythonssl双向认证_Python 上的 ssl 提示验证失败,有什么办法深究具体失败的原因么?...
- 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
- NullReferenceException C#中的异常
- 深度剖析Java数据结构之表(二)——List接口
- java折叠自行车x1-auto,java入门第三季 7-1 简易扑克练习
- 在linux下设置开机自动启动程序的方法
- laravel中修改默认时区
- 使用Python采集淘宝类目数据并进行数据分析
- Newifi3(新路由3)刷潘多拉(Pandora)固件
- Go程序设计语言pdf
- H5 video 播放器demo代码
- (2.1)【经典木马-冰河木马】详细介绍,原理、使用方法
- c语言可编写的游戏,占卜子女兴盛大全篇
- H3C CAS 5.0 虚拟机备份与还原
- error: device unauthorized.This adb server's $ADB_VENDOR_KEYS is not set
- 华为手机 从服务器获取安装包信息,华为openGauss 获取并校验安装包
- MATLAB 绘制论文图片格式设置万能代码模板
- windows10 录音机内录、外录、内外混合录的方法
热门文章
- 什么是DAS、NAS、SAN、IP-SAN,它们之间有什么区别?
- Undefined control sequence. 解决
- 计算机多媒体课件设计,多媒体课件设计与制作 教师课件制作平台
- 线性(时不变)系统 非线性系统
- 【项目总结】基于SpringBoot+Ansj分词+正倒排索引的Java文档搜索引擎项目总结
- 十行 js 获取带有双字节字符的字符串长度
- JavaScript、jQuery实现“社区便利店收银系统”(1+X Web前端开发初级 例题)
- java system.nanotime_java - System.nanoTime()完全没用吗?
- 国家信息安全水平考试NISP一级模拟题(02)
- 当区块链是数字经济和数字社会的基石时,我们如何发现机遇?