- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
182 lines
5.8 KiB
Lua
182 lines
5.8 KiB
Lua
--[[
|
||
@module pwm_app
|
||
@summary PWM 输出功能模块
|
||
@version 1.0
|
||
@date 2025.11.05
|
||
@author 马梦阳
|
||
@usage
|
||
本功能模块演示的内容为:
|
||
1. 旧风格 PWM 演示:
|
||
使用 pwm.open() 完成 PWM 通道的配置与启动
|
||
使用 pwm.close() 关闭 PWM 通道
|
||
旧风格 PWM 接口不支持单独配置和动态调整占空比和信号频率
|
||
2. 新风格 PWM 演示:
|
||
使用 pwm.setup() 完成 PWM 通道的配置
|
||
使用 pwm.start() 启动 PWM 输出
|
||
使用 pwm.setDuty() 动态调整占空比
|
||
使用 pwm.setFreq() 动态调整信号频率
|
||
使用 pwm.stop() 停止 PWM 输出
|
||
新风格 PWM 接口支持在运行中动态调整占空比和信号频率
|
||
3. 综合任务调度:顺序运行上述两种风格示例,并在关键节点进行日志输出
|
||
|
||
注意事项:
|
||
1. 本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27,PIN16);
|
||
2. 该引脚需要通过 LuatIO 工具进行复用配置,pins_Air780EPM.json 文件即复用配置后生成的文件;
|
||
3. 关于 LuatIO 工具的使用介绍以及如何生成 json 文件,请参考 https://docs.openluat.com/air780epm/common/luatio/;
|
||
3. 将通过 LuatIO 工具配置好复用关系后生成的 json 文件与脚本文件一同烧录到模组中即可实现 PWM 输出功能;
|
||
|
||
本文件没有对外接口,直接在 main.lua 中 require "pwm_app" 就可以加载运行;
|
||
]]
|
||
|
||
--[[
|
||
旧风格 PWM 演示函数
|
||
使用 pwm.open() 一次性完成配置和启动
|
||
适合固定频率/占空比、无需中途调整的场景
|
||
]]
|
||
local function task1_old_pwm()
|
||
log.info("PWM", "旧风格 PWM 示例开始")
|
||
|
||
-- 选择 PWM 通道 4
|
||
-- 注意:本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27,PIN16);
|
||
-- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
|
||
local pwm_channel = 4
|
||
|
||
-- 第一次输出:1 kHz,45% 占空比,分频精度 100
|
||
local pwm_success = pwm.open(pwm_channel, 1000, 45, 0, 100)
|
||
if pwm_success then
|
||
log.info("PWM", "PWM4 通道开启成功: 信号频率 1000 Hz, 分频精度 100, 占空比 45%")
|
||
else
|
||
log.info("PWM", "PWM4 通道开启失败")
|
||
end
|
||
|
||
-- 持续 1 s 后关闭
|
||
sys.wait(1000)
|
||
pwm.close(pwm_channel)
|
||
log.info("PWM", "PWM4 通道已关闭")
|
||
|
||
-- 增加 1 秒的间隔时间
|
||
sys.wait(1000)
|
||
|
||
-- 第二次输出:500 Hz,60% 占空比,分频精度 100
|
||
local pwm_success = pwm.open(pwm_channel, 500, 60, 0, 100)
|
||
if pwm_success then
|
||
log.info("PWM", "PWM4 通道开启成功: 信号频率 500 Hz, 分频精度 100, 占空比 60%")
|
||
else
|
||
log.info("PWM", "PWM4 通道开启失败")
|
||
end
|
||
|
||
-- 持续 2 s 后关闭
|
||
sys.wait(2000)
|
||
pwm.close(pwm_channel)
|
||
log.info("PWM", "PWM4 通道已关闭")
|
||
|
||
-- 增加 1 秒的间隔时间
|
||
sys.wait(1000)
|
||
|
||
-- 第三次输出:300 Hz,80% 占空比,分频精度 100
|
||
local pwm_success = pwm.open(pwm_channel, 300, 80, 0, 100)
|
||
if pwm_success then
|
||
log.info("PWM", "PWM4 通道开启成功: 信号频率 300 Hz, 分频精度 100, 占空比 80%")
|
||
else
|
||
log.info("PWM", "PWM4 通道开启失败")
|
||
end
|
||
|
||
-- 持续 3 s 后关闭
|
||
sys.wait(3000)
|
||
pwm.close(pwm_channel)
|
||
log.info("PWM", "PWM4 通道已关闭")
|
||
|
||
log.info("PWM", "旧风格 PWM 示例结束")
|
||
end
|
||
|
||
|
||
--[[
|
||
新风格 PWM 演示函数
|
||
使用 pwm.setup() 分步完成配置与启动,支持运行中动态修改频率和占空比
|
||
适合需要实时调节输出参数的场景
|
||
]]
|
||
local function task2_new_pwm()
|
||
log.info("PWM", "新风格 PWM 示例开始")
|
||
|
||
-- 选择 PWM 通道 4
|
||
-- 注意:本 demo 演示所使用的是 Air780EPM 模组的 PWM4 通道(GPIO27,PIN16);
|
||
-- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
|
||
local pwm_channel = 4
|
||
|
||
-- 配置 PWM 参数:频率 1000 Hz、占空比 50%、分频精度 100
|
||
local setup_success = pwm.setup(pwm_channel, 1000, 50, 0, 100)
|
||
if setup_success then
|
||
log.info("PWM", "PWM4 配置成功: 信号频率 1000 Hz, 分频精度 100, 占空比 50%")
|
||
else
|
||
log.info("PWM", "PWM4 配置失败")
|
||
end
|
||
|
||
-- 启动 PWM 输出
|
||
local pwm_success = pwm.start(pwm_channel)
|
||
if pwm_success then
|
||
log.info("PWM", "PWM4 启动成功")
|
||
else
|
||
log.info("PWM", "PWM4 启动失败")
|
||
end
|
||
|
||
-- 持续输出 2 秒
|
||
sys.wait(2000)
|
||
|
||
-- 动态调整占空比至 25%
|
||
local setduty_success = pwm.setDuty(pwm_channel, 25)
|
||
if setduty_success then
|
||
log.info("PWM", "PWM4 占空比更新为 25%")
|
||
else
|
||
log.info("PWM", "PWM4 占空比设置失败")
|
||
end
|
||
|
||
-- 持续输出 2 秒
|
||
sys.wait(2000)
|
||
|
||
-- 动态调整信号频率为 2000 Hz
|
||
local setfreq_success = pwm.setFreq(pwm_channel, 2000)
|
||
if setfreq_success then
|
||
log.info("PWM", "PWM4 频率更新为 2000 Hz")
|
||
else
|
||
log.error("PWM", "PWM4 频率设置失败")
|
||
end
|
||
|
||
-- 持续输出 2 秒
|
||
sys.wait(2000)
|
||
|
||
-- 停止 PWM 输出
|
||
local pwm_success = pwm.stop(pwm_channel)
|
||
if pwm_success then
|
||
log.info("PWM", "PWM4 停止成功")
|
||
else
|
||
log.info("PWM", "PWM4 停止失败")
|
||
end
|
||
|
||
log.info("PWM", "新风格 PWM 示例结束")
|
||
end
|
||
|
||
|
||
--[[
|
||
主演示任务:
|
||
顺序调用旧风格与新风格 PWM 示例函数
|
||
并在两者之间插入 3 秒间隔方便区分新旧风格示例输出情况
|
||
]]
|
||
local function pwm_demo_task()
|
||
log.info("PWM", "PWM 综合演示任务开始")
|
||
|
||
-- 运行旧风格 PWM 示例
|
||
task1_old_pwm()
|
||
|
||
-- 间隔 3 秒
|
||
sys.wait(3000)
|
||
|
||
-- 运行新风格 PWM 示例
|
||
task2_new_pwm()
|
||
|
||
log.info("PWM", "PWM 综合演示任务结束")
|
||
end
|
||
|
||
-- 创建并启动一个 task
|
||
-- 用于运行 pwm_demo_task 函数
|
||
sys.taskInit(pwm_demo_task)
|