My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

stepper_indirection.cpp 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. /**
  23. * stepper_indirection.cpp
  24. *
  25. * Stepper motor driver indirection to allow some stepper functions to
  26. * be done via SPI/I2c instead of direct pin manipulation.
  27. *
  28. * Part of Marlin
  29. *
  30. * Copyright (c) 2015 Dominik Wenger
  31. */
  32. #include "stepper_indirection.h"
  33. #include "../inc/MarlinConfig.h"
  34. #include "../module/stepper.h"
  35. //
  36. // TMC26X Driver objects and inits
  37. //
  38. #if HAS_DRIVER(TMC26X)
  39. #include <SPI.h>
  40. #ifdef STM32F7
  41. #include "../HAL/HAL_STM32F7/TMC2660.h"
  42. #else
  43. #include <TMC26XStepper.h>
  44. #endif
  45. #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
  46. #if AXIS_DRIVER_TYPE(X, TMC26X)
  47. _TMC26X_DEFINE(X);
  48. #endif
  49. #if AXIS_DRIVER_TYPE(X2, TMC26X)
  50. _TMC26X_DEFINE(X2);
  51. #endif
  52. #if AXIS_DRIVER_TYPE(Y, TMC26X)
  53. _TMC26X_DEFINE(Y);
  54. #endif
  55. #if AXIS_DRIVER_TYPE(Y2, TMC26X)
  56. _TMC26X_DEFINE(Y2);
  57. #endif
  58. #if AXIS_DRIVER_TYPE(Z, TMC26X)
  59. _TMC26X_DEFINE(Z);
  60. #endif
  61. #if AXIS_DRIVER_TYPE(Z2, TMC26X)
  62. _TMC26X_DEFINE(Z2);
  63. #endif
  64. #if AXIS_DRIVER_TYPE(Z3, TMC26X)
  65. _TMC26X_DEFINE(Z3);
  66. #endif
  67. #if AXIS_DRIVER_TYPE(E0, TMC26X)
  68. _TMC26X_DEFINE(E0);
  69. #endif
  70. #if AXIS_DRIVER_TYPE(E1, TMC26X)
  71. _TMC26X_DEFINE(E1);
  72. #endif
  73. #if AXIS_DRIVER_TYPE(E2, TMC26X)
  74. _TMC26X_DEFINE(E2);
  75. #endif
  76. #if AXIS_DRIVER_TYPE(E3, TMC26X)
  77. _TMC26X_DEFINE(E3);
  78. #endif
  79. #if AXIS_DRIVER_TYPE(E4, TMC26X)
  80. _TMC26X_DEFINE(E4);
  81. #endif
  82. #if AXIS_DRIVER_TYPE(E5, TMC26X)
  83. _TMC26X_DEFINE(E5);
  84. #endif
  85. #define _TMC26X_INIT(A) do{ \
  86. stepper##A.setMicrosteps(A##_MICROSTEPS); \
  87. stepper##A.start(); \
  88. }while(0)
  89. void tmc26x_init_to_defaults() {
  90. #if AXIS_DRIVER_TYPE(X, TMC26X)
  91. _TMC26X_INIT(X);
  92. #endif
  93. #if AXIS_DRIVER_TYPE(X2, TMC26X)
  94. _TMC26X_INIT(X2);
  95. #endif
  96. #if AXIS_DRIVER_TYPE(Y, TMC26X)
  97. _TMC26X_INIT(Y);
  98. #endif
  99. #if AXIS_DRIVER_TYPE(Y2, TMC26X)
  100. _TMC26X_INIT(Y2);
  101. #endif
  102. #if AXIS_DRIVER_TYPE(Z, TMC26X)
  103. _TMC26X_INIT(Z);
  104. #endif
  105. #if AXIS_DRIVER_TYPE(Z2, TMC26X)
  106. _TMC26X_INIT(Z2);
  107. #endif
  108. #if AXIS_DRIVER_TYPE(Z3, TMC26X)
  109. _TMC26X_INIT(Z3);
  110. #endif
  111. #if AXIS_DRIVER_TYPE(E0, TMC26X)
  112. _TMC26X_INIT(E0);
  113. #endif
  114. #if AXIS_DRIVER_TYPE(E1, TMC26X)
  115. _TMC26X_INIT(E1);
  116. #endif
  117. #if AXIS_DRIVER_TYPE(E2, TMC26X)
  118. _TMC26X_INIT(E2);
  119. #endif
  120. #if AXIS_DRIVER_TYPE(E3, TMC26X)
  121. _TMC26X_INIT(E3);
  122. #endif
  123. #if AXIS_DRIVER_TYPE(E4, TMC26X)
  124. _TMC26X_INIT(E4);
  125. #endif
  126. #if AXIS_DRIVER_TYPE(E5, TMC26X)
  127. _TMC26X_INIT(E5);
  128. #endif
  129. }
  130. #endif // TMC26X
  131. #if HAS_TRINAMIC
  132. #define _TMC_INIT(ST, SPMM) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
  133. #endif
  134. //
  135. // TMC2130 Driver objects and inits
  136. //
  137. #if HAS_DRIVER(TMC2130)
  138. #include <SPI.h>
  139. #include "planner.h"
  140. #include "../core/enum.h"
  141. #if ENABLED(TMC_USE_SW_SPI)
  142. #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  143. #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
  144. #else
  145. #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE)
  146. #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
  147. #endif
  148. // Stepper objects of TMC2130 steppers used
  149. #if AXIS_DRIVER_TYPE(X, TMC2130)
  150. TMC2130_DEFINE(X);
  151. #endif
  152. #if AXIS_DRIVER_TYPE(X2, TMC2130)
  153. TMC2130_DEFINE(X2);
  154. #endif
  155. #if AXIS_DRIVER_TYPE(Y, TMC2130)
  156. TMC2130_DEFINE(Y);
  157. #endif
  158. #if AXIS_DRIVER_TYPE(Y2, TMC2130)
  159. TMC2130_DEFINE(Y2);
  160. #endif
  161. #if AXIS_DRIVER_TYPE(Z, TMC2130)
  162. TMC2130_DEFINE(Z);
  163. #endif
  164. #if AXIS_DRIVER_TYPE(Z2, TMC2130)
  165. TMC2130_DEFINE(Z2);
  166. #endif
  167. #if AXIS_DRIVER_TYPE(Z3, TMC2130)
  168. TMC2130_DEFINE(Z3);
  169. #endif
  170. #if AXIS_DRIVER_TYPE(E0, TMC2130)
  171. TMC2130_DEFINE(E0);
  172. #endif
  173. #if AXIS_DRIVER_TYPE(E1, TMC2130)
  174. TMC2130_DEFINE(E1);
  175. #endif
  176. #if AXIS_DRIVER_TYPE(E2, TMC2130)
  177. TMC2130_DEFINE(E2);
  178. #endif
  179. #if AXIS_DRIVER_TYPE(E3, TMC2130)
  180. TMC2130_DEFINE(E3);
  181. #endif
  182. #if AXIS_DRIVER_TYPE(E4, TMC2130)
  183. TMC2130_DEFINE(E4);
  184. #endif
  185. #if AXIS_DRIVER_TYPE(E5, TMC2130)
  186. TMC2130_DEFINE(E5);
  187. #endif
  188. template<char AXIS_LETTER, char DRIVER_ID>
  189. void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
  190. #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
  191. UNUSED(thrs);
  192. UNUSED(spmm);
  193. #endif
  194. st.begin();
  195. CHOPCONF_t chopconf{0};
  196. chopconf.tbl = 1;
  197. chopconf.toff = 3;
  198. chopconf.intpol = INTERPOLATE;
  199. chopconf.hstrt = 2;
  200. chopconf.hend = 5;
  201. st.CHOPCONF(chopconf.sr);
  202. st.rms_current(mA, HOLD_MULTIPLIER);
  203. st.microsteps(microsteps);
  204. st.iholddelay(10);
  205. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  206. #if ENABLED(STEALTHCHOP)
  207. st.en_pwm_mode(true);
  208. PWMCONF_t pwmconf{0};
  209. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  210. pwmconf.pwm_autoscale = true;
  211. pwmconf.pwm_grad = 5;
  212. pwmconf.pwm_ampl = 180;
  213. st.PWMCONF(pwmconf.sr);
  214. #if ENABLED(HYBRID_THRESHOLD)
  215. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  216. #endif
  217. #endif
  218. st.GSTAT(); // Clear GSTAT
  219. }
  220. #endif // TMC2130
  221. //
  222. // TMC2208 Driver objects and inits
  223. //
  224. #if HAS_DRIVER(TMC2208)
  225. #include <HardwareSerial.h>
  226. #include "planner.h"
  227. #define _TMC2208_DEFINE_HARDWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(&ST##_HARDWARE_SERIAL, R_SENSE)
  228. #define TMC2208_DEFINE_HARDWARE(ST) _TMC2208_DEFINE_HARDWARE(ST, TMC_##ST##_LABEL)
  229. #define _TMC2208_DEFINE_SOFTWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, R_SENSE, ST##_SERIAL_RX_PIN > -1)
  230. #define TMC2208_DEFINE_SOFTWARE(ST) _TMC2208_DEFINE_SOFTWARE(ST, TMC_##ST##_LABEL)
  231. // Stepper objects of TMC2208 steppers used
  232. #if AXIS_DRIVER_TYPE(X, TMC2208)
  233. #ifdef X_HARDWARE_SERIAL
  234. TMC2208_DEFINE_HARDWARE(X);
  235. #else
  236. TMC2208_DEFINE_SOFTWARE(X);
  237. #endif
  238. #endif
  239. #if AXIS_DRIVER_TYPE(X2, TMC2208)
  240. #ifdef X2_HARDWARE_SERIAL
  241. TMC2208_DEFINE_HARDWARE(X2);
  242. #else
  243. TMC2208_DEFINE_SOFTWARE(X2);
  244. #endif
  245. #endif
  246. #if AXIS_DRIVER_TYPE(Y, TMC2208)
  247. #ifdef Y_HARDWARE_SERIAL
  248. TMC2208_DEFINE_HARDWARE(Y);
  249. #else
  250. TMC2208_DEFINE_SOFTWARE(Y);
  251. #endif
  252. #endif
  253. #if AXIS_DRIVER_TYPE(Y2, TMC2208)
  254. #ifdef Y2_HARDWARE_SERIAL
  255. TMC2208_DEFINE_HARDWARE(Y2);
  256. #else
  257. TMC2208_DEFINE_SOFTWARE(Y2);
  258. #endif
  259. #endif
  260. #if AXIS_DRIVER_TYPE(Z, TMC2208)
  261. #ifdef Z_HARDWARE_SERIAL
  262. TMC2208_DEFINE_HARDWARE(Z);
  263. #else
  264. TMC2208_DEFINE_SOFTWARE(Z);
  265. #endif
  266. #endif
  267. #if AXIS_DRIVER_TYPE(Z2, TMC2208)
  268. #ifdef Z2_HARDWARE_SERIAL
  269. TMC2208_DEFINE_HARDWARE(Z2);
  270. #else
  271. TMC2208_DEFINE_SOFTWARE(Z2);
  272. #endif
  273. #endif
  274. #if AXIS_DRIVER_TYPE(Z3, TMC2208)
  275. #ifdef Z3_HARDWARE_SERIAL
  276. TMC2208_DEFINE_HARDWARE(Z3);
  277. #else
  278. TMC2208_DEFINE_SOFTWARE(Z3);
  279. #endif
  280. #endif
  281. #if AXIS_DRIVER_TYPE(E0, TMC2208)
  282. #ifdef E0_HARDWARE_SERIAL
  283. TMC2208_DEFINE_HARDWARE(E0);
  284. #else
  285. TMC2208_DEFINE_SOFTWARE(E0);
  286. #endif
  287. #endif
  288. #if AXIS_DRIVER_TYPE(E1, TMC2208)
  289. #ifdef E1_HARDWARE_SERIAL
  290. TMC2208_DEFINE_HARDWARE(E1);
  291. #else
  292. TMC2208_DEFINE_SOFTWARE(E1);
  293. #endif
  294. #endif
  295. #if AXIS_DRIVER_TYPE(E2, TMC2208)
  296. #ifdef E2_HARDWARE_SERIAL
  297. TMC2208_DEFINE_HARDWARE(E2);
  298. #else
  299. TMC2208_DEFINE_SOFTWARE(E2);
  300. #endif
  301. #endif
  302. #if AXIS_DRIVER_TYPE(E3, TMC2208)
  303. #ifdef E3_HARDWARE_SERIAL
  304. TMC2208_DEFINE_HARDWARE(E3);
  305. #else
  306. TMC2208_DEFINE_SOFTWARE(E3);
  307. #endif
  308. #endif
  309. #if AXIS_DRIVER_TYPE(E4, TMC2208)
  310. #ifdef E4_HARDWARE_SERIAL
  311. TMC2208_DEFINE_HARDWARE(E4);
  312. #else
  313. TMC2208_DEFINE_SOFTWARE(E4);
  314. #endif
  315. #endif
  316. #if AXIS_DRIVER_TYPE(E5, TMC2208)
  317. #ifdef E5_HARDWARE_SERIAL
  318. TMC2208_DEFINE_HARDWARE(E5);
  319. #else
  320. TMC2208_DEFINE_SOFTWARE(E5);
  321. #endif
  322. #endif
  323. void tmc2208_serial_begin() {
  324. #if AXIS_DRIVER_TYPE(X, TMC2208)
  325. #ifdef X_HARDWARE_SERIAL
  326. X_HARDWARE_SERIAL.begin(115200);
  327. #else
  328. stepperX.beginSerial(115200);
  329. #endif
  330. #endif
  331. #if AXIS_DRIVER_TYPE(X2, TMC2208)
  332. #ifdef X2_HARDWARE_SERIAL
  333. X2_HARDWARE_SERIAL.begin(115200);
  334. #else
  335. stepperX2.beginSerial(115200);
  336. #endif
  337. #endif
  338. #if AXIS_DRIVER_TYPE(Y, TMC2208)
  339. #ifdef Y_HARDWARE_SERIAL
  340. Y_HARDWARE_SERIAL.begin(115200);
  341. #else
  342. stepperY.beginSerial(115200);
  343. #endif
  344. #endif
  345. #if AXIS_DRIVER_TYPE(Y2, TMC2208)
  346. #ifdef Y2_HARDWARE_SERIAL
  347. Y2_HARDWARE_SERIAL.begin(115200);
  348. #else
  349. stepperY2.beginSerial(115200);
  350. #endif
  351. #endif
  352. #if AXIS_DRIVER_TYPE(Z, TMC2208)
  353. #ifdef Z_HARDWARE_SERIAL
  354. Z_HARDWARE_SERIAL.begin(115200);
  355. #else
  356. stepperZ.beginSerial(115200);
  357. #endif
  358. #endif
  359. #if AXIS_DRIVER_TYPE(Z2, TMC2208)
  360. #ifdef Z2_HARDWARE_SERIAL
  361. Z2_HARDWARE_SERIAL.begin(115200);
  362. #else
  363. stepperZ2.beginSerial(115200);
  364. #endif
  365. #endif
  366. #if AXIS_DRIVER_TYPE(Z3, TMC2208)
  367. #ifdef Z3_HARDWARE_SERIAL
  368. Z3_HARDWARE_SERIAL.begin(115200);
  369. #else
  370. stepperZ3.beginSerial(115200);
  371. #endif
  372. #endif
  373. #if AXIS_DRIVER_TYPE(E0, TMC2208)
  374. #ifdef E0_HARDWARE_SERIAL
  375. E0_HARDWARE_SERIAL.begin(115200);
  376. #else
  377. stepperE0.beginSerial(115200);
  378. #endif
  379. #endif
  380. #if AXIS_DRIVER_TYPE(E1, TMC2208)
  381. #ifdef E1_HARDWARE_SERIAL
  382. E1_HARDWARE_SERIAL.begin(115200);
  383. #else
  384. stepperE1.beginSerial(115200);
  385. #endif
  386. #endif
  387. #if AXIS_DRIVER_TYPE(E2, TMC2208)
  388. #ifdef E2_HARDWARE_SERIAL
  389. E2_HARDWARE_SERIAL.begin(115200);
  390. #else
  391. stepperE2.beginSerial(115200);
  392. #endif
  393. #endif
  394. #if AXIS_DRIVER_TYPE(E3, TMC2208)
  395. #ifdef E3_HARDWARE_SERIAL
  396. E3_HARDWARE_SERIAL.begin(115200);
  397. #else
  398. stepperE3.beginSerial(115200);
  399. #endif
  400. #endif
  401. #if AXIS_DRIVER_TYPE(E4, TMC2208)
  402. #ifdef E4_HARDWARE_SERIAL
  403. E4_HARDWARE_SERIAL.begin(115200);
  404. #else
  405. stepperE4.beginSerial(115200);
  406. #endif
  407. #endif
  408. #if AXIS_DRIVER_TYPE(E5, TMC2208)
  409. #ifdef E5_HARDWARE_SERIAL
  410. E5_HARDWARE_SERIAL.begin(115200);
  411. #else
  412. stepperE5.beginSerial(115200);
  413. #endif
  414. #endif
  415. }
  416. template<char AXIS_LETTER, char DRIVER_ID>
  417. void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
  418. #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
  419. UNUSED(thrs);
  420. UNUSED(spmm);
  421. #endif
  422. TMC2208_n::GCONF_t gconf{0};
  423. gconf.pdn_disable = true; // Use UART
  424. gconf.mstep_reg_select = true; // Select microsteps with UART
  425. gconf.i_scale_analog = false;
  426. TMC2208_n::CHOPCONF_t chopconf{0};
  427. chopconf.tbl = 0b01; // blank_time = 24
  428. chopconf.toff = 5;
  429. chopconf.intpol = INTERPOLATE;
  430. chopconf.hstrt = 2;
  431. chopconf.hend = 5;
  432. st.CHOPCONF(chopconf.sr);
  433. st.rms_current(mA, HOLD_MULTIPLIER);
  434. st.microsteps(microsteps);
  435. st.iholddelay(10);
  436. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  437. #if ENABLED(STEALTHCHOP)
  438. gconf.en_spreadcycle = false;
  439. TMC2208_n::PWMCONF_t pwmconf{0};
  440. pwmconf.pwm_lim = 12;
  441. pwmconf.pwm_reg = 8;
  442. pwmconf.pwm_autograd = true;
  443. pwmconf.pwm_autoscale = true;
  444. pwmconf.pwm_freq = 0b01;
  445. pwmconf.pwm_grad = 14;
  446. pwmconf.pwm_ofs = 36;
  447. st.PWMCONF(pwmconf.sr);
  448. #if ENABLED(HYBRID_THRESHOLD)
  449. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  450. #endif
  451. #else
  452. gconf.en_spreadcycle = true;
  453. #endif
  454. st.GCONF(gconf.sr);
  455. st.GSTAT(0b111); // Clear
  456. delay(200);
  457. }
  458. #endif // TMC2208
  459. //
  460. // TMC2660 Driver objects and inits
  461. //
  462. #if HAS_DRIVER(TMC2660)
  463. #include <SPI.h>
  464. #include "planner.h"
  465. #include "../core/enum.h"
  466. #if ENABLED(TMC_USE_SW_SPI)
  467. #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  468. #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
  469. #else
  470. #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE)
  471. #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
  472. #endif
  473. // Stepper objects of TMC2660 steppers used
  474. #if AXIS_DRIVER_TYPE(X, TMC2660)
  475. TMC2660_DEFINE(X);
  476. #endif
  477. #if AXIS_DRIVER_TYPE(X2, TMC2660)
  478. TMC2660_DEFINE(X2);
  479. #endif
  480. #if AXIS_DRIVER_TYPE(Y, TMC2660)
  481. TMC2660_DEFINE(Y);
  482. #endif
  483. #if AXIS_DRIVER_TYPE(Y2, TMC2660)
  484. TMC2660_DEFINE(Y2);
  485. #endif
  486. #if AXIS_DRIVER_TYPE(Z, TMC2660)
  487. TMC2660_DEFINE(Z);
  488. #endif
  489. #if AXIS_DRIVER_TYPE(Z2, TMC2660)
  490. TMC2660_DEFINE(Z2);
  491. #endif
  492. #if AXIS_DRIVER_TYPE(E0, TMC2660)
  493. TMC2660_DEFINE(E0);
  494. #endif
  495. #if AXIS_DRIVER_TYPE(E1, TMC2660)
  496. TMC2660_DEFINE(E1);
  497. #endif
  498. #if AXIS_DRIVER_TYPE(E2, TMC2660)
  499. TMC2660_DEFINE(E2);
  500. #endif
  501. #if AXIS_DRIVER_TYPE(E3, TMC2660)
  502. TMC2660_DEFINE(E3);
  503. #endif
  504. #if AXIS_DRIVER_TYPE(E4, TMC2660)
  505. TMC2660_DEFINE(E4);
  506. #endif
  507. #if AXIS_DRIVER_TYPE(E5, TMC2660)
  508. TMC2660_DEFINE(E5);
  509. #endif
  510. template<char AXIS_LETTER, char DRIVER_ID>
  511. void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const float) {
  512. st.begin();
  513. st.rms_current(mA);
  514. st.microsteps(microsteps);
  515. st.blank_time(24);
  516. st.toff(5); // Only enables the driver if used with stealthChop
  517. st.intpol(INTERPOLATE);
  518. //st.hysteresis_start(3);
  519. //st.hysteresis_end(2);
  520. }
  521. #endif // TMC2660
  522. void restore_stepper_drivers() {
  523. #if AXIS_IS_TMC(X)
  524. stepperX.push();
  525. #endif
  526. #if AXIS_IS_TMC(X2)
  527. stepperX2.push();
  528. #endif
  529. #if AXIS_IS_TMC(Y)
  530. stepperY.push();
  531. #endif
  532. #if AXIS_IS_TMC(Y2)
  533. stepperY2.push();
  534. #endif
  535. #if AXIS_IS_TMC(Z)
  536. stepperZ.push();
  537. #endif
  538. #if AXIS_IS_TMC(Z2)
  539. stepperZ2.push();
  540. #endif
  541. #if AXIS_IS_TMC(Z3)
  542. stepperZ3.push();
  543. #endif
  544. #if AXIS_IS_TMC(E0)
  545. stepperE0.push();
  546. #endif
  547. #if AXIS_IS_TMC(E1)
  548. stepperE1.push();
  549. #endif
  550. #if AXIS_IS_TMC(E2)
  551. stepperE2.push();
  552. #endif
  553. #if AXIS_IS_TMC(E3)
  554. stepperE3.push();
  555. #endif
  556. #if AXIS_IS_TMC(E4)
  557. stepperE4.push();
  558. #endif
  559. #if AXIS_IS_TMC(E5)
  560. stepperE5.push();
  561. #endif
  562. }
  563. void reset_stepper_drivers() {
  564. #if HAS_DRIVER(TMC26X)
  565. tmc26x_init_to_defaults();
  566. #endif
  567. #if ENABLED(HAVE_L6470DRIVER)
  568. L6470_init_to_defaults();
  569. #endif
  570. #if AXIS_IS_TMC(X)
  571. _TMC_INIT(X, planner.settings.axis_steps_per_mm[X_AXIS]);
  572. #endif
  573. #if AXIS_IS_TMC(X2)
  574. _TMC_INIT(X2, planner.settings.axis_steps_per_mm[X_AXIS]);
  575. #endif
  576. #if AXIS_IS_TMC(Y)
  577. _TMC_INIT(Y, planner.settings.axis_steps_per_mm[Y_AXIS]);
  578. #endif
  579. #if AXIS_IS_TMC(Y2)
  580. _TMC_INIT(Y2, planner.settings.axis_steps_per_mm[Y_AXIS]);
  581. #endif
  582. #if AXIS_IS_TMC(Z)
  583. _TMC_INIT(Z, planner.settings.axis_steps_per_mm[Z_AXIS]);
  584. #endif
  585. #if AXIS_IS_TMC(Z2)
  586. _TMC_INIT(Z2, planner.settings.axis_steps_per_mm[Z_AXIS]);
  587. #endif
  588. #if AXIS_IS_TMC(Z3)
  589. _TMC_INIT(Z3, planner.settings.axis_steps_per_mm[Z_AXIS]);
  590. #endif
  591. #if AXIS_IS_TMC(E0)
  592. _TMC_INIT(E0, planner.settings.axis_steps_per_mm[E_AXIS_N(0)]);
  593. #endif
  594. #if AXIS_IS_TMC(E1)
  595. _TMC_INIT(E1, planner.settings.axis_steps_per_mm[E_AXIS_N(1)]);
  596. #endif
  597. #if AXIS_IS_TMC(E2)
  598. _TMC_INIT(E2, planner.settings.axis_steps_per_mm[E_AXIS_N(2)]);
  599. #endif
  600. #if AXIS_IS_TMC(E3)
  601. _TMC_INIT(E3, planner.settings.axis_steps_per_mm[E_AXIS_N(3)]);
  602. #endif
  603. #if AXIS_IS_TMC(E4)
  604. _TMC_INIT(E4, planner.settings.axis_steps_per_mm[E_AXIS_N(4)]);
  605. #endif
  606. #if AXIS_IS_TMC(E5)
  607. _TMC_INIT(E5, planner.settings.axis_steps_per_mm[E_AXIS_N(5)]);
  608. #endif
  609. #if USE_SENSORLESS
  610. #if X_SENSORLESS
  611. #if AXIS_HAS_STALLGUARD(X)
  612. stepperX.sgt(X_STALL_SENSITIVITY);
  613. #endif
  614. #if AXIS_HAS_STALLGUARD(X2)
  615. stepperX2.sgt(X_STALL_SENSITIVITY);
  616. #endif
  617. #endif
  618. #if Y_SENSORLESS
  619. #if AXIS_HAS_STALLGUARD(Y)
  620. stepperY.sgt(Y_STALL_SENSITIVITY);
  621. #endif
  622. #if AXIS_HAS_STALLGUARD(Y2)
  623. stepperY2.sgt(Y_STALL_SENSITIVITY);
  624. #endif
  625. #endif
  626. #if Z_SENSORLESS
  627. #if AXIS_HAS_STALLGUARD(Z)
  628. stepperZ.sgt(Z_STALL_SENSITIVITY);
  629. #endif
  630. #if AXIS_HAS_STALLGUARD(Z2)
  631. stepperZ2.sgt(Z_STALL_SENSITIVITY);
  632. #endif
  633. #if AXIS_HAS_STALLGUARD(Z3)
  634. stepperZ3.sgt(Z_STALL_SENSITIVITY);
  635. #endif
  636. #endif
  637. #endif
  638. #ifdef TMC_ADV
  639. TMC_ADV()
  640. #endif
  641. stepper.set_directions();
  642. }
  643. //
  644. // L6470 Driver objects and inits
  645. //
  646. #if HAS_DRIVER(L6470)
  647. #include <SPI.h>
  648. #include <L6470.h>
  649. #define _L6470_DEFINE(ST) L6470 stepper##ST(ST##_ENABLE_PIN)
  650. // L6470 Stepper objects
  651. #if AXIS_DRIVER_TYPE(X, L6470)
  652. _L6470_DEFINE(X);
  653. #endif
  654. #if AXIS_DRIVER_TYPE(X2, L6470)
  655. _L6470_DEFINE(X2);
  656. #endif
  657. #if AXIS_DRIVER_TYPE(Y, L6470)
  658. _L6470_DEFINE(Y);
  659. #endif
  660. #if AXIS_DRIVER_TYPE(Y2, L6470)
  661. _L6470_DEFINE(Y2);
  662. #endif
  663. #if AXIS_DRIVER_TYPE(Z, L6470)
  664. _L6470_DEFINE(Z);
  665. #endif
  666. #if AXIS_DRIVER_TYPE(Z2, L6470)
  667. _L6470_DEFINE(Z2);
  668. #endif
  669. #if AXIS_DRIVER_TYPE(Z3, L6470)
  670. _L6470_DEFINE(Z3);
  671. #endif
  672. #if AXIS_DRIVER_TYPE(E0, L6470)
  673. _L6470_DEFINE(E0);
  674. #endif
  675. #if AXIS_DRIVER_TYPE(E1, L6470)
  676. _L6470_DEFINE(E1);
  677. #endif
  678. #if AXIS_DRIVER_TYPE(E2, L6470)
  679. _L6470_DEFINE(E2);
  680. #endif
  681. #if AXIS_DRIVER_TYPE(E3, L6470)
  682. _L6470_DEFINE(E3);
  683. #endif
  684. #if AXIS_DRIVER_TYPE(E4, L6470)
  685. _L6470_DEFINE(E4);
  686. #endif
  687. #if AXIS_DRIVER_TYPE(E5, L6470)
  688. _L6470_DEFINE(E5);
  689. #endif
  690. #define _L6470_INIT(A) do{ \
  691. stepper##A.init(); \
  692. stepper##A.softFree(); \
  693. stepper##A.setMicroSteps(A##_MICROSTEPS); \
  694. stepper##A.setOverCurrent(A##_OVERCURRENT); \
  695. stepper##A.setStallCurrent(A##_STALLCURRENT); \
  696. }while(0)
  697. void L6470_init_to_defaults() {
  698. #if AXIS_DRIVER_TYPE(X, L6470)
  699. _L6470_INIT(X);
  700. #endif
  701. #if AXIS_DRIVER_TYPE(X2, L6470)
  702. _L6470_INIT(X2);
  703. #endif
  704. #if AXIS_DRIVER_TYPE(Y, L6470)
  705. _L6470_INIT(Y);
  706. #endif
  707. #if AXIS_DRIVER_TYPE(Y2, L6470)
  708. _L6470_INIT(Y2);
  709. #endif
  710. #if AXIS_DRIVER_TYPE(Z, L6470)
  711. _L6470_INIT(Z);
  712. #endif
  713. #if AXIS_DRIVER_TYPE(Z2, L6470)
  714. _L6470_INIT(Z2);
  715. #endif
  716. #if AXIS_DRIVER_TYPE(Z3, L6470)
  717. _L6470_INIT(Z3);
  718. #endif
  719. #if AXIS_DRIVER_TYPE(E0, L6470)
  720. _L6470_INIT(E0);
  721. #endif
  722. #if AXIS_DRIVER_TYPE(E1, L6470)
  723. _L6470_INIT(E1);
  724. #endif
  725. #if AXIS_DRIVER_TYPE(E2, L6470)
  726. _L6470_INIT(E2);
  727. #endif
  728. #if AXIS_DRIVER_TYPE(E3, L6470)
  729. _L6470_INIT(E3);
  730. #endif
  731. #if AXIS_DRIVER_TYPE(E4, L6470)
  732. _L6470_INIT(E4);
  733. #endif
  734. #if AXIS_DRIVER_TYPE(E5, L6470)
  735. _L6470_INIT(E5);
  736. #endif
  737. }
  738. #endif // L6470