跳转至

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()之后后面不要加任何语句!!!!!