【雕爷学编程】MicroPython手册之 ESP32-C3 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-C3是一款由乐鑫科技开发的物联网芯片,它具有以下主要特性:

搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。
内置 400 KB SRAM,384 KB ROM,支持最大 16 MB 的外置 Flash。
集成了天线开关、射频巴伦、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能,仅需要 20 余个外围元件。
具有 22 个可编程 GPIO 管脚,支持 ADC、SPI、UART、I2C、I2S、RMT、TWAI 和 PWM。
具有完善的安全机制,包括安全启动、Flash 加密、数字签名和 HMAC 外设、世界控制器模块等。
沿用乐鑫成熟的物联网开发框架 ESP-IDF,支持 Arduino 和 MicroPython 等开源平台。

在这里插入图片描述
MicroPython的ESP32-C3支持PWM(脉宽调制),下面是对ESP32-C3 PWM的主要特点、应用场景以及需要注意的事项的详细解释:

主要特点:

脉宽调制:ESP32-C3的PWM是一种通过调整输出信号的脉冲宽度来控制电平的技术。它可以生成具有可调节占空比的方波信号,用于模拟输出或控制外部设备的亮度、速度等。

硬件支持:ESP32-C3内置了多个PWM通道,可以同时控制多个PWM输出。这些PWM通道具有独立的计数器和寄存器,可以实现高精度的脉宽调制。

高分辨率:ESP32-C3的PWM支持高分辨率的脉宽调制,通常以位数表示。较高的分辨率可以提供更精细的电平调节,使得PWM输出更加平滑和精确。

频率调节:ESP32-C3的PWM支持可调节的输出频率。可以根据具体需求选择适当的频率,以满足不同应用场景对PWM信号的要求。

应用场景:

电机控制:PWM广泛应用于电机控制领域。ESP32-C3的PWM可以用于控制直流电机或步进电机的转速和转向,通过调节PWM信号的占空比可以实现精准的速度调节。

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

声音合成:PWM可以用于声音合成领域。通过调节PWM信号的频率和占空比,可以产生不同音高和音色的声音信号,广泛应用于音乐合成、语音合成等领域。

模拟信号生成:PWM可以用于模拟信号的生成。通过调节PWM信号的占空比和频率,可以生成模拟信号,如正弦波、方波等,用于测试、测量和模拟电路等应用。

需要注意的事项:

输出电平范围:在使用ESP32-C3的PWM时,需要注意输出电平范围的匹配。根据外部设备的工作电压要求,选择合适的电平范围,以避免损坏设备或导致错误操作。

频率和分辨率的权衡:调节PWM输出的频率和分辨率时,需要权衡精度和性能。较高的分辨率可以提供更精确的输出,但可能会占用更多的计算资源。根据具体应用需求,选择合适的频率和分辨率设置。

噪音和滤波:PWM输出可能会产生噪音,特别是在高频率情况下。在一些对噪音敏感的应用中,可能需要采取滤波措施来降低噪音干扰。

电流负载和散热:在控制外部设备时,需要注意PWM输出引脚的电流负载能力。如果负载电流较大,可能需要额外的电流放大器或电流驱动器。此外,PWM输出产生的功率较大,可能需要适当的散热措施来防止芯片过热。

保护和安全:使用ESP32-C3的PWM时,需要注意保护和安全措施。确保正确连接和使用外部设备,避免短路、过载等操作错误。此外,根据具体应用需求,可以考虑添加过压保护、过流保护等电路以保护ESP32-C3和外部设备的安全。

总结:ESP32-C3的PWM具有脉宽调制的特点,支持多通道、高分辨率和可调节的频率。它在电机控制、LED调光、声音合成和模拟信号生成等应用场景中具有广泛的应用。在使用时,需要注意输出电平范围、频率和分辨率的权衡、噪音和滤波、电流负载和散热以及保护和安全措施。

案例一:控制LED亮度

from machine import Pin, PWM
import time

# 定义引脚
led = Pin(2, Pin.OUT)
pwm = PWM(led, freq=1000)

