選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

231 行
5.8KB

  1. #include "periph/gpio.h"
  2. #include "periph/uart.h"
  3. #include "include/stepper.h"
  4. #include "include/stepper_params.h"
  5. #include "include/sensor.h"
  6. #include "include/gb_math.h"
  7. #define ENABLE_DEBUG (0)
  8. #include "debug.h"
  9. #define STEP_PIN (stepper->p.step_pin)
  10. #define DIR_PIN (stepper->p.dir_pin)
  11. #define ENABLE_PIN (stepper->p.enable_pin)
  12. #define UART (stepper->p.uart)
  13. static void stepper_event(event_t *_event)
  14. {
  15. stepper_t *stepper = container_of(_event, stepper_t, event);
  16. stepper_step(stepper);
  17. stepper_update(stepper);
  18. }
  19. int stepper_init(stepper_t *stepper, const stepper_params_t *params)
  20. {
  21. stepper->p = *params;
  22. event_t event = { .handler = stepper_event };
  23. stepper->event = event;
  24. stepper->velocity_setpoint = 0.0;
  25. stepper->step_count = 0;
  26. stepper->time_step = 0;
  27. stepper->step_angle = GB_MATH_TAU / (float)(stepper->p.division * stepper->p.microstep);
  28. event_timeout_init(&(stepper->event_timeout), stepper->queue, (event_t*)&(stepper->event));
  29. gpio_init(STEP_PIN, GPIO_OUT);
  30. gpio_init(DIR_PIN, GPIO_OUT);
  31. gpio_init(ENABLE_PIN, GPIO_OD);
  32. stepper_enable(stepper);
  33. if(uart_init(UART, 38400, NULL, NULL))
  34. return STEPPER_ERR;
  35. le_uint32_t data;
  36. data.u32 = STEPPER_GCONF_VALUES;
  37. stepper_write(stepper, STEPPER_GCONF_ADDR, &data);
  38. data.u32 = STEPPER_CHOPCONF_VALUES;
  39. stepper_write(stepper, STEPPER_CHOPCONF_ADDR, &data);
  40. //event_post(stepper->queue, &(stepper->event));
  41. printf("initialized descriptor 0x%08x\n", (unsigned)stepper);
  42. printf("initialized event 0x%08x\n", (unsigned)&(stepper->event));
  43. printf("initialized queue 0x%08x\n", (unsigned)stepper->queue);
  44. return STEPPER_OK;
  45. }
  46. void stepper_set_setpoint(stepper_t *stepper, int16_t count, uint32_t time_step)
  47. {
  48. //Write the count to the setpoint field.
  49. stepper->step_setpoint = count;
  50. //Set direction
  51. if (stepper->step_setpoint < stepper->step_count)
  52. {
  53. stepper_set_direction(stepper, STEPPER_REVERSE);
  54. //Write the time_step to the time_step field.
  55. stepper->time_step = time_step/(stepper->step_count - stepper->step_setpoint);
  56. }
  57. else
  58. {
  59. stepper_set_direction(stepper, STEPPER_FORWARD);
  60. //Write the time_step to the time_step field.
  61. stepper->time_step = time_step/(stepper->step_setpoint - stepper->step_count);
  62. }
  63. if (stepper->time_step <= 400){
  64. stepper->time_step = 400;
  65. }
  66. //Call update to set a timeout.
  67. stepper_update(stepper);
  68. }
  69. void stepper_get_angle(stepper_t *stepper, float *angle)
  70. {
  71. *angle = stepper->step_count * stepper->step_angle;
  72. return;
  73. }
  74. int32_t stepper_get_count(stepper_t *stepper, float angle)
  75. {
  76. return (int32_t) gb_round(angle/stepper->step_angle);
  77. }
  78. void stepper_update(stepper_t *stepper)
  79. {
  80. // Set thread flags and return if the stepper is at the desired position.
  81. if(stepper->step_count == stepper->step_setpoint)
  82. {
  83. thread_flags_set(stepper->thread, stepper->flags);
  84. return;
  85. }
  86. // Set a new timeout event.
  87. event_timeout_set(&stepper->event_timeout, stepper->time_step);
  88. }
  89. /*
  90. int stepper_time_step(stepper_t *stepper){
  91. if (stepper->velocity_setpoint == 0.0) {
  92. return STEPPER_ERR;
  93. }
  94. float step_time = stepper->step_angle / stepper->velocity_setpoint;
  95. stepper->time_step = (uint32_t)(step_time*1000000.0);
  96. return STEPPER_OK;
  97. }
  98. */
  99. int stepper_step(stepper_t *stepper)
  100. {
  101. if (!stepper->enable) {
  102. return STEPPER_DISABLED;
  103. }
  104. if (stepper->direction == STEPPER_FORWARD)
  105. {
  106. stepper->step_count++;
  107. }
  108. else
  109. {
  110. stepper->step_count--;
  111. }
  112. gpio_toggle(STEP_PIN);
  113. //printf("Stepper %c @ %i\n", stepper->id, stepper->step_count);
  114. return STEPPER_OK;
  115. }
  116. uint8_t stepper_crc8(const uint8_t *data, size_t len, uint8_t g_polynom, uint8_t crc){
  117. for (size_t i=0; i < len; i++)
  118. {
  119. uint8_t current_byte = data[i];
  120. for (size_t i=0; i < 8; i++)
  121. {
  122. bool xor = (crc >> 7) ^ (current_byte & 0x01);
  123. crc = crc <<1;
  124. crc = xor ? crc ^ g_polynom : crc;
  125. current_byte = current_byte >> 1;
  126. }
  127. }
  128. return crc;
  129. }
  130. /*
  131. void stepper_set_velocity(stepper_t *stepper, float velocity)
  132. {
  133. if (velocity > 0)
  134. {
  135. stepper->velocity_setpoint = gb_min(velocity,20);//20
  136. stepper_set_direction(stepper, STEPPER_FORWARD);
  137. }
  138. else
  139. {
  140. stepper->velocity_setpoint = gb_min(-velocity,20);//20
  141. stepper_set_direction(stepper, STEPPER_REVERSE);
  142. }
  143. stepper_update(stepper);
  144. }
  145. */
  146. void stepper_set_direction(stepper_t *stepper, stepper_direction_t direction){
  147. stepper->direction = direction;
  148. if (direction == STEPPER_REVERSE)
  149. {
  150. gpio_set(DIR_PIN);
  151. }
  152. else
  153. {
  154. gpio_clear(DIR_PIN);
  155. }
  156. }
  157. void stepper_write(stepper_t *stepper, uint8_t reg, le_uint32_t *data)
  158. {
  159. uint8_t* message;
  160. message = (uint8_t*) malloc(8 * sizeof(uint8_t));
  161. message[0] = STEPPER_UART_SYNC;
  162. message[1] = STEPPER_UART_SLAVE_ADDR;
  163. message[2] = reg | 0x80;
  164. memcpy(&message[3], data->u8, 4);
  165. message[7] = 0x0;
  166. uint8_t crc = stepper_crc8(message, 7, 0x07, 0x0);
  167. message[7] = crc;
  168. uart_write(UART, message, 8);
  169. /* printf("\n");
  170. for (int i = 0; i<8; i++)
  171. {
  172. printf("%0.2x",message[i]);
  173. }
  174. printf("\n");
  175. */
  176. return;
  177. }
  178. void stepper_read(stepper_t *stepper, uint8_t reg)
  179. {
  180. uint8_t* message;
  181. message = (uint8_t*) malloc(4 * sizeof(uint8_t));
  182. message[0] = STEPPER_UART_SYNC;
  183. message[1] = STEPPER_UART_SLAVE_ADDR;
  184. message[2] = reg;
  185. message[3] = stepper_crc8(message, 3, 0x07, 0x0);
  186. uart_write(UART, message, 4);
  187. return;
  188. }
  189. void stepper_enable(stepper_t *stepper){
  190. stepper->enable = true;
  191. gpio_clear(ENABLE_PIN);
  192. }
  193. void stepper_disable(stepper_t *stepper){
  194. stepper->enable = false;
  195. gpio_set(ENABLE_PIN);
  196. }