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 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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. //
  35. // TMC26X Driver objects and inits
  36. //
  37. #if HAS_DRIVER(TMC26X)
  38. #include <SPI.h>
  39. #ifdef STM32F7
  40. #include "../HAL/HAL_STM32F7/TMC2660.h"
  41. #else
  42. #include <TMC26XStepper.h>
  43. #endif
  44. #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
  45. #if AXIS_DRIVER_TYPE(X, TMC26X)
  46. _TMC26X_DEFINE(X);
  47. #endif
  48. #if AXIS_DRIVER_TYPE(X2, TMC26X)
  49. _TMC26X_DEFINE(X2);
  50. #endif
  51. #if AXIS_DRIVER_TYPE(Y, TMC26X)
  52. _TMC26X_DEFINE(Y);
  53. #endif
  54. #if AXIS_DRIVER_TYPE(Y2, TMC26X)
  55. _TMC26X_DEFINE(Y2);
  56. #endif
  57. #if AXIS_DRIVER_TYPE(Z, TMC26X)
  58. _TMC26X_DEFINE(Z);
  59. #endif
  60. #if AXIS_DRIVER_TYPE(Z2, TMC26X)
  61. _TMC26X_DEFINE(Z2);
  62. #endif
  63. #if AXIS_DRIVER_TYPE(E0, TMC26X)
  64. _TMC26X_DEFINE(E0);
  65. #endif
  66. #if AXIS_DRIVER_TYPE(E1, TMC26X)
  67. _TMC26X_DEFINE(E1);
  68. #endif
  69. #if AXIS_DRIVER_TYPE(E2, TMC26X)
  70. _TMC26X_DEFINE(E2);
  71. #endif
  72. #if AXIS_DRIVER_TYPE(E3, TMC26X)
  73. _TMC26X_DEFINE(E3);
  74. #endif
  75. #if AXIS_DRIVER_TYPE(E4, TMC26X)
  76. _TMC26X_DEFINE(E4);
  77. #endif
  78. #define _TMC26X_INIT(A) do{ \
  79. stepper##A.setMicrosteps(A##_MICROSTEPS); \
  80. stepper##A.start(); \
  81. }while(0)
  82. void tmc26x_init_to_defaults() {
  83. #if AXIS_DRIVER_TYPE(X, TMC26X)
  84. _TMC26X_INIT(X);
  85. #endif
  86. #if AXIS_DRIVER_TYPE(X2, TMC26X)
  87. _TMC26X_INIT(X2);
  88. #endif
  89. #if AXIS_DRIVER_TYPE(Y, TMC26X)
  90. _TMC26X_INIT(Y);
  91. #endif
  92. #if AXIS_DRIVER_TYPE(Y2, TMC26X)
  93. _TMC26X_INIT(Y2);
  94. #endif
  95. #if AXIS_DRIVER_TYPE(Z, TMC26X)
  96. _TMC26X_INIT(Z);
  97. #endif
  98. #if AXIS_DRIVER_TYPE(Z2, TMC26X)
  99. _TMC26X_INIT(Z2);
  100. #endif
  101. #if AXIS_DRIVER_TYPE(E0, TMC26X)
  102. _TMC26X_INIT(E0);
  103. #endif
  104. #if AXIS_DRIVER_TYPE(E1, TMC26X)
  105. _TMC26X_INIT(E1);
  106. #endif
  107. #if AXIS_DRIVER_TYPE(E2, TMC26X)
  108. _TMC26X_INIT(E2);
  109. #endif
  110. #if AXIS_DRIVER_TYPE(E3, TMC26X)
  111. _TMC26X_INIT(E3);
  112. #endif
  113. #if AXIS_DRIVER_TYPE(E4, TMC26X)
  114. _TMC26X_INIT(E4);
  115. #endif
  116. }
  117. #endif // TMC26X
  118. //
  119. // TMC2130 Driver objects and inits
  120. //
  121. #if HAS_DRIVER(TMC2130)
  122. #include <SPI.h>
  123. #include <TMC2130Stepper.h>
  124. #include "planner.h"
  125. #include "../core/enum.h"
  126. #if TMC2130STEPPER_VERSION < 0x020201
  127. #error "Update TMC2130Stepper library to 2.2.1 or newer."
  128. #endif
  129. #if ENABLED(TMC_USE_SW_SPI)
  130. #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  131. #else
  132. #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN)
  133. #endif
  134. // Stepper objects of TMC2130 steppers used
  135. #if AXIS_DRIVER_TYPE(X, TMC2130)
  136. _TMC2130_DEFINE(X);
  137. #endif
  138. #if AXIS_DRIVER_TYPE(X2, TMC2130)
  139. _TMC2130_DEFINE(X2);
  140. #endif
  141. #if AXIS_DRIVER_TYPE(Y, TMC2130)
  142. _TMC2130_DEFINE(Y);
  143. #endif
  144. #if AXIS_DRIVER_TYPE(Y2, TMC2130)
  145. _TMC2130_DEFINE(Y2);
  146. #endif
  147. #if AXIS_DRIVER_TYPE(Z, TMC2130)
  148. _TMC2130_DEFINE(Z);
  149. #endif
  150. #if AXIS_DRIVER_TYPE(Z2, TMC2130)
  151. _TMC2130_DEFINE(Z2);
  152. #endif
  153. #if AXIS_DRIVER_TYPE(E0, TMC2130)
  154. _TMC2130_DEFINE(E0);
  155. #endif
  156. #if AXIS_DRIVER_TYPE(E1, TMC2130)
  157. _TMC2130_DEFINE(E1);
  158. #endif
  159. #if AXIS_DRIVER_TYPE(E2, TMC2130)
  160. _TMC2130_DEFINE(E2);
  161. #endif
  162. #if AXIS_DRIVER_TYPE(E3, TMC2130)
  163. _TMC2130_DEFINE(E3);
  164. #endif
  165. #if AXIS_DRIVER_TYPE(E4, TMC2130)
  166. _TMC2130_DEFINE(E4);
  167. #endif
  168. // Use internal reference voltage for current calculations. This is the default.
  169. // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
  170. // https://www.trinamic.com/products/integrated-circuits/details/tmc2130/
  171. void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
  172. #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
  173. UNUSED(thrs);
  174. UNUSED(spmm);
  175. #endif
  176. st.begin();
  177. st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
  178. st.microsteps(microsteps);
  179. st.blank_time(24);
  180. st.off_time(5); // Only enables the driver if used with stealthChop
  181. st.interpolate(INTERPOLATE);
  182. st.power_down_delay(128); // ~2s until driver lowers to hold current
  183. st.hysteresis_start(3);
  184. st.hysteresis_end(2);
  185. #if ENABLED(STEALTHCHOP)
  186. st.stealth_freq(1); // f_pwm = 2/683 f_clk
  187. st.stealth_autoscale(1);
  188. st.stealth_gradient(5);
  189. st.stealth_amplitude(255);
  190. st.stealthChop(1);
  191. #if ENABLED(HYBRID_THRESHOLD)
  192. st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm));
  193. #endif
  194. #endif
  195. st.GSTAT(); // Clear GSTAT
  196. }
  197. #define _TMC2130_INIT(ST, SPMM) tmc2130_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
  198. void tmc2130_init_to_defaults() {
  199. #if AXIS_DRIVER_TYPE(X, TMC2130)
  200. _TMC2130_INIT( X, planner.axis_steps_per_mm[X_AXIS]);
  201. #endif
  202. #if AXIS_DRIVER_TYPE(X2, TMC2130)
  203. _TMC2130_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
  204. #endif
  205. #if AXIS_DRIVER_TYPE(Y, TMC2130)
  206. _TMC2130_INIT( Y, planner.axis_steps_per_mm[Y_AXIS]);
  207. #endif
  208. #if AXIS_DRIVER_TYPE(Y2, TMC2130)
  209. _TMC2130_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
  210. #endif
  211. #if AXIS_DRIVER_TYPE(Z, TMC2130)
  212. _TMC2130_INIT( Z, planner.axis_steps_per_mm[Z_AXIS]);
  213. #endif
  214. #if AXIS_DRIVER_TYPE(Z2, TMC2130)
  215. _TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
  216. #endif
  217. #if AXIS_DRIVER_TYPE(E0, TMC2130)
  218. _TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
  219. #endif
  220. #if AXIS_DRIVER_TYPE(E1, TMC2130)
  221. { constexpr int extruder = 1; _TMC2130_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
  222. #endif
  223. #if AXIS_DRIVER_TYPE(E2, TMC2130)
  224. { constexpr int extruder = 2; _TMC2130_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
  225. #endif
  226. #if AXIS_DRIVER_TYPE(E3, TMC2130)
  227. { constexpr int extruder = 3; _TMC2130_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
  228. #endif
  229. #if AXIS_DRIVER_TYPE(E4, TMC2130)
  230. { constexpr int extruder = 4; _TMC2130_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
  231. #endif
  232. #if ENABLED(SENSORLESS_HOMING)
  233. #define TMC_INIT_SGT(P,Q) stepper##Q.sgt(P##_HOMING_SENSITIVITY);
  234. #if X_SENSORLESS
  235. #if AXIS_DRIVER_TYPE(X, TMC2130)
  236. stepperX.sgt(X_HOMING_SENSITIVITY);
  237. #endif
  238. #if AXIS_DRIVER_TYPE(X2, TMC2130)
  239. stepperX2.sgt(X_HOMING_SENSITIVITY);
  240. #endif
  241. #endif
  242. #if Y_SENSORLESS
  243. #if AXIS_DRIVER_TYPE(Y, TMC2130)
  244. stepperY.sgt(Y_HOMING_SENSITIVITY);
  245. #endif
  246. #if AXIS_DRIVER_TYPE(Y2, TMC2130)
  247. stepperY2.sgt(Y_HOMING_SENSITIVITY);
  248. #endif
  249. #endif
  250. #if Z_SENSORLESS
  251. #if AXIS_DRIVER_TYPE(Z, TMC2130)
  252. stepperZ.sgt(Z_HOMING_SENSITIVITY);
  253. #endif
  254. #if AXIS_DRIVER_TYPE(Z2, TMC2130)
  255. stepperZ2.sgt(Z_HOMING_SENSITIVITY);
  256. #endif
  257. #endif
  258. #endif
  259. }
  260. #endif // TMC2130
  261. //
  262. // TMC2208 Driver objects and inits
  263. //
  264. #if HAS_DRIVER(TMC2208)
  265. #include <SoftwareSerial.h>
  266. #include <HardwareSerial.h>
  267. #include <TMC2208Stepper.h>
  268. #include "planner.h"
  269. #if TMC2208STEPPER_VERSION < 0x000101
  270. #error "Update TMC2208Stepper library to 0.1.1 or newer."
  271. #endif
  272. #define _TMC2208_DEFINE_HARDWARE(ST) TMC2208Stepper stepper##ST(&ST##_HARDWARE_SERIAL)
  273. #define _TMC2208_DEFINE_SOFTWARE(ST) TMC2208Stepper stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_SERIAL_RX_PIN > -1)
  274. // Stepper objects of TMC2208 steppers used
  275. #if AXIS_DRIVER_TYPE(X, TMC2208)
  276. #ifdef X_HARDWARE_SERIAL
  277. _TMC2208_DEFINE_HARDWARE(X);
  278. #else
  279. _TMC2208_DEFINE_SOFTWARE(X);
  280. #endif
  281. #endif
  282. #if AXIS_DRIVER_TYPE(X2, TMC2208)
  283. #ifdef X2_HARDWARE_SERIAL
  284. _TMC2208_DEFINE_HARDWARE(X2);
  285. #else
  286. _TMC2208_DEFINE_SOFTWARE(X2);
  287. #endif
  288. #endif
  289. #if AXIS_DRIVER_TYPE(Y, TMC2208)
  290. #ifdef Y_HARDWARE_SERIAL
  291. _TMC2208_DEFINE_HARDWARE(Y);
  292. #else
  293. _TMC2208_DEFINE_SOFTWARE(Y);
  294. #endif
  295. #endif
  296. #if AXIS_DRIVER_TYPE(Y2, TMC2208)
  297. #ifdef Y2_HARDWARE_SERIAL
  298. _TMC2208_DEFINE_HARDWARE(Y2);
  299. #else
  300. _TMC2208_DEFINE_SOFTWARE(Y2);
  301. #endif
  302. #endif
  303. #if AXIS_DRIVER_TYPE(Z, TMC2208)
  304. #ifdef Z_HARDWARE_SERIAL
  305. _TMC2208_DEFINE_HARDWARE(Z);
  306. #else
  307. _TMC2208_DEFINE_SOFTWARE(Z);
  308. #endif
  309. #endif
  310. #if AXIS_DRIVER_TYPE(Z2, TMC2208)
  311. #ifdef Z2_HARDWARE_SERIAL
  312. _TMC2208_DEFINE_HARDWARE(Z2);
  313. #else
  314. _TMC2208_DEFINE_SOFTWARE(Z2);
  315. #endif
  316. #endif
  317. #if AXIS_DRIVER_TYPE(E0, TMC2208)
  318. #ifdef E0_HARDWARE_SERIAL
  319. _TMC2208_DEFINE_HARDWARE(E0);
  320. #else
  321. _TMC2208_DEFINE_SOFTWARE(E0);
  322. #endif
  323. #endif
  324. #if AXIS_DRIVER_TYPE(E1, TMC2208)
  325. #ifdef E1_HARDWARE_SERIAL
  326. _TMC2208_DEFINE_HARDWARE(E1);
  327. #else
  328. _TMC2208_DEFINE_SOFTWARE(E1);
  329. #endif
  330. #endif
  331. #if AXIS_DRIVER_TYPE(E2, TMC2208)
  332. #ifdef E2_HARDWARE_SERIAL
  333. _TMC2208_DEFINE_HARDWARE(E2);
  334. #else
  335. _TMC2208_DEFINE_SOFTWARE(E2);
  336. #endif
  337. #endif
  338. #if AXIS_DRIVER_TYPE(E3, TMC2208)
  339. #ifdef E3_HARDWARE_SERIAL
  340. _TMC2208_DEFINE_HARDWARE(E3);
  341. #else
  342. _TMC2208_DEFINE_SOFTWARE(E3);
  343. #endif
  344. #endif
  345. #if AXIS_DRIVER_TYPE(E4, TMC2208)
  346. #ifdef E4_HARDWARE_SERIAL
  347. _TMC2208_DEFINE_HARDWARE(E4);
  348. #else
  349. _TMC2208_DEFINE_SOFTWARE(E4);
  350. #endif
  351. #endif
  352. void tmc2208_serial_begin() {
  353. #if AXIS_DRIVER_TYPE(X, TMC2208)
  354. #ifdef X_HARDWARE_SERIAL
  355. X_HARDWARE_SERIAL.begin(115200);
  356. #else
  357. stepperX.beginSerial(115200);
  358. #endif
  359. #endif
  360. #if AXIS_DRIVER_TYPE(X2, TMC2208)
  361. #ifdef X2_HARDWARE_SERIAL
  362. X2_HARDWARE_SERIAL.begin(115200);
  363. #else
  364. stepperX2.beginSerial(115200);
  365. #endif
  366. #endif
  367. #if AXIS_DRIVER_TYPE(Y, TMC2208)
  368. #ifdef Y_HARDWARE_SERIAL
  369. Y_HARDWARE_SERIAL.begin(115200);
  370. #else
  371. stepperY.beginSerial(115200);
  372. #endif
  373. #endif
  374. #if AXIS_DRIVER_TYPE(Y2, TMC2208)
  375. #ifdef Y2_HARDWARE_SERIAL
  376. Y2_HARDWARE_SERIAL.begin(115200);
  377. #else
  378. stepperY2.beginSerial(115200);
  379. #endif
  380. #endif
  381. #if AXIS_DRIVER_TYPE(Z, TMC2208)
  382. #ifdef Z_HARDWARE_SERIAL
  383. Z_HARDWARE_SERIAL.begin(115200);
  384. #else
  385. stepperZ.beginSerial(115200);
  386. #endif
  387. #endif
  388. #if AXIS_DRIVER_TYPE(Z2, TMC2208)
  389. #ifdef Z2_HARDWARE_SERIAL
  390. Z2_HARDWARE_SERIAL.begin(115200);
  391. #else
  392. stepperZ2.beginSerial(115200);
  393. #endif
  394. #endif
  395. #if AXIS_DRIVER_TYPE(E0, TMC2208)
  396. #ifdef E0_HARDWARE_SERIAL
  397. E0_HARDWARE_SERIAL.begin(115200);
  398. #else
  399. stepperE0.beginSerial(115200);
  400. #endif
  401. #endif
  402. #if AXIS_DRIVER_TYPE(E1, TMC2208)
  403. #ifdef E1_HARDWARE_SERIAL
  404. E1_HARDWARE_SERIAL.begin(115200);
  405. #else
  406. stepperE1.beginSerial(115200);
  407. #endif
  408. #endif
  409. #if AXIS_DRIVER_TYPE(E2, TMC2208)
  410. #ifdef E2_HARDWARE_SERIAL
  411. E2_HARDWARE_SERIAL.begin(115200);
  412. #else
  413. stepperE2.beginSerial(115200);
  414. #endif
  415. #endif
  416. #if AXIS_DRIVER_TYPE(E3, TMC2208)
  417. #ifdef E3_HARDWARE_SERIAL
  418. E3_HARDWARE_SERIAL.begin(115200);
  419. #else
  420. stepperE3.beginSerial(115200);
  421. #endif
  422. #endif
  423. #if AXIS_DRIVER_TYPE(E4, TMC2208)
  424. #ifdef E4_HARDWARE_SERIAL
  425. E4_HARDWARE_SERIAL.begin(115200);
  426. #else
  427. stepperE4.beginSerial(115200);
  428. #endif
  429. #endif
  430. }
  431. // Use internal reference voltage for current calculations. This is the default.
  432. // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
  433. void tmc2208_init(TMC2208Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
  434. st.pdn_disable(true); // Use UART
  435. st.mstep_reg_select(true); // Select microsteps with UART
  436. st.I_scale_analog(false);
  437. st.rms_current(mA, HOLD_MULTIPLIER, R_SENSE);
  438. st.microsteps(microsteps);
  439. st.blank_time(24);
  440. st.toff(5);
  441. st.intpol(INTERPOLATE);
  442. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  443. st.hysteresis_start(3);
  444. st.hysteresis_end(2);
  445. #if ENABLED(STEALTHCHOP)
  446. st.pwm_lim(12);
  447. st.pwm_reg(8);
  448. st.pwm_autograd(1);
  449. st.pwm_autoscale(1);
  450. st.pwm_freq(1);
  451. st.pwm_grad(14);
  452. st.pwm_ofs(36);
  453. st.en_spreadCycle(false);
  454. #if ENABLED(HYBRID_THRESHOLD)
  455. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  456. #else
  457. UNUSED(thrs);
  458. UNUSED(spmm);
  459. #endif
  460. #else
  461. st.en_spreadCycle(true);
  462. #endif
  463. st.GSTAT(0b111); // Clear
  464. delay(200);
  465. }
  466. #define _TMC2208_INIT(ST, SPMM) tmc2208_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
  467. void tmc2208_init_to_defaults() {
  468. #if AXIS_DRIVER_TYPE(X, TMC2208)
  469. _TMC2208_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
  470. #endif
  471. #if AXIS_DRIVER_TYPE(X2, TMC2208)
  472. _TMC2208_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
  473. #endif
  474. #if AXIS_DRIVER_TYPE(Y, TMC2208)
  475. _TMC2208_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
  476. #endif
  477. #if AXIS_DRIVER_TYPE(Y2, TMC2208)
  478. _TMC2208_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
  479. #endif
  480. #if AXIS_DRIVER_TYPE(Z, TMC2208)
  481. _TMC2208_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
  482. #endif
  483. #if AXIS_DRIVER_TYPE(Z2, TMC2208)
  484. _TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
  485. #endif
  486. #if AXIS_DRIVER_TYPE(E0, TMC2208)
  487. _TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
  488. #endif
  489. #if AXIS_DRIVER_TYPE(E1, TMC2208)
  490. { constexpr int extruder = 1; _TMC2208_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
  491. #endif
  492. #if AXIS_DRIVER_TYPE(E2, TMC2208)
  493. { constexpr int extruder = 2; _TMC2208_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
  494. #endif
  495. #if AXIS_DRIVER_TYPE(E3, TMC2208)
  496. { constexpr int extruder = 3; _TMC2208_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
  497. #endif
  498. #if AXIS_DRIVER_TYPE(E4, TMC2208)
  499. { constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
  500. #endif
  501. }
  502. #endif // TMC2208
  503. void restore_stepper_drivers() {
  504. #if AXIS_IS_TMC(X)
  505. stepperX.push();
  506. #endif
  507. #if AXIS_IS_TMC(X2)
  508. stepperX2.push();
  509. #endif
  510. #if AXIS_IS_TMC(Y)
  511. stepperY.push();
  512. #endif
  513. #if AXIS_IS_TMC(Y2)
  514. stepperY2.push();
  515. #endif
  516. #if AXIS_IS_TMC(Z)
  517. stepperZ.push();
  518. #endif
  519. #if AXIS_IS_TMC(Z2)
  520. stepperZ2.push();
  521. #endif
  522. #if AXIS_IS_TMC(E0)
  523. stepperE0.push();
  524. #endif
  525. #if AXIS_IS_TMC(E1)
  526. stepperE1.push();
  527. #endif
  528. #if AXIS_IS_TMC(E2)
  529. stepperE2.push();
  530. #endif
  531. #if AXIS_IS_TMC(E3)
  532. stepperE3.push();
  533. #endif
  534. #if AXIS_IS_TMC(E4)
  535. stepperE4.push();
  536. #endif
  537. }
  538. void reset_stepper_drivers() {
  539. #if HAS_DRIVER(TMC26X)
  540. tmc26x_init_to_defaults();
  541. #endif
  542. #if HAS_DRIVER(TMC2130)
  543. delay(100);
  544. tmc2130_init_to_defaults();
  545. #endif
  546. #if HAS_DRIVER(TMC2208)
  547. delay(100);
  548. tmc2208_init_to_defaults();
  549. #endif
  550. #ifdef TMC_ADV
  551. TMC_ADV()
  552. #endif
  553. #if HAS_DRIVER(L6470)
  554. L6470_init_to_defaults();
  555. #endif
  556. }
  557. //
  558. // L6470 Driver objects and inits
  559. //
  560. #if HAS_DRIVER(L6470)
  561. #include <SPI.h>
  562. #include <L6470.h>
  563. #define _L6470_DEFINE(ST) L6470 stepper##ST(ST##_ENABLE_PIN)
  564. // L6470 Stepper objects
  565. #if AXIS_DRIVER_TYPE(X, L6470)
  566. _L6470_DEFINE(X);
  567. #endif
  568. #if AXIS_DRIVER_TYPE(X2, L6470)
  569. _L6470_DEFINE(X2);
  570. #endif
  571. #if AXIS_DRIVER_TYPE(Y, L6470)
  572. _L6470_DEFINE(Y);
  573. #endif
  574. #if AXIS_DRIVER_TYPE(Y2, L6470)
  575. _L6470_DEFINE(Y2);
  576. #endif
  577. #if AXIS_DRIVER_TYPE(Z, L6470)
  578. _L6470_DEFINE(Z);
  579. #endif
  580. #if AXIS_DRIVER_TYPE(Z2, L6470)
  581. _L6470_DEFINE(Z2);
  582. #endif
  583. #if AXIS_DRIVER_TYPE(E0, L6470)
  584. _L6470_DEFINE(E0);
  585. #endif
  586. #if AXIS_DRIVER_TYPE(E1, L6470)
  587. _L6470_DEFINE(E1);
  588. #endif
  589. #if AXIS_DRIVER_TYPE(E2, L6470)
  590. _L6470_DEFINE(E2);
  591. #endif
  592. #if AXIS_DRIVER_TYPE(E3, L6470)
  593. _L6470_DEFINE(E3);
  594. #endif
  595. #if AXIS_DRIVER_TYPE(E4, L6470)
  596. _L6470_DEFINE(E4);
  597. #endif
  598. #define _L6470_INIT(A) do{ \
  599. stepper##A.init(); \
  600. stepper##A.softFree(); \
  601. stepper##A.setMicroSteps(A##_MICROSTEPS); \
  602. stepper##A.setOverCurrent(A##_OVERCURRENT); \
  603. stepper##A.setStallCurrent(A##_STALLCURRENT); \
  604. }while(0)
  605. void L6470_init_to_defaults() {
  606. #if AXIS_DRIVER_TYPE(X, L6470)
  607. _L6470_INIT(X);
  608. #endif
  609. #if AXIS_DRIVER_TYPE(X2, L6470)
  610. _L6470_INIT(X2);
  611. #endif
  612. #if AXIS_DRIVER_TYPE(Y, L6470)
  613. _L6470_INIT(Y);
  614. #endif
  615. #if AXIS_DRIVER_TYPE(Y2, L6470)
  616. _L6470_INIT(Y2);
  617. #endif
  618. #if AXIS_DRIVER_TYPE(Z, L6470)
  619. _L6470_INIT(Z);
  620. #endif
  621. #if AXIS_DRIVER_TYPE(Z2, L6470)
  622. _L6470_INIT(Z2);
  623. #endif
  624. #if AXIS_DRIVER_TYPE(E0, L6470)
  625. _L6470_INIT(E0);
  626. #endif
  627. #if AXIS_DRIVER_TYPE(E1, L6470)
  628. _L6470_INIT(E1);
  629. #endif
  630. #if AXIS_DRIVER_TYPE(E2, L6470)
  631. _L6470_INIT(E2);
  632. #endif
  633. #if AXIS_DRIVER_TYPE(E3, L6470)
  634. _L6470_INIT(E3);
  635. #endif
  636. #if AXIS_DRIVER_TYPE(E4, L6470)
  637. _L6470_INIT(E4);
  638. #endif
  639. }
  640. #endif // L6470