while True:
    for i in range(0, 1024):
        pwm.duty(i)  # 设置PWM占空比
        time.sleep(0.001)  # 延时
    for i in range(1023, -1, -1):
        pwm.duty(i)  # 设置PWM占空比
        time.sleep(0.001)  # 延时

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO2的LED。通过PWM(脉宽调制)技术,可以控制LED的亮度。程序会不断地改变PWM占空比,使LED的亮度从最暗到最亮,然后再从最亮到最暗。

案例二:控制电机速度

from machine import Pin, PWM
import time

# 定义引脚
motor_pin = Pin(5, Pin.OUT)
pwm = PWM(motor_pin, freq=1000)

while True:
    for i in range(0, 1024):
        pwm.duty(i)  # 设置PWM占空比
        time.sleep(0.001)  # 延时
    for i in range(1023, -1, -1):
        pwm.duty(i)  # 设置PWM占空比
        time.sleep(0.001)  # 延时

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO5的电机。通过PWM(脉宽调制)技术,可以控制电机的速度。程序会不断地改变PWM占空比,使电机的速度从慢到快,然后再从快到慢。

案例三:控制舵机角度

from machine import Pin, PWM
import time

# 定义引脚
servo_pin = Pin(18, Pin.OUT)
pwm = PWM(servo_pin, freq=50)

def set_servo_angle(angle):
    duty = angle / 18 + 2
    pwm.duty(int(duty * (1023 / 18)))

while True:
    for angle in range(0, 180):
        set_servo_angle(angle)
        time.sleep(0.01)
    for angle in range(180, 0, -1):
        set_servo_angle(angle)
        time.sleep(0.01)

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO18的舵机。通过PWM(脉宽调制)技术,可以控制舵机的角度。程序会不断地改变舵机的角度,使舵机从0度旋转到180度,然后再从180度旋转到0度。

案例四:控制LED的亮度
在此示例中,我们将使用PWM来控制LED的亮度。

from machine import Pin, PWM  
import time  
  
# 初始化PWM,设置频率为100Hz,占空比为50%  
pwm = PWM(Pin(2), freq=100, duty=50)  
  
# 循环改变占空比,从而改变LED的亮度  
while True:  
    for duty in range(0, 101, 1):  
        pwm.duty(duty)  
        time.sleep(0.01)  # 延时一段时间,以便人眼可以观察到亮度变化  
    for duty in range(100, -1, -1):  
        pwm.duty(duty)  
        time.sleep(0.01)  # 延时一段时间,以便人眼可以观察到亮度变化

解读:在此程序中,我们首先导入了 Pin、PWM 和 time 模块。然后,我们使用 PWM 类初始化PWM,设置频率为100Hz,占空比为50%。然后,我们进入一个无限循环,在这个循环中,我们使用两个嵌套的for循环来逐渐改变PWM的占空比,从而改变LED的亮度。通过这种方式,我们可以观察到LED亮度的变化。

案例五:控制舵机的旋转角度
在此示例中,我们将使用PWM来控制舵机的旋转角度。

from machine import Pin, PWM  
import time  
  
# 初始化PWM,设置频率为20Hz,占空比为50%  
pwm = PWM(Pin(2), freq=20, duty=50)  
  
# 设置舵机旋转的角度范围和步进值  
angle_range = 180  # 旋转角度范围为180度  
step_size = 1  # 每次旋转增加或减少的角度步进值为1度  
  
