【雕爷学编程】MicroPython手册之 ESP32-S3 PWM (脉宽调制)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述
MicroPython的ESP32-S3芯片提供了PWM(脉宽调制)功能,以下是关于其主要特点、应用场景和需要注意的事项的详细解释:

主要特点:

精确控制脉冲宽度:ESP32-S3的PWM模块可以精确控制脉冲的宽度。通过调整脉冲的高电平时间与周期之比,可以实现对输出信号的精确控制。

多通道PWM:ESP32-S3芯片具有多个PWM通道,可以同时控制多个PWM输出。每个PWM通道都有独立的寄存器和配置选项,提供更大的灵活性。

高频率支持:ESP32-S3的PWM模块支持高频率的脉冲输出。这使得它适用于需要高速响应的应用,如电机驱动、音频合成等。

应用场景:

电机控制:PWM广泛应用于电机控制领域。通过调整PWM信号的占空比,可以控制电机的转速和方向,实现精确的电机控制。

LED调光:PWM常用于LED灯的调光控制。通过调整PWM信号的占空比,可以实现LED的亮度调节,提供不同的光照效果。

声音合成:PWM可以用于产生模拟音频信号。通过调整PWM信号的频率和占空比,可以合成不同频率和音调的声音。

无线通信:PWM也可以用于无线通信中的调制和解调。它可以将数字信号转换为模拟信号进行传输,实现简单的调制和解调功能。

需要注意的事项:

频率选择:在使用PWM时,需要根据具体应用的需求选择合适的PWM频率。较高的PWM频率可以提供更平滑的输出,但可能会增加处理器负担。

分辨率配置:ESP32-S3的PWM模块支持配置不同的分辨率。较高的分辨率可以提供更精细的脉冲宽度调节,但可能会占用更多的资源。

输出电流限制:在连接外部设备时,需要注意PWM输出引脚的电流限制。确保外部设备的电流需求在PWM输出引脚的可承受范围内。

中断处理:ESP32-S3的PWM模块支持中断机制,可以在特定事件发生时触发中断。在使用中断时,需要编写正确的中断处理程序,并避免在中断处理程序中执行耗时操作,以确保系统的响应性能。

综上所述,MicroPython的ESP32-S3的PWM功能具有精确控制、多通道支持和高频率特性。它适用于电机控制、LED调光、声音合成和无线通信等应用场景。在使用PWM时,需要注意频率选择、分辨率配置、输出电流限制和中断处理等事项,以确保PWM输出的稳定性和可靠性。

案例一:使用ESP32-S3的PWM控制LED灯

from machine import Pin, PWM
import time

# 定义PWM引脚为GPIO2,频率为1000Hz
pwm = PWM(Pin(2), freq=1000)

while True:
    # 设置PWM占空比为50%
    pwm.duty(512)
    time.sleep(1)
    # 设置PWM占空比为75%
    pwm.duty(768)
    time.sleep(1)
    # 设置PWM占空比为100%
    pwm.duty(1024)
    time.sleep(1)

要点解读:在这个程序中,我们使用了MicroPython的machine模块中的PWM类来控制ESP32-S3的PWM。首先,我们将PWM的引脚设置为GPIO2,并设置频率为1000Hz。然后,我们使用一个无限循环来不断改变PWM的占空比。在每次循环中,我们将占空比设置为50%、75%和100%,并让程序暂停1秒。这样,我们就可以实现一个简单的LED灯闪烁效果。

案例二:使用ESP32-S3的PWM控制电机

from machine import Pin, PWM
import time

# 定义PWM引脚为GPIO5,频率为50Hz
motor_pwm = PWM(Pin(5), freq=50)

def set_motor_speed(speed):
    # 根据速度值计算占空比
    duty = int((speed / 100) * 1024)
    motor_pwm.duty(duty)

while True:
    # 设置电机速度为50%
    set_motor_speed(50)
    time.sleep(1)
    # 设置电机速度为75%
    set_motor_speed(75)
    time.sleep(1)
    # 设置电机速度为100%
    set_motor_speed(100)
    time.sleep(1)

要点解读:在这个程序中,我们同样使用了MicroPython的machine模块中的PWM类来控制ESP32-S3的PWM。我们将PWM的引脚设置为GPIO5,并设置频率为50Hz。然后,我们定义了一个名为set_motor_speed的函数,该函数根据传入的速度值计算占空比,并设置PWM的占空比。在主循环中,我们不断地调用这个函数来改变电机的速度。这样,我们就可以实现一个简单的电机控制功能。

