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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (C) 2019 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 "stepper.h"
  35. #if HAS_DRIVER(L6470)
  36. #include "L6470/L6470_Marlin.h"
  37. #endif
  38. //
  39. // TMC26X Driver objects and inits
  40. //
  41. #if HAS_DRIVER(TMC26X)
  42. #include <SPI.h>
  43. #ifdef STM32F7
  44. #include "../HAL/HAL_STM32F7/TMC2660.h"
  45. #else
  46. #include <TMC26XStepper.h>
  47. #endif
  48. #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
  49. #if AXIS_DRIVER_TYPE_X(TMC26X)
  50. _TMC26X_DEFINE(X);
  51. #endif
  52. #if AXIS_DRIVER_TYPE_X2(TMC26X)
  53. _TMC26X_DEFINE(X2);
  54. #endif
  55. #if AXIS_DRIVER_TYPE_Y(TMC26X)
  56. _TMC26X_DEFINE(Y);
  57. #endif
  58. #if AXIS_DRIVER_TYPE_Y2(TMC26X)
  59. _TMC26X_DEFINE(Y2);
  60. #endif
  61. #if AXIS_DRIVER_TYPE_Z(TMC26X)
  62. _TMC26X_DEFINE(Z);
  63. #endif
  64. #if AXIS_DRIVER_TYPE_Z2(TMC26X)
  65. _TMC26X_DEFINE(Z2);
  66. #endif
  67. #if AXIS_DRIVER_TYPE_Z3(TMC26X)
  68. _TMC26X_DEFINE(Z3);
  69. #endif
  70. #if AXIS_DRIVER_TYPE_E0(TMC26X)
  71. _TMC26X_DEFINE(E0);
  72. #endif
  73. #if AXIS_DRIVER_TYPE_E1(TMC26X)
  74. _TMC26X_DEFINE(E1);
  75. #endif
  76. #if AXIS_DRIVER_TYPE_E2(TMC26X)
  77. _TMC26X_DEFINE(E2);
  78. #endif
  79. #if AXIS_DRIVER_TYPE_E3(TMC26X)
  80. _TMC26X_DEFINE(E3);
  81. #endif
  82. #if AXIS_DRIVER_TYPE_E4(TMC26X)
  83. _TMC26X_DEFINE(E4);
  84. #endif
  85. #if AXIS_DRIVER_TYPE_E5(TMC26X)
  86. _TMC26X_DEFINE(E5);
  87. #endif
  88. #define _TMC26X_INIT(A) do{ \
  89. stepper##A.setMicrosteps(A##_MICROSTEPS); \
  90. stepper##A.start(); \
  91. }while(0)
  92. void tmc26x_init_to_defaults() {
  93. #if AXIS_DRIVER_TYPE_X(TMC26X)
  94. _TMC26X_INIT(X);
  95. #endif
  96. #if AXIS_DRIVER_TYPE_X2(TMC26X)
  97. _TMC26X_INIT(X2);
  98. #endif
  99. #if AXIS_DRIVER_TYPE_Y(TMC26X)
  100. _TMC26X_INIT(Y);
  101. #endif
  102. #if AXIS_DRIVER_TYPE_Y2(TMC26X)
  103. _TMC26X_INIT(Y2);
  104. #endif
  105. #if AXIS_DRIVER_TYPE_Z(TMC26X)
  106. _TMC26X_INIT(Z);
  107. #endif
  108. #if AXIS_DRIVER_TYPE_Z2(TMC26X)
  109. _TMC26X_INIT(Z2);
  110. #endif
  111. #if AXIS_DRIVER_TYPE_Z3(TMC26X)
  112. _TMC26X_INIT(Z3);
  113. #endif
  114. #if AXIS_DRIVER_TYPE_E0(TMC26X)
  115. _TMC26X_INIT(E0);
  116. #endif
  117. #if AXIS_DRIVER_TYPE_E1(TMC26X)
  118. _TMC26X_INIT(E1);
  119. #endif
  120. #if AXIS_DRIVER_TYPE_E2(TMC26X)
  121. _TMC26X_INIT(E2);
  122. #endif
  123. #if AXIS_DRIVER_TYPE_E3(TMC26X)
  124. _TMC26X_INIT(E3);
  125. #endif
  126. #if AXIS_DRIVER_TYPE_E4(TMC26X)
  127. _TMC26X_INIT(E4);
  128. #endif
  129. #if AXIS_DRIVER_TYPE_E5(TMC26X)
  130. _TMC26X_INIT(E5);
  131. #endif
  132. }
  133. #endif // TMC26X
  134. #if HAS_TRINAMIC
  135. enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
  136. #define _TMC_INIT(ST, SPMM_INDEX, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, planner.settings.axis_steps_per_mm[SPMM_INDEX], stealthchop_by_axis[STEALTH_INDEX])
  137. #endif
  138. //
  139. // TMC2130 Driver objects and inits
  140. //
  141. #if HAS_DRIVER(TMC2130)
  142. #include <SPI.h>
  143. #include "planner.h"
  144. #include "../core/enum.h"
  145. #if ENABLED(TMC_USE_SW_SPI)
  146. #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  147. #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
  148. #else
  149. #define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  150. #define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
  151. #endif
  152. // Stepper objects of TMC2130 steppers used
  153. #if AXIS_DRIVER_TYPE_X(TMC2130)
  154. TMC2130_DEFINE(X);
  155. #endif
  156. #if AXIS_DRIVER_TYPE_X2(TMC2130)
  157. TMC2130_DEFINE(X2);
  158. #endif
  159. #if AXIS_DRIVER_TYPE_Y(TMC2130)
  160. TMC2130_DEFINE(Y);
  161. #endif
  162. #if AXIS_DRIVER_TYPE_Y2(TMC2130)
  163. TMC2130_DEFINE(Y2);
  164. #endif
  165. #if AXIS_DRIVER_TYPE_Z(TMC2130)
  166. TMC2130_DEFINE(Z);
  167. #endif
  168. #if AXIS_DRIVER_TYPE_Z2(TMC2130)
  169. TMC2130_DEFINE(Z2);
  170. #endif
  171. #if AXIS_DRIVER_TYPE_Z3(TMC2130)
  172. TMC2130_DEFINE(Z3);
  173. #endif
  174. #if AXIS_DRIVER_TYPE_E0(TMC2130)
  175. TMC2130_DEFINE(E0);
  176. #endif
  177. #if AXIS_DRIVER_TYPE_E1(TMC2130)
  178. TMC2130_DEFINE(E1);
  179. #endif
  180. #if AXIS_DRIVER_TYPE_E2(TMC2130)
  181. TMC2130_DEFINE(E2);
  182. #endif
  183. #if AXIS_DRIVER_TYPE_E3(TMC2130)
  184. TMC2130_DEFINE(E3);
  185. #endif
  186. #if AXIS_DRIVER_TYPE_E4(TMC2130)
  187. TMC2130_DEFINE(E4);
  188. #endif
  189. #if AXIS_DRIVER_TYPE_E5(TMC2130)
  190. TMC2130_DEFINE(E5);
  191. #endif
  192. template<char AXIS_LETTER, char DRIVER_ID>
  193. 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, const bool stealth) {
  194. st.begin();
  195. CHOPCONF_t chopconf{0};
  196. chopconf.tbl = 1;
  197. chopconf.toff = chopper_timing.toff;
  198. chopconf.intpol = INTERPOLATE;
  199. chopconf.hend = chopper_timing.hend + 3;
  200. chopconf.hstrt = chopper_timing.hstrt - 1;
  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. st.en_pwm_mode(stealth);
  207. st.stored.stealthChop_enabled = stealth;
  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. #else
  217. UNUSED(thrs);
  218. UNUSED(spmm);
  219. #endif
  220. st.GSTAT(); // Clear GSTAT
  221. }
  222. #endif // TMC2130
  223. //
  224. // TMC2160 Driver objects and inits
  225. //
  226. #if HAS_DRIVER(TMC2160)
  227. #include <SPI.h>
  228. #include "planner.h"
  229. #include "../core/enum.h"
  230. #if ENABLED(TMC_USE_SW_SPI)
  231. #define _TMC2160_DEFINE(ST, L) TMCMarlin<TMC2160Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  232. #define TMC2160_DEFINE(ST) _TMC2160_DEFINE(ST, TMC_##ST##_LABEL)
  233. #else
  234. #define _TMC2160_DEFINE(ST, L) TMCMarlin<TMC2160Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  235. #define TMC2160_DEFINE(ST) _TMC2160_DEFINE(ST, TMC_##ST##_LABEL)
  236. #endif
  237. // Stepper objects of TMC2160 steppers used
  238. #if AXIS_DRIVER_TYPE(X, TMC2160)
  239. TMC2160_DEFINE(X);
  240. #endif
  241. #if AXIS_DRIVER_TYPE(X2, TMC2160)
  242. TMC2160_DEFINE(X2);
  243. #endif
  244. #if AXIS_DRIVER_TYPE(Y, TMC2160)
  245. TMC2160_DEFINE(Y);
  246. #endif
  247. #if AXIS_DRIVER_TYPE(Y2, TMC2160)
  248. TMC2160_DEFINE(Y2);
  249. #endif
  250. #if AXIS_DRIVER_TYPE(Z, TMC2160)
  251. TMC2160_DEFINE(Z);
  252. #endif
  253. #if AXIS_DRIVER_TYPE(Z2, TMC2160)
  254. TMC2160_DEFINE(Z2);
  255. #endif
  256. #if AXIS_DRIVER_TYPE(Z3, TMC2160)
  257. TMC2160_DEFINE(Z3);
  258. #endif
  259. #if AXIS_DRIVER_TYPE(E0, TMC2160)
  260. TMC2160_DEFINE(E0);
  261. #endif
  262. #if AXIS_DRIVER_TYPE(E1, TMC2160)
  263. TMC2160_DEFINE(E1);
  264. #endif
  265. #if AXIS_DRIVER_TYPE(E2, TMC2160)
  266. TMC2160_DEFINE(E2);
  267. #endif
  268. #if AXIS_DRIVER_TYPE(E3, TMC2160)
  269. TMC2160_DEFINE(E3);
  270. #endif
  271. #if AXIS_DRIVER_TYPE(E4, TMC2160)
  272. TMC2160_DEFINE(E4);
  273. #endif
  274. #if AXIS_DRIVER_TYPE(E5, TMC2160)
  275. TMC2160_DEFINE(E5);
  276. #endif
  277. template<char AXIS_LETTER, char DRIVER_ID>
  278. void tmc_init(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm, const bool stealth) {
  279. st.begin();
  280. static constexpr int8_t timings[] = CHOPPER_TIMING; // Default 4, -2, 1
  281. CHOPCONF_t chopconf{0};
  282. chopconf.tbl = 1;
  283. chopconf.toff = timings[0];
  284. chopconf.intpol = INTERPOLATE;
  285. chopconf.hend = timings[1] + 3;
  286. chopconf.hstrt = timings[2] - 1;
  287. st.CHOPCONF(chopconf.sr);
  288. st.rms_current(mA, HOLD_MULTIPLIER);
  289. st.microsteps(microsteps);
  290. st.iholddelay(10);
  291. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  292. st.TCOOLTHRS(0xFFFFF);
  293. #if ENABLED(ADAPTIVE_CURRENT)
  294. COOLCONF_t coolconf{0};
  295. coolconf.semin = INCREASE_CURRENT_THRS;
  296. coolconf.semax = REDUCE_CURRENT_THRS;
  297. st.COOLCONF(coolconf.sr);
  298. #endif
  299. st.en_pwm_mode(stealth);
  300. PWMCONF_t pwmconf{0};
  301. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  302. pwmconf.pwm_autoscale = true;
  303. pwmconf.pwm_grad = 5;
  304. pwmconf.pwm_ampl = 180;
  305. st.PWMCONF(pwmconf.sr);
  306. #if ENABLED(HYBRID_THRESHOLD)
  307. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  308. #else
  309. UNUSED(thrs);
  310. UNUSED(spmm);
  311. #endif
  312. st.GSTAT(); // Clear GSTAT
  313. }
  314. #endif // TMC2160
  315. //
  316. // TMC2208 Driver objects and inits
  317. //
  318. #if HAS_DRIVER(TMC2208)
  319. #include <HardwareSerial.h>
  320. #include "planner.h"
  321. #define _TMC2208_DEFINE_HARDWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(&ST##_HARDWARE_SERIAL, ST##_RSENSE)
  322. #define TMC2208_DEFINE_HARDWARE(ST) _TMC2208_DEFINE_HARDWARE(ST, TMC_##ST##_LABEL)
  323. #define _TMC2208_DEFINE_SOFTWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_RSENSE, ST##_SERIAL_RX_PIN > -1)
  324. #define TMC2208_DEFINE_SOFTWARE(ST) _TMC2208_DEFINE_SOFTWARE(ST, TMC_##ST##_LABEL)
  325. // Stepper objects of TMC2208 steppers used
  326. #if AXIS_DRIVER_TYPE_X(TMC2208)
  327. #ifdef X_HARDWARE_SERIAL
  328. TMC2208_DEFINE_HARDWARE(X);
  329. #else
  330. TMC2208_DEFINE_SOFTWARE(X);
  331. #endif
  332. #endif
  333. #if AXIS_DRIVER_TYPE_X2(TMC2208)
  334. #ifdef X2_HARDWARE_SERIAL
  335. TMC2208_DEFINE_HARDWARE(X2);
  336. #else
  337. TMC2208_DEFINE_SOFTWARE(X2);
  338. #endif
  339. #endif
  340. #if AXIS_DRIVER_TYPE_Y(TMC2208)
  341. #ifdef Y_HARDWARE_SERIAL
  342. TMC2208_DEFINE_HARDWARE(Y);
  343. #else
  344. TMC2208_DEFINE_SOFTWARE(Y);
  345. #endif
  346. #endif
  347. #if AXIS_DRIVER_TYPE_Y2(TMC2208)
  348. #ifdef Y2_HARDWARE_SERIAL
  349. TMC2208_DEFINE_HARDWARE(Y2);
  350. #else
  351. TMC2208_DEFINE_SOFTWARE(Y2);
  352. #endif
  353. #endif
  354. #if AXIS_DRIVER_TYPE_Z(TMC2208)
  355. #ifdef Z_HARDWARE_SERIAL
  356. TMC2208_DEFINE_HARDWARE(Z);
  357. #else
  358. TMC2208_DEFINE_SOFTWARE(Z);
  359. #endif
  360. #endif
  361. #if AXIS_DRIVER_TYPE_Z2(TMC2208)
  362. #ifdef Z2_HARDWARE_SERIAL
  363. TMC2208_DEFINE_HARDWARE(Z2);
  364. #else
  365. TMC2208_DEFINE_SOFTWARE(Z2);
  366. #endif
  367. #endif
  368. #if AXIS_DRIVER_TYPE_Z3(TMC2208)
  369. #ifdef Z3_HARDWARE_SERIAL
  370. TMC2208_DEFINE_HARDWARE(Z3);
  371. #else
  372. TMC2208_DEFINE_SOFTWARE(Z3);
  373. #endif
  374. #endif
  375. #if AXIS_DRIVER_TYPE_E0(TMC2208)
  376. #ifdef E0_HARDWARE_SERIAL
  377. TMC2208_DEFINE_HARDWARE(E0);
  378. #else
  379. TMC2208_DEFINE_SOFTWARE(E0);
  380. #endif
  381. #endif
  382. #if AXIS_DRIVER_TYPE_E1(TMC2208)
  383. #ifdef E1_HARDWARE_SERIAL
  384. TMC2208_DEFINE_HARDWARE(E1);
  385. #else
  386. TMC2208_DEFINE_SOFTWARE(E1);
  387. #endif
  388. #endif
  389. #if AXIS_DRIVER_TYPE_E2(TMC2208)
  390. #ifdef E2_HARDWARE_SERIAL
  391. TMC2208_DEFINE_HARDWARE(E2);
  392. #else
  393. TMC2208_DEFINE_SOFTWARE(E2);
  394. #endif
  395. #endif
  396. #if AXIS_DRIVER_TYPE_E3(TMC2208)
  397. #ifdef E3_HARDWARE_SERIAL
  398. TMC2208_DEFINE_HARDWARE(E3);
  399. #else
  400. TMC2208_DEFINE_SOFTWARE(E3);
  401. #endif
  402. #endif
  403. #if AXIS_DRIVER_TYPE_E4(TMC2208)
  404. #ifdef E4_HARDWARE_SERIAL
  405. TMC2208_DEFINE_HARDWARE(E4);
  406. #else
  407. TMC2208_DEFINE_SOFTWARE(E4);
  408. #endif
  409. #endif
  410. #if AXIS_DRIVER_TYPE_E5(TMC2208)
  411. #ifdef E5_HARDWARE_SERIAL
  412. TMC2208_DEFINE_HARDWARE(E5);
  413. #else
  414. TMC2208_DEFINE_SOFTWARE(E5);
  415. #endif
  416. #endif
  417. void tmc2208_serial_begin() {
  418. #if AXIS_DRIVER_TYPE_X(TMC2208)
  419. #ifdef X_HARDWARE_SERIAL
  420. X_HARDWARE_SERIAL.begin(115200);
  421. #else
  422. stepperX.beginSerial(115200);
  423. #endif
  424. #endif
  425. #if AXIS_DRIVER_TYPE_X2(TMC2208)
  426. #ifdef X2_HARDWARE_SERIAL
  427. X2_HARDWARE_SERIAL.begin(115200);
  428. #else
  429. stepperX2.beginSerial(115200);
  430. #endif
  431. #endif
  432. #if AXIS_DRIVER_TYPE_Y(TMC2208)
  433. #ifdef Y_HARDWARE_SERIAL
  434. Y_HARDWARE_SERIAL.begin(115200);
  435. #else
  436. stepperY.beginSerial(115200);
  437. #endif
  438. #endif
  439. #if AXIS_DRIVER_TYPE_Y2(TMC2208)
  440. #ifdef Y2_HARDWARE_SERIAL
  441. Y2_HARDWARE_SERIAL.begin(115200);
  442. #else
  443. stepperY2.beginSerial(115200);
  444. #endif
  445. #endif
  446. #if AXIS_DRIVER_TYPE_Z(TMC2208)
  447. #ifdef Z_HARDWARE_SERIAL
  448. Z_HARDWARE_SERIAL.begin(115200);
  449. #else
  450. stepperZ.beginSerial(115200);
  451. #endif
  452. #endif
  453. #if AXIS_DRIVER_TYPE_Z2(TMC2208)
  454. #ifdef Z2_HARDWARE_SERIAL
  455. Z2_HARDWARE_SERIAL.begin(115200);
  456. #else
  457. stepperZ2.beginSerial(115200);
  458. #endif
  459. #endif
  460. #if AXIS_DRIVER_TYPE_Z3(TMC2208)
  461. #ifdef Z3_HARDWARE_SERIAL
  462. Z3_HARDWARE_SERIAL.begin(115200);
  463. #else
  464. stepperZ3.beginSerial(115200);
  465. #endif
  466. #endif
  467. #if AXIS_DRIVER_TYPE_E0(TMC2208)
  468. #ifdef E0_HARDWARE_SERIAL
  469. E0_HARDWARE_SERIAL.begin(115200);
  470. #else
  471. stepperE0.beginSerial(115200);
  472. #endif
  473. #endif
  474. #if AXIS_DRIVER_TYPE_E1(TMC2208)
  475. #ifdef E1_HARDWARE_SERIAL
  476. E1_HARDWARE_SERIAL.begin(115200);
  477. #else
  478. stepperE1.beginSerial(115200);
  479. #endif
  480. #endif
  481. #if AXIS_DRIVER_TYPE_E2(TMC2208)
  482. #ifdef E2_HARDWARE_SERIAL
  483. E2_HARDWARE_SERIAL.begin(115200);
  484. #else
  485. stepperE2.beginSerial(115200);
  486. #endif
  487. #endif
  488. #if AXIS_DRIVER_TYPE_E3(TMC2208)
  489. #ifdef E3_HARDWARE_SERIAL
  490. E3_HARDWARE_SERIAL.begin(115200);
  491. #else
  492. stepperE3.beginSerial(115200);
  493. #endif
  494. #endif
  495. #if AXIS_DRIVER_TYPE_E4(TMC2208)
  496. #ifdef E4_HARDWARE_SERIAL
  497. E4_HARDWARE_SERIAL.begin(115200);
  498. #else
  499. stepperE4.beginSerial(115200);
  500. #endif
  501. #endif
  502. #if AXIS_DRIVER_TYPE_E5(TMC2208)
  503. #ifdef E5_HARDWARE_SERIAL
  504. E5_HARDWARE_SERIAL.begin(115200);
  505. #else
  506. stepperE5.beginSerial(115200);
  507. #endif
  508. #endif
  509. }
  510. template<char AXIS_LETTER, char DRIVER_ID>
  511. 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, const bool stealth) {
  512. TMC2208_n::GCONF_t gconf{0};
  513. gconf.pdn_disable = true; // Use UART
  514. gconf.mstep_reg_select = true; // Select microsteps with UART
  515. gconf.i_scale_analog = false;
  516. gconf.en_spreadcycle = !stealth;
  517. st.GCONF(gconf.sr);
  518. st.stored.stealthChop_enabled = stealth;
  519. TMC2208_n::CHOPCONF_t chopconf{0};
  520. chopconf.tbl = 0b01; // blank_time = 24
  521. chopconf.toff = chopper_timing.toff;
  522. chopconf.intpol = INTERPOLATE;
  523. chopconf.hend = chopper_timing.hend + 3;
  524. chopconf.hstrt = chopper_timing.hstrt - 1;
  525. st.CHOPCONF(chopconf.sr);
  526. st.rms_current(mA, HOLD_MULTIPLIER);
  527. st.microsteps(microsteps);
  528. st.iholddelay(10);
  529. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  530. TMC2208_n::PWMCONF_t pwmconf{0};
  531. pwmconf.pwm_lim = 12;
  532. pwmconf.pwm_reg = 8;
  533. pwmconf.pwm_autograd = true;
  534. pwmconf.pwm_autoscale = true;
  535. pwmconf.pwm_freq = 0b01;
  536. pwmconf.pwm_grad = 14;
  537. pwmconf.pwm_ofs = 36;
  538. st.PWMCONF(pwmconf.sr);
  539. #if ENABLED(HYBRID_THRESHOLD)
  540. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  541. #else
  542. UNUSED(thrs);
  543. UNUSED(spmm);
  544. #endif
  545. st.GSTAT(0b111); // Clear
  546. delay(200);
  547. }
  548. #endif // TMC2208
  549. //
  550. // TMC2660 Driver objects and inits
  551. //
  552. #if HAS_DRIVER(TMC2660)
  553. #include <SPI.h>
  554. #include "planner.h"
  555. #include "../core/enum.h"
  556. #if ENABLED(TMC_USE_SW_SPI)
  557. #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  558. #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
  559. #else
  560. #define _TMC2660_DEFINE(ST, L) TMCMarlin<TMC2660Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  561. #define TMC2660_DEFINE(ST) _TMC2660_DEFINE(ST, TMC_##ST##_LABEL)
  562. #endif
  563. // Stepper objects of TMC2660 steppers used
  564. #if AXIS_DRIVER_TYPE_X(TMC2660)
  565. TMC2660_DEFINE(X);
  566. #endif
  567. #if AXIS_DRIVER_TYPE_X2(TMC2660)
  568. TMC2660_DEFINE(X2);
  569. #endif
  570. #if AXIS_DRIVER_TYPE_Y(TMC2660)
  571. TMC2660_DEFINE(Y);
  572. #endif
  573. #if AXIS_DRIVER_TYPE_Y2(TMC2660)
  574. TMC2660_DEFINE(Y2);
  575. #endif
  576. #if AXIS_DRIVER_TYPE_Z(TMC2660)
  577. TMC2660_DEFINE(Z);
  578. #endif
  579. #if AXIS_DRIVER_TYPE_Z2(TMC2660)
  580. TMC2660_DEFINE(Z2);
  581. #endif
  582. #if AXIS_DRIVER_TYPE_E0(TMC2660)
  583. TMC2660_DEFINE(E0);
  584. #endif
  585. #if AXIS_DRIVER_TYPE_E1(TMC2660)
  586. TMC2660_DEFINE(E1);
  587. #endif
  588. #if AXIS_DRIVER_TYPE_E2(TMC2660)
  589. TMC2660_DEFINE(E2);
  590. #endif
  591. #if AXIS_DRIVER_TYPE_E3(TMC2660)
  592. TMC2660_DEFINE(E3);
  593. #endif
  594. #if AXIS_DRIVER_TYPE_E4(TMC2660)
  595. TMC2660_DEFINE(E4);
  596. #endif
  597. #if AXIS_DRIVER_TYPE_E5(TMC2660)
  598. TMC2660_DEFINE(E5);
  599. #endif
  600. template<char AXIS_LETTER, char DRIVER_ID>
  601. void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const float, const bool) {
  602. st.begin();
  603. TMC2660_n::CHOPCONF_t chopconf{0};
  604. chopconf.tbl = 1;
  605. chopconf.toff = chopper_timing.toff;
  606. chopconf.hend = chopper_timing.hend + 3;
  607. chopconf.hstrt = chopper_timing.hstrt - 1;
  608. st.CHOPCONF(chopconf.sr);
  609. st.rms_current(mA);
  610. st.microsteps(microsteps);
  611. st.intpol(INTERPOLATE);
  612. st.diss2g(true); // Disable short to ground protection. Too many false readings?
  613. #if ENABLED(TMC_DEBUG)
  614. st.rdsel(0b01);
  615. #endif
  616. }
  617. #endif // TMC2660
  618. //
  619. // TMC5130 Driver objects and inits
  620. //
  621. #if HAS_DRIVER(TMC5130)
  622. #include <SPI.h>
  623. #include "planner.h"
  624. #include "../core/enum.h"
  625. #if ENABLED(TMC_USE_SW_SPI)
  626. #define _TMC5130_DEFINE(ST, L) TMCMarlin<TMC5130Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  627. #define TMC5130_DEFINE(ST) _TMC5130_DEFINE(ST, TMC_##ST##_LABEL)
  628. #else
  629. #define _TMC5130_DEFINE(ST, L) TMCMarlin<TMC5130Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  630. #define TMC5130_DEFINE(ST) _TMC5130_DEFINE(ST, TMC_##ST##_LABEL)
  631. #endif
  632. // Stepper objects of TMC5130 steppers used
  633. #if AXIS_DRIVER_TYPE_X(TMC5130)
  634. TMC5130_DEFINE(X);
  635. #endif
  636. #if AXIS_DRIVER_TYPE_X2(TMC5130)
  637. TMC5130_DEFINE(X2);
  638. #endif
  639. #if AXIS_DRIVER_TYPE_Y(TMC5130)
  640. TMC5130_DEFINE(Y);
  641. #endif
  642. #if AXIS_DRIVER_TYPE_Y2(TMC5130)
  643. TMC5130_DEFINE(Y2);
  644. #endif
  645. #if AXIS_DRIVER_TYPE_Z(TMC5130)
  646. TMC5130_DEFINE(Z);
  647. #endif
  648. #if AXIS_DRIVER_TYPE_Z2(TMC5130)
  649. TMC5130_DEFINE(Z2);
  650. #endif
  651. #if AXIS_DRIVER_TYPE_Z3(TMC5130)
  652. TMC5130_DEFINE(Z3);
  653. #endif
  654. #if AXIS_DRIVER_TYPE_E0(TMC5130)
  655. TMC5130_DEFINE(E0);
  656. #endif
  657. #if AXIS_DRIVER_TYPE_E1(TMC5130)
  658. TMC5130_DEFINE(E1);
  659. #endif
  660. #if AXIS_DRIVER_TYPE_E2(TMC5130)
  661. TMC5130_DEFINE(E2);
  662. #endif
  663. #if AXIS_DRIVER_TYPE_E3(TMC5130)
  664. TMC5130_DEFINE(E3);
  665. #endif
  666. #if AXIS_DRIVER_TYPE_E4(TMC5130)
  667. TMC5130_DEFINE(E4);
  668. #endif
  669. #if AXIS_DRIVER_TYPE_E5(TMC5130)
  670. TMC5130_DEFINE(E5);
  671. #endif
  672. template<char AXIS_LETTER, char DRIVER_ID>
  673. void tmc_init(TMCMarlin<TMC5130Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm, const bool stealth) {
  674. st.begin();
  675. CHOPCONF_t chopconf{0};
  676. chopconf.tbl = 1;
  677. chopconf.toff = chopper_timing.toff;
  678. chopconf.intpol = INTERPOLATE;
  679. chopconf.hend = chopper_timing.hend + 3;
  680. chopconf.hstrt = chopper_timing.hstrt - 1;
  681. st.CHOPCONF(chopconf.sr);
  682. st.rms_current(mA, HOLD_MULTIPLIER);
  683. st.microsteps(microsteps);
  684. st.iholddelay(10);
  685. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  686. st.en_pwm_mode(stealth);
  687. st.stored.stealthChop_enabled = stealth;
  688. PWMCONF_t pwmconf{0};
  689. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  690. pwmconf.pwm_autoscale = true;
  691. pwmconf.pwm_grad = 5;
  692. pwmconf.pwm_ampl = 180;
  693. st.PWMCONF(pwmconf.sr);
  694. #if ENABLED(HYBRID_THRESHOLD)
  695. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  696. #else
  697. UNUSED(thrs);
  698. UNUSED(spmm);
  699. #endif
  700. st.GSTAT(); // Clear GSTAT
  701. }
  702. #endif // TMC5130
  703. //
  704. // TMC5160 Driver objects and inits
  705. //
  706. #if HAS_DRIVER(TMC5160)
  707. #include <SPI.h>
  708. #include "planner.h"
  709. #include "../core/enum.h"
  710. #if ENABLED(TMC_USE_SW_SPI)
  711. #define _TMC5160_DEFINE(ST, L) TMCMarlin<TMC5160Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  712. #define TMC5160_DEFINE(ST) _TMC5160_DEFINE(ST, TMC_##ST##_LABEL)
  713. #else
  714. #define _TMC5160_DEFINE(ST, L) TMCMarlin<TMC5160Stepper, L> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  715. #define TMC5160_DEFINE(ST) _TMC5160_DEFINE(ST, TMC_##ST##_LABEL)
  716. #endif
  717. // Stepper objects of TMC5160 steppers used
  718. #if AXIS_DRIVER_TYPE(X, TMC5160)
  719. TMC5160_DEFINE(X);
  720. #endif
  721. #if AXIS_DRIVER_TYPE(X2, TMC5160)
  722. TMC5160_DEFINE(X2);
  723. #endif
  724. #if AXIS_DRIVER_TYPE(Y, TMC5160)
  725. TMC5160_DEFINE(Y);
  726. #endif
  727. #if AXIS_DRIVER_TYPE(Y2, TMC5160)
  728. TMC5160_DEFINE(Y2);
  729. #endif
  730. #if AXIS_DRIVER_TYPE(Z, TMC5160)
  731. TMC5160_DEFINE(Z);
  732. #endif
  733. #if AXIS_DRIVER_TYPE(Z2, TMC5160)
  734. TMC5160_DEFINE(Z2);
  735. #endif
  736. #if AXIS_DRIVER_TYPE(Z3, TMC5160)
  737. TMC5160_DEFINE(Z3);
  738. #endif
  739. #if AXIS_DRIVER_TYPE(E0, TMC5160)
  740. TMC5160_DEFINE(E0);
  741. #endif
  742. #if AXIS_DRIVER_TYPE(E1, TMC5160)
  743. TMC5160_DEFINE(E1);
  744. #endif
  745. #if AXIS_DRIVER_TYPE(E2, TMC5160)
  746. TMC5160_DEFINE(E2);
  747. #endif
  748. #if AXIS_DRIVER_TYPE(E3, TMC5160)
  749. TMC5160_DEFINE(E3);
  750. #endif
  751. #if AXIS_DRIVER_TYPE(E4, TMC5160)
  752. TMC5160_DEFINE(E4);
  753. #endif
  754. #if AXIS_DRIVER_TYPE(E5, TMC5160)
  755. TMC5160_DEFINE(E5);
  756. #endif
  757. template<char AXIS_LETTER, char DRIVER_ID>
  758. void tmc_init(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm, const bool stealth) {
  759. st.begin();
  760. int8_t timings[] = CHOPPER_TIMING; // Default 4, -2, 1
  761. CHOPCONF_t chopconf{0};
  762. chopconf.tbl = 1;
  763. chopconf.toff = timings[0];
  764. chopconf.intpol = INTERPOLATE;
  765. chopconf.hend = timings[1] + 3;
  766. chopconf.hstrt = timings[2] - 1;
  767. st.CHOPCONF(chopconf.sr);
  768. st.rms_current(mA, HOLD_MULTIPLIER);
  769. st.microsteps(microsteps);
  770. st.iholddelay(10);
  771. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  772. #if ENABLED(ADAPTIVE_CURRENT)
  773. COOLCONF_t coolconf{0};
  774. coolconf.semin = INCREASE_CURRENT_THRS;
  775. coolconf.semax = REDUCE_CURRENT_THRS;
  776. st.COOLCONF(coolconf.sr);
  777. #endif
  778. st.en_pwm_mode(stealth);
  779. PWMCONF_t pwmconf{0};
  780. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  781. pwmconf.pwm_autoscale = true;
  782. pwmconf.pwm_grad = 5;
  783. pwmconf.pwm_ampl = 180;
  784. st.PWMCONF(pwmconf.sr);
  785. #if ENABLED(HYBRID_THRESHOLD)
  786. st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
  787. #else
  788. UNUSED(thrs);
  789. UNUSED(spmm);
  790. #endif
  791. st.GSTAT(); // Clear GSTAT
  792. }
  793. #endif // TMC5160
  794. void restore_stepper_drivers() {
  795. #if AXIS_IS_TMC(X)
  796. stepperX.push();
  797. #endif
  798. #if AXIS_IS_TMC(X2)
  799. stepperX2.push();
  800. #endif
  801. #if AXIS_IS_TMC(Y)
  802. stepperY.push();
  803. #endif
  804. #if AXIS_IS_TMC(Y2)
  805. stepperY2.push();
  806. #endif
  807. #if AXIS_IS_TMC(Z)
  808. stepperZ.push();
  809. #endif
  810. #if AXIS_IS_TMC(Z2)
  811. stepperZ2.push();
  812. #endif
  813. #if AXIS_IS_TMC(Z3)
  814. stepperZ3.push();
  815. #endif
  816. #if AXIS_IS_TMC(E0)
  817. stepperE0.push();
  818. #endif
  819. #if AXIS_IS_TMC(E1)
  820. stepperE1.push();
  821. #endif
  822. #if AXIS_IS_TMC(E2)
  823. stepperE2.push();
  824. #endif
  825. #if AXIS_IS_TMC(E3)
  826. stepperE3.push();
  827. #endif
  828. #if AXIS_IS_TMC(E4)
  829. stepperE4.push();
  830. #endif
  831. #if AXIS_IS_TMC(E5)
  832. stepperE5.push();
  833. #endif
  834. }
  835. void reset_stepper_drivers() {
  836. #if HAS_DRIVER(TMC26X)
  837. tmc26x_init_to_defaults();
  838. #endif
  839. #if HAS_DRIVER(L6470)
  840. L6470.init_to_defaults();
  841. #endif
  842. #if HAS_TRINAMIC
  843. static constexpr bool stealthchop_by_axis[] = {
  844. #if ENABLED(STEALTHCHOP_XY)
  845. true
  846. #else
  847. false
  848. #endif
  849. ,
  850. #if ENABLED(STEALTHCHOP_Z)
  851. true
  852. #else
  853. false
  854. #endif
  855. ,
  856. #if ENABLED(STEALTHCHOP_E)
  857. true
  858. #else
  859. false
  860. #endif
  861. };
  862. #endif
  863. #if AXIS_IS_TMC(X)
  864. _TMC_INIT(X, X_AXIS, STEALTH_AXIS_XY);
  865. #endif
  866. #if AXIS_IS_TMC(X2)
  867. _TMC_INIT(X2, X_AXIS, STEALTH_AXIS_XY);
  868. #endif
  869. #if AXIS_IS_TMC(Y)
  870. _TMC_INIT(Y, Y_AXIS, STEALTH_AXIS_XY);
  871. #endif
  872. #if AXIS_IS_TMC(Y2)
  873. _TMC_INIT(Y2, Y_AXIS, STEALTH_AXIS_XY);
  874. #endif
  875. #if AXIS_IS_TMC(Z)
  876. _TMC_INIT(Z, Z_AXIS, STEALTH_AXIS_Z);
  877. #endif
  878. #if AXIS_IS_TMC(Z2)
  879. _TMC_INIT(Z2, Z_AXIS, STEALTH_AXIS_Z);
  880. #endif
  881. #if AXIS_IS_TMC(Z3)
  882. _TMC_INIT(Z3, Z_AXIS, STEALTH_AXIS_Z);
  883. #endif
  884. #if AXIS_IS_TMC(E0)
  885. _TMC_INIT(E0, E_AXIS, STEALTH_AXIS_E);
  886. #endif
  887. #if AXIS_IS_TMC(E1)
  888. _TMC_INIT(E1, E_AXIS_N(1), STEALTH_AXIS_E);
  889. #endif
  890. #if AXIS_IS_TMC(E2)
  891. _TMC_INIT(E2, E_AXIS_N(2), STEALTH_AXIS_E);
  892. #endif
  893. #if AXIS_IS_TMC(E3)
  894. _TMC_INIT(E3, E_AXIS_N(3), STEALTH_AXIS_E);
  895. #endif
  896. #if AXIS_IS_TMC(E4)
  897. _TMC_INIT(E4, E_AXIS_N(4), STEALTH_AXIS_E);
  898. #endif
  899. #if AXIS_IS_TMC(E5)
  900. _TMC_INIT(E5, E_AXIS_N(5), STEALTH_AXIS_E);
  901. #endif
  902. #if USE_SENSORLESS
  903. #if X_SENSORLESS
  904. #if AXIS_HAS_STALLGUARD(X)
  905. stepperX.sgt(X_STALL_SENSITIVITY);
  906. #endif
  907. #if AXIS_HAS_STALLGUARD(X2)
  908. stepperX2.sgt(X_STALL_SENSITIVITY);
  909. #endif
  910. #endif
  911. #if Y_SENSORLESS
  912. #if AXIS_HAS_STALLGUARD(Y)
  913. stepperY.sgt(Y_STALL_SENSITIVITY);
  914. #endif
  915. #if AXIS_HAS_STALLGUARD(Y2)
  916. stepperY2.sgt(Y_STALL_SENSITIVITY);
  917. #endif
  918. #endif
  919. #if Z_SENSORLESS
  920. #if AXIS_HAS_STALLGUARD(Z)
  921. stepperZ.sgt(Z_STALL_SENSITIVITY);
  922. #endif
  923. #if AXIS_HAS_STALLGUARD(Z2)
  924. stepperZ2.sgt(Z_STALL_SENSITIVITY);
  925. #endif
  926. #if AXIS_HAS_STALLGUARD(Z3)
  927. stepperZ3.sgt(Z_STALL_SENSITIVITY);
  928. #endif
  929. #endif
  930. #endif
  931. #ifdef TMC_ADV
  932. TMC_ADV()
  933. #endif
  934. #if HAS_TRINAMIC
  935. stepper.set_directions();
  936. #endif
  937. }
  938. //
  939. // L6470 Driver objects and inits
  940. //
  941. #if HAS_DRIVER(L6470)
  942. // create stepper objects
  943. #define _L6470_DEFINE(ST) L6470 stepper##ST((const int)L6470_CHAIN_SS_PIN)
  944. // L6470 Stepper objects
  945. #if AXIS_DRIVER_TYPE_X(L6470)
  946. _L6470_DEFINE(X);
  947. #endif
  948. #if AXIS_DRIVER_TYPE_X2(L6470)
  949. _L6470_DEFINE(X2);
  950. #endif
  951. #if AXIS_DRIVER_TYPE_Y(L6470)
  952. _L6470_DEFINE(Y);
  953. #endif
  954. #if AXIS_DRIVER_TYPE_Y2(L6470)
  955. _L6470_DEFINE(Y2);
  956. #endif
  957. #if AXIS_DRIVER_TYPE_Z(L6470)
  958. _L6470_DEFINE(Z);
  959. #endif
  960. #if AXIS_DRIVER_TYPE_Z2(L6470)
  961. _L6470_DEFINE(Z2);
  962. #endif
  963. #if AXIS_DRIVER_TYPE_Z3(L6470)
  964. _L6470_DEFINE(Z3);
  965. #endif
  966. #if AXIS_DRIVER_TYPE_E0(L6470)
  967. _L6470_DEFINE(E0);
  968. #endif
  969. #if AXIS_DRIVER_TYPE_E1(L6470)
  970. _L6470_DEFINE(E1);
  971. #endif
  972. #if AXIS_DRIVER_TYPE_E2(L6470)
  973. _L6470_DEFINE(E2);
  974. #endif
  975. #if AXIS_DRIVER_TYPE_E3(L6470)
  976. _L6470_DEFINE(E3);
  977. #endif
  978. #if AXIS_DRIVER_TYPE_E4(L6470)
  979. _L6470_DEFINE(E4);
  980. #endif
  981. #if AXIS_DRIVER_TYPE_E5(L6470)
  982. _L6470_DEFINE(E5);
  983. #endif
  984. // not using L6470 library's init command because it
  985. // briefly sends power to the steppers
  986. #define _L6470_INIT_CHIP(Q) do{ \
  987. stepper##Q.resetDev(); \
  988. stepper##Q.softFree(); \
  989. stepper##Q.SetParam(L6470_CONFIG, CONFIG_PWM_DIV_1 \
  990. | CONFIG_PWM_MUL_2 \
  991. | CONFIG_SR_290V_us \
  992. | CONFIG_OC_SD_DISABLE \
  993. | CONFIG_VS_COMP_DISABLE \
  994. | CONFIG_SW_HARD_STOP \
  995. | CONFIG_INT_16MHZ); \
  996. stepper##Q.SetParam(L6470_KVAL_RUN, 0xFF); \
  997. stepper##Q.SetParam(L6470_KVAL_ACC, 0xFF); \
  998. stepper##Q.SetParam(L6470_KVAL_DEC, 0xFF); \
  999. stepper##Q.setMicroSteps(Q##_MICROSTEPS); \
  1000. stepper##Q.setOverCurrent(Q##_OVERCURRENT); \
  1001. stepper##Q.setStallCurrent(Q##_STALLCURRENT); \
  1002. stepper##Q.SetParam(L6470_KVAL_HOLD, Q##_MAX_VOLTAGE); \
  1003. stepper##Q.SetParam(L6470_ABS_POS, 0); \
  1004. stepper##Q.getStatus(); \
  1005. }while(0)
  1006. void L6470_Marlin::init_to_defaults() {
  1007. #if AXIS_DRIVER_TYPE_X(L6470)
  1008. _L6470_INIT_CHIP(X);
  1009. #endif
  1010. #if AXIS_DRIVER_TYPE_X2(L6470)
  1011. _L6470_INIT_CHIP(X2);
  1012. #endif
  1013. #if AXIS_DRIVER_TYPE_Y(L6470)
  1014. _L6470_INIT_CHIP(Y);
  1015. #endif
  1016. #if AXIS_DRIVER_TYPE_Y2(L6470)
  1017. _L6470_INIT_CHIP(Y2);
  1018. #endif
  1019. #if AXIS_DRIVER_TYPE_Z(L6470)
  1020. _L6470_INIT_CHIP(Z);
  1021. #endif
  1022. #if AXIS_DRIVER_TYPE_Z2(L6470)
  1023. _L6470_INIT_CHIP(Z2);
  1024. #endif
  1025. #if AXIS_DRIVER_TYPE_Z3(L6470)
  1026. _L6470_INIT_CHIP(Z3);
  1027. #endif
  1028. #if AXIS_DRIVER_TYPE_E0(L6470)
  1029. _L6470_INIT_CHIP(E0);
  1030. #endif
  1031. #if AXIS_DRIVER_TYPE_E1(L6470)
  1032. _L6470_INIT_CHIP(E1);
  1033. #endif
  1034. #if AXIS_DRIVER_TYPE_E2(L6470)
  1035. _L6470_INIT_CHIP(E2);
  1036. #endif
  1037. #if AXIS_DRIVER_TYPE_E3(L6470)
  1038. _L6470_INIT_CHIP(E3);
  1039. #endif
  1040. #if AXIS_DRIVER_TYPE_E4(L6470)
  1041. _L6470_INIT_CHIP(E4);
  1042. #endif
  1043. #if AXIS_DRIVER_TYPE_E5(L6470)
  1044. _L6470_INIT_CHIP(E5);
  1045. #endif
  1046. }
  1047. #endif // L6470