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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  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. #include <HardwareSerial.h>
  136. #include <SPI.h>
  137. #include "planner.h"
  138. #include "../core/enum.h"
  139. enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
  140. #define _TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX])
  141. // IC = TMC model number
  142. // ST = Stepper object letter
  143. // L = Label characters
  144. // AI = Axis Enum Index
  145. // SWHW = SW/SH UART selection
  146. #if ENABLED(TMC_USE_SW_SPI)
  147. #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
  148. #else
  149. #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
  150. #endif
  151. #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(&ST##_HARDWARE_SERIAL, ST##_RSENSE, ST##_SLAVE_ADDRESS)
  152. #define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_RSENSE, ST##_SLAVE_ADDRESS, ST##_SERIAL_RX_PIN > -1)
  153. #define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
  154. #define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
  155. #define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
  156. #define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
  157. #if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1
  158. #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
  159. #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
  160. #else
  161. #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
  162. #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E)
  163. #endif
  164. // Stepper objects of TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 steppers used
  165. #if AXIS_HAS_SPI(X)
  166. TMC_SPI_DEFINE(X, X);
  167. #endif
  168. #if AXIS_HAS_SPI(X2)
  169. TMC_SPI_DEFINE(X2, X);
  170. #endif
  171. #if AXIS_HAS_SPI(Y)
  172. TMC_SPI_DEFINE(Y, Y);
  173. #endif
  174. #if AXIS_HAS_SPI(Y2)
  175. TMC_SPI_DEFINE(Y2, Y);
  176. #endif
  177. #if AXIS_HAS_SPI(Z)
  178. TMC_SPI_DEFINE(Z, Z);
  179. #endif
  180. #if AXIS_HAS_SPI(Z2)
  181. TMC_SPI_DEFINE(Z2, Z);
  182. #endif
  183. #if AXIS_HAS_SPI(Z3)
  184. TMC_SPI_DEFINE(Z3, Z);
  185. #endif
  186. #if AXIS_HAS_SPI(E0)
  187. TMC_SPI_DEFINE_E(0);
  188. #endif
  189. #if AXIS_HAS_SPI(E1)
  190. TMC_SPI_DEFINE_E(1);
  191. #endif
  192. #if AXIS_HAS_SPI(E2)
  193. TMC_SPI_DEFINE_E(2);
  194. #endif
  195. #if AXIS_HAS_SPI(E3)
  196. TMC_SPI_DEFINE_E(3);
  197. #endif
  198. #if AXIS_HAS_SPI(E4)
  199. TMC_SPI_DEFINE_E(4);
  200. #endif
  201. #if AXIS_HAS_SPI(E5)
  202. TMC_SPI_DEFINE_E(5);
  203. #endif
  204. #endif
  205. #if HAS_DRIVER(TMC2130)
  206. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  207. void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  208. st.begin();
  209. CHOPCONF_t chopconf{0};
  210. chopconf.tbl = 1;
  211. chopconf.toff = chopper_timing.toff;
  212. chopconf.intpol = INTERPOLATE;
  213. chopconf.hend = chopper_timing.hend + 3;
  214. chopconf.hstrt = chopper_timing.hstrt - 1;
  215. #if ENABLED(SQUARE_WAVE_STEPPING)
  216. chopconf.dedge = true;
  217. #endif
  218. st.CHOPCONF(chopconf.sr);
  219. st.rms_current(mA, HOLD_MULTIPLIER);
  220. st.microsteps(microsteps);
  221. st.iholddelay(10);
  222. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  223. st.en_pwm_mode(stealth);
  224. st.stored.stealthChop_enabled = stealth;
  225. PWMCONF_t pwmconf{0};
  226. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  227. pwmconf.pwm_autoscale = true;
  228. pwmconf.pwm_grad = 5;
  229. pwmconf.pwm_ampl = 180;
  230. st.PWMCONF(pwmconf.sr);
  231. #if ENABLED(HYBRID_THRESHOLD)
  232. st.set_pwm_thrs(thrs);
  233. #else
  234. UNUSED(thrs);
  235. #endif
  236. st.GSTAT(); // Clear GSTAT
  237. }
  238. #endif // TMC2130
  239. #if HAS_DRIVER(TMC2160)
  240. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  241. void tmc_init(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  242. st.begin();
  243. static constexpr int8_t timings[] = CHOPPER_TIMING; // Default 4, -2, 1
  244. CHOPCONF_t chopconf{0};
  245. chopconf.tbl = 1;
  246. chopconf.toff = timings[0];
  247. chopconf.intpol = INTERPOLATE;
  248. chopconf.hend = timings[1] + 3;
  249. chopconf.hstrt = timings[2] - 1;
  250. #if ENABLED(SQUARE_WAVE_STEPPING)
  251. chopconf.dedge = true;
  252. #endif
  253. st.CHOPCONF(chopconf.sr);
  254. st.rms_current(mA, HOLD_MULTIPLIER);
  255. st.microsteps(microsteps);
  256. st.iholddelay(10);
  257. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  258. st.TCOOLTHRS(0xFFFFF);
  259. #if ENABLED(ADAPTIVE_CURRENT)
  260. COOLCONF_t coolconf{0};
  261. coolconf.semin = INCREASE_CURRENT_THRS;
  262. coolconf.semax = REDUCE_CURRENT_THRS;
  263. st.COOLCONF(coolconf.sr);
  264. #endif
  265. st.en_pwm_mode(stealth);
  266. TMC2160_n::PWMCONF_t pwmconf{0};
  267. pwmconf.pwm_lim = 12;
  268. pwmconf.pwm_reg = 8;
  269. pwmconf.pwm_autograd = true;
  270. pwmconf.pwm_autoscale = true;
  271. pwmconf.pwm_freq = 0b01;
  272. pwmconf.pwm_grad = 14;
  273. pwmconf.pwm_ofs = 36;
  274. st.PWMCONF(pwmconf.sr);
  275. #if ENABLED(HYBRID_THRESHOLD)
  276. st.set_pwm_thrs(thrs);
  277. #else
  278. UNUSED(thrs);
  279. #endif
  280. st.GSTAT(); // Clear GSTAT
  281. }
  282. #endif // TMC2160
  283. //
  284. // TMC2208/2209 Driver objects and inits
  285. //
  286. #if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)
  287. #if AXIS_HAS_UART(X)
  288. #ifdef X_HARDWARE_SERIAL
  289. TMC_UART_DEFINE(HW, X, X);
  290. #else
  291. TMC_UART_DEFINE(SW, X, X);
  292. #endif
  293. #endif
  294. #if AXIS_HAS_UART(X2)
  295. #ifdef X2_HARDWARE_SERIAL
  296. TMC_UART_DEFINE(HW, X2, X);
  297. #else
  298. TMC_UART_DEFINE(SW, X2, X);
  299. #endif
  300. #endif
  301. #if AXIS_HAS_UART(Y)
  302. #ifdef Y_HARDWARE_SERIAL
  303. TMC_UART_DEFINE(HW, Y, Y);
  304. #else
  305. TMC_UART_DEFINE(SW, Y, Y);
  306. #endif
  307. #endif
  308. #if AXIS_HAS_UART(Y2)
  309. #ifdef Y2_HARDWARE_SERIAL
  310. TMC_UART_DEFINE(HW, Y2, Y);
  311. #else
  312. TMC_UART_DEFINE(SW, Y2, Y);
  313. #endif
  314. #endif
  315. #if AXIS_HAS_UART(Z)
  316. #ifdef Z_HARDWARE_SERIAL
  317. TMC_UART_DEFINE(HW, Z, Z);
  318. #else
  319. TMC_UART_DEFINE(SW, Z, Z);
  320. #endif
  321. #endif
  322. #if AXIS_HAS_UART(Z2)
  323. #ifdef Z2_HARDWARE_SERIAL
  324. TMC_UART_DEFINE(HW, Z2, Z);
  325. #else
  326. TMC_UART_DEFINE(SW, Z2, Z);
  327. #endif
  328. #endif
  329. #if AXIS_HAS_UART(Z3)
  330. #ifdef Z3_HARDWARE_SERIAL
  331. TMC_UART_DEFINE(HW, Z3, Z);
  332. #else
  333. TMC_UART_DEFINE(SW, Z3, Z);
  334. #endif
  335. #endif
  336. #if AXIS_HAS_UART(E0)
  337. #ifdef E0_HARDWARE_SERIAL
  338. TMC_UART_DEFINE_E(HW, 0);
  339. #else
  340. TMC_UART_DEFINE_E(SW, 0);
  341. #endif
  342. #endif
  343. #if AXIS_HAS_UART(E1)
  344. #ifdef E1_HARDWARE_SERIAL
  345. TMC_UART_DEFINE_E(HW, 1);
  346. #else
  347. TMC_UART_DEFINE_E(SW, 1);
  348. #endif
  349. #endif
  350. #if AXIS_HAS_UART(E2)
  351. #ifdef E2_HARDWARE_SERIAL
  352. TMC_UART_DEFINE_E(HW, 2);
  353. #else
  354. TMC_UART_DEFINE_E(SW, 2);
  355. #endif
  356. #endif
  357. #if AXIS_HAS_UART(E3)
  358. #ifdef E3_HARDWARE_SERIAL
  359. TMC_UART_DEFINE_E(HW, 3);
  360. #else
  361. TMC_UART_DEFINE_E(SW, 3);
  362. #endif
  363. #endif
  364. #if AXIS_HAS_UART(E4)
  365. #ifdef E4_HARDWARE_SERIAL
  366. TMC_UART_DEFINE_E(HW, 4);
  367. #else
  368. TMC_UART_DEFINE_E(SW, 4);
  369. #endif
  370. #endif
  371. #if AXIS_HAS_UART(E5)
  372. #ifdef E5_HARDWARE_SERIAL
  373. TMC_UART_DEFINE_E(HW, 5);
  374. #else
  375. TMC_UART_DEFINE_E(SW, 5);
  376. #endif
  377. #endif
  378. void tmc_serial_begin() {
  379. #if AXIS_HAS_UART(X)
  380. #ifdef X_HARDWARE_SERIAL
  381. X_HARDWARE_SERIAL.begin(115200);
  382. #else
  383. stepperX.beginSerial(115200);
  384. #endif
  385. #endif
  386. #if AXIS_HAS_UART(X2)
  387. #ifdef X2_HARDWARE_SERIAL
  388. X2_HARDWARE_SERIAL.begin(115200);
  389. #else
  390. stepperX2.beginSerial(115200);
  391. #endif
  392. #endif
  393. #if AXIS_HAS_UART(Y)
  394. #ifdef Y_HARDWARE_SERIAL
  395. Y_HARDWARE_SERIAL.begin(115200);
  396. #else
  397. stepperY.beginSerial(115200);
  398. #endif
  399. #endif
  400. #if AXIS_HAS_UART(Y2)
  401. #ifdef Y2_HARDWARE_SERIAL
  402. Y2_HARDWARE_SERIAL.begin(115200);
  403. #else
  404. stepperY2.beginSerial(115200);
  405. #endif
  406. #endif
  407. #if AXIS_HAS_UART(Z)
  408. #ifdef Z_HARDWARE_SERIAL
  409. Z_HARDWARE_SERIAL.begin(115200);
  410. #else
  411. stepperZ.beginSerial(115200);
  412. #endif
  413. #endif
  414. #if AXIS_HAS_UART(Z2)
  415. #ifdef Z2_HARDWARE_SERIAL
  416. Z2_HARDWARE_SERIAL.begin(115200);
  417. #else
  418. stepperZ2.beginSerial(115200);
  419. #endif
  420. #endif
  421. #if AXIS_HAS_UART(Z3)
  422. #ifdef Z3_HARDWARE_SERIAL
  423. Z3_HARDWARE_SERIAL.begin(115200);
  424. #else
  425. stepperZ3.beginSerial(115200);
  426. #endif
  427. #endif
  428. #if AXIS_HAS_UART(E0)
  429. #ifdef E0_HARDWARE_SERIAL
  430. E0_HARDWARE_SERIAL.begin(115200);
  431. #else
  432. stepperE0.beginSerial(115200);
  433. #endif
  434. #endif
  435. #if AXIS_HAS_UART(E1)
  436. #ifdef E1_HARDWARE_SERIAL
  437. E1_HARDWARE_SERIAL.begin(115200);
  438. #else
  439. stepperE1.beginSerial(115200);
  440. #endif
  441. #endif
  442. #if AXIS_HAS_UART(E2)
  443. #ifdef E2_HARDWARE_SERIAL
  444. E2_HARDWARE_SERIAL.begin(115200);
  445. #else
  446. stepperE2.beginSerial(115200);
  447. #endif
  448. #endif
  449. #if AXIS_HAS_UART(E3)
  450. #ifdef E3_HARDWARE_SERIAL
  451. E3_HARDWARE_SERIAL.begin(115200);
  452. #else
  453. stepperE3.beginSerial(115200);
  454. #endif
  455. #endif
  456. #if AXIS_HAS_UART(E4)
  457. #ifdef E4_HARDWARE_SERIAL
  458. E4_HARDWARE_SERIAL.begin(115200);
  459. #else
  460. stepperE4.beginSerial(115200);
  461. #endif
  462. #endif
  463. #if AXIS_HAS_UART(E5)
  464. #ifdef E5_HARDWARE_SERIAL
  465. E5_HARDWARE_SERIAL.begin(115200);
  466. #else
  467. stepperE5.beginSerial(115200);
  468. #endif
  469. #endif
  470. }
  471. #endif
  472. #if HAS_DRIVER(TMC2208)
  473. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  474. void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  475. TMC2208_n::GCONF_t gconf{0};
  476. gconf.pdn_disable = true; // Use UART
  477. gconf.mstep_reg_select = true; // Select microsteps with UART
  478. gconf.i_scale_analog = false;
  479. gconf.en_spreadcycle = !stealth;
  480. st.GCONF(gconf.sr);
  481. st.stored.stealthChop_enabled = stealth;
  482. TMC2208_n::CHOPCONF_t chopconf{0};
  483. chopconf.tbl = 0b01; // blank_time = 24
  484. chopconf.toff = chopper_timing.toff;
  485. chopconf.intpol = INTERPOLATE;
  486. chopconf.hend = chopper_timing.hend + 3;
  487. chopconf.hstrt = chopper_timing.hstrt - 1;
  488. #if ENABLED(SQUARE_WAVE_STEPPING)
  489. chopconf.dedge = true;
  490. #endif
  491. st.CHOPCONF(chopconf.sr);
  492. st.rms_current(mA, HOLD_MULTIPLIER);
  493. st.microsteps(microsteps);
  494. st.iholddelay(10);
  495. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  496. TMC2208_n::PWMCONF_t pwmconf{0};
  497. pwmconf.pwm_lim = 12;
  498. pwmconf.pwm_reg = 8;
  499. pwmconf.pwm_autograd = true;
  500. pwmconf.pwm_autoscale = true;
  501. pwmconf.pwm_freq = 0b01;
  502. pwmconf.pwm_grad = 14;
  503. pwmconf.pwm_ofs = 36;
  504. st.PWMCONF(pwmconf.sr);
  505. #if ENABLED(HYBRID_THRESHOLD)
  506. st.set_pwm_thrs(thrs);
  507. #else
  508. UNUSED(thrs);
  509. #endif
  510. st.GSTAT(0b111); // Clear
  511. delay(200);
  512. }
  513. #endif // TMC2208
  514. #if HAS_DRIVER(TMC2209)
  515. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  516. void tmc_init(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  517. TMC2208_n::GCONF_t gconf{0};
  518. gconf.pdn_disable = true; // Use UART
  519. gconf.mstep_reg_select = true; // Select microsteps with UART
  520. gconf.i_scale_analog = false;
  521. gconf.en_spreadcycle = !stealth;
  522. st.GCONF(gconf.sr);
  523. st.stored.stealthChop_enabled = stealth;
  524. TMC2208_n::CHOPCONF_t chopconf{0};
  525. chopconf.tbl = 0b01; // blank_time = 24
  526. chopconf.toff = chopper_timing.toff;
  527. chopconf.intpol = INTERPOLATE;
  528. chopconf.hend = chopper_timing.hend + 3;
  529. chopconf.hstrt = chopper_timing.hstrt - 1;
  530. st.CHOPCONF(chopconf.sr);
  531. st.rms_current(mA, HOLD_MULTIPLIER);
  532. st.microsteps(microsteps);
  533. st.iholddelay(10);
  534. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  535. TMC2208_n::PWMCONF_t pwmconf{0};
  536. pwmconf.pwm_lim = 12;
  537. pwmconf.pwm_reg = 8;
  538. pwmconf.pwm_autograd = true;
  539. pwmconf.pwm_autoscale = true;
  540. pwmconf.pwm_freq = 0b01;
  541. pwmconf.pwm_grad = 14;
  542. pwmconf.pwm_ofs = 36;
  543. st.PWMCONF(pwmconf.sr);
  544. #if ENABLED(HYBRID_THRESHOLD)
  545. st.set_pwm_thrs(thrs);
  546. #else
  547. UNUSED(thrs);
  548. #endif
  549. st.GSTAT(0b111); // Clear
  550. }
  551. #endif // TMC2209
  552. #if HAS_DRIVER(TMC2660)
  553. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  554. void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool) {
  555. st.begin();
  556. TMC2660_n::CHOPCONF_t chopconf{0};
  557. chopconf.tbl = 1;
  558. chopconf.toff = chopper_timing.toff;
  559. chopconf.hend = chopper_timing.hend + 3;
  560. chopconf.hstrt = chopper_timing.hstrt - 1;
  561. st.CHOPCONF(chopconf.sr);
  562. st.sdoff(0);
  563. st.rms_current(mA);
  564. st.microsteps(microsteps);
  565. #if ENABLED(SQUARE_WAVE_STEPPING)
  566. st.dedge(true);
  567. #endif
  568. st.intpol(INTERPOLATE);
  569. st.diss2g(true); // Disable short to ground protection. Too many false readings?
  570. #if ENABLED(TMC_DEBUG)
  571. st.rdsel(0b01);
  572. #endif
  573. }
  574. #endif // TMC2660
  575. #if HAS_DRIVER(TMC5130)
  576. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  577. void tmc_init(TMCMarlin<TMC5130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  578. st.begin();
  579. CHOPCONF_t chopconf{0};
  580. chopconf.tbl = 1;
  581. chopconf.toff = chopper_timing.toff;
  582. chopconf.intpol = INTERPOLATE;
  583. chopconf.hend = chopper_timing.hend + 3;
  584. chopconf.hstrt = chopper_timing.hstrt - 1;
  585. #if ENABLED(SQUARE_WAVE_STEPPING)
  586. chopconf.dedge = true;
  587. #endif
  588. st.CHOPCONF(chopconf.sr);
  589. st.rms_current(mA, HOLD_MULTIPLIER);
  590. st.microsteps(microsteps);
  591. st.iholddelay(10);
  592. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  593. st.en_pwm_mode(stealth);
  594. st.stored.stealthChop_enabled = stealth;
  595. PWMCONF_t pwmconf{0};
  596. pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk
  597. pwmconf.pwm_autoscale = true;
  598. pwmconf.pwm_grad = 5;
  599. pwmconf.pwm_ampl = 180;
  600. st.PWMCONF(pwmconf.sr);
  601. #if ENABLED(HYBRID_THRESHOLD)
  602. st.set_pwm_thrs(thrs);
  603. #else
  604. UNUSED(thrs);
  605. #endif
  606. st.GSTAT(); // Clear GSTAT
  607. }
  608. #endif // TMC5130
  609. #if HAS_DRIVER(TMC5160)
  610. template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
  611. void tmc_init(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
  612. st.begin();
  613. int8_t timings[] = CHOPPER_TIMING; // Default 4, -2, 1
  614. CHOPCONF_t chopconf{0};
  615. chopconf.tbl = 1;
  616. chopconf.toff = timings[0];
  617. chopconf.intpol = INTERPOLATE;
  618. chopconf.hend = timings[1] + 3;
  619. chopconf.hstrt = timings[2] - 1;
  620. #if ENABLED(SQUARE_WAVE_STEPPING)
  621. chopconf.dedge = true;
  622. #endif
  623. st.CHOPCONF(chopconf.sr);
  624. st.rms_current(mA, HOLD_MULTIPLIER);
  625. st.microsteps(microsteps);
  626. st.iholddelay(10);
  627. st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
  628. #if ENABLED(ADAPTIVE_CURRENT)
  629. COOLCONF_t coolconf{0};
  630. coolconf.semin = INCREASE_CURRENT_THRS;
  631. coolconf.semax = REDUCE_CURRENT_THRS;
  632. st.COOLCONF(coolconf.sr);
  633. #endif
  634. st.en_pwm_mode(stealth);
  635. TMC2160_n::PWMCONF_t pwmconf{0};
  636. pwmconf.pwm_lim = 12;
  637. pwmconf.pwm_reg = 8;
  638. pwmconf.pwm_autograd = true;
  639. pwmconf.pwm_autoscale = true;
  640. pwmconf.pwm_freq = 0b01;
  641. pwmconf.pwm_grad = 14;
  642. pwmconf.pwm_ofs = 36;
  643. st.PWMCONF(pwmconf.sr);
  644. #if ENABLED(HYBRID_THRESHOLD)
  645. st.set_pwm_thrs(thrs);
  646. #else
  647. UNUSED(thrs);
  648. #endif
  649. st.GSTAT(); // Clear GSTAT
  650. }
  651. #endif // TMC5160
  652. void restore_stepper_drivers() {
  653. #if AXIS_IS_TMC(X)
  654. stepperX.push();
  655. #endif
  656. #if AXIS_IS_TMC(X2)
  657. stepperX2.push();
  658. #endif
  659. #if AXIS_IS_TMC(Y)
  660. stepperY.push();
  661. #endif
  662. #if AXIS_IS_TMC(Y2)
  663. stepperY2.push();
  664. #endif
  665. #if AXIS_IS_TMC(Z)
  666. stepperZ.push();
  667. #endif
  668. #if AXIS_IS_TMC(Z2)
  669. stepperZ2.push();
  670. #endif
  671. #if AXIS_IS_TMC(Z3)
  672. stepperZ3.push();
  673. #endif
  674. #if AXIS_IS_TMC(E0)
  675. stepperE0.push();
  676. #endif
  677. #if AXIS_IS_TMC(E1)
  678. stepperE1.push();
  679. #endif
  680. #if AXIS_IS_TMC(E2)
  681. stepperE2.push();
  682. #endif
  683. #if AXIS_IS_TMC(E3)
  684. stepperE3.push();
  685. #endif
  686. #if AXIS_IS_TMC(E4)
  687. stepperE4.push();
  688. #endif
  689. #if AXIS_IS_TMC(E5)
  690. stepperE5.push();
  691. #endif
  692. }
  693. void reset_stepper_drivers() {
  694. #if HAS_DRIVER(TMC26X)
  695. tmc26x_init_to_defaults();
  696. #endif
  697. #if HAS_DRIVER(L6470)
  698. L6470.init_to_defaults();
  699. #endif
  700. #if HAS_TRINAMIC
  701. static constexpr bool stealthchop_by_axis[] = {
  702. #if ENABLED(STEALTHCHOP_XY)
  703. true
  704. #else
  705. false
  706. #endif
  707. ,
  708. #if ENABLED(STEALTHCHOP_Z)
  709. true
  710. #else
  711. false
  712. #endif
  713. ,
  714. #if ENABLED(STEALTHCHOP_E)
  715. true
  716. #else
  717. false
  718. #endif
  719. };
  720. #endif
  721. #if AXIS_IS_TMC(X)
  722. _TMC_INIT(X, STEALTH_AXIS_XY);
  723. #endif
  724. #if AXIS_IS_TMC(X2)
  725. _TMC_INIT(X2, STEALTH_AXIS_XY);
  726. #endif
  727. #if AXIS_IS_TMC(Y)
  728. _TMC_INIT(Y, STEALTH_AXIS_XY);
  729. #endif
  730. #if AXIS_IS_TMC(Y2)
  731. _TMC_INIT(Y2, STEALTH_AXIS_XY);
  732. #endif
  733. #if AXIS_IS_TMC(Z)
  734. _TMC_INIT(Z, STEALTH_AXIS_Z);
  735. #endif
  736. #if AXIS_IS_TMC(Z2)
  737. _TMC_INIT(Z2, STEALTH_AXIS_Z);
  738. #endif
  739. #if AXIS_IS_TMC(Z3)
  740. _TMC_INIT(Z3, STEALTH_AXIS_Z);
  741. #endif
  742. #if AXIS_IS_TMC(E0)
  743. _TMC_INIT(E0, STEALTH_AXIS_E);
  744. #endif
  745. #if AXIS_IS_TMC(E1)
  746. _TMC_INIT(E1, STEALTH_AXIS_E);
  747. #endif
  748. #if AXIS_IS_TMC(E2)
  749. _TMC_INIT(E2, STEALTH_AXIS_E);
  750. #endif
  751. #if AXIS_IS_TMC(E3)
  752. _TMC_INIT(E3, STEALTH_AXIS_E);
  753. #endif
  754. #if AXIS_IS_TMC(E4)
  755. _TMC_INIT(E4, STEALTH_AXIS_E);
  756. #endif
  757. #if AXIS_IS_TMC(E5)
  758. _TMC_INIT(E5, STEALTH_AXIS_E);
  759. #endif
  760. #if USE_SENSORLESS
  761. #if X_SENSORLESS
  762. #if AXIS_HAS_STALLGUARD(X)
  763. stepperX.homing_threshold(X_STALL_SENSITIVITY);
  764. #endif
  765. #if AXIS_HAS_STALLGUARD(X2)
  766. stepperX2.homing_threshold(X_STALL_SENSITIVITY);
  767. #endif
  768. #endif
  769. #if Y_SENSORLESS
  770. #if AXIS_HAS_STALLGUARD(Y)
  771. stepperY.homing_threshold(Y_STALL_SENSITIVITY);
  772. #endif
  773. #if AXIS_HAS_STALLGUARD(Y2)
  774. stepperY2.homing_threshold(Y_STALL_SENSITIVITY);
  775. #endif
  776. #endif
  777. #if Z_SENSORLESS
  778. #if AXIS_HAS_STALLGUARD(Z)
  779. stepperZ.homing_threshold(Z_STALL_SENSITIVITY);
  780. #endif
  781. #if AXIS_HAS_STALLGUARD(Z2)
  782. stepperZ2.homing_threshold(Z_STALL_SENSITIVITY);
  783. #endif
  784. #if AXIS_HAS_STALLGUARD(Z3)
  785. stepperZ3.homing_threshold(Z_STALL_SENSITIVITY);
  786. #endif
  787. #endif
  788. #endif
  789. #ifdef TMC_ADV
  790. TMC_ADV()
  791. #endif
  792. #if HAS_TRINAMIC
  793. stepper.set_directions();
  794. #endif
  795. }
  796. //
  797. // L6470 Driver objects and inits
  798. //
  799. #if HAS_DRIVER(L6470)
  800. // create stepper objects
  801. #define _L6470_DEFINE(ST) L6470 stepper##ST((const int)L6470_CHAIN_SS_PIN)
  802. // L6470 Stepper objects
  803. #if AXIS_DRIVER_TYPE_X(L6470)
  804. _L6470_DEFINE(X);
  805. #endif
  806. #if AXIS_DRIVER_TYPE_X2(L6470)
  807. _L6470_DEFINE(X2);
  808. #endif
  809. #if AXIS_DRIVER_TYPE_Y(L6470)
  810. _L6470_DEFINE(Y);
  811. #endif
  812. #if AXIS_DRIVER_TYPE_Y2(L6470)
  813. _L6470_DEFINE(Y2);
  814. #endif
  815. #if AXIS_DRIVER_TYPE_Z(L6470)
  816. _L6470_DEFINE(Z);
  817. #endif
  818. #if AXIS_DRIVER_TYPE_Z2(L6470)
  819. _L6470_DEFINE(Z2);
  820. #endif
  821. #if AXIS_DRIVER_TYPE_Z3(L6470)
  822. _L6470_DEFINE(Z3);
  823. #endif
  824. #if AXIS_DRIVER_TYPE_E0(L6470)
  825. _L6470_DEFINE(E0);
  826. #endif
  827. #if AXIS_DRIVER_TYPE_E1(L6470)
  828. _L6470_DEFINE(E1);
  829. #endif
  830. #if AXIS_DRIVER_TYPE_E2(L6470)
  831. _L6470_DEFINE(E2);
  832. #endif
  833. #if AXIS_DRIVER_TYPE_E3(L6470)
  834. _L6470_DEFINE(E3);
  835. #endif
  836. #if AXIS_DRIVER_TYPE_E4(L6470)
  837. _L6470_DEFINE(E4);
  838. #endif
  839. #if AXIS_DRIVER_TYPE_E5(L6470)
  840. _L6470_DEFINE(E5);
  841. #endif
  842. // not using L6470 library's init command because it
  843. // briefly sends power to the steppers
  844. #define _L6470_INIT_CHIP(Q) do{ \
  845. stepper##Q.resetDev(); \
  846. stepper##Q.softFree(); \
  847. stepper##Q.SetParam(L6470_CONFIG, CONFIG_PWM_DIV_1 \
  848. | CONFIG_PWM_MUL_2 \
  849. | CONFIG_SR_290V_us \
  850. | CONFIG_OC_SD_DISABLE \
  851. | CONFIG_VS_COMP_DISABLE \
  852. | CONFIG_SW_HARD_STOP \
  853. | CONFIG_INT_16MHZ); \
  854. stepper##Q.SetParam(L6470_KVAL_RUN, 0xFF); \
  855. stepper##Q.SetParam(L6470_KVAL_ACC, 0xFF); \
  856. stepper##Q.SetParam(L6470_KVAL_DEC, 0xFF); \
  857. stepper##Q.setMicroSteps(Q##_MICROSTEPS); \
  858. stepper##Q.setOverCurrent(Q##_OVERCURRENT); \
  859. stepper##Q.setStallCurrent(Q##_STALLCURRENT); \
  860. stepper##Q.SetParam(L6470_KVAL_HOLD, Q##_MAX_VOLTAGE); \
  861. stepper##Q.SetParam(L6470_ABS_POS, 0); \
  862. stepper##Q.getStatus(); \
  863. }while(0)
  864. void L6470_Marlin::init_to_defaults() {
  865. #if AXIS_DRIVER_TYPE_X(L6470)
  866. _L6470_INIT_CHIP(X);
  867. #endif
  868. #if AXIS_DRIVER_TYPE_X2(L6470)
  869. _L6470_INIT_CHIP(X2);
  870. #endif
  871. #if AXIS_DRIVER_TYPE_Y(L6470)
  872. _L6470_INIT_CHIP(Y);
  873. #endif
  874. #if AXIS_DRIVER_TYPE_Y2(L6470)
  875. _L6470_INIT_CHIP(Y2);
  876. #endif
  877. #if AXIS_DRIVER_TYPE_Z(L6470)
  878. _L6470_INIT_CHIP(Z);
  879. #endif
  880. #if AXIS_DRIVER_TYPE_Z2(L6470)
  881. _L6470_INIT_CHIP(Z2);
  882. #endif
  883. #if AXIS_DRIVER_TYPE_Z3(L6470)
  884. _L6470_INIT_CHIP(Z3);
  885. #endif
  886. #if AXIS_DRIVER_TYPE_E0(L6470)
  887. _L6470_INIT_CHIP(E0);
  888. #endif
  889. #if AXIS_DRIVER_TYPE_E1(L6470)
  890. _L6470_INIT_CHIP(E1);
  891. #endif
  892. #if AXIS_DRIVER_TYPE_E2(L6470)
  893. _L6470_INIT_CHIP(E2);
  894. #endif
  895. #if AXIS_DRIVER_TYPE_E3(L6470)
  896. _L6470_INIT_CHIP(E3);
  897. #endif
  898. #if AXIS_DRIVER_TYPE_E4(L6470)
  899. _L6470_INIT_CHIP(E4);
  900. #endif
  901. #if AXIS_DRIVER_TYPE_E5(L6470)
  902. _L6470_INIT_CHIP(E5);
  903. #endif
  904. }
  905. #endif // L6470