PWM

1、管脚图中标注了三个PWM信号,分别是PIN20:PWM1,PIN20:PWM0,PIN26:PWM4,但事实上并非只有这三个管脚可复用为PWM,可以复用为PWM的管脚如下:

2、从上图可以看出,模组有16个管脚可以复用为PWM;
3、虽然是16个管脚可以复用为PWM,但并不是这16个管脚可以同时使用;
-
16个管脚,可以复用的PWM是:PWM0,PWM1,PWM2,PWM4,最多只能同时使用4个,PWM0/1/2/4同时只能有一个管脚复用;
-
注意!没有PWM3,是PWM0-1-2-4,没有3,请不要用错了;
4、AONPWM,Always ON PWM,休眠状态下可以保持输出,AONPWM0-1,对应AONGPPIO23-25的复用,三个PWM都可以在休眠状态下保持输出;
注意!
AGPIO用作PWM功能时,需注意控制负载在可承受的范围(包括负载电容),否则PWM翻转时
会有较大的瞬时电流,造成其他AGPIO输出电压跌落;

5、PWM0/PWM0n,PWM1/PWM1n,PWM2/PWM2n,PWM4/PWM4n,为四对PWM互补信号,其中一路为高电平时另一路必为低电平;
注意!
AGPIO用作PWM功能时,需注意控制负载在可承受的范围(包括负载电容),否则PWM翻转时
会有较大的瞬时电流,造成其他AGPIO输出电压跌落;

6、在使用任何一个管脚的PWM功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;
关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

7、PWM相关LuatOS核心库 54 pwm - 合宙模组资料中心 ;
pwm(main.lua)
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "pwm_demo"
VERSION = "001.000.000"
--[[
注意1:部分 PWM 通道通常与 GPIO 引脚绑定,在使用前需要进行复用操作;
参考文档:https://docs.openluat.com/air780epm/common/luatio/;
注意2:PWM 核心库有两种 API 风格:
旧风格(基于pwm.open()):一步完成配置与启动,适合简单固定输出场景;
新风格(基于pwm.setup()):分步操作,支持动态调节占空比和频率,适合需要灵活控制的场景;
]]
log.info("main", PROJECT, VERSION)
-- Task1:旧 API 风格 PWM 输出示例;
local function task1_old_pwm()
log.info("Task1", "启动旧风格 PWM 示例(通道 4)")
local ch = 4
-- 打开 PWM4,并设置信号频率为 1 kHz,分频精度为 100,占空比为 100/100=100%,持续输出;
local pwm_success = pwm.open(ch, 1000, 100, 0, 2147483647) -- 2147483647
-- 判断通道开启情况;
if pwm_success then
log.info("Task1", "PWM4 通道开启成功")
else
log.info("Task1", "PWM4 通道开启失败")
end
-- 等待 3 秒;
sys.wait(3000)
-- 关闭 PWM4;
pwm.close(ch)
log.info("Task1", "PWM4 已关闭")
log.info("Task1", "Task1 结束")
end
-- Task 2:新 API 风格 PWM 输出示例(动态调节);
local function task2_new_pwm()
log.info("Task2", "启动新风格 PWM 示例(通道 4)")
local ch = 4
-- 配置 PWM4 通道:信号频率为 1 kHz,分频精度为 100,占空比为 100/100=100%,持续输出;
local setup_success = pwm.setup(ch, 1000, 100, 0, 100)
-- 判断 PWM 通道参数是否配置成功;
if setup_success then
log.info("Task2", "PWM4 配置成功,稍后可启动")
else
log.info("Task2", "PWM4 配置失败,检查通道或内存")
end
-- 启动 PWM4;
local pwm_success = pwm.start(ch)
if pwm_success then
log.info("Task2", "PWM4 启动成功,稍后可输出信号")
else
log.info("Task2", "PWM4 启动失败,检查通道或内存")
end
-- 等待 2 秒后调整占空比;
-- pwm.setDuty()接口的第二个参数依赖配置时的分频精度;
-- 若分频精度为 100,则此处设置的占空比为 25/100=25%;
sys.wait(2000)
local setduty_success = pwm.setDuty(ch, 25)
if setduty_success then
log.info("Task2", "PWM4 占空比更新为 25%")
else
log.info("Task2", "PWM4 占空比设置失败")
end
-- 再等 2 秒后调整频率;
sys.wait(2000)
local setfreq_success = pwm.setFreq(ch, 2000)
if setfreq_success then
log.info("Task2", "PWM4 频率更新为 2000 Hz")
else
log.error("Task2", "PWM4 频率设置失败")
end
-- 再等 2 秒后停止;
sys.wait(2000)
local pwm_success = pwm.stop(ch)
if pwm_success then
log.info("Task2", "PWM4 停止成功,通道资源已释放")
else
log.info("Task2", "PWM4 停止失败,检查通道或内存")
end
log.info("Task2", "Task2 结束")
end
-- 主演示任务;
local function pwm_demo_task()
log.info("MAIN", "启动 PWM 综合演示任务")
task1_old_pwm() -- 调用旧 API 演示
sys.wait(500) -- 短暂间隔
task2_new_pwm() -- 调用新 API 演示
sys.wait(500) -- 短暂间隔
log.info("MAIN", "PWM 综合演示任务结束")
end
-- 启动任务
sys.taskInit(pwm_demo_task)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!