wheel.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 "wheel.h"
  11. #define DBG_SECTION_NAME "wheel"
  12. #define DBG_LEVEL DBG_LOG
  13. #include <rtdbg.h>
  14. wheel_t wheel_create(motor_t w_motor, encoder_t w_encoder, controller_t w_controller, float radius, rt_uint16_t gear_ratio)
  15. {
  16. // 1. Malloc memory for wheel
  17. wheel_t new_wheel = (wheel_t) rt_malloc(sizeof(struct wheel));
  18. if(new_wheel == RT_NULL)
  19. {
  20. LOG_E("Falied to allocate memory for new wheel");
  21. return RT_NULL;
  22. }
  23. // 2. Initialize wheel
  24. new_wheel -> w_motor = w_motor;
  25. new_wheel -> w_encoder = w_encoder;
  26. new_wheel -> w_controller = w_controller;
  27. new_wheel -> radius = radius;
  28. new_wheel -> gear_ratio = gear_ratio;
  29. return new_wheel;
  30. }
  31. rt_err_t wheel_destroy(wheel_t whl)
  32. {
  33. RT_ASSERT(whl != RT_NULL);
  34. LOG_D("Free wheel");
  35. motor_destroy(whl->w_motor);
  36. encoder_destroy(whl->w_encoder);
  37. controller_destroy(whl->w_controller);
  38. rt_free(whl);
  39. return RT_EOK;
  40. }
  41. rt_err_t wheel_enable(wheel_t whl)
  42. {
  43. RT_ASSERT(whl != RT_NULL);
  44. LOG_D("Enabling wheel");
  45. // Enable PWM for motor
  46. motor_enable(whl->w_motor);
  47. // Enable Encoder's interrupt
  48. encoder_enable(whl->w_encoder);
  49. // Enable control
  50. controller_enable(whl->w_controller);
  51. return RT_EOK;
  52. }
  53. rt_err_t wheel_disable(wheel_t whl)
  54. {
  55. RT_ASSERT(whl != RT_NULL);
  56. LOG_D("Disabling wheel");
  57. // Disable PWM for motor
  58. motor_disable(whl->w_motor);
  59. // Disable Encoder's interrupt
  60. encoder_disable(whl->w_encoder);
  61. // Disable control
  62. controller_disable(whl->w_controller);
  63. return RT_EOK;
  64. }
  65. rt_err_t wheel_reset(wheel_t whl)
  66. {
  67. RT_ASSERT(whl != RT_NULL);
  68. // Reset Controller
  69. controller_reset(whl->w_controller);
  70. // Reset Motor
  71. motor_reset(whl->w_motor);
  72. // Reset Encoder
  73. encoder_reset(whl->w_encoder);
  74. return RT_EOK;
  75. }
  76. /** speed = rpm x 60 x 2 x PI x radius **/
  77. rt_err_t wheel_set_speed(wheel_t whl, double speed)
  78. {
  79. RT_ASSERT(whl != RT_NULL);
  80. return wheel_set_rpm(whl, (rt_int16_t) (speed / 60.0 / 2.0 / whl->radius / PI));
  81. }
  82. rt_err_t wheel_set_rpm(wheel_t whl, rt_int16_t rpm)
  83. {
  84. RT_ASSERT(whl != RT_NULL);
  85. controller_set_target(whl->w_controller, rpm);
  86. if(whl->w_controller->target == rpm)
  87. {
  88. return RT_EOK;
  89. }
  90. else
  91. {
  92. return RT_ERROR;
  93. }
  94. }
  95. void wheel_update(wheel_t whl)
  96. {
  97. RT_ASSERT(whl != RT_NULL);
  98. // Get current rpm
  99. whl->rpm = encoder_measure_rpm(whl->w_encoder);
  100. // Automatic control calculation
  101. controller_update(whl->w_controller, whl->rpm);
  102. // Set speed
  103. motor_run(whl->w_motor, whl->w_controller->output);
  104. }
  105. void wheel_stop(wheel_t whl)
  106. {
  107. RT_ASSERT(whl != RT_NULL);
  108. motor_stop(whl->w_motor);
  109. }