encoder.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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-08-26 sogwms The first version
  9. */
  10. #ifndef __ENCODER_H__
  11. #define __ENCODER_H__
  12. #include <rtthread.h>
  13. #include <rtdevice.h>
  14. enum encoder_direction
  15. {
  16. ENCODER_DIR_FORWARD,
  17. ENCODER_DIR_BACKWARD,
  18. };
  19. typedef struct encoder *encoder_t;
  20. struct encoder
  21. {
  22. rt_int32_t pulse_count; /* absolute pulse number in total */
  23. rt_uint16_t pulse_revol; /* pulse number per revolution */
  24. rt_uint16_t sample_time; /* sample time in microseconds for speed measurement */
  25. rt_tick_t last_time;
  26. rt_int32_t last_count;
  27. rt_int16_t cps;
  28. enum encoder_direction dir;
  29. rt_err_t (*enable)(void *enc);
  30. rt_err_t (*disable)(void *enc);
  31. rt_err_t (*destroy)(void *enc);
  32. };
  33. encoder_t encoder_create(rt_size_t size, rt_uint16_t sample_time);
  34. rt_err_t encoder_destroy(encoder_t enc);
  35. rt_err_t encoder_enable(encoder_t enc); /* start measurement */
  36. rt_err_t encoder_disable(encoder_t enc); /* stop measurement */
  37. rt_err_t encoder_reset(encoder_t enc); /* set pulse_count to 0 */
  38. rt_err_t encoder_set_sample_time(encoder_t enc, rt_uint16_t sample_time); /* set sample time */
  39. /** rpm = pulse_count / sample_time(ms) / pulse_revol * 1000 * 60 **/
  40. rt_int32_t encoder_read(encoder_t enc); /* return pulse_count */
  41. rt_int16_t encoder_measure_cps(encoder_t enc); /* pulse_count per second */
  42. rt_int16_t encoder_measure_rpm(encoder_t enc); /* revolutions per minute */
  43. #endif