PWM - 脉宽调制
PWM 简介
什么是 PWM
PWM 代表脉冲宽度调制(Pulse Width Modulation),是一种常见的电子信号调制技术。它通过改变信号的脉冲宽度来控制电路或设备的输出功率或速度。PWM 信号是一个周期性的信号,包含一个固定频率的基准信号和一个可变的占空比信号。占空比指的是脉冲宽度与周期之间的比率,它控制着信号的平均电平,从而控制电路或设备的输出功率或速度。
PWM 技术在电子工程、控制系统和机械工程等领域得到广泛应用。例如,在电机控制中,PWM 信号可以用来控制电机的转速和转向。在电源管理中,PWM 信号可以用来调节直流-直流转换器的输出电压和电流。在 LED 灯控制中,PWM 信号可以用来控制 LED 的亮度和颜色。
需要注意的是,在使用 PWM 技术时,需要选择适当的频率和占空比,以满足具体应用的需求。同时,还需要考虑 PWM 信号的稳定性和噪声等因素,以确保电路或设备的正常运行和可靠性。
怎么使用 PWM
使用 PWM 技术需要通过特定的电路或芯片来生成 PWM 信号,支持 QuecPython 开发的模组大部分都具有此功能,具体可见 PWM 功能 API 文档 确认是否支持此功能,可以按照以下步骤进行:
硬件设计
根据上述 PWM 功能 API 文档 介绍的引脚号和模组的硬件设计文档(从 下载区 获取)设计好硬件电路即可。设计硬件电路注意需要注意电平转换,以及电平转换电路的最大输出频率。
如模组本身不支持或支持的数量不够用,则可以使用模组支持的任意一个 GPIO 结合 定时器 来粗略模拟输出 PWM 信号,硬件设计相同,软件实现可见下文。
软件应用
当使用模组自带 PWM 功能时:
>>>from misc import PWM
>>>pwm = PWM(PWM.PWM0, PWM.ABOVE_MS, 1, 5)
>>>pwm.open()
当自行模拟 PWM 功能时需要注意 QuecPython 对于时序控制并不是很精确,请自行根据需求实现相关代码。
PWM 功能测试
在命令行中执行上面三行代码即可让模组的 PWM0 引脚输出一个周期为 5ms,占空比为 20%的方波,借助 逻辑分析仪 我们可以看到输出的波形。交互界面及逻辑分析仪获取到的波形如下图。
如上图所示,填写的参数和实际抓取到的波形是能够对应上的,有关 API 具体参数含义可以仔细阅读 API 介绍文档进行理解。
对于 QuecPython 的 PWM API 需要注意的是,填的参数不能超出填写范围,否则将会出现报错,这是常见问题。
一般使用 PWM 功能主要步骤是:
- 设置 PWM 参数:根据具体应用需求,设置 PWM 信号的频率和占空比等参数。频率决定信号的周期,占空比决定信号的平均电平和电路或设备的输出功率或速度。对于 QuecPython API,则需要填写高电平时间和周期来决定占空比和频率。即占空比 = 高电平时间/周期,频率 = 1 秒/周期(单位:秒)。
- 连接 PWM 输出:将 PWM 信号的输出端口连接到需要控制的电路或设备,如电机、LED 等。通常需要使用适当的电路元件,如电容、电感、MOSFET 或三极管等,来控制 PWM 信号的幅值和波形。
- 调试和优化:根据实际情况,调试 PWM 电路或程序,以确保 PWM 信号的稳定性和准确性。可以通过示波器、数字万用表等仪器来监测 PWM 信号的波形和电平等参数,进行优化和调整。
需要注意的是,在使用 PWM 技术时,需要根据具体应用需求选择合适的 PWM 芯片或电路,即选择合适的模组,并合理设置参数和连接电路。同时,还需要注意 PWM 信号的稳定性、可靠性和噪声等因素,以确保电路或设备的正常运行和安全性。
PWM 功能应用实例
在本文中,我们将使用 QuecPython 板载的 PWM 功能,实现一个呼吸灯的效果。呼吸灯是一种灯光效果,类似于人类呼吸时的变化。它可以在各种电子设备中使用,例如嵌入式系统、智能家居、玩具等。
准备工作
我们需要使用 QuecPython 开发板、以及一个直插式 LED 灯(部分板载贴片式 LED 即可测试,详情请看电路原理图确认)。将 LED 灯连接到 QuecPython 开发板上。将 LED 的长脚连接到开发板的 PWM0 引脚,将短脚连接到开发板的 GND 引脚。
代码实现
以下是实现呼吸灯效果的 QuecPython 代码。代码中的注释将帮助您理解代码的工作原理。
# 导入所需模块
from misc import PWM
from utime import sleep_ms
# 设置 PWM 通道和频率
PWM_CHANNEL = PWM.PWM0
PWM_FREQ_Hz = 50
# 初始化 PWM 占空比和周期时长
pwm_duty = 100 # PWM 占空比初始值为 100%
cycleTime = 1000 // PWM_FREQ_Hz # 周期时长(单位:ms)
while True:
# 根据当前 PWM 占空比计算高电平时间
highTime = cycleTime * pwm_duty // 100
# 创建 PWM 对象并打开
pwm = PWM(PWM_CHANNEL, PWM.ABOVE_MS, highTime, cycleTime)
pwm.open()
# 根据 PWM 占空比的变化情况更新 PWM 占空比值
if pwm_duty >= 100:
pwm_duty_change_step = -10 # 如果 PWM 占空比达到了 100%,则向负方向降低
if pwm_duty <= 0:
pwm_duty_change_step = 10 # 如果 PWM 占空比达到了 0%,则向正方向增加
pwm_duty += pwm_duty_change_step # 更新 PWM 占空比
# 等待一段时间,再进行下一次循环操作
sleep_ms(100)
这段代码通过使用 misc
模块和 utime
模块中的函数实现对 PWM(脉冲宽度调制)信号的控制。PWM 信号的特点是占空比可以调整,因此可以通过占空比来控制输出的平均电压。在这段代码中,先选择一个 PWM 通道(PWM_CHANNEL = PWM.PWM0
)和设定 PWM 信号的频率(PWM_FREQ_Hz = 50
)。然后通过循环语句不断改变 PWM 信号的占空比,从而使输出的电平产生周期性的变化。
具体来说,代码循环中的每个步骤如下:
- 根据当前的 PWM 占空比值计算出 PWM 信号的高电平时间(
highTime = cycleTime * pwm_duty // 100
)。这里cycleTime
表示一个 PWM 信号的周期时长,单位为毫秒,由设定的 PWM 频率和公式cycleTime = 1000 / PWM_FREQ_Hz
计算得出。pwm_duty
表示当前的 PWM 占空比,范围在 0%~100%之间。因此,当pwm_duty
为 100%时,高电平时间等于一个周期的时长;当pwm_duty
为 0%时,高电平时间为 0。 - 创建一个 PWM 对象,并指定输出方式为“高电平持续时间大于等于给定时间”(
PWM.ABOVE_MS
),同时将高电平时间和周期时长设置为计算得到的值。然后通过open()
方法打开 PWM 输出。 - 根据当前 PWM 占空比的变化趋势更新 PWM 占空比值。当 PWM 占空比达到 100%时,向负方向(即减小 PWM 占空比)变化;当 PWM 占空比达到 0%时,向正方向(即增加 PWM 占空比)变化。
- 等待一段时间(这里是 100 毫秒),然后进入下一次循环。
这样,即可实现对 PWM 信号的控制,从而产生周期性变化的平均电压输出。
总结
PWM 功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。