stepper_indirection.cpp 18 KB

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