从零开始的MicroPython(五)PWM

上一篇:串口

文章目录

定义

要理解一个定义,就要引申一个已经掌握的概念,PWM是什么?我们或许可以用“周期”的概念来理解。
在这里插入图片描述
高电平出现的占比是占空比

PWM(脉冲宽度调制)是一种调节信号的方法。它通过控制脉冲的占空比(Duty Cycle)和频率来实现对信号的调节。

占空比是脉冲的高电平时间与周期的比值。在一个周期内,高电平时间占整个周期的比例就是占空比。占空比的范围在0到1之间,可以用百分比表示。例如,50%的占空比表示高电平时间占整个周期的一半。

频率是脉冲的周期,即在一个单位时间内脉冲的个数。频率通常以赫兹(Hz)表示,表示每秒钟的脉冲个数。例如,100Hz的频率表示每秒钟有100个脉冲。

通过改变占空比和频率,可以控制PWM信号的特性。改变占空比可以改变信号的幅度,即高电平的电压大小。当占空比接近0时,高电平时间很短,信号的幅度很小;当占空比接近1时,高电平时间很长,信号的幅度很大。改变频率可以改变信号的变化速度,即脉冲的间隔时间。频率越高,脉冲的间隔时间越短,变化速度越快。

占空比和频率是调节PWM信号特性的两个重要参数。在实际应用中,可以根据需要调整这两个参数,以实现对信号的精确控制。

Frequency = 1/Time_Period
Time_Period = On_time + Off_time

ESP32

ESP32有16个PWM通道,8个定时器。

代码

from machine import Pin, PWM
try:
    f = 100  # Hz
    d = 1024 // 16  # 6.25%
    pins = (15, 2, 4, 16, 18, 19, 22, 23, 25, 26, 27, 14 , 12, 13, 32, 33)
    pwms = []
    for i, pin in enumerate(pins):
        pwms.append(PWM(Pin(pin), freq=f * (i // 2 + 1), duty= 1023 if i==15 else d * (i + 1)))
        print(pwms[i])
finally:
    for pwm in pwms:
        try:
            pwm.deinit()
        except:
            pass

输出结果:

PWM(Pin(15), freq=100, duty=64, resolution=10, mode=0, channel=0, timer=0)
PWM(Pin(2), freq=100, duty=128, resolution=10, mode=0, channel=1, timer=0)
PWM(Pin(4), freq=200, duty=192, resolution=10, mode=0, channel=2, timer=1)
PWM(Pin(16), freq=200, duty=256, resolution=10, mode=0, channel=3, timer=1)
PWM(Pin(18), freq=300, duty=320, resolution=10, mode=0, channel=4, timer=2)
PWM(Pin(19), freq=300, duty=384, resolution=10, mode=0, channel=5, timer=2)
PWM(Pin(22), freq=400, duty=448, resolution=10, mode=0, channel=6, timer=3)
PWM(Pin(23), freq=400, duty=512, resolution=10, mode=0, channel=7, timer=3)
PWM(Pin(25), freq=500, duty=576, resolution=10, mode=1, channel=0, timer=0)
PWM(Pin(26), freq=500, duty=640, resolution=10, mode=1, channel=1, timer=0)
PWM(Pin(27), freq=600, duty=704, resolution=10, mode=1, channel=2, timer=1)
PWM(Pin(14), freq=600, duty=768, resolution=10, mode=1, channel=3, timer=1)
PWM(Pin(12), freq=700, duty=832, resolution=10, mode=1, channel=4, timer=2)
PWM(Pin(13), freq=700, duty=896, resolution=10, mode=1, channel=5, timer=2)
PWM(Pin(32), freq=800, duty=960, resolution=10, mode=1, channel=6, timer=3)
PWM(Pin(33), freq=800, duty=1023, resolution=10, mode=1, channel=7, timer=3)

PWM呼吸灯:

from machine import Pin, PWM
from time import sleep_ms

led = PWM(Pin(2), freq = 1000) # PWM频率1000Hz

while True:
    for i in range(1024): # 脉冲宽度由最小值0增加到最大值1023
        led.duty(i)
        sleep_ms(1)
    for i in range(1023, -1, -1): # 脉冲宽度由最大值1023减小到最小值0
        led.duty(i)
        sleep_ms(1) 

脉冲宽度说得高大上,其实就是他高电平的持续时间,也就是占空比大小。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道了。你的问题是如何在 ESP8266 上使用 MicroPython 捕获 PWM 信号。 在 ESP8266 上使用 MicroPython 捕获 PWM 信号可以使用 machine 模块中的 Pin 和 PWM 类。Pin 类可以将 ESP8266 上的 GPIO 引脚设置为输入模式,PWM 类可以初始化一个 PWM 对象,并将其连接到一个 GPIO 引脚上。 具体步骤如下: 1. 首先需要在 ESP8266 上安装 MicroPython,然后将 PWM 信号连接到 ESP8266 上的一个 GPIO 引脚。 2. 在 MicroPython 中,使用 Pin 类将连接到 PWM 信号的 GPIO 引脚设置为输入模式。 3. 使用 PWM 类初始化一个 PWM 对象,并将其连接到相同的 GPIO 引脚上。 4. 使用 PWM 对象的 freq() 方法设置 PWM 对象的频率,通常和 PWM 信号的频率一致。 5. 使用 PWM 对象的 duty() 方法设置 PWM 对象的占空比,以捕获 PWM 信号的变化。 下面是一个简单的 MicroPython 代码示例,用于捕获 PWM 信号: ```python from machine import Pin, PWM pwm_pin = Pin(0, Pin.IN) # 连接到GPIO0 pwm = PWM(pwm_pin, freq=1000) # 初始化PWM对象,设置频率为1000Hz while True: duty_cycle = pwm.duty() # 读取PWM占空比 print("Duty Cycle: %d" % duty_cycle) ``` 上面的代码中,首先使用 Pin 类将 GPIO0 引脚设置为输入模式,并使用 PWM 类初始化一个 PWM 对象,将其连接到 GPIO0 引脚上。在每次循环中,使用 PWM 对象的 duty() 方法读取 PWM 信号的占空比,并将其打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值