一、实验目的

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

二、PWM简介

1.关于PWM

含义
PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。
基本原理
PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
优点及应用范围
由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。

2.STM32上的PWM

PWM产生
STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:(其他定时器框图类似)

PWM相关寄存器
包含三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)捕获/比较使能寄存器(TIMx_CCER)捕获/比较寄存器(TIMx_CCR1~4)。设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。在TIMx_CCMRx寄存器中的OCxM位写入110(PWM模式1)或111(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。

捕获/比较模式寄存器(TIMx_CCMRx)
下图为TIMx_CCMR1寄存器的各位描述:

这里需要使用的是模式设置位OCxM,总共有两种PWM模式,这两种PWM 模式的区别就是输出电平的极性相反。

110:PWM模式1。在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2。 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

捕获/比较使能寄存器(TIMx_CCER)
下图为TIMx_CCER寄存器的各位描述:

该寄存器控制着各个输入输出通道的开关。这里只用到了CC2E位,该位是输入/捕获 2 输出使能位,要想PWM 从 I/O 口输出,这个位必须设置为 1。
捕获/比较寄存器(TIMx_CCRx)
下图为TIMx_CCR1寄存器的各位描述:

在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果在OC1端口上产生输出信号。利用这点,我们通过修改这个寄存器的值实现控制 PWM 的输出脉宽。

三、创建项目

1、创建工程

打开STM32CubeMX软件新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:

选择芯片

打开外部时钟,点击“System Core”,选择RCC,在HSE选项中选择“Crystal/Ceramic Resonator”。

选择调试接口,点击“System Core”,选择SYS,在 Debug选项中选择“Serial Wire”。

配置定时器3。
如图,在相应的位置选中定时器3;位置3选择时钟源为“Internal Clock”,通道1选择“PWM Generation CH1”。

设置分频系数为71,
计数周期为500,
其它默认。
配置定时器4
同定时器3相同

时钟配置。

创建项目

2、Keil代码编写

在main.c文件添加变量

uint16_t pwm=0;   //占空比

开启TIM3和TIM4的PWM的通道1

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、线路连接

USB转TTL STM32F103C8T6开发板
3V3 3V3
GND GND
RXD A9
TXD A10
LED灯短脚 A6
LED灯长脚 3V3
PB6 PC13

4、实物连接

5、实验结果

四、总结

最开始的时候没有清楚的方向,但在查阅了资料以及提供的博客后也能成功地完成了实验,连接线路时也因为粗心将led长短脚连错导致浪费了一些时间,所以做实验的时候一定要细心认真严谨。也通过此次作业学习到了pwm地基本知识入门,受益匪浅。

五、参考资料

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-pwm-huxideng/

https://blog.csdn.net/zmhDD/article/details/111942507

https://blog.csdn.net/qq_45237293/article/details/111997424

利用PWM实现LED呼吸灯相关推荐

  1. 【嵌入式知识12】使用PWM实现LED呼吸灯

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

  2. GD32F303的PWM实现LED呼吸灯的方法

    GD32F303的PWM实现LED呼吸灯的方法 首先配置TIMER1,定义初始化结构体变量 static void ConfigTIMER1ForPWMPB10(unsigned short arr, ...

  3. 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯

    小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...

  4. ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

    ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...

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

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

  6. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

  7. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  8. 基于STM32的PWM驱动LED呼吸灯

    一,PWM基本原理 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.如当周期T=T1+T2:T1为高电平时间,T ...

  9. Arduino ESP32利用PWM实现板载LED呼吸灯效果

    Arduino ESP32利用PWM实现板载LED呼吸灯效果 LEDC简介 LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的.它具有16个通道,可以生 ...

最新文章

  1. docker设置网络
  2. python3中字符串编码常见种类_Python基础篇—标准数据类型—String字符串编码问题...
  3. Netty实战六之ChannelHandler和ChannelPipeline
  4. “策小编数洞”开工啦,欢迎来唠两块钱儿的
  5. 用matlab交互式的选取图像特定区域数据
  6. 最受IT公司欢迎的50款开源软件
  7. 大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)
  8. echarts 有引导线和内部文字_上进青年研习社丨设计入门02:平面设计之平面构成中的线...
  9. Vue指令之v-bind
  10. Mediator(中介者)-对象行为型模式
  11. 计算机2级文档试题,计算机二级考试word操作题真题
  12. cad完全卸载教程_卸载后 如何彻底删除CAD2010?
  13. Flips测试类(page43)
  14. Docker 搭建 LNMP镜像 + Wordpress
  15. ESP8266-Arduino编程实例-LM75温度传感器驱动
  16. 一种提升多分类准确性的Trick
  17. 事件模型-温度预警问题
  18. 原创 | SpringBoot版本竟然引发这种问题,让我吐血三升!
  19. R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用anova函数进行方差分析通过p值确认指定连续变量和风险值HR之间是否存在非线性关系
  20. 微信小程序项目转换成uniapp项目

热门文章

  1. word2010删除分节符_在Word 2007和2010中更改分节符的类型
  2. Linux CentOS7 读 exFAT
  3. python编程计算1!+2!+...+10!,设计C语言计算1!+2!+3!+......+10!=?
  4. 旅游宣传软文怎么写吸引人?纯干货
  5. [zz]基于flashplayer的视频播放优化
  6. 手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖
  7. 技术晨读积累_20140526
  8. 数据可视化之树形图(原理+Python代码)
  9. html二级菜单的创建
  10. R语言pheatmap包绘制热图