案例三:使用ESP32-S3的PWM控制舵机

from machine import Pin, PWM
import time

# 定义PWM引脚为GPIO16,频率为50Hz
servo_pwm = PWM(Pin(16), freq=50)

def set_servo_angle(angle):
    # 根据角度值计算占空比
    duty = int((angle / 180) * (1024 - 204)) + 204
    servo_pwm.duty(duty)

while True:
    # 设置舵机角度为0度
    set_servo_angle(0)
    time.sleep(1)
    # 设置舵机角度为90度
    set_servo_angle(90)
    time.sleep(1)
    # 设置舵机角度为180度
    set_servo_angle(180)
    time.sleep(1)

要点解读:在这个程序中,我们同样使用了MicroPython的machine模块中的PWM类来控制ESP32-S3的PWM。我们将PWM的引脚设置为GPIO16,并设置频率为50Hz。然后,我们定义了一个名为set_servo_angle的函数,该函数根据传入的角度值计算占空比,并设置PWM的占空比。在主循环中,我们不断地调用这个函数来改变舵机的角度。这样,我们就可以实现一个简单的舵机控制功能。

案例四:控制LED灯亮度
在这个程序中,我们将使用ESP32-S3的PWM模块控制LED灯的亮度。具体来说,我们将使用machine.PWM()函数创建一个PWM对象,并设置其频率和占空比。然后,我们将使用pwm.duty()函数设置PWM的占空比,从而控制LED灯的亮度。需要注意的是,在控制LED灯亮度之前,我们需要先使用pin.init()函数设置GPIO口为输出模式。

import machine  
import time  
  
# 设置PWM参数  
pwm = machine.PWM(pin='GPIO17', freq=100, duty=0)  
  
while True:  
    # 控制LED灯亮度  
    for i in range(256): # 占空比从0到255变化  
        pwm.duty(i) # 设置PWM占空比为i  
        time.sleep(0.01) # 等待0.01秒钟  
    for i in range(256, 0, -1): # 占空比从255到0变化  
        pwm.duty(i) # 设置PWM占空比为i  
        time.sleep(0.01) # 等待0.01秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用machine.PWM()函数创建了一个PWM对象,并设置其使用的GPIO口为17,频率为100Hz,初始占空比为0。接下来,我们使用一个无限循环来控制LED灯的亮度。在每次循环中,我们先使用一个for循环将占空比从0变化到255,并使用pwm.duty()函数将占空比设置为当前的数值。然后,我们使用time.sleep()函数等待0.01秒钟,以避免过于频繁地变化占空比。接着,我们再使用一个for循环将占空比从255变化到0,并重复上述过程。这样,LED灯将会以渐变的方式闪烁,实现亮度控制。

案例五:控制电机转速
在这个程序中,我们将使用ESP32-S3的PWM模块控制电机的转速。具体来说,我们将使用machine.PWM()函数创建一个PWM对象,并设置其频率和占空比。然后,我们将使用pwm.duty()函数设置PWM的占空比,从而控制电机的转速。需要注意的是,在控制电机转速之前,我们需要先使用pin.init()函数设置GPIO口为输出模式。

import machine  
import time  
  
# 设置PWM参数  
pwm = machine.PWM(pin='GPIO17', freq=200, duty=0)  
  
while True:  
    # 控制电机转速  
    for i in range(256): # 占空比从0到255变化  
        pwm.duty(i) # 设置PWM占空比为i  
        time.sleep(0.02) # 等待0.02秒钟  
    for i in range(256, 0, -1): # 占空比从255到0变化  
        pwm.duty(i) # 设置PWM占空比为i  
        time.sleep(0.02) # 等待0.02秒钟

在这个程序中,我们使用了一个无限循环来控制电机的转速。在每次循环中,我们使用一个for循环将占空比从0变化到255,并使用pwm.duty()函数将占空比设置为当前的数值。然后,我们使用time.sleep()函数等待0.02秒钟,以避免过于频繁地变化占空比。接着,我们再使用一个for循环将占空比从255变化到0,并重复上述过程。这样,电机将会以渐变的方式旋转,实现转速控制。需要注意的是,在实际应用中,我们需要根据具体的电机型号和控制电路来调整PWM的频率和占空比,以达到最佳的控制效果。

案例六:生成正弦波信号
在这个程序中,我们将使用ESP32-S3的PWM模块生成正弦波信号。具体来说,我们将使用math模块中的sin()函数计算正弦函数的值,并将其作为PWM的占空比。然后,我们将使用pwm.duty()函数设置PWM的占空比,从而生成正弦波信号。需要注意的是,在生成正弦波信号之前,我们需要先使用pin.init()函数设置GPIO口为输出模式。

import machine  
import time  
import math  
  
# 设置PWM参数  
pwm = machine.PWM(pin='GPIO17', freq=1000, duty=0)  
  
while True:  
    # 生成正弦波信号  
    for i in range(256): # 占空比从0到255变化  
        value = math.sin(i / 256.0 * 2 * math.pi) # 计算正弦函数的值  
        pwm.duty(int(value * 255)) # 设置PWM占空比为value的整数部分  
        time.sleep(0.01) # 等待0.01秒钟  
    for i in range(256, 0, -1): # 占空比从255到0变化  
        value = math.sin((i - 1) / 256.0 * 2 * math.pi) # 计算正弦函数的值  
        pwm.duty(int(value * 255)) # 设置PWM占空比为value的整数部分  
        time.sleep(0.01) # 等待0.01秒钟

在这个程序中,我们首先导入了machine模块、time模块和math模块。然后,我们使用machine.PWM()函数创建了一个PWM对象,并设置其使用的GPIO口为17,频率为1000Hz,初始占空比为0。接下来,我们使用一个无限循环来生成正弦波信号。在每次循环中,我们先使用一个for循环将占空比从0变化到255,并使用math.sin()函数计算正弦函数的值。然后,我们将计算得到的值乘以255并取整数部分,作为PWM的占空比。然后,我们使用time.sleep()函数等待0.01秒钟,以避免过于频繁地变化占空比。接着,我们再使用一个for循环将占空比从255变化到0,并重复上述过程。这样,我们就可以使用PWM模块生成正弦波信号了。需要注意的是,在实际应用中,我们可能需要根据具体的电路和应用场景来调整PWM的频率和占空比,以达到最佳的效果。

案例七:控制LED的亮度:

import machine

led_pin = machine.Pin(2)
pwm = machine.PWM(led_pin)
pwm.freq(1000)

def set_led_brightness(brightness):
    duty = int(brightness / 100 * 1023)
    pwm.duty(duty)

while True:
    set_led_brightness(50)
    machine.delay(1000)
    set_led_brightness(100)
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过PWM调整LED的亮度。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号。
使用machine.PWM()函数创建一个PWM对象,并将其与引脚连接。
在这个示例中,引脚2被配置为PWM输出,用于连接LED。
set_led_brightness()函数用于设置LED的亮度,通过调整PWM的占空比来实现。
在一个无限循环中,通过调用set_led_brightness()函数来周期性地调整LED的亮度。

案例八:控制舵机角度:

import machine

servo_pin = machine.Pin(5)
pwm = machine.PWM(servo_pin)
pwm.freq(50)

def set_servo_angle(angle):
    duty = int(40 + angle / 18)
    pwm.duty(duty)

while True:
    set_servo_angle(0)
    machine.delay(1000)
    set_servo_angle(90)
    machine.delay(1000)
    set_servo_angle(180)
    machine.delay(1000)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过PWM控制舵机的角度。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号。
使用machine.PWM()函数创建一个PWM对象,并将其与引脚连接。
在这个示例中,引脚5被配置为PWM输出,用于连接舵机。
set_servo_angle()函数用于设置舵机的角度,通过调整PWM的占空比来实现。
在一个无限循环中,通过调用set_servo_angle()函数来控制舵机转动到不同的角度。

案例九:生成音频信号:

import machine

audio_pin = machine.Pin(25)
pwm = machine.PWM(audio_pin)
pwm.freq(440)

while True:
    pwm.duty(512)
    machine.delay(500)
    pwm.duty(0)
    machine.delay(500)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过PWM生成音频信号。
使用machine.Pin()函数创建一个引脚对象,指定引脚编号。
使用machine.PWM()函数创建一个PWM对象,并将其与引脚连接。
在这个示例中,引脚25被配置为PWM输出,用于生成音频信号。
通过调整PWM的占空比来控制音频信号的幅度。
在一个无限循环中,通过设置PWM的占空比来产生间隔为500毫秒的音频信号。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值