TMCStepper
Library supporting Trinamic Stepper Drivers for Arduino platforms
Loading...
Searching...
No Matches
TMC2240Stepper.h
Go to the documentation of this file.
1
7#pragma once
8
9#define INIT2240_REGISTER(REG) TMC2240_n::REG##_t REG##_register{}
10
37 public:
38 TMC2240Stepper(uint16_t pinCS, int8_t link_index = -1);
39 TMC2240Stepper(uint16_t pinCS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK, int8_t link_index = -1);
40
44 uint32_t Rref = 12000;
45 void begin();
46 void defaults();
47 void setSPISpeed(uint32_t speed);
48 void switchCSpin(bool state);
49 bool isEnabled();
50 void push();
51
52 // RW: GCONF
53 void GCONF(uint32_t input);
54 void fast_standstill(bool B);
55 void en_pwm_mode(bool B);
56 void multistep_filt(bool B);
57 void shaft(bool B);
58 void diag0_error(bool B);
59 void diag0_otpw(bool B);
60 void diag0_stall(bool B);
61 void diag1_stall(bool B);
62 void diag1_index(bool B);
63 void diag1_onstate(bool B);
64 void diag0_pushpull(bool B);
65 void diag1_pushpull(bool B);
66 void small_hysteresis(bool B);
67 void stop_enable(bool B);
68 void direct_mode(bool B);
69 uint32_t GCONF();
70 bool fast_standstill();
71 bool en_pwm_mode();
72 bool multistep_filt();
73 bool shaft();
74 bool diag0_error();
75 bool diag0_otpw();
76 bool diag0_stall();
77 bool diag1_stall();
78 bool diag1_index();
79 bool diag1_onstate();
80 bool diag0_pushpull();
81 bool diag1_pushpull();
82 bool small_hysteresis();
83 bool stop_enable();
84 bool direct_mode();
85
86 // R+WC: GSTAT
87 void GSTAT(uint8_t input);
88 uint8_t GSTAT();
89 bool reset();
90 bool drv_err();
91 bool uv_cp();
92 bool register_reset();
93 bool vm_uvlo();
94 // R: IFCNT
95
96 uint8_t IFCNT();
97
98 // W: NODECONF
99 void NODECONF(uint16_t input);
100 uint16_t NODECONF();
101 // Alias for parity with others
102 uint16_t SLAVECONF() { return NODECONF(); }
103 void SLAVECONF(uint16_t input) { NODECONF(input); }
104
105 void senddelay(uint8_t B);
106 uint8_t senddelay();
107 void nodeaddr(uint8_t B);
108 uint8_t nodeaddr();
109 void slaveaddr(uint8_t B) { nodeaddr(B); }
110 uint8_t slaveaddr() { return nodeaddr(); }
111
112 // R: IOIN
113 uint32_t IOIN();
114 bool step();
115 bool dir();
116 bool encb();
117 bool enca();
118 bool drv_enn();
119 bool encn();
120 bool uart_en();
121 bool comp_a();
122 bool comp_b();
123 bool comp_a1_a2();
124 bool comp_b1_b2();
125 bool output();
126 bool ext_res_det();
127 bool ext_clk();
128 bool adc_err();
129 uint8_t silicon_rv();
130 uint8_t version();
131
132 // W: DRV_CONF
133 void DRV_CONF(uint32_t input);
134 void current_range(uint8_t);
135 uint8_t current_range();
136 void slope_control(uint8_t);
137 uint8_t slope_control();
138 uint32_t DRV_CONF();
139
140 void GLOBAL_SCALER(uint8_t input);
141 uint8_t GLOBAL_SCALER();
142
143 // W: IHOLD_IRUN
144 void IHOLD_IRUN(uint32_t input);
145 uint32_t IHOLD_IRUN();
146 void ihold(uint8_t B);
147 void irun(uint8_t B);
148 void iholddelay(uint8_t B);
149 void irundelay(uint8_t B);
150 uint8_t ihold();
151 uint8_t irun();
152 uint8_t iholddelay();
153 uint8_t irundelay();
154
155 // W: TCOOLTHRS
156 uint32_t TCOOLTHRS();
157 void TCOOLTHRS( uint32_t input);
158
159 // W: THIGH
160 uint32_t THIGH();
161 void THIGH( uint32_t input);
162
163 // RW: CHOPCONF
164 void CHOPCONF(uint32_t input);
165 void toff(uint8_t B);
166 void hstrt(uint8_t B);
167 void hend(uint8_t B);
168 void fd3(bool B);
169 void disfdcc(bool B);
170 void chm(bool B);
171 void TBL(uint8_t B);
172 void vhighfs(bool B);
173 void vhighchm(bool B);
174 void tpfd(uint8_t B);
175 void mres(uint8_t B);
176 void intpol(bool B);
177 void dedge(bool B);
178 void diss2g(bool B);
179 void diss2vs(bool B);
180 uint32_t CHOPCONF();
181 uint8_t toff();
182 uint8_t hstrt();
183 uint8_t hend();
184 bool fd3();
185 bool disfdcc();
186 bool chm();
187 uint8_t TBL();
188 bool vhighfs();
189 bool vhighchm();
190 uint8_t tpfd();
191 uint8_t mres();
192 bool intpol();
193 bool dedge();
194 bool diss2g();
195 bool diss2vs();
196
197 // RW: COOLCONF
198 void COOLCONF(uint32_t B);
199 uint32_t COOLCONF();
200 void semin(uint8_t B);
201 void seup(uint8_t B);
202 void semax(uint8_t B);
203 void sedn(uint8_t B);
204 void seimin(bool B);
205 void sgt(int8_t B);
206 void sfilt(bool B);
207 uint8_t semin();
208 uint8_t seup();
209 uint8_t semax();
210 uint8_t sedn();
211 bool seimin();
212 int8_t sgt();
213 bool sfilt();
214
215 // RW: PWMCONF
216 void PWMCONF(uint32_t input);
217 void pwm_ofs(uint8_t B);
218 void pwm_grad(uint8_t B);
219 void pwm_freq(uint8_t B);
220 void pwm_autoscale(bool B);
221 void pwm_autograd(bool B);
222 void freewheel(uint8_t B);
223 void pwm_meas_sd_enable(bool B);
224 void pwm_dis_reg_stst(bool B);
225 void pwm_reg(uint8_t B);
226 void pwm_lim(uint8_t B);
227 uint32_t PWMCONF();
228 uint8_t pwm_ofs();
229 uint8_t pwm_grad();
230 uint8_t pwm_freq();
231 bool pwm_autoscale();
232 bool pwm_autograd();
233 uint8_t freewheel();
234 bool pwm_meas_sd_enable();
235 bool pwm_dis_reg_stst();
236 uint8_t pwm_reg();
237 uint8_t pwm_lim();
238
239 // R: PWM_SCALE
240 uint32_t PWM_SCALE();
241 uint8_t pwm_scale_sum();
242 int16_t pwm_scale_auto();
243
244 // R: PWM_AUTO
245 uint32_t PWM_AUTO();
246 uint8_t pwm_ofs_auto();
247 uint8_t pwm_grad_auto();
248
249 // R: MSCURACT
250 uint32_t MSCURACT();
251 int16_t cur_a();
252 int16_t cur_b();
253
254 uint32_t DRV_STATUS();
255 uint32_t SG_RESULT();
256 bool s2vsa();
257 bool s2vsb();
258 bool stealth();
259 bool fsactive();
260 uint16_t CS_ACTUAL();
261 bool stallguard();
262 bool ot();
263 bool otpw();
264 bool s2ga();
265 bool s2gb();
266 bool ola();
267 bool olb();
268 bool stst();
269
270 uint16_t bytesWritten = 0;
271 bool CRCerror = false;
272
273 void microsteps(uint16_t ms);
274 uint16_t microsteps();
275
276 uint8_t test_connection();
277 uint16_t MSCNT();
278
279 uint16_t cs2rms(uint8_t CS);
280 void rms_current(uint16_t mA);
281 void rms_current(uint16_t mA, float mult);
282 uint16_t rms_current();
283
284 void hysteresis_end(int8_t value);
285 int8_t hysteresis_end();
286 void hysteresis_start(uint8_t value);
287 uint8_t hysteresis_start();
288
289 uint8_t TPOWERDOWN();
290 void TPOWERDOWN(uint8_t input);
291
292 // RW: TPWMTHRS
293 uint32_t TPWMTHRS();
294 void TPWMTHRS( uint32_t input);
295
296 // R: TSTEP
297 uint32_t TSTEP();
298
305 uint32_t SG4_THRS();
306 void SG4_THRS(uint32_t input);
312 uint8_t sg4_thrs();
313 void sg4_thrs(uint8_t B);
319 bool sg4_filt_en();
320 void sg4_filt_en(bool B);
326 uint8_t sg4_angle_offset();
327 void sg4_angle_offset(uint8_t B);
328
333 uint32_t SG4_RESULT();
334 uint16_t sg4_result();
335
336 // RW: ADC_VSUPPLY_AIN
337 uint32_t ADC_VSUPPLY_AIN();
338
339 // RW: ADC_TEMP
340 uint32_t ADC_TEMP();
341
342 // RW: OTW_OV_VTH
343 uint32_t OTW_OV_VTH();
344 void OTW_OV_VTH(uint32_t input);
345 float get_ain_voltage(); // AIN × 305.2 µV
346 float get_vsupply_voltage(); // VSUPPLY × 9.732 mV
347 float get_chip_temperature(); // (ADC_TEMP - 2038) / 7.7
349 void set_overtemp_prewarn_celsius(float tempC);
351 void set_overvoltage_threshold_voltage(float volts);
352
354
355 protected:
371 // (46 Bytes)
372 /*
373 INIT2240_REGISTER(MSLUT0); // 4
374 INIT2240_REGISTER(MSLUT1); // 4
375 INIT2240_REGISTER(MSLUT2); // 4
376 INIT2240_REGISTER(MSLUT3); // 4
377 INIT2240_REGISTER(MSLUT4); // 4
378 INIT2240_REGISTER(MSLUT5); // 4
379 INIT2240_REGISTER(MSLUT6); // 4
380 INIT2240_REGISTER(MSLUT7); // 4
381 INIT2240_REGISTER(MSLUTSEL); // 4
382 INIT2240_REGISTER(MSLUTSTART); // 4
383 */
384
385 struct IFCNT_t { constexpr static uint8_t address = 0x02; };
386 struct TSTEP_t { constexpr static uint8_t address = 0x12; };
387 struct MSCNT_t { constexpr static uint8_t address = 0x6A; };
388
389 float calc_IFS_current_RMS();
390 uint32_t set_globalscaler(float current, float IFS_current_RMS);
391
394 uint8_t transfer(const uint8_t data);
395 void transferEmptyBytes(const uint8_t n);
396 void write(uint8_t addressByte, uint32_t config);
397 uint32_t read(uint8_t addressByte);
398
399 static constexpr uint8_t TMC_READ = 0x00, TMC_WRITE = 0x80;
400
401 SSwitch *sswitch = nullptr;
402
403 static constexpr uint8_t TMC2240_SYNC = 0x05;
404 static constexpr uint8_t replyDelay = 2;
405 static constexpr uint8_t abort_window = 5;
406 static constexpr uint8_t max_retries = 2;
407
408 uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t);
409 float holdMultiplier = 0.5;
410
411 static uint32_t spi_speed; // Default 2MHz
412 const uint16_t _pinCS;
414 static constexpr float default_RS = 0.11;
415
417 static int8_t chain_length;
418};
bool comp_b()
Definition IOIN.cpp:101
uint32_t CHOPCONF()
Definition CHOPCONF.cpp:102
void COOLCONF(uint32_t B)
void semax(uint8_t B)
uint8_t hstrt()
Definition CHOPCONF.cpp:124
INIT2240_REGISTER(TCOOLTHRS)
uint8_t GLOBAL_SCALER()
bool ext_res_det()
Definition IOIN.cpp:105
bool enca()
Definition IOIN.cpp:96
void seup(uint8_t B)
uint8_t iholddelay()
void beginTransaction()
static constexpr float default_RS
bool pwm_dis_reg_stst()
Definition PWMCONF.cpp:126
uint32_t GCONF()
Definition GCONF.cpp:118
bool multistep_filt()
Definition GCONF.cpp:142
void IHOLD_IRUN(uint32_t input)
uint32_t OTW_OV_VTH()
INIT2240_REGISTER(OTW_OV_VTH)
uint8_t tpfd()
Definition CHOPCONF.cpp:132
INIT2240_REGISTER(COOLCONF)
bool uart_en()
Definition IOIN.cpp:99
static constexpr uint8_t max_retries
INIT2240_REGISTER(SG4_THRS)
uint8_t ihold()
uint16_t SLAVECONF()
const uint16_t _pinCS
uint32_t SG4_RESULT()
uint8_t current_range()
Definition DRV_CONF.cpp:45
static constexpr uint8_t abort_window
bool en_pwm_mode()
Definition GCONF.cpp:141
uint64_t _sendDatagram(uint8_t[], const uint8_t, uint16_t)
uint16_t bytesWritten
float get_chip_temperature()
void NODECONF(uint16_t input)
Definition SLAVECONF.cpp:31
bool diag0_error()
Definition GCONF.cpp:144
uint16_t CS_ACTUAL()
TMC2240Stepper(uint16_t pinCS, int8_t link_index=-1)
static constexpr uint8_t TMC_READ
uint8_t irundelay()
INIT2240_REGISTER(NODECONF)
void setSPISpeed(uint32_t speed)
uint8_t sedn()
SW_SPIClass * TMC_SW_SPI
static constexpr uint8_t TMC2240_SYNC
bool diag0_otpw()
Definition GCONF.cpp:145
uint16_t rms_current()
uint8_t pwm_scale_sum()
static constexpr uint8_t replyDelay
INIT2240_REGISTER(GCONF)
void write(uint8_t addressByte, uint32_t config)
uint8_t slaveaddr()
INIT2240_REGISTER(CHOPCONF)
uint32_t ADC_VSUPPLY_AIN()
bool stop_enable()
Definition GCONF.cpp:153
uint16_t NODECONF()
Definition SLAVECONF.cpp:30
uint32_t SG_RESULT()
bool direct_mode()
Definition GCONF.cpp:154
uint8_t version()
Definition IOIN.cpp:109
void seimin(bool B)
uint8_t transfer(const uint8_t data)
INIT2240_REGISTER(TPOWERDOWN)
bool pwm_autograd()
Definition PWMCONF.cpp:123
uint8_t hysteresis_start()
bool diag1_index()
Definition GCONF.cpp:148
void set_overvoltage_threshold_voltage(float volts)
INIT2240_REGISTER(PWMCONF)
bool encn()
Definition IOIN.cpp:98
void set_overtemp_prewarn_celsius(float tempC)
uint8_t silicon_rv()
Definition IOIN.cpp:108
bool pwm_autoscale()
Definition PWMCONF.cpp:122
void GLOBAL_SCALER(uint8_t input)
INIT2240_REGISTER(IHOLD_IRUN)
uint32_t set_globalscaler(float current, float IFS_current_RMS)
static constexpr uint8_t TMC_WRITE
void switchCSpin(bool state)
bool drv_enn()
Definition IOIN.cpp:97
uint8_t mres()
Definition CHOPCONF.cpp:133
uint8_t semax()
void semin(uint8_t B)
uint8_t TBL()
Definition CHOPCONF.cpp:129
bool diag0_pushpull()
Definition GCONF.cpp:150
INIT2240_REGISTER(DRV_CONF)
uint8_t pwm_grad()
Definition PWMCONF.cpp:120
uint8_t pwm_freq()
Definition PWMCONF.cpp:121
bool shaft()
Definition GCONF.cpp:143
uint32_t IHOLD_IRUN()
void slaveaddr(uint8_t B)
bool comp_a1_a2()
Definition IOIN.cpp:102
void sfilt(bool B)
bool output()
Definition IOIN.cpp:104
bool diag1_pushpull()
Definition GCONF.cpp:151
float calc_IFS_current_RMS()
bool adc_err()
Definition IOIN.cpp:107
void endTransaction()
uint8_t pwm_ofs()
Definition PWMCONF.cpp:119
void transferEmptyBytes(const uint8_t n)
uint32_t DRV_CONF()
Definition DRV_CONF.cpp:37
bool fast_standstill()
Definition GCONF.cpp:140
uint32_t PWMCONF()
Definition PWMCONF.cpp:102
uint8_t pwm_lim()
Definition PWMCONF.cpp:128
bool dir()
Definition IOIN.cpp:94
uint8_t freewheel()
Definition PWMCONF.cpp:124
void GSTAT(uint8_t input)
uint8_t seup()
uint8_t semin()
void sedn(uint8_t B)
bool pwm_meas_sd_enable()
Definition PWMCONF.cpp:125
uint16_t cs2rms(uint8_t CS)
bool encb()
Definition IOIN.cpp:95
uint32_t read(uint8_t addressByte)
uint8_t hend()
Definition CHOPCONF.cpp:125
float get_vsupply_voltage()
INIT2240_REGISTER(THIGH)
bool small_hysteresis()
Definition GCONF.cpp:152
uint16_t microsteps()
uint8_t status_response
INIT2240_REGISTER(GLOBAL_SCALER)
bool diag1_stall()
Definition GCONF.cpp:147
bool diag1_onstate()
Definition GCONF.cpp:149
float get_overtemp_prewarn_celsius()
uint32_t COOLCONF()
void CHOPCONF(uint32_t input)
Definition CHOPCONF.cpp:103
uint8_t pwm_reg()
Definition PWMCONF.cpp:127
uint8_t irun()
int8_t sgt()
Definition COOLCONF.cpp:69
uint8_t pwm_grad_auto()
static int8_t chain_length
void SLAVECONF(uint16_t input)
INIT2240_REGISTER(TPWMTHRS)
float get_overvoltage_threshold_voltage()
void DRV_CONF(uint32_t input)
Definition DRV_CONF.cpp:38
void PWMCONF(uint32_t input)
Definition PWMCONF.cpp:103
int16_t pwm_scale_auto()
uint8_t toff()
Definition CHOPCONF.cpp:123
uint8_t test_connection()
uint8_t sg4_angle_offset()
bool step()
Definition IOIN.cpp:93
uint8_t senddelay()
Definition SLAVECONF.cpp:37
bool diag0_stall()
Definition GCONF.cpp:146
bool comp_b1_b2()
Definition IOIN.cpp:103
uint32_t DRV_STATUS()
uint32_t IOIN()
Definition IOIN.cpp:92
void GCONF(uint32_t input)
Definition GCONF.cpp:119
bool comp_a()
Definition IOIN.cpp:100
static uint32_t spi_speed
bool ext_clk()
Definition IOIN.cpp:106
INIT2240_REGISTER(GSTAT)
uint8_t slope_control()
Definition DRV_CONF.cpp:46
uint8_t nodeaddr()
Definition SLAVECONF.cpp:35
uint16_t sg4_result()
static constexpr uint8_t address
static constexpr uint8_t address
static constexpr uint8_t address