ab_phase_encoder.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "ab_phase_encoder.h"
  2. #define DBG_SECTION_NAME "ab_phase_encoder"
  3. #define DBG_LEVEL DBG_LOG
  4. #include <rtdbg.h>
  5. struct ab_phase_encoder
  6. {
  7. struct encoder enc;
  8. rt_base_t pin_a; /* interrupt pin */
  9. rt_base_t pin_b;
  10. rt_int16_t last_value;
  11. };
  12. static const uint8_t AB_PHASE_ENCODER_TABLE[4] = {2, 0, 3, 1};
  13. static void encoder_isr(void *args)
  14. {
  15. ab_phase_encoder_t enc_sub = (ab_phase_encoder_t)args;
  16. int val = rt_pin_read(enc_sub->pin_a) * 2 + rt_pin_read(enc_sub->pin_b);
  17. // rt_kprintf("val:%d\n", val);
  18. if (AB_PHASE_ENCODER_TABLE[enc_sub->last_value] == val)
  19. {
  20. enc_sub->enc.dir = ENCODER_DIR_FORWARD;
  21. enc_sub->enc.pulse_count++;
  22. }
  23. else
  24. {
  25. enc_sub->enc.dir = ENCODER_DIR_BACKWARD;
  26. enc_sub->enc.pulse_count--;
  27. }
  28. enc_sub->last_value = val;
  29. }
  30. static rt_err_t ab_phase_encoder_enable(void *enc)
  31. {
  32. RT_ASSERT(enc != RT_NULL);
  33. ab_phase_encoder_t enc_sub = (ab_phase_encoder_t)enc;
  34. // Attach interrupts
  35. rt_pin_mode(enc_sub->pin_a, PIN_MODE_INPUT);
  36. rt_pin_mode(enc_sub->pin_b, PIN_MODE_INPUT);
  37. rt_pin_attach_irq(enc_sub->pin_a, PIN_IRQ_MODE_RISING_FALLING, encoder_isr, enc_sub);
  38. rt_pin_attach_irq(enc_sub->pin_b, PIN_IRQ_MODE_RISING_FALLING, encoder_isr, enc_sub);
  39. enc_sub->last_value = rt_pin_read(enc_sub->pin_a) * 2 + rt_pin_read(enc_sub->pin_b);
  40. enc_sub->enc.last_time = rt_tick_get();
  41. rt_pin_irq_enable(enc_sub->pin_a, PIN_IRQ_ENABLE);
  42. rt_pin_irq_enable(enc_sub->pin_b, PIN_IRQ_ENABLE);
  43. return RT_EOK;
  44. }
  45. static rt_err_t ab_phase_encoder_disable(void *enc)
  46. {
  47. RT_ASSERT(enc != RT_NULL);
  48. ab_phase_encoder_t enc_sub = (ab_phase_encoder_t)enc;
  49. rt_pin_irq_enable(enc_sub->pin_a, PIN_IRQ_DISABLE);
  50. rt_pin_irq_enable(enc_sub->pin_b, PIN_IRQ_DISABLE);
  51. return RT_EOK;
  52. }
  53. static rt_err_t ab_phase_encoder_destroy(void *enc)
  54. {
  55. RT_ASSERT(enc != RT_NULL);
  56. ab_phase_encoder_disable(enc);
  57. ab_phase_encoder_t enc_sub = (ab_phase_encoder_t)enc;
  58. rt_pin_detach_irq(enc_sub->pin_a);
  59. rt_pin_detach_irq(enc_sub->pin_b);
  60. rt_free(enc_sub);
  61. return RT_EOK;
  62. }
  63. ab_phase_encoder_t ab_phase_encoder_create(rt_base_t pin_a, rt_base_t pin_b, rt_uint16_t pulse_revol)
  64. {
  65. // Malloc memory and initialize pulse_count and pin
  66. ab_phase_encoder_t new_encoder = (ab_phase_encoder_t)encoder_create(sizeof(struct ab_phase_encoder));
  67. if(new_encoder == RT_NULL)
  68. {
  69. return RT_NULL;
  70. }
  71. new_encoder->pin_a = pin_a;
  72. new_encoder->pin_b = pin_b;
  73. new_encoder->last_value = 0;
  74. new_encoder->enc.pulse_revol = pulse_revol;
  75. new_encoder->enc.enable = ab_phase_encoder_enable;
  76. new_encoder->enc.disable = ab_phase_encoder_disable;
  77. new_encoder->enc.destroy = ab_phase_encoder_destroy;
  78. return new_encoder;
  79. }