1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
第十三章 PWM实验
在ESP32-S3上,PWM功能主要由machine模块提供,通过设置PWM频率(每秒高电平脉冲数)和占空比(一个周期内高电平时间比例)实现对特定设备的控制。例如,使用PWM控制LED灯亮度时,需要先初始化PWM对象并设置频率和占空比。频率影响PWM信号扫描速度,占空比则控制高电平脉冲时间长度,从而影响LED灯亮度。
本章分为如下几个小节:
13.1 PWM脉宽调制技术
13.2 machine.PWM类
13.3 硬件设计
13.4 软件设计
13.5 下载验证
13.1 PWM脉宽调制技术
PWM是脉冲宽度调制的缩写,它是通过对一些列脉冲的宽度进行调制,等效出所需要的波形,对模拟信号电平进行数字编码,也就是说,通过调节占空比的变化调节信号、能量等编号。占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,如方波的占空比为50%。
在第八章实现的LED灯闪烁,500ms亮与500ma灭循环,信号的波形图图下所示。
图13.1.1 信号波形图
上图中,占空比为50%的方波。如果把延时时间缩短,时间越短LED灯闪烁的越快。当时间足够短的时候,从人眼的角度来看,LED保持常亮,并不会感觉到LED闪烁。如果我们在一个时间足够短的周期内调节高低电平的时间比例,也就是控制高低电平的占空比,就可以达到控制LED灯亮度的目的了,这就是PWM控制。不同占空比效果如下图所示。
图13.1.2 PWM控制
PWM占空比受到两个因素影响,频率和占空比。例如PWM的控制周期为100ms,其中25ms被设置为高电平,75ms被设置为低电平,则占空比就是25/100=25%。值得注意的是,在MicroPython中,ESP32-S3的占空比(duty)并不是百分比取值,而是一个分辨率的形式,其取值范围为0~1023。
13.2 machine.PWM类
machine.PWM 类是 machine 模块下的一个硬件类,用于指定 PWM 设备的配置和控制,提供对 PWM 设备的操作方法。PWM是一种对模拟信号电平进行数字编码的方式。PWM 设备可以通过调节有效电平在一个周期信号中的比例时间来操作设备。PWM 设备有两个重要的参数:频率(freq)和占空比(duty)。频率是指从一个上升沿(下降沿)到下一个上升沿(下降沿)的时间周期,单位为 Hz。占空比是有效电平(通常为电平)在一个周期内的时间比例。
1,machine.PWM类的构造对象
在 MicroPython 中PWM的构造对象方法如下:
- class machine.PWM(pin,freq,duty)
- 使用示例:pwm = machine.PWM(Pin(1),freq = 1000)
复制代码 该构造函数的参数描述,如下表所示。
表13.2.1 machine.PWM构造函数参数描述
返回值:PWM对象。
2,machine.PWM类的方法
①:PWM对象初始化。
其方法原型如下:
该方法的参数描述,如下表所示。
表13.2.2 UART.init方法参数描述
②:关闭PWM设备。
其方法原型如下:
③:设置频率。
其方法原型如下:
该方法的参数描述,如下表所示。
表13.2.2 PWM.freq方法参数描述
④:设置占空比。
其方法原型如下:
该方法的参数描述,如下表所示。
表13.2.2 PWM.duty_u16函数参数描述
13.3 硬件设计
1. 例程功能
本章实验功能简介:实现LED由暗变亮,再从亮变暗,依次循环。
2. 硬件资源
1)LED灯
LED-IO1
2)独立按键
BOOT-IO0
3)PWM
3. 原理图
本章实验使用的PWM为ESP32-S3的片上资源,因此并没有相应的连接原理图
13.4 软件设计
13.4.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图13.4.1.1 程序流程图
13.4.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。PWM实验main.py源码如下:
- from machine import Pin,PWM
- import time
- """
- * @brief 程序入口
- * @param 无
- * @retval 无
- """
- if __name__ == '__main__':
-
- pwm = PWM(Pin(1),freq = 1000)
-
- while True:
- # 渐亮
- for i in range(0,1024):
- pwm.duty(i)
- time.sleep_ms(1)
- # 渐暗
- for i in range(1023,0,-1):
- pwm.duty(i)
- time.sleep_ms(1)
复制代码 这示例代码使用ESP32的PWM功能,通过循环改变PWM占空比的方式,控制LED灯的亮度在0-1023之间变化,然后从1023-0之间变化,实现LED灯的亮度会以一个平稳的速度从最暗变到最亮,然后再从最亮变到最暗。
13.5 下载验证
下载代码完成后,ESP32-S3开发板上LED灯的亮度会以一个平稳的速度从最暗变到最亮,然后再从最亮变到最暗。
|