fix_pulse_output.lua 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. --[[
  2. @module test_ioqueue
  3. @summary IO队列功能测试
  4. @version 1.0
  5. @date 2025.10.18
  6. @author 孟伟
  7. @usage
  8. 本功能模块演示的内容为:
  9. 高精度固定间隔脉冲输出功能
  10. 输出脉冲信息:
  11. 输出固定间隔对称方波
  12. - 低电平持续时间:20微秒(固定)
  13. - 高电平持续时间:20微秒(固定)
  14. - 脉冲周期:40微秒(完整周期)
  15. - 占空比50%
  16. - 脉冲数量:41个完整周期(通过循环40次生成)
  17. - 使用ioqueue.setdelay的连续模式,所有延时间隔自动保持20us
  18. 本文件没有对外接口,直接在main.lua中require "fix_pulse_output"就可以加载运行;
  19. ]]
  20. -- 选好硬件定时器和输出引脚,这里使用硬件定时器0,输出引脚2
  21. local hw_timer_id, out_pin = 0, 2
  22. function fix_pulse_output_fun()
  23. local _, tick_us = mcu.tick64()
  24. --确保为GPIO功能
  25. gpio.setup(out_pin, nil, nil)
  26. -- 第一步:初始化
  27. -- 100个命令,循环10次(生成100个脉冲)
  28. ioqueue.init(hw_timer_id, 100, 10)
  29. -- 设置GPIO为输出模式,初始输出高电平
  30. ioqueue.setgpio(hw_timer_id, out_pin, false, 0, 1)
  31. -- 第二步:配置连续延时模式
  32. ioqueue.setdelay(hw_timer_id, 20, tick_us - 3, true)
  33. -- 第三步:生成脉冲序列
  34. -- 每个循环生成1个完整周期:低电平20us + 高电平20us = 40us周期
  35. for i = 0, 40, 1 do
  36. ioqueue.output(hw_timer_id, out_pin, 0) -- 输出低电平
  37. ioqueue.delay(hw_timer_id) -- 延时20us
  38. ioqueue.output(hw_timer_id, out_pin, 1) -- 输出高电平
  39. ioqueue.delay(hw_timer_id) -- 延时20us
  40. end
  41. -- 第四步:执行
  42. ioqueue.start(hw_timer_id)
  43. -- 等待执行完成,系统会在完成时发布这个事件
  44. sys.waitUntil("IO_QUEUE_DONE_" .. hw_timer_id)
  45. -- 停止硬件定时器
  46. ioqueue.stop(hw_timer_id)
  47. -- 释放硬件定时器资源,可以重新分配使用
  48. ioqueue.release(hw_timer_id)
  49. end
  50. sys.taskInit(fix_pulse_output_fun)