TMCStepper
Library supporting Trinamic Stepper Drivers for Arduino platforms
Loading...
Searching...
No Matches
TMCStepper.cpp
Go to the documentation of this file.
1
21#include "../TMCStepper.h"
22#include "TMC_MACROS.h"
23
24// Make sure the endianness is correct
25#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
26 #error "TMCStepper does not currently support Big Endian targets!"
27#endif
28
29/*
30 Requested current = mA = I_rms/1000
31 Equation for current:
32 I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2)
33 Solve for CS ->
34 CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1
35
36 Example:
37 vsense = 0b0 -> V_fs = 0.325V
38 mA = 1640mA = I_rms/1000 = 1.64A
39 R_sense = 0.10 Ohm
40 ->
41 CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4
42 CS = 26
43*/
44
45uint16_t TMCStepper::cs2rms(uint8_t CS) {
46 return (float)(CS+1)/32.0 * (vsense() ? 0.180 : 0.325)/(Rsense+0.02) / 1.41421 * 1000;
47}
48
49void TMCStepper::rms_current(uint16_t mA) {
50 uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1;
51 // If Current Scale is too low, turn on high sensitivity R_sense and calculate again
52 if (CS < 16) {
53 vsense(true);
54 CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1;
55 } else { // If CS >= 16, turn off high_sense_r
56 vsense(false);
57 }
58
59 if (CS > 31)
60 CS = 31;
61
62 irun(CS);
64 //val_mA = mA;
65}
66void TMCStepper::rms_current(uint16_t mA, float mult) {
67 holdMultiplier = mult;
68 rms_current(mA);
69}
70
72 return cs2rms(irun());
73}
74
76 uint32_t drv_status = DRV_STATUS();
77 switch (drv_status) {
78 case 0xFFFFFFFF: return 1;
79 case 0: return 2;
80 default: return 0;
81 }
82}
83
84void TMCStepper::hysteresis_end(int8_t value) { hend(value+3); }
85int8_t TMCStepper::hysteresis_end() { return hend()-3; };
86
87void TMCStepper::hysteresis_start(uint8_t value) { hstrt(value-1); }
88uint8_t TMCStepper::hysteresis_start() { return hstrt()+1; }
89
90void TMCStepper::microsteps(uint16_t ms) {
91 switch(ms) {
92 case 256: mres(0); break;
93 case 128: mres(1); break;
94 case 64: mres(2); break;
95 case 32: mres(3); break;
96 case 16: mres(4); break;
97 case 8: mres(5); break;
98 case 4: mres(6); break;
99 case 2: mres(7); break;
100 case 0: mres(8); break;
101 default: break;
102 }
103}
104
106 switch(mres()) {
107 case 0: return 256;
108 case 1: return 128;
109 case 2: return 64;
110 case 3: return 32;
111 case 4: return 16;
112 case 5: return 8;
113 case 6: return 4;
114 case 7: return 2;
115 case 8: return 0;
116 }
117 return 0;
118}
119
120void TMCStepper::blank_time(uint8_t value) {
121 switch (value) {
122 case 16: tbl(0b00); break;
123 case 24: tbl(0b01); break;
124 case 36: tbl(0b10); break;
125 case 54: tbl(0b11); break;
126 }
127}
128
130 switch (tbl()) {
131 case 0b00: return 16;
132 case 0b01: return 24;
133 case 0b10: return 36;
134 case 0b11: return 54;
135 }
136 return 0;
137}
138
140// R+C: GSTAT
142void TMCStepper::GSTAT(uint8_t){ write(GSTAT_t::address, 0b111); }
143bool TMCStepper::reset() { GSTAT_t r; r.sr = GSTAT(); return r.reset; }
144bool TMCStepper::drv_err() { GSTAT_t r; r.sr = GSTAT(); return r.drv_err; }
145bool TMCStepper::uv_cp() { GSTAT_t r; r.sr = GSTAT(); return r.uv_cp; }
147// W: TPOWERDOWN
148uint8_t TMCStepper::TPOWERDOWN() { return TPOWERDOWN_register.sr; }
149void TMCStepper::TPOWERDOWN(uint8_t input) {
150 TPOWERDOWN_register.sr = input;
151 write(TPOWERDOWN_register.address, TPOWERDOWN_register.sr);
152}
153
154// R: TSTEP
157// W: TPWMTHRS
158uint32_t TMCStepper::TPWMTHRS() { return TPWMTHRS_register.sr; }
159void TMCStepper::TPWMTHRS(uint32_t input) {
160 TPWMTHRS_register.sr = input;
161 write(TPWMTHRS_register.address, TPWMTHRS_register.sr);
162}
163
165// R: MSCNT
virtual void write(uint8_t, uint32_t)=0
const float Rsense
virtual uint8_t hend()=0
bool drv_err()
virtual uint32_t read(uint8_t)=0
uint16_t MSCNT()
virtual uint32_t DRV_STATUS()=0
virtual uint8_t mres()=0
uint8_t ihold()
uint8_t TPOWERDOWN()
uint8_t irun()
int8_t hysteresis_end()
virtual uint8_t tbl()=0
uint16_t rms_current()
virtual bool vsense(void)=0
float holdMultiplier
uint8_t hysteresis_start()
uint32_t TSTEP()
uint32_t TPWMTHRS()
uint8_t GSTAT()
virtual uint8_t hstrt()=0
uint16_t microsteps()
uint16_t cs2rms(uint8_t CS)
uint8_t blank_time()
uint8_t test_connection()
static constexpr uint8_t address
static constexpr uint8_t address
static constexpr uint8_t address