encoder.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. #include <rtdevice.h>
  11. #include <encoder.h>
  12. #define DBG_SECTION_NAME "encoder"
  13. #define DBG_LEVEL DBG_LOG
  14. #include <rtdbg.h>
  15. encoder_t encoder_create(rt_size_t size, rt_uint16_t sample_time)
  16. {
  17. // Malloc memory and initialize
  18. encoder_t new_encoder = (encoder_t)rt_malloc(size);
  19. if(new_encoder == RT_NULL)
  20. {
  21. LOG_E("Failed to malloc memory for new encoder\n");
  22. return RT_NULL;
  23. }
  24. new_encoder->pulse_count = 0;
  25. new_encoder->last_count = 0;
  26. new_encoder->sample_time = sample_time;
  27. return new_encoder;
  28. }
  29. rt_err_t encoder_destroy(encoder_t enc)
  30. {
  31. LOG_D("Free Encoder");
  32. RT_ASSERT(enc != RT_NULL);
  33. return enc->destroy(enc);
  34. }
  35. rt_err_t encoder_enable(encoder_t enc)
  36. {
  37. LOG_D("Enabling encoder");
  38. RT_ASSERT(enc != RT_NULL);
  39. return enc->enable(enc);
  40. }
  41. rt_err_t encoder_disable(encoder_t enc)
  42. {
  43. LOG_D("Diabling encoder");
  44. RT_ASSERT(enc != RT_NULL);
  45. return enc->disable(enc);
  46. }
  47. rt_int32_t encoder_read(encoder_t enc)
  48. {
  49. RT_ASSERT(enc != RT_NULL);
  50. return enc->pulse_count;
  51. }
  52. rt_err_t encoder_reset(encoder_t enc)
  53. {
  54. RT_ASSERT(enc != RT_NULL);
  55. enc->pulse_count = 0;
  56. enc->last_count = 0;
  57. return RT_EOK;
  58. }
  59. rt_int16_t encoder_measure_cps(encoder_t enc)
  60. {
  61. RT_ASSERT(enc != RT_NULL);
  62. // return count per second
  63. if((rt_tick_get() - enc->last_time) < rt_tick_from_millisecond(enc->sample_time))
  64. {
  65. LOG_D("Encoder waiting ... ");
  66. return enc->cps;
  67. }
  68. rt_int32_t diff_count = enc->pulse_count - enc->last_count;
  69. enc->cps = diff_count * 1000 / enc->sample_time;
  70. enc->last_count = enc->pulse_count;
  71. enc->last_time = rt_tick_get();
  72. return enc->cps;
  73. }
  74. rt_int16_t encoder_measure_rpm(encoder_t enc)
  75. {
  76. RT_ASSERT(enc != RT_NULL);
  77. // return resolution per minute
  78. rt_int16_t res_rpm = encoder_measure_cps(enc) * 60 / enc->pulse_revol;
  79. return res_rpm;
  80. }
  81. rt_err_t encoder_set_sample_time(encoder_t enc, rt_uint16_t sample_time)
  82. {
  83. RT_ASSERT(enc != RT_NULL);
  84. enc->sample_time = sample_time;
  85. return RT_EOK;
  86. }