Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

102 lines
3.5KB

  1. #include "include/controller.h"
  2. int controller_init(controller_t *control)
  3. {
  4. gpio_init(BTN0_PIN,BTN0_MODE);
  5. controller_home(control);
  6. control->flags = control->stepper_a->flags | control->stepper_b->flags;
  7. return 0;
  8. }
  9. int controller_loop(controller_t *control){
  10. path_node_t *setpoint = (path_node_t*)control->path->current.next;
  11. //printf("start controller loop\n");
  12. while(setpoint->list.next != 0x0){
  13. if ((setpoint->point.x > 127) | (setpoint->point.x < 0) | (setpoint->point.y > 127) | (setpoint->point.y < 0 ) ) {
  14. printf("Controller Error, x and y value are out of range x: %i, y: %i\n", setpoint->point.x, setpoint->point.y);
  15. return CONTROLLER_ERR;
  16. }
  17. if (setpoint->modus == PATH_MOVE) {
  18. controller_raise_marker(control);
  19. } else {
  20. controller_lower_marker(control);
  21. }
  22. //printf("Controller: look up x: %i, y: %i\n", setpoint->point.x, setpoint->point.y);
  23. int16_t angle1 = lookup_table_angle1[setpoint->point.y][setpoint->point.x];
  24. int16_t angle2 = lookup_table_angle2[setpoint->point.y][setpoint->point.x];
  25. //printf("Controller: next setpoint A: %i, B: %i\n",angle1, angle2);
  26. stepper_set_setpoint(control->stepper_a, angle1, control->time_step);
  27. stepper_set_setpoint(control->stepper_b, angle2, control->time_step);
  28. xtimer_usleep(10000);
  29. thread_flags_wait_all(control->flags);
  30. setpoint = path_next(setpoint);
  31. }
  32. printf("controller loop done\n");
  33. return CONTROLLER_OK;
  34. }
  35. int controller_home(controller_t *control){
  36. stepper_disable(control->stepper_b);
  37. stepper_disable(control->stepper_a);
  38. while(gpio_read(BTN0_PIN)!=0)
  39. {
  40. }
  41. xtimer_usleep(1000000);
  42. stepper_enable(control->stepper_b);
  43. stepper_set_direction(control->stepper_b,STEPPER_FORWARD);
  44. while(gpio_read(BTN0_PIN)!=0){
  45. stepper_step(control->stepper_b);
  46. xtimer_usleep(3000);
  47. }
  48. stepper_enable(control->stepper_a);
  49. stepper_set_direction(control->stepper_a,STEPPER_REVERSE);
  50. stepper_set_direction(control->stepper_b,STEPPER_REVERSE);
  51. uint32_t homing_b_steps = stepper_get_count(control->stepper_a,1.92);
  52. uint32_t homing_a_steps= stepper_get_count(control->stepper_b,0.75);
  53. uint32_t homing_combined = homing_b_steps - homing_a_steps;
  54. for(uint32_t i = 0; i < homing_combined; i++)
  55. {
  56. stepper_step(control->stepper_b);
  57. xtimer_usleep(1000);
  58. }
  59. stepper_enable(control->stepper_b);
  60. for(uint32_t i = 0; i < homing_a_steps; i++)
  61. {
  62. stepper_step(control->stepper_b);
  63. stepper_step(control->stepper_a);
  64. xtimer_usleep(1000);
  65. }
  66. control->stepper_a->step_count = stepper_get_count(control->stepper_a,GB_MATH_PI/2.0);
  67. control->stepper_b->step_count = 0;
  68. float angle_a;
  69. float angle_b;
  70. stepper_get_angle(control->stepper_a, &angle_a);
  71. stepper_get_angle(control->stepper_b, &angle_b);
  72. //printf("angle1: %f, angle2 %f\n", angle1, angle2);
  73. printf("Angle A: %f, B: %f\n", angle_a, angle_b);
  74. while(gpio_read(BTN0_PIN)!=0)
  75. {
  76. }
  77. xtimer_usleep(500000);
  78. return 0;
  79. }
  80. void controller_raise_marker(controller_t *control)
  81. {
  82. servo_set(control->servo,SERVO_RAISED);
  83. if(!control->lifted){
  84. xtimer_usleep(100000);
  85. control->lifted = true;
  86. }
  87. }
  88. void controller_lower_marker(controller_t *control)
  89. {
  90. servo_set(control->servo,SERVO_LOWERED);
  91. if(control->lifted){
  92. xtimer_usleep(100000);
  93. control->lifted = false;
  94. }
  95. }