forked from grblHAL/Plugins_motor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrinamic.h
256 lines (217 loc) · 6.79 KB
/
trinamic.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/*
motors/trinamic.h - Trinamic stepper driver plugin
Part of grblHAL
Copyright (c) 2018-2021 Terje Io
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TRINAMIC_H_
#define _TRINAMIC_H_
#ifdef ARDUINO
#include "../driver.h"
#else
#include "driver.h"
#endif
#if TRINAMIC_ENABLE
#if TRINAMIC_ENABLE == 2130
#define R_SENSE 110
#include "../trinamic/tmc2130hal.h"
#endif
#if TRINAMIC_ENABLE == 2209
#define R_SENSE 110
#include "../trinamic/tmc2209hal.h"
#endif
#if TRINAMIC_ENABLE == 5160
#define R_SENSE 75
#include "../trinamic/tmc5160hal.h"
#endif
#if TRINAMIC_ENABLE == 2209
#define TMC_STALLGUARD 4
#else
#define TMC_STALLGUARD 2
#endif
#define PWM_THRESHOLD_VELOCITY 0 // mm/min - 0 to disable, should be set > homing seek rate when enabled (use M913 to set at run time)
// General
#if TRINAMIC_MIXED_DRIVERS
#define TMC_X_ENABLE 0
#else
#define TMC_X_ENABLE 1 // Do not change
#endif
#define TMC_X_MONITOR 1
#define TMC_X_MICROSTEPS 16
#define TMC_X_R_SENSE R_SENSE // mOhm
#define TMC_X_CURRENT 500 // mA RMS
#define TMC_X_HOLD_CURRENT_PCT 50
#define TMC_X_SGT 22
#define TMC_X_HOME_FEED_SGT 22
#define TMC_X_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_X_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 1); \
stepper[motor]->hysteresis_end(motor, -1);
#if TRINAMIC_MIXED_DRIVERS
#define TMC_Y_ENABLE 0
#else
#define TMC_Y_ENABLE 1 // Do not change
#endif
#define TMC_Y_MONITOR 1
#define TMC_Y_MICROSTEPS 16
#define TMC_Y_R_SENSE R_SENSE // mOhm
#define TMC_Y_CURRENT 500 // mA RMS
#define TMC_Y_HOLD_CURRENT_PCT 50
#define TMC_Y_SGT 22
#define TMC_Y_HOME_FEED_SGT 22
#define TMC_Y_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_Y_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 1); \
stepper[motor]->hysteresis_end(motor, -1);
#if TRINAMIC_MIXED_DRIVERS
#define TMC_Z_ENABLE 0
#else
#define TMC_Z_ENABLE 1 // Do not change
#endif
#define TMC_Z_MONITOR 1
#define TMC_Z_MICROSTEPS 16
#define TMC_Z_R_SENSE R_SENSE // mOhm
#define TMC_Z_CURRENT 500 // mA RMS
#define TMC_Z_HOLD_CURRENT_PCT 50
#define TMC_Z_SGT 22
#define TMC_Z_HOME_FEED_SGT 22
#define TMC_Z_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_Z_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 1); \
stepper[motor]->hysteresis_end(motor, -1);
#ifdef A_AXIS
#if TRINAMIC_MIXED_DRIVERS
#define TMC_A_ENABLE 0
#else
#define TMC_A_ENABLE 1 // Do not change
#endif
#define TMC_A_MONITOR 1
#define TMC_A_MICROSTEPS 16
#define TMC_A_R_SENSE R_SENSE // mOhm
#define TMC_A_CURRENT 500 // mA RMS
#define TMC_A_HOLD_CURRENT_PCT 50
#define TMC_A_SGT 22
#define TMC_A_HOME_FEED_SGT 22
#define TMC_A_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_A_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 4); \
stepper[motor]->hysteresis_end(motor, -2);
#endif
#ifdef B_AXIS
#if TRINAMIC_MIXED_DRIVERS
#define TMC_B_ENABLE 0
#else
#define TMC_B_ENABLE 1 // Do not change
#endif
#define TMC_B_MONITOR 1
#define TMC_B_MICROSTEPS 16
#define TMC_B_R_SENSE R_SENSE // mOhm
#define TMC_B_CURRENT 500 // mA RMS
#define TMC_B_HOLD_CURRENT_PCT 50
#define TMC_B_SGT 22
#define TMC_B_HOME_FEED_SGT 22
#define TMC_B_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_B_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 4); \
stepper[motor]->hysteresis_end(motor, -2);
#endif
#ifdef C_AXIS
#if TRINAMIC_MIXED_DRIVERS
#define TMC_C_ENABLE 0
#else
#define TMC_C_ENABLE 1 // Do not change
#endif
#define TMC_C_MONITOR 1
#define TMC_C_MICROSTEPS 16
#define TMC_C_R_SENSE R_SENSE // mOhm
#define TMC_C_CURRENT 500 // mA RMS
#define TMC_C_HOLD_CURRENT_PCT 50
#define TMC_C_SGT 22
#define TMC_C_HOME_FEED_SGT 22
#define TMC_C_ADVANCED(motor) \
stepper[motor]->stealthChop(motor, 0); \
stepper[motor]->sg_filter(motor, 1); \
stepper[motor]->sg_stall_value(motor, TMC_C_SGT); \
stepper[motor]->sedn(motor, 1); \
stepper[motor]->semin(motor, 5); \
stepper[motor]->semax(motor, 2); \
stepper[motor]->toff(motor, 3); \
stepper[motor]->tbl(motor, 1); \
stepper[motor]->chopper_mode(motor, 0); \
stepper[motor]->hysteresis_start(motor, 4); \
stepper[motor]->hysteresis_end(motor, -2);
#endif
//
typedef struct {
uint16_t current; // mA
uint8_t hold_current_pct;
uint16_t r_sense; // mOhm
uint8_t microsteps;
trinamic_mode_t mode;
int16_t homing_sensitivity;
int16_t homing_feed_sensitivity;
} motor_settings_t;
typedef struct {
axes_signals_t driver_enable;
axes_signals_t homing_enable;
motor_settings_t driver[N_AXIS];
} trinamic_settings_t;
typedef void (*trinamic_on_drivers_init_ptr)(uint8_t n_motors, axes_signals_t enabled);
typedef struct {
trinamic_on_drivers_init_ptr on_drivers_init;
} trinamic_driver_if_t;
bool trinamic_init (void);
void trinamic_fault_handler (void);
void trinamic_warn_handler (void);
void trinamic_if_init (trinamic_driver_if_t *driver);
#endif // TRINAMIC_ENABLE
#endif