pwm_test.lua 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. --[[
  2. @module pwm_app
  3. @summary PWM 输出功能模块
  4. @version 1.0
  5. @date 2025.10.29
  6. @author 马梦阳
  7. @usage
  8. 本功能模块演示的内容为:
  9. 1. 旧风格 PWM 演示:
  10. 使用 pwm.open() 完成 PWM 通道的配置与启动
  11. 使用 pwm.close() 关闭 PWM 通道
  12. 旧风格 PWM 接口不支持单独配置和动态调整占空比和信号频率
  13. 2. 新风格 PWM 演示:
  14. 使用 pwm.setup() 完成 PWM 通道的配置
  15. 使用 pwm.start() 启动 PWM 输出
  16. 使用 pwm.setDuty() 动态调整占空比
  17. 使用 pwm.setFreq() 动态调整信号频率
  18. 使用 pwm.stop() 停止 PWM 输出
  19. 新风格 PWM 接口支持在运行中动态调整占空比和信号频率
  20. 3. 综合任务调度:顺序运行上述两种风格示例,并在关键节点进行日志输出
  21. 注意事项:
  22. 1. 本 demo 演示所使用的是 Air8000 模组的 PWM0 通道(GPIO21,PIN24);
  23. 2. 该引脚需要通过 LuatIO 工具进行复用配置,pins_Air8000.json 文件即复用配置后生成的文件;
  24. 3. 关于 LuatIO 工具的使用介绍以及如何生成 json 文件,请参考 https://docs.openluat.com/air780epm/common/luatio/;
  25. 3. 将通过 LuatIO 工具配置好复用关系后生成的 json 文件与脚本文件一同烧录到模组中即可实现 PWM 输出功能;
  26. 本文件没有对外接口,直接在 main.lua 中 require "pwm_app" 就可以加载运行;
  27. ]]
  28. --[[
  29. 旧风格 PWM 演示函数
  30. 使用 pwm.open() 一次性完成配置和启动
  31. 适合固定频率/占空比、无需中途调整的场景
  32. ]]
  33. local function task1_old_pwm()
  34. log.info("PWM", "旧风格 PWM 示例开始")
  35. -- 选择 PWM 通道 4
  36. -- 注意:本 demo 演示所使用的是 Air8000 模组的 PWM0 通道(GPIO21,PIN24);
  37. -- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
  38. local pwm_channel = 0
  39. -- 第一次输出:1 kHz,45% 占空比,分频精度 100
  40. local pwm_success = pwm.open(pwm_channel, 1000, 45, 0, 100)
  41. if pwm_success then
  42. log.info("PWM", "PWM0 通道开启成功: 信号频率 1000 Hz, 分频精度 100, 占空比 45%")
  43. else
  44. log.info("PWM", "PWM0 通道开启失败")
  45. end
  46. -- 持续 1 s 后关闭
  47. sys.wait(5000)
  48. pwm.close(pwm_channel)
  49. log.info("PWM", "PWM0 通道已关闭")
  50. -- 增加 1 秒的间隔时间
  51. sys.wait(2000)
  52. -- 第二次输出:500 Hz,60% 占空比,分频精度 100
  53. local pwm_success = pwm.open(pwm_channel, 500, 60, 0, 100)
  54. if pwm_success then
  55. log.info("PWM", "PWM0 通道开启成功: 信号频率 500 Hz, 分频精度 100, 占空比 60%")
  56. else
  57. log.info("PWM", "PWM0 通道开启失败")
  58. end
  59. -- 持续 2 s 后关闭
  60. sys.wait(5000)
  61. pwm.close(pwm_channel)
  62. log.info("PWM", "PWM0 通道已关闭")
  63. -- 增加 1 秒的间隔时间
  64. sys.wait(2000)
  65. -- 第三次输出:300 Hz,80% 占空比,分频精度 100
  66. local pwm_success = pwm.open(pwm_channel, 300, 80, 0, 100)
  67. if pwm_success then
  68. log.info("PWM", "PWM0 通道开启成功: 信号频率 300 Hz, 分频精度 100, 占空比 80%")
  69. else
  70. log.info("PWM", "PWM0 通道开启失败")
  71. end
  72. -- 持续 3 s 后关闭
  73. sys.wait(5000)
  74. pwm.close(pwm_channel)
  75. log.info("PWM", "PWM0 通道已关闭")
  76. log.info("PWM", "旧风格 PWM 示例结束")
  77. end
  78. --[[
  79. 新风格 PWM 演示函数
  80. 使用 pwm.setup() 分步完成配置与启动,支持运行中动态修改频率和占空比
  81. 适合需要实时调节输出参数的场景
  82. ]]
  83. local function task2_new_pwm()
  84. sys.wait(30000)
  85. log.info("PWM", "新风格 PWM 示例开始")
  86. -- 选择 PWM 通道 4
  87. -- 注意:本 demo 演示所使用的是 Air8000 模组的 PWM0 通道(GPIO21,PIN24);
  88. -- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
  89. local pwm_channel = 0
  90. -- 配置 PWM 参数:频率 1000 Hz、占空比 50%、分频精度 100
  91. local setup_success = pwm.setup(pwm_channel, 1000, 50, 0, 100)
  92. if setup_success then
  93. log.info("PWM", "PWM0 配置成功: 信号频率 1000 Hz, 分频精度 100, 占空比 50%")
  94. else
  95. log.info("PWM", "PWM0 配置失败")
  96. end
  97. -- 启动 PWM 输出
  98. local pwm_success = pwm.start(pwm_channel)
  99. if pwm_success then
  100. log.info("PWM", "PWM0 启动成功")
  101. else
  102. log.info("PWM", "PWM0 启动失败")
  103. end
  104. -- 持续输出 2 秒
  105. sys.wait(10000)
  106. -- 动态调整占空比至 25%
  107. local setduty_success = pwm.setDuty(pwm_channel, 25)
  108. if setduty_success then
  109. log.info("PWM", "PWM0 占空比更新为 25%")
  110. else
  111. log.info("PWM", "PWM0 占空比设置失败")
  112. end
  113. -- 持续输出 2 秒
  114. sys.wait(10000)
  115. -- 动态调整信号频率为 2000 Hz
  116. -- local setfreq_success = pwm.setFreq(pwm_channel, 2000)
  117. -- if setfreq_success then
  118. -- log.info("PWM", "PWM0 频率更新为 2000 Hz")
  119. -- else
  120. -- log.error("PWM", "PWM0 频率设置失败")
  121. -- end
  122. -- -- 持续输出 2 秒
  123. -- sys.wait(2000)
  124. -- 停止 PWM 输出
  125. local pwm_success = pwm.stop(pwm_channel)
  126. if pwm_success then
  127. log.info("PWM", "PWM0 停止成功")
  128. else
  129. log.info("PWM", "PWM0 停止失败")
  130. end
  131. log.info("PWM", "新风格 PWM 示例结束")
  132. end
  133. local function task3_pwm_test()
  134. sys.wait(30000)
  135. log.info("PWM", "输出0-5V变化电压测试")
  136. -- 选择 PWM 通道 4
  137. -- 注意:本 demo 演示所使用的是 Air8000 模组的 PWM0 通道(GPIO21,PIN24);
  138. -- 该引脚需要通过 LuatIO 工具进行复用配置,详细说明看最顶部的注意事项;
  139. local pwm_channel = 0
  140. -- 配置 PWM 参数:频率 1000 Hz、占空比 50%、分频精度 100
  141. local setup_success = pwm.setup(pwm_channel, 1000, 100, 0, 100)
  142. if setup_success then
  143. log.info("PWM", "PWM0 配置成功: 信号频率 1000 Hz, 分频精度 100, 占空比 100%")
  144. else
  145. log.info("PWM", "PWM0 配置失败")
  146. end
  147. -- 启动 PWM 输出
  148. local pwm_success = pwm.start(pwm_channel)
  149. if pwm_success then
  150. log.info("PWM", "PWM0 启动成功")
  151. else
  152. log.info("PWM", "PWM0 启动失败")
  153. end
  154. while true do
  155. -- 持续输出 2 秒
  156. sys.wait(1000)
  157. -- 动态调整占空比至 25%
  158. local setduty0_success = pwm.setDuty(pwm_channel, 0)
  159. if setduty0_success then
  160. log.info("PWM", "PWM0 占空比更新为 0%")
  161. else
  162. log.info("PWM", "PWM0 占空比设置失败")
  163. end
  164. sys.wait(1000)
  165. local setduty5_success = pwm.setDuty(pwm_channel, 100)
  166. if setduty5_success then
  167. log.info("PWM", "PWM0 占空比更新为 100%")
  168. else
  169. log.info("PWM", "PWM0 占空比设置失败")
  170. end
  171. end
  172. -- 停止 PWM 输出
  173. local pwm_success = pwm.stop(pwm_channel)
  174. if pwm_success then
  175. log.info("PWM", "PWM0 停止成功")
  176. else
  177. log.info("PWM", "PWM0 停止失败")
  178. end
  179. log.info("PWM", "新风格 PWM 示例结束")
  180. end
  181. --[[
  182. 主演示任务:
  183. 顺序调用旧风格与新风格 PWM 示例函数
  184. 并在两者之间插入 3 秒间隔方便区分新旧风格示例输出情况
  185. ]]
  186. local function pwm_demo_task()
  187. log.info("PWM", "PWM 综合演示任务开始")
  188. -- 运行旧风格 PWM 示例
  189. -- task1_old_pwm()
  190. -- 间隔 3 秒
  191. -- sys.wait(3000)
  192. -- 运行新风格 PWM 示例
  193. -- task2_new_pwm()
  194. task3_pwm_test()
  195. log.info("PWM", "PWM 综合演示任务结束")
  196. end
  197. -- 创建并启动一个 task
  198. -- 用于运行 pwm_demo_task 函数
  199. sys.taskInit(pwm_demo_task)