tmc2130.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #ifndef TMC2130_H
  2. #define TMC2130_H
  3. //mode
  4. extern uint8_t tmc2130_mode;
  5. //holding and running currents
  6. extern uint8_t tmc2130_current_h[4];
  7. extern uint8_t tmc2130_current_r[4];
  8. //microstep resolution (0 means 256usteps, 8 means 1ustep
  9. extern uint8_t tmc2130_mres[4];
  10. //flags for axis stall detection
  11. extern uint8_t tmc2130_sg_thr[4];
  12. extern bool tmc2130_sg_stop_on_crash;
  13. extern uint8_t tmc2130_sg_crash; //crash mask
  14. extern uint8_t tmc2130_sg_meassure;
  15. extern uint32_t tmc2130_sg_meassure_cnt;
  16. extern uint32_t tmc2130_sg_meassure_val;
  17. extern uint8_t tmc2130_sg_homing_axes_mask;
  18. #define TMC2130_MODE_NORMAL 0
  19. #define TMC2130_MODE_SILENT 1
  20. #define TMC2130_WAVE_FAC1000_MIN 30
  21. #define TMC2130_WAVE_FAC1000_MAX 200
  22. #define TMC2130_WAVE_FAC1000_STP 1
  23. extern uint8_t tmc2130_home_enabled;
  24. extern uint8_t tmc2130_home_origin[2];
  25. extern uint8_t tmc2130_home_bsteps[2];
  26. extern uint8_t tmc2130_home_fsteps[2];
  27. extern uint8_t tmc2130_wave_fac[4];
  28. #pragma pack(push)
  29. #pragma pack(1)
  30. typedef struct
  31. {
  32. uint8_t toff:4;
  33. uint8_t hstr:3;
  34. uint8_t hend:4;
  35. uint8_t tbl:2;
  36. uint8_t res:3;
  37. } tmc2130_chopper_config_t;
  38. #pragma pack(pop)
  39. extern tmc2130_chopper_config_t tmc2130_chopper_config[4];
  40. //initialize tmc2130
  41. extern void tmc2130_init();
  42. //check diag pins (called from stepper isr)
  43. extern void tmc2130_st_isr(uint8_t last_step_mask);
  44. //update stall guard (called from st_synchronize inside the loop)
  45. extern bool tmc2130_update_sg();
  46. //temperature watching (called from )
  47. extern void tmc2130_check_overtemp();
  48. //enter homing (called from homeaxis before homing starts)
  49. extern void tmc2130_home_enter(uint8_t axes_mask);
  50. //exit homing (called from homeaxis after homing ends)
  51. extern void tmc2130_home_exit();
  52. //start stallguard meassuring for single axis
  53. extern void tmc2130_sg_meassure_start(uint8_t axis);
  54. //stop current stallguard meassuring and report result
  55. extern uint16_t tmc2130_sg_meassure_stop();
  56. extern void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_t current_r);
  57. //set holding current for any axis (M911)
  58. extern void tmc2130_set_current_h(uint8_t axis, uint8_t current);
  59. //set running current for any axis (M912)
  60. extern void tmc2130_set_current_r(uint8_t axis, uint8_t current);
  61. //print currents (M913)
  62. extern void tmc2130_print_currents();
  63. //set PWM_AMPL for any axis (M917)
  64. extern void tmc2130_set_pwm_ampl(uint8_t axis, uint8_t pwm_ampl);
  65. //set PWM_GRAD for any axis (M918)
  66. extern void tmc2130_set_pwm_grad(uint8_t axis, uint8_t pwm_ampl);
  67. extern uint16_t tmc2130_rd_MSCNT(uint8_t axis);
  68. extern uint32_t tmc2130_rd_MSCURACT(uint8_t axis);
  69. extern uint8_t tmc2130_usteps2mres(uint16_t usteps);
  70. #define tmc2130_mres2usteps(mres) ((uint16_t)256 >> mres)
  71. extern bool tmc2130_wait_standstill_xy(int timeout);
  72. extern void tmc2130_eeprom_load_config();
  73. extern void tmc2130_eeprom_save_config();
  74. #pragma pack(push)
  75. #pragma pack(1)
  76. struct
  77. {
  78. uint8_t mres:5; // mres - byte 0, bit 0..4 microstep resolution
  79. uint8_t reserved_0_0:2; // reserved - byte 0, bit 5..6
  80. uint8_t intpol:1; // intpol - byte 0, bit 7 linear interpolation to 255 usteps
  81. uint8_t pwm_ampl:8; // pwm_ampl - byte 1, bit 0..7 pwm amplitude for silent mode
  82. uint8_t pwm_grad:4; // pwm_grad - byte 2, bit 0..3 pwm gradient for silent mode
  83. uint8_t pwm_freq:2; // pwm_freq - byte 2, bit 4..5 pwm frequency for silent mode
  84. uint8_t reserved_2_0:2; // reserved - byte 2, bit 6..7
  85. uint16_t tcoolthrs:16; // tcoolthrs - byte 3..4 coolstep threshold / middle sensitivity
  86. int8_t sg_thrs:8; // sg_thrs - byte 5, bit 0..7 stallguard sensitivity in high power / middle sensitivity
  87. int8_t current_h:6; // current_h - byte 6, bit 0..5 holding current for high power mode
  88. uint8_t reserved_6_0:2; // reserved - byte 6, bit 6..7
  89. int8_t current_r:6; // current_r - byte 7, bit 0..5 running current for high power mode
  90. uint8_t reserved_7_0:2; // reserved - byte 7, bit 6..7
  91. int8_t home_sg_thrs:8; // sg_thrs - byte 8, bit 0..7 stallguard sensitivity for homing
  92. int8_t home_current:6; // current_r - byte 9, bit 0..5 running current for homing
  93. uint8_t reserved_9_0:2; // reserved - byte 9, bit 6..7
  94. int8_t home_dtcoolthrs:8; // dtcoolthrs - byte 10, bit 0..7 delta tcoolthrs for homing
  95. int8_t dtcoolthrs_low:8; // dtcoolthrs - byte 11, bit 0..7 delta tcoolthrs for low sensitivity (based on value for middle sensitivity)
  96. int8_t dtcoolthrs_high:8; // dtcoolthrs - byte 12, bit 0..7 delta tcoolthrs for high sensitivity (based on value for middle sensitivity)
  97. int8_t sg_thrs_low:8; // sg_thrs - byte 13, bit 0..7 stallguard sensitivity in high power / low sensitivity
  98. int8_t sg_thrs_high:8; // sg_thrs - byte 14, bit 0..7 stallguard sensitivity in high power / high sensitivity
  99. } tmc2130_axis_config;
  100. #pragma pack(pop)
  101. extern uint16_t tmc2130_get_res(uint8_t axis);
  102. extern void tmc2130_set_res(uint8_t axis, uint16_t res);
  103. extern uint8_t tmc2130_get_pwr(uint8_t axis);
  104. extern void tmc2130_set_pwr(uint8_t axis, uint8_t pwr);
  105. extern uint8_t tmc2130_get_inv(uint8_t axis);
  106. extern uint8_t tmc2130_get_dir(uint8_t axis);
  107. extern void tmc2130_set_dir(uint8_t axis, uint8_t dir);
  108. extern void tmc2130_do_step(uint8_t axis);
  109. extern void tmc2130_do_steps(uint8_t axis, uint16_t steps, uint8_t dir, uint16_t delay_us);
  110. extern void tmc2130_goto_step(uint8_t axis, uint8_t step, uint8_t dir, uint16_t delay_us, uint16_t microstep_resolution);
  111. extern void tmc2130_get_wave(uint8_t axis, uint8_t* data, FILE* stream);
  112. extern void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000);
  113. extern bool tmc2130_home_calibrate(uint8_t axis);
  114. #endif //TMC2130_H