single_phase_encoder.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-07-17 Wu Han The first version
  9. */
  10. #include "single_phase_encoder.h"
  11. #define DBG_SECTION_NAME "single_phase_encoder"
  12. #define DBG_LEVEL DBG_LOG
  13. #include <rtdbg.h>
  14. struct single_phase_encoder
  15. {
  16. struct encoder enc;
  17. rt_base_t pin; /* interrupt pin */
  18. };
  19. static void encoder_isr(void *args)
  20. {
  21. rt_int32_t* pulse_count = (rt_int32_t*)args;
  22. (*pulse_count)++;
  23. }
  24. static rt_err_t single_phase_encoder_enable(void *enc)
  25. {
  26. single_phase_encoder_t enc_sub = (single_phase_encoder_t)enc;
  27. // Attach interrupts
  28. rt_pin_mode(enc_sub->pin, PIN_MODE_INPUT_PULLUP);
  29. rt_pin_attach_irq(enc_sub->pin, PIN_IRQ_MODE_FALLING, encoder_isr, &(enc_sub->enc.pulse_count));
  30. enc_sub->enc.last_time = rt_tick_get();
  31. return rt_pin_irq_enable(enc_sub->pin, PIN_IRQ_ENABLE);
  32. }
  33. static rt_err_t single_phase_encoder_disable(void *enc)
  34. {
  35. single_phase_encoder_t enc_sub = (single_phase_encoder_t)enc;
  36. return rt_pin_irq_enable(enc_sub->pin, PIN_IRQ_DISABLE);;
  37. }
  38. static rt_err_t single_phase_encoder_destroy(void *enc)
  39. {
  40. single_phase_encoder_disable(enc);
  41. single_phase_encoder_t enc_sub = (single_phase_encoder_t)enc;
  42. rt_pin_detach_irq(enc_sub->pin);
  43. rt_free(enc);
  44. return RT_EOK;
  45. }
  46. single_phase_encoder_t single_phase_encoder_create(rt_base_t pin, rt_uint16_t pulse_revol, rt_uint16_t sample_time)
  47. {
  48. // Malloc memory and initialize pulse_count and pin
  49. single_phase_encoder_t new_encoder = (single_phase_encoder_t)encoder_create(sizeof(struct single_phase_encoder), sample_time);
  50. if(new_encoder == RT_NULL)
  51. {
  52. return RT_NULL;
  53. }
  54. new_encoder->pin = pin;
  55. new_encoder->enc.pulse_revol = pulse_revol;
  56. new_encoder->enc.enable = single_phase_encoder_enable;
  57. new_encoder->enc.disable = single_phase_encoder_disable;
  58. new_encoder->enc.destroy = single_phase_encoder_destroy;
  59. return new_encoder;
  60. }