跳转至

PWM

一、PWM 概述

1.1 PWM 是什么

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

要想使用 PWM 还需了解 PWM 的相关参数:

  1. PWM 的频率: 是指 1 秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),也就是说一秒钟 PWM 有多少个周期。 单位:Hz
  2. PWM 的周期: T=1/f 周期=1/频率 例:如果频率为 50Hz ,也就是说一个周期是 20ms,那么一秒钟就有 50 次 PWM 周期。
  3. PWM 的占空比: 是一个脉冲周期内,高电平的时间占整个周期时间的比例 单位: % (0%-100%) 例:一个周期 10ms,高电平占 8ms,那么此占空比就是 8/10=80%。

1.2 PWM 原理

单片机的 IO 引脚输出的是数字信号,且只能输出 1 和 0,那如果 TTL 电平中,高电平为 5V,低电平为 0V,但是我们想要输出不同的模拟电压,比如输出 3.75V 应该怎么操作?

此时要用到 PWM,通过改变 IO 口输出方波的占空比,得到不同的模拟电压。 3.75/5=0.75,也就是高电平时间占整个周期的 75%,即占空比为 75%,可得到模拟电压 3.75V。 注意上图中变化的蓝色横线,代表着输出的模拟电压,占空比越大,则模拟电压也越大。

1.3 PWM 通道说明

说明: Air8101 支持 6 路 PWM,ID 为 0 - 5。

调用 PWM 库的 API 时,填 PWM ID 即可,下表是默认的 PWM ID 与硬件管脚的对应关系,暂时没有复用。

如果要使用 PWM 0, 查看上表可知,该 PWM ID 对应的硬件管脚是 P18。 -- 打开 PWM0,设置脉冲频率为 1kHz,占空比为 50% 持续输出。 pwm.open(0, 1000, 50, 0) 如果模组管脚 26 不使用 PWM 功能,则不需要打开 PWM20,可以当成普通 GPIO19 使用。

二、演示功能概述

本章节分别用两个示例演示了如何使用 Air8101 的 PWM 功能

1. 控制 Air8101 开发 PWM0 通道的 PWM 输出,设置不同的占空比,外接发光二极管,让小灯有不同的亮度

2. 使用 Air8101 核心板的 PWM0 通道,外接发光二极管来查看呼吸灯效果。

三、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

参考:硬件环境清单 - luatos@air8101 - 合宙文档中心,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;参考项目使用的内核固件;

3. luatos 需要的脚本和资源文件

脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/pwm

lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板 - luatos@air8101 - 合宙文档中心,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。

五、PWM 软硬件资料

5.1 API 接口介绍

本教程使用 api 接口为:pwm - PWM 模块 - luatos@air780e - 合宙文档中心

六、代码示例介绍

6.1 PWM 输出

本例使用 Air8101 开发板上 PWM0 通道,对应硬件 GPIO18,外接发光二极管来查看呼吸灯效果。

打开 PWM0 通道的 PWM 输出,设置不同的占空比,观察小灯的亮度。

6.1.1 代码介绍

local PWM_ID = 0  -- 代码中使用pwm通道0,如需使用其他pwm通道请查看Air8101/pwm使用指南1.3、pwm通道说明。
sys.taskInit(function()
    while true do
        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为1000,占空比为10/1000=1% 持续输出
        pwm.open(PWM_ID, 1000, 10, 0, 1000) -- 小灯微微发光
        log.info("pwm", "当前分频精度1000,占空比1%")
        sys.wait(1000)
        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为256,占空比为128/256=50% 持续输出
        pwm.open(PWM_ID, 1000, 128, 0, 256) -- 小灯中等亮度
        log.info("pwm", "当前分频精度256,占空比50%")
        sys.wait(1000)
        -- 开启pwm通道0,设置脉冲频率为1kHz,分频精度为100,占空比为100/100=100% 持续输出
        pwm.open(PWM_ID, 1000, 100, 0, 100) -- 小灯很高亮度
        log.info("pwm", "当前分频精度100,占空比100%")
        sys.wait(1000)
    end
end)

6.1.2 效果展示

图片等待补充。。。

6.2 呼吸灯效果

本例使用 Air8101 开发板上 PWM0 通道,对应硬件 GPIO18,外接发光二极管来查看呼吸灯效果。

呼吸灯效果就是小灯由亮到暗逐渐变化,很有节奏感地一起一伏,”感觉,好像人在呼吸“,我们可以通过不断调高占空比让小灯一点点亮起,再不断调低占空比让小灯一点点熄灭从而达到此效果。

6.2.1 代码介绍

local PWM_ID = 0
sys.taskInit(function()
    log.info("pwm", "ch", PWM_ID)
    while 1 d
        -- 仿呼吸灯效果
        log.info("pwm", ">>>>>")
        -- 占空比从90%(i=10时)到9%(i=1时)
        for i = 10,1,-1 do
            pwm.open(PWM_ID, 1000, i*) -- 频率1000hz, 占空比0-100
            sys.wait(100 + i_10)_
_        end_
_        -- 占空比从10%增加到90%。_
_        for i = 10,1,-1 do_
            pwm.open(PWM_ID, 1000, 100 - i*9)
            sys.wait(100 + i*10)
        end
        sys.wait(2000)
    end
end)

6.2.2 效果展示

外接发光二极管,效果如下图所示:

图片等待补充。。。

通过示波器查看 PWM 输出波形,如下所示,可以看到占空比在 10%-90% 之间变化。

七、总结

本教程旨在通过合宙开发板展示 PWM(脉冲宽度调制)输出呼吸灯的实现方法,帮助读者深入理解如何在项目中应用 PWM 技术。PWM 作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用。通过精确控制信号的占空比,PWM 能够实现电能的有效管理。

PWM 的主要应用

1. 电机控制:通过调节电机供电的 PWM 信号,控制电机转速和扭矩。

2. 灯光调光:用于调节 LED 灯的亮度,改变状态的快慢来实现不同亮度效果。

3. 音频信号生成:在音频电子设备中生成不同的声音频率和音量。

4. 加热控制:在加热元件中使用 PWM 来调整输出功率,从而实现精确的温度控制。

PWM 的优点:

1. 高效性:PWM 有效降低能量损耗,因为其开关操作使功率元件始终处于全导通或全关闭状态。

2. 控制精度高:可以通过调节占空比进行非常精确的控制。

3. 实现简便:可以通过简单的数字电路或微控制器轻松实现。

PWM 的缺点:

1. 高频噪声:由于快速切换,PWM 信号可能产生高频噪声,需要滤波以减小干扰。

2. 硬件要求:某些应用需要特定的硬件支持,如支持 PWM 输入的微控制器或电路。

八、常见问题

1. 如何验证所产生的 PWM 信号?

可以使用示波器检测 PWM 输出,查看频率、占空比和波形的完整性。确保波形按照设计参数正常工作,必要时进行调整。

2. PWM 的信号的频率如何选择?

频率的选择通常取决于具体应用,根据自己的项目需要来选择: (1)电机控制:常用频率为 1 kHz 到 20 kHz,以确保足够的反应速度和控制精度。 (2)LED 调光:频率通常在 1 kHz 以上,以避免人眼感知到闪烁。 (3)音频信号:频率设置应高于音频信号的最高频率(例如,至少为 20 kHz)。

3. 什么是占空比,如何计算 PWM 的占空比?

占空比即是一个脉冲周期内,高电平的时间占整个周期 例如,如果 PWM 信号的高电平时间为 2 ms,周期为 10 ms,占空比 = (2 / 10) × 100 = 20%。