Library for Trinamic TMC2209 stepper modules to drive bipolar stepper motors. Ported and adapted from https://github.com/teemuatlut/TMCStepper
TMCStepper.cpp
00001 #include "TMCStepper.h" 00002 00003 00004 /* 00005 Requested current = mA = I_rms/1000 00006 Equation for current: 00007 I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2) 00008 Solve for CS -> 00009 CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1 00010 00011 Example: 00012 vsense = 0b0 -> V_fs = 0.325V 00013 mA = 1640mA = I_rms/1000 = 1.64A 00014 R_sense = 0.10 Ohm 00015 -> 00016 CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4 00017 CS = 26 00018 */ 00019 00020 uint16_t TMCStepper::cs2rms(uint8_t CS) { 00021 return (float)(CS+1)/32.0 * (vsense() ? 0.180 : 0.325)/(Rsense+0.02) / 1.41421 * 1000; 00022 } 00023 00024 void TMCStepper::rms_current(uint16_t mA) { 00025 uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1; 00026 // If Current Scale is too low, turn on high sensitivity R_sense and calculate again 00027 if (CS < 16) { 00028 vsense(true); 00029 CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1; 00030 } else { // If CS >= 16, turn off high_sense_r 00031 vsense(false); 00032 } 00033 00034 if (CS > 31) 00035 CS = 31; 00036 00037 irun(CS); 00038 ihold(CS*holdMultiplier); 00039 //val_mA = mA; 00040 } 00041 void TMCStepper::rms_current(uint16_t mA, float mult) { 00042 holdMultiplier = mult; 00043 rms_current(mA); 00044 } 00045 00046 uint16_t TMCStepper::rms_current() { 00047 return cs2rms(irun()); 00048 } 00049 00050 uint8_t TMCStepper::test_connection() { 00051 uint32_t drv_status = DRV_STATUS(); 00052 switch (drv_status) { 00053 case 0xFFFFFFFF: return 1; 00054 case 0: return 2; 00055 default: return 0; 00056 } 00057 } 00058 00059 void TMCStepper::hysteresis_end(int8_t value) { hend(value+3); } 00060 int8_t TMCStepper::hysteresis_end() { return hend()-3; }; 00061 00062 void TMCStepper::hysteresis_start(uint8_t value) { hstrt(value-1); } 00063 uint8_t TMCStepper::hysteresis_start() { return hstrt()+1; } 00064 00065 void TMCStepper::microsteps(uint16_t ms) { 00066 switch(ms) { 00067 case 256: mres(0); break; 00068 case 128: mres(1); break; 00069 case 64: mres(2); break; 00070 case 32: mres(3); break; 00071 case 16: mres(4); break; 00072 case 8: mres(5); break; 00073 case 4: mres(6); break; 00074 case 2: mres(7); break; 00075 case 1: mres(8); break; 00076 default: break; 00077 } 00078 } 00079 00080 uint16_t TMCStepper::microsteps() { 00081 switch(mres()) { 00082 case 0: return 256; 00083 case 1: return 128; 00084 case 2: return 64; 00085 case 3: return 32; 00086 case 4: return 16; 00087 case 5: return 8; 00088 case 6: return 4; 00089 case 7: return 2; 00090 case 8: return 1; 00091 } 00092 return 1; 00093 } 00094 00095 void TMCStepper::blank_time(uint8_t value) { 00096 switch (value) { 00097 case 16: tbl(0b00); break; 00098 case 24: tbl(0b01); break; 00099 case 36: tbl(0b10); break; 00100 case 54: tbl(0b11); break; 00101 } 00102 } 00103 00104 uint8_t TMCStepper::blank_time() { 00105 switch (tbl()) { 00106 case 0b00: return 16; 00107 case 0b01: return 24; 00108 case 0b10: return 36; 00109 case 0b11: return 54; 00110 } 00111 return 0; 00112 } 00113 00114 /////////////////////////////////////////////////////////////////////////////////////// 00115 // R+C: GSTAT 00116 uint8_t TMCStepper::GSTAT() { return read(GSTAT_t::address); } 00117 void TMCStepper::GSTAT(uint8_t){ write(GSTAT_t::address, 0b111); } 00118 bool TMCStepper::reset() { GSTAT_t r; r.sr = GSTAT(); return r.reset; } 00119 bool TMCStepper::drv_err() { GSTAT_t r; r.sr = GSTAT(); return r.drv_err; } 00120 bool TMCStepper::uv_cp() { GSTAT_t r; r.sr = GSTAT(); return r.uv_cp; } 00121 /////////////////////////////////////////////////////////////////////////////////////// 00122 // W: TPOWERDOWN 00123 uint8_t TMCStepper::TPOWERDOWN() { return TPOWERDOWN_register.sr; } 00124 void TMCStepper::TPOWERDOWN(uint8_t input) { 00125 TPOWERDOWN_register.sr = input; 00126 write(TPOWERDOWN_register.address, TPOWERDOWN_register.sr); 00127 } 00128 /////////////////////////////////////////////////////////////////////////////////////// 00129 // R: TSTEP 00130 uint32_t TMCStepper::TSTEP() { return read(TSTEP_t::address); } 00131 /////////////////////////////////////////////////////////////////////////////////////// 00132 // W: TPWMTHRS 00133 uint32_t TMCStepper::TPWMTHRS() { return TPWMTHRS_register.sr; } 00134 void TMCStepper::TPWMTHRS(uint32_t input) { 00135 TPWMTHRS_register.sr = input; 00136 write(TPWMTHRS_register.address, TPWMTHRS_register.sr); 00137 } 00138 00139 uint16_t TMCStepper::MSCNT() { 00140 return read(MSCNT_t::address); 00141 } 00142 00143 uint32_t TMCStepper::MSCURACT() { return read(MSCURACT_t::address); } 00144 int16_t TMCStepper::cur_a() { 00145 MSCURACT_t r{0}; 00146 r.sr = MSCURACT(); 00147 int16_t value = r.cur_a; 00148 if (value > 255) value -= 512; 00149 return value; 00150 } 00151 int16_t TMCStepper::cur_b() { 00152 MSCURACT_t r{0}; 00153 r.sr = MSCURACT(); 00154 int16_t value = r.cur_b; 00155 if (value > 255) value -= 512; 00156 return value; 00157 }
Generated on Wed Jul 13 2022 22:52:51 by
1.7.2