rotary.lua 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. -- 旋转编码器
  2. -- 正反方向根据实际情况决定
  3. local s1_pin = pin.PC09
  4. local s2_pin = pin.PA10
  5. local pin_need = 1
  6. local s1_last = nil
  7. local s2_last = nil
  8. local s1_up = false
  9. local s2_up = false
  10. local s1_down = false
  11. local s2_down = false
  12. local _,us_tick = mcu.tick64()
  13. us_tick = us_tick * 1000 --低于1ms的当杂波去除,可以根据实际需要修改
  14. local function stage1()
  15. pin_need = 0
  16. -- log.info("wait down")
  17. ioqueue.exti(s1_pin, nil, gpio.FALLING, true)
  18. ioqueue.exti(s2_pin, nil, gpio.FALLING, true)
  19. end
  20. local function stage2()
  21. pin_need = 1
  22. -- log.info("wait up")
  23. ioqueue.exti(s1_pin, nil, gpio.RISING, true)
  24. ioqueue.exti(s2_pin, nil, gpio.RISING, true)
  25. s1_up,s2_up,s1_down,s2_down = false,false,false,false
  26. end
  27. local function s1_irq(val, tick)
  28. if gpio.get(s1_pin) ~= pin_need then return end
  29. if s1_last then
  30. local result,_ = mcu.dtick64(tick, s1_last, us_tick)
  31. if result then
  32. -- log.info("s1", mcu.dtick64(tick, s1_last))
  33. if pin_need > 0 then
  34. s1_up = true
  35. else
  36. s1_down = true
  37. end
  38. -- log.info("s1", s1_up, s1_down)
  39. else
  40. return
  41. end
  42. else
  43. -- log.info("s1")
  44. s1_up = true
  45. end
  46. if pin_need > 0 and s1_up and s2_up then
  47. stage1()
  48. end
  49. if s2_down then
  50. log.info("s2pin先检测到,右转+1")
  51. stage2()
  52. end
  53. s1_last = tick
  54. end
  55. local function s2_irq(val, tick)
  56. if gpio.get(s2_pin) ~= pin_need then return end
  57. if s2_last then
  58. local result,_ = mcu.dtick64(tick, s2_last, us_tick)
  59. if result then
  60. -- log.info("s2", mcu.dtick64(tick, s2_last))
  61. if pin_need > 0 then
  62. s2_up = true
  63. else
  64. s2_down = true
  65. end
  66. -- log.info("s2", s2_up, s2_down)
  67. else
  68. return
  69. end
  70. else
  71. -- log.info("s2")
  72. s2_check = true
  73. end
  74. if pin_need > 0 and s1_up and s2_up then
  75. stage1()
  76. end
  77. if s1_down then
  78. log.info("s1pin先检测到,左转+1")
  79. stage2()
  80. end
  81. s2_last = tick
  82. end
  83. sys.subscribe("IO_QUEUE_EXTI_" .. s1_pin, s1_irq)
  84. sys.subscribe("IO_QUEUE_EXTI_" .. s2_pin, s2_irq)
  85. function rotary_start()
  86. pin_need = 1
  87. ioqueue.exti(s1_pin, nil, gpio.RISING, true)
  88. ioqueue.exti(s2_pin, nil, gpio.RISING, true)
  89. -- sys.timerLoopStart(clear, 10000)
  90. end