# 循环控制舵机的旋转角度  
while True:  
    for angle in range(0, angle_range+step_size, step_size):  
        pwm.duty(int(angle * (100 // step_size)))  # 设置占空比来控制旋转角度  
        time.sleep(0.1)  # 延时一段时间,以便人眼可以观察到舵机旋转的变化  
    for angle in range(angle_range, -step_size, -step_size):  
        pwm.duty(int(angle * (100 // step_size)))  # 设置占空比来控制旋转角度  
        time.sleep(0.1)  # 延时一段时间,以便人眼可以观察到舵机旋转的变化

解释:
首先导入了 Pin、PWM 和 time 模块。这些模块分别用于控制GPIO引脚、脉宽调制信号和时间延时。
然后使用 PWM 类初始化PWM信号,设置PWM信号的频率为20Hz,占空比为50%。这里使用的是GPIO引脚2作为PWM信号的输出引脚。
接着设置了舵机旋转的角度范围为180度,每次旋转增加或减少的角度步进值为1度。
进入一个无限循环,在这个循环中,使用两个嵌套的for循环来逐渐改变PWM的占空比,从而控制舵机的旋转角度。第一个for循环从0度开始,每次增加step_size度,直到最大角度angle_range度。第二个for循环从最大角度开始,每次减少step_size度,直到最小角度-step_size度。在每个角度位置,通过设置pwm.duty()函数的参数来设置PWM的占空比,从而控制舵机的旋转角度。同时使用time.sleep()函数进行时间延时,以便人眼可以观察到舵机旋转的变化。

案例六:控制电机速度
在此示例中,我们将使用PWM来控制电机的速度。

from machine import Pin, PWM  
import time  
  
# 初始化PWM,设置频率为100Hz,占空比为50%  
pwm = PWM(Pin(2), freq=100, duty=50)  
  
# 循环控制电机的速度  
while True:  
    for speed in range(0, 101, 1):  
        pwm.duty(speed)  # 设置占空比来控制电机速度  
        time.sleep(0.1)  # 延时一段时间,以便人眼可以观察到电机速度的变化  
    for speed in range(100, -1, -1):  
        pwm.duty(speed)  # 设置占空比来控制电机速度  
        time.sleep(0.1)  # 延时一段时间,以便人眼可以观察到电机速度的变化

解读:在此程序中,我们首先导入了 Pin、PWM 和 time 模块。然后,我们使用 PWM 类初始化PWM,设置频率为100Hz,占空比为50%。然后,我们进入一个无限循环,在这个循环中,我们使用两个嵌套的for循环来逐渐改变PWM的占空比,从而控制电机的速度。通过这种方式,我们可以观察到电机速度的变化。

案例七:控制LED亮度

import machine
import utime

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

while True:
    for duty in range(1024):
        pwm.duty(duty)
        utime.sleep_ms(5)
    for duty in range(1023, -1, -1):
        pwm.duty(duty)
        utime.sleep_ms(5)

要点解读:
代码使用machine.Pin创建一个引脚对象,这里使用引脚2。
machine.PWM用于创建一个PWM对象,用于控制引脚的脉冲宽度调制(PWM)信号。
pwm.freq()设置PWM信号的频率,这里设置为1000Hz。
pwm.duty()用于设置PWM信号的占空比,值范围为0到1023,表示LED的亮度。
在循环中,通过逐渐增加和减小占空比的方式,实现LED的渐变亮度效果。

案例八:控制舵机转动角度

import machine
import utime

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

while True:
    pwm.duty(40)  # 0度
    utime.sleep(2)
    pwm.duty(77)  # 90度
    utime.sleep(2)
    pwm.duty(115)  # 180度
    utime.sleep(2)

要点解读:
代码使用machine.Pin创建一个引脚对象,这里使用引脚2。
machine.PWM用于创建一个PWM对象,用于控制引脚的脉冲宽度调制(PWM)信号。
pwm.freq()设置PWM信号的频率,这里设置为50Hz。
pwm.duty()用于设置PWM信号的占空比,值范围为0到1023,表示舵机转动角度。
在循环中,通过设置不同的占空比来控制舵机的转动角度。这里分别设置为0度、90度和180度,每个角度保持2秒钟。

案例九:控制电机速度

import machine
import utime

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

while True:
    pwm.duty(512)  # 中速
    utime.sleep(2)
    pwm.duty(1023)  # 最大速度
    utime.sleep(2)
    pwm.duty(0)  # 停止
    utime.sleep(2)

要点解读:
代码使用machine.Pin创建一个引脚对象,这里使用引脚2。
machine.PWM用于创建一个PWM对象,用于控制引脚的脉冲宽度调制(PWM)信号。
pwm.freq()设置PWM信号的频率,这里设置为1000Hz。
pwm.duty()用于设置PWM信号的占空比,值范围为0到1023,表示电机的转速。
在循环中,通过设置不同的占空比来控制电机的速度。这里分别设置为中速(50%占空比)、最大速度(100%占空比)和停止(0%占空比),每个速度保持2秒钟。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值