Library for Trinamic TMC2209 stepper modules to drive bipolar stepper motors. Ported and adapted from https://github.com/teemuatlut/TMCStepper
TMCStepper.h@0:f4343071c8b1, 2021-03-18 (annotated)
- Committer:
- charly
- Date:
- Thu Mar 18 20:50:27 2021 +0000
- Revision:
- 0:f4343071c8b1
First version of TMCStepper for Trinamic TMC2209-modules.; Software ported and adapted from https://github.com/teemuatlut/TMCStepper
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charly | 0:f4343071c8b1 | 1 | #pragma once |
charly | 0:f4343071c8b1 | 2 | |
charly | 0:f4343071c8b1 | 3 | //#define TMCDEBUG |
charly | 0:f4343071c8b1 | 4 | |
charly | 0:f4343071c8b1 | 5 | #include "mbed.h" |
charly | 0:f4343071c8b1 | 6 | |
charly | 0:f4343071c8b1 | 7 | #define SW_CAPABLE_PLATFORM true |
charly | 0:f4343071c8b1 | 8 | |
charly | 0:f4343071c8b1 | 9 | //#include "TMC2130_bitfields.h" |
charly | 0:f4343071c8b1 | 10 | //#include "TMC2160_bitfields.h" |
charly | 0:f4343071c8b1 | 11 | //#include "TMC5130_bitfields.h" |
charly | 0:f4343071c8b1 | 12 | //#include "TMC5160_bitfields.h" |
charly | 0:f4343071c8b1 | 13 | #include "TMC2208_bitfields.h" |
charly | 0:f4343071c8b1 | 14 | #include "TMC2209_bitfields.h" |
charly | 0:f4343071c8b1 | 15 | //#include "TMC2660_bitfields.h" |
charly | 0:f4343071c8b1 | 16 | |
charly | 0:f4343071c8b1 | 17 | #define INIT_REGISTER(REG) REG##_t REG##_register = REG##_t |
charly | 0:f4343071c8b1 | 18 | //#define INIT2130_REGISTER(REG) TMC2130_n::REG##_t REG##_register = TMC2130_n::REG##_t |
charly | 0:f4343071c8b1 | 19 | //#define INIT2160_REGISTER(REG) TMC2160_n::REG##_t REG##_register = TMC2160_n::REG##_t |
charly | 0:f4343071c8b1 | 20 | //#define INIT5130_REGISTER(REG) TMC5130_n::REG##_t REG##_register = TMC5130_n::REG##_t |
charly | 0:f4343071c8b1 | 21 | //#define INIT5160_REGISTER(REG) TMC5160_n::REG##_t REG##_register = TMC5160_n::REG##_t |
charly | 0:f4343071c8b1 | 22 | //#define INIT2660_REGISTER(REG) TMC2660_n::REG##_t REG##_register = TMC2660_n::REG##_t |
charly | 0:f4343071c8b1 | 23 | #define INIT2208_REGISTER(REG) TMC2208_n::REG##_t REG##_register = TMC2208_n::REG##_t |
charly | 0:f4343071c8b1 | 24 | //#define INIT2224_REGISTER(REG) TMC2224_n::REG##_t REG##_register = TMC2224_n::REG##_t |
charly | 0:f4343071c8b1 | 25 | #define SET_ALIAS(TYPE, DRIVER, NEW, ARG, OLD) TYPE (DRIVER::*NEW)(ARG) = &DRIVER::OLD |
charly | 0:f4343071c8b1 | 26 | |
charly | 0:f4343071c8b1 | 27 | #define TMCSTEPPER_VERSION 0x000701 // v0.7.1 |
charly | 0:f4343071c8b1 | 28 | |
charly | 0:f4343071c8b1 | 29 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 30 | #include <BufferedSerial.h> |
charly | 0:f4343071c8b1 | 31 | #include <Stream.h> |
charly | 0:f4343071c8b1 | 32 | #endif |
charly | 0:f4343071c8b1 | 33 | class TMCStepper { |
charly | 0:f4343071c8b1 | 34 | public: |
charly | 0:f4343071c8b1 | 35 | uint16_t cs2rms(uint8_t CS); |
charly | 0:f4343071c8b1 | 36 | void rms_current(uint16_t mA); |
charly | 0:f4343071c8b1 | 37 | void rms_current(uint16_t mA, float mult); |
charly | 0:f4343071c8b1 | 38 | uint16_t rms_current(); |
charly | 0:f4343071c8b1 | 39 | void hold_multiplier(float val) { holdMultiplier = val; } |
charly | 0:f4343071c8b1 | 40 | float hold_multiplier() { return holdMultiplier; } |
charly | 0:f4343071c8b1 | 41 | uint8_t test_connection(); |
charly | 0:f4343071c8b1 | 42 | |
charly | 0:f4343071c8b1 | 43 | // Helper functions |
charly | 0:f4343071c8b1 | 44 | void microsteps(uint16_t ms); |
charly | 0:f4343071c8b1 | 45 | uint16_t microsteps(); |
charly | 0:f4343071c8b1 | 46 | void blank_time(uint8_t value); |
charly | 0:f4343071c8b1 | 47 | uint8_t blank_time(); |
charly | 0:f4343071c8b1 | 48 | void hysteresis_end(int8_t value); |
charly | 0:f4343071c8b1 | 49 | int8_t hysteresis_end(); |
charly | 0:f4343071c8b1 | 50 | void hysteresis_start(uint8_t value); |
charly | 0:f4343071c8b1 | 51 | uint8_t hysteresis_start(); |
charly | 0:f4343071c8b1 | 52 | |
charly | 0:f4343071c8b1 | 53 | // R+WC: GSTAT |
charly | 0:f4343071c8b1 | 54 | void GSTAT( uint8_t input); |
charly | 0:f4343071c8b1 | 55 | uint8_t GSTAT(); |
charly | 0:f4343071c8b1 | 56 | bool reset(); |
charly | 0:f4343071c8b1 | 57 | bool drv_err(); |
charly | 0:f4343071c8b1 | 58 | bool uv_cp(); |
charly | 0:f4343071c8b1 | 59 | |
charly | 0:f4343071c8b1 | 60 | // W: IHOLD_IRUN |
charly | 0:f4343071c8b1 | 61 | void IHOLD_IRUN( uint32_t input); |
charly | 0:f4343071c8b1 | 62 | uint32_t IHOLD_IRUN(); |
charly | 0:f4343071c8b1 | 63 | void ihold( uint8_t B); |
charly | 0:f4343071c8b1 | 64 | void irun( uint8_t B); |
charly | 0:f4343071c8b1 | 65 | void iholddelay( uint8_t B); |
charly | 0:f4343071c8b1 | 66 | uint8_t ihold(); |
charly | 0:f4343071c8b1 | 67 | uint8_t irun(); |
charly | 0:f4343071c8b1 | 68 | uint8_t iholddelay(); |
charly | 0:f4343071c8b1 | 69 | |
charly | 0:f4343071c8b1 | 70 | // W: TPOWERDOWN |
charly | 0:f4343071c8b1 | 71 | uint8_t TPOWERDOWN(); |
charly | 0:f4343071c8b1 | 72 | void TPOWERDOWN( uint8_t input); |
charly | 0:f4343071c8b1 | 73 | |
charly | 0:f4343071c8b1 | 74 | // R: TSTEP |
charly | 0:f4343071c8b1 | 75 | uint32_t TSTEP(); |
charly | 0:f4343071c8b1 | 76 | |
charly | 0:f4343071c8b1 | 77 | // W: TPWMTHRS |
charly | 0:f4343071c8b1 | 78 | uint32_t TPWMTHRS(); |
charly | 0:f4343071c8b1 | 79 | void TPWMTHRS( uint32_t input); |
charly | 0:f4343071c8b1 | 80 | |
charly | 0:f4343071c8b1 | 81 | // R: MSCNT |
charly | 0:f4343071c8b1 | 82 | uint16_t MSCNT(); |
charly | 0:f4343071c8b1 | 83 | |
charly | 0:f4343071c8b1 | 84 | // R: MSCURACT |
charly | 0:f4343071c8b1 | 85 | uint32_t MSCURACT(); |
charly | 0:f4343071c8b1 | 86 | int16_t cur_a(); |
charly | 0:f4343071c8b1 | 87 | int16_t cur_b(); |
charly | 0:f4343071c8b1 | 88 | |
charly | 0:f4343071c8b1 | 89 | protected: |
charly | 0:f4343071c8b1 | 90 | TMCStepper(float RS) : Rsense(RS) {}; |
charly | 0:f4343071c8b1 | 91 | INIT_REGISTER(IHOLD_IRUN){{.sr=0}}; // 32b |
charly | 0:f4343071c8b1 | 92 | INIT_REGISTER(TPOWERDOWN){.sr=0}; // 8b |
charly | 0:f4343071c8b1 | 93 | INIT_REGISTER(TPWMTHRS){.sr=0}; // 32b |
charly | 0:f4343071c8b1 | 94 | |
charly | 0:f4343071c8b1 | 95 | static constexpr uint8_t TMC_READ = 0x00, |
charly | 0:f4343071c8b1 | 96 | TMC_WRITE = 0x80; |
charly | 0:f4343071c8b1 | 97 | |
charly | 0:f4343071c8b1 | 98 | struct TSTEP_t { constexpr static uint8_t address = 0x12; }; |
charly | 0:f4343071c8b1 | 99 | struct MSCNT_t { constexpr static uint8_t address = 0x6A; }; |
charly | 0:f4343071c8b1 | 100 | |
charly | 0:f4343071c8b1 | 101 | virtual void write(uint8_t, uint32_t) = 0; |
charly | 0:f4343071c8b1 | 102 | virtual uint32_t read(uint8_t) = 0; |
charly | 0:f4343071c8b1 | 103 | virtual void vsense(bool) = 0; |
charly | 0:f4343071c8b1 | 104 | virtual bool vsense(void) = 0; |
charly | 0:f4343071c8b1 | 105 | virtual uint32_t DRV_STATUS() = 0; |
charly | 0:f4343071c8b1 | 106 | virtual void hend(uint8_t) = 0; |
charly | 0:f4343071c8b1 | 107 | virtual uint8_t hend() = 0; |
charly | 0:f4343071c8b1 | 108 | virtual void hstrt(uint8_t) = 0; |
charly | 0:f4343071c8b1 | 109 | virtual uint8_t hstrt() = 0; |
charly | 0:f4343071c8b1 | 110 | virtual void mres(uint8_t) = 0; |
charly | 0:f4343071c8b1 | 111 | virtual uint8_t mres() = 0; |
charly | 0:f4343071c8b1 | 112 | virtual void tbl(uint8_t) = 0; |
charly | 0:f4343071c8b1 | 113 | virtual uint8_t tbl() = 0; |
charly | 0:f4343071c8b1 | 114 | |
charly | 0:f4343071c8b1 | 115 | const float Rsense; |
charly | 0:f4343071c8b1 | 116 | float holdMultiplier = 0.5; |
charly | 0:f4343071c8b1 | 117 | }; |
charly | 0:f4343071c8b1 | 118 | |
charly | 0:f4343071c8b1 | 119 | |
charly | 0:f4343071c8b1 | 120 | class TMC2208Stepper : public TMCStepper { |
charly | 0:f4343071c8b1 | 121 | public: |
charly | 0:f4343071c8b1 | 122 | TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr, uint16_t mul_pin1, uint16_t mul_pin2); |
charly | 0:f4343071c8b1 | 123 | TMC2208Stepper(Stream * SerialPort, float RS) : |
charly | 0:f4343071c8b1 | 124 | TMC2208Stepper(SerialPort, RS, TMC2208_SLAVE_ADDR) |
charly | 0:f4343071c8b1 | 125 | {} |
charly | 0:f4343071c8b1 | 126 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 127 | TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS) : |
charly | 0:f4343071c8b1 | 128 | TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR) |
charly | 0:f4343071c8b1 | 129 | {} |
charly | 0:f4343071c8b1 | 130 | |
charly | 0:f4343071c8b1 | 131 | __attribute__((deprecated("Boolean argument has been deprecated and does nothing"))) |
charly | 0:f4343071c8b1 | 132 | TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, bool) : |
charly | 0:f4343071c8b1 | 133 | TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR) |
charly | 0:f4343071c8b1 | 134 | {}; |
charly | 0:f4343071c8b1 | 135 | #else |
charly | 0:f4343071c8b1 | 136 | TMC2208Stepper(PinName, PinName, float) = delete; // Your platform does not currently support Software Serial |
charly | 0:f4343071c8b1 | 137 | #endif |
charly | 0:f4343071c8b1 | 138 | void defaults(); |
charly | 0:f4343071c8b1 | 139 | void push(); |
charly | 0:f4343071c8b1 | 140 | void begin(); |
charly | 0:f4343071c8b1 | 141 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 142 | void beginSerial(uint32_t baudrate) __attribute__((weak)); |
charly | 0:f4343071c8b1 | 143 | #else |
charly | 0:f4343071c8b1 | 144 | void beginSerial(uint32_t) = delete; // Your platform does not currently support Software Serial |
charly | 0:f4343071c8b1 | 145 | #endif |
charly | 0:f4343071c8b1 | 146 | bool isEnabled(); |
charly | 0:f4343071c8b1 | 147 | |
charly | 0:f4343071c8b1 | 148 | // RW: GCONF |
charly | 0:f4343071c8b1 | 149 | void GCONF(uint32_t input); |
charly | 0:f4343071c8b1 | 150 | void I_scale_analog(bool B); |
charly | 0:f4343071c8b1 | 151 | void internal_Rsense(bool B); |
charly | 0:f4343071c8b1 | 152 | void en_spreadCycle(bool B); |
charly | 0:f4343071c8b1 | 153 | void shaft(bool B); |
charly | 0:f4343071c8b1 | 154 | void index_otpw(bool B); |
charly | 0:f4343071c8b1 | 155 | void index_step(bool B); |
charly | 0:f4343071c8b1 | 156 | void pdn_disable(bool B); |
charly | 0:f4343071c8b1 | 157 | void mstep_reg_select(bool B); |
charly | 0:f4343071c8b1 | 158 | void multistep_filt(bool B); |
charly | 0:f4343071c8b1 | 159 | uint32_t GCONF(); |
charly | 0:f4343071c8b1 | 160 | bool I_scale_analog(); |
charly | 0:f4343071c8b1 | 161 | bool internal_Rsense(); |
charly | 0:f4343071c8b1 | 162 | bool en_spreadCycle(); |
charly | 0:f4343071c8b1 | 163 | bool shaft(); |
charly | 0:f4343071c8b1 | 164 | bool index_otpw(); |
charly | 0:f4343071c8b1 | 165 | bool index_step(); |
charly | 0:f4343071c8b1 | 166 | bool pdn_disable(); |
charly | 0:f4343071c8b1 | 167 | bool mstep_reg_select(); |
charly | 0:f4343071c8b1 | 168 | bool multistep_filt(); |
charly | 0:f4343071c8b1 | 169 | |
charly | 0:f4343071c8b1 | 170 | // R: IFCNT |
charly | 0:f4343071c8b1 | 171 | uint8_t IFCNT(); |
charly | 0:f4343071c8b1 | 172 | |
charly | 0:f4343071c8b1 | 173 | // W: SLAVECONF |
charly | 0:f4343071c8b1 | 174 | void SLAVECONF(uint16_t input); |
charly | 0:f4343071c8b1 | 175 | uint16_t SLAVECONF(); |
charly | 0:f4343071c8b1 | 176 | void senddelay(uint8_t B); |
charly | 0:f4343071c8b1 | 177 | uint8_t senddelay(); |
charly | 0:f4343071c8b1 | 178 | |
charly | 0:f4343071c8b1 | 179 | // W: OTP_PROG |
charly | 0:f4343071c8b1 | 180 | void OTP_PROG(uint16_t input); |
charly | 0:f4343071c8b1 | 181 | |
charly | 0:f4343071c8b1 | 182 | // R: OTP_READ |
charly | 0:f4343071c8b1 | 183 | uint32_t OTP_READ(); |
charly | 0:f4343071c8b1 | 184 | |
charly | 0:f4343071c8b1 | 185 | // R: IOIN |
charly | 0:f4343071c8b1 | 186 | uint32_t IOIN(); |
charly | 0:f4343071c8b1 | 187 | bool enn(); |
charly | 0:f4343071c8b1 | 188 | bool ms1(); |
charly | 0:f4343071c8b1 | 189 | bool ms2(); |
charly | 0:f4343071c8b1 | 190 | bool diag(); |
charly | 0:f4343071c8b1 | 191 | bool pdn_uart(); |
charly | 0:f4343071c8b1 | 192 | bool step(); |
charly | 0:f4343071c8b1 | 193 | bool sel_a(); |
charly | 0:f4343071c8b1 | 194 | bool dir(); |
charly | 0:f4343071c8b1 | 195 | uint8_t version(); |
charly | 0:f4343071c8b1 | 196 | |
charly | 0:f4343071c8b1 | 197 | // RW: FACTORY_CONF |
charly | 0:f4343071c8b1 | 198 | void FACTORY_CONF(uint16_t input); |
charly | 0:f4343071c8b1 | 199 | uint16_t FACTORY_CONF(); |
charly | 0:f4343071c8b1 | 200 | void fclktrim(uint8_t B); |
charly | 0:f4343071c8b1 | 201 | void ottrim(uint8_t B); |
charly | 0:f4343071c8b1 | 202 | uint8_t fclktrim(); |
charly | 0:f4343071c8b1 | 203 | uint8_t ottrim(); |
charly | 0:f4343071c8b1 | 204 | |
charly | 0:f4343071c8b1 | 205 | // W: VACTUAL |
charly | 0:f4343071c8b1 | 206 | void VACTUAL(uint32_t input); |
charly | 0:f4343071c8b1 | 207 | uint32_t VACTUAL(); |
charly | 0:f4343071c8b1 | 208 | |
charly | 0:f4343071c8b1 | 209 | // RW: CHOPCONF |
charly | 0:f4343071c8b1 | 210 | void CHOPCONF(uint32_t input); |
charly | 0:f4343071c8b1 | 211 | void toff(uint8_t B); |
charly | 0:f4343071c8b1 | 212 | void hstrt(uint8_t B); |
charly | 0:f4343071c8b1 | 213 | void hend(uint8_t B); |
charly | 0:f4343071c8b1 | 214 | void tbl(uint8_t B); |
charly | 0:f4343071c8b1 | 215 | void vsense(bool B); |
charly | 0:f4343071c8b1 | 216 | void mres(uint8_t B); |
charly | 0:f4343071c8b1 | 217 | void intpol(bool B); |
charly | 0:f4343071c8b1 | 218 | void dedge(bool B); |
charly | 0:f4343071c8b1 | 219 | void diss2g(bool B); |
charly | 0:f4343071c8b1 | 220 | void diss2vs(bool B); |
charly | 0:f4343071c8b1 | 221 | uint32_t CHOPCONF(); |
charly | 0:f4343071c8b1 | 222 | uint8_t toff(); |
charly | 0:f4343071c8b1 | 223 | uint8_t hstrt(); |
charly | 0:f4343071c8b1 | 224 | uint8_t hend(); |
charly | 0:f4343071c8b1 | 225 | uint8_t tbl(); |
charly | 0:f4343071c8b1 | 226 | bool vsense(); |
charly | 0:f4343071c8b1 | 227 | uint8_t mres(); |
charly | 0:f4343071c8b1 | 228 | bool intpol(); |
charly | 0:f4343071c8b1 | 229 | bool dedge(); |
charly | 0:f4343071c8b1 | 230 | bool diss2g(); |
charly | 0:f4343071c8b1 | 231 | bool diss2vs(); |
charly | 0:f4343071c8b1 | 232 | |
charly | 0:f4343071c8b1 | 233 | // R: DRV_STATUS |
charly | 0:f4343071c8b1 | 234 | uint32_t DRV_STATUS(); |
charly | 0:f4343071c8b1 | 235 | bool otpw(); |
charly | 0:f4343071c8b1 | 236 | bool ot(); |
charly | 0:f4343071c8b1 | 237 | bool s2ga(); |
charly | 0:f4343071c8b1 | 238 | bool s2gb(); |
charly | 0:f4343071c8b1 | 239 | bool s2vsa(); |
charly | 0:f4343071c8b1 | 240 | bool s2vsb(); |
charly | 0:f4343071c8b1 | 241 | bool ola(); |
charly | 0:f4343071c8b1 | 242 | bool olb(); |
charly | 0:f4343071c8b1 | 243 | bool t120(); |
charly | 0:f4343071c8b1 | 244 | bool t143(); |
charly | 0:f4343071c8b1 | 245 | bool t150(); |
charly | 0:f4343071c8b1 | 246 | bool t157(); |
charly | 0:f4343071c8b1 | 247 | uint16_t cs_actual(); |
charly | 0:f4343071c8b1 | 248 | bool stealth(); |
charly | 0:f4343071c8b1 | 249 | bool stst(); |
charly | 0:f4343071c8b1 | 250 | |
charly | 0:f4343071c8b1 | 251 | // RW: PWMCONF |
charly | 0:f4343071c8b1 | 252 | void PWMCONF(uint32_t input); |
charly | 0:f4343071c8b1 | 253 | void pwm_ofs(uint8_t B); |
charly | 0:f4343071c8b1 | 254 | void pwm_grad(uint8_t B); |
charly | 0:f4343071c8b1 | 255 | void pwm_freq(uint8_t B); |
charly | 0:f4343071c8b1 | 256 | void pwm_autoscale(bool B); |
charly | 0:f4343071c8b1 | 257 | void pwm_autograd(bool B); |
charly | 0:f4343071c8b1 | 258 | void freewheel(uint8_t B); |
charly | 0:f4343071c8b1 | 259 | void pwm_reg(uint8_t B); |
charly | 0:f4343071c8b1 | 260 | void pwm_lim(uint8_t B); |
charly | 0:f4343071c8b1 | 261 | uint32_t PWMCONF(); |
charly | 0:f4343071c8b1 | 262 | uint8_t pwm_ofs(); |
charly | 0:f4343071c8b1 | 263 | uint8_t pwm_grad(); |
charly | 0:f4343071c8b1 | 264 | uint8_t pwm_freq(); |
charly | 0:f4343071c8b1 | 265 | bool pwm_autoscale(); |
charly | 0:f4343071c8b1 | 266 | bool pwm_autograd(); |
charly | 0:f4343071c8b1 | 267 | uint8_t freewheel(); |
charly | 0:f4343071c8b1 | 268 | uint8_t pwm_reg(); |
charly | 0:f4343071c8b1 | 269 | uint8_t pwm_lim(); |
charly | 0:f4343071c8b1 | 270 | |
charly | 0:f4343071c8b1 | 271 | // R: PWM_SCALE |
charly | 0:f4343071c8b1 | 272 | uint32_t PWM_SCALE(); |
charly | 0:f4343071c8b1 | 273 | uint8_t pwm_scale_sum(); |
charly | 0:f4343071c8b1 | 274 | int16_t pwm_scale_auto(); |
charly | 0:f4343071c8b1 | 275 | |
charly | 0:f4343071c8b1 | 276 | // R: PWM_AUTO (0x72) |
charly | 0:f4343071c8b1 | 277 | uint32_t PWM_AUTO(); |
charly | 0:f4343071c8b1 | 278 | uint8_t pwm_ofs_auto(); |
charly | 0:f4343071c8b1 | 279 | uint8_t pwm_grad_auto(); |
charly | 0:f4343071c8b1 | 280 | |
charly | 0:f4343071c8b1 | 281 | uint16_t bytesWritten = 0; |
charly | 0:f4343071c8b1 | 282 | float Rsense = 0.11; |
charly | 0:f4343071c8b1 | 283 | bool CRCerror = false; |
charly | 0:f4343071c8b1 | 284 | protected: |
charly | 0:f4343071c8b1 | 285 | INIT2208_REGISTER(GCONF) {{.sr=0}}; |
charly | 0:f4343071c8b1 | 286 | INIT_REGISTER(SLAVECONF) {{.sr=0}}; |
charly | 0:f4343071c8b1 | 287 | INIT_REGISTER(FACTORY_CONF) {{.sr=0}}; |
charly | 0:f4343071c8b1 | 288 | INIT2208_REGISTER(VACTUAL) {.sr=0}; |
charly | 0:f4343071c8b1 | 289 | INIT2208_REGISTER(CHOPCONF) {{.sr=0}}; |
charly | 0:f4343071c8b1 | 290 | INIT2208_REGISTER(PWMCONF) {{.sr=0}}; |
charly | 0:f4343071c8b1 | 291 | |
charly | 0:f4343071c8b1 | 292 | struct IFCNT_t { constexpr static uint8_t address = 0x02; }; |
charly | 0:f4343071c8b1 | 293 | struct OTP_PROG_t { constexpr static uint8_t address = 0x04; }; |
charly | 0:f4343071c8b1 | 294 | struct OTP_READ_t { constexpr static uint8_t address = 0x05; }; |
charly | 0:f4343071c8b1 | 295 | |
charly | 0:f4343071c8b1 | 296 | TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr); |
charly | 0:f4343071c8b1 | 297 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 298 | TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr); |
charly | 0:f4343071c8b1 | 299 | #endif |
charly | 0:f4343071c8b1 | 300 | |
charly | 0:f4343071c8b1 | 301 | Stream * HWSerial = nullptr; |
charly | 0:f4343071c8b1 | 302 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 303 | BufferedSerial * SWSerial = nullptr; |
charly | 0:f4343071c8b1 | 304 | const uint16_t RXTX_pin = 0; // Half duplex |
charly | 0:f4343071c8b1 | 305 | #endif |
charly | 0:f4343071c8b1 | 306 | |
charly | 0:f4343071c8b1 | 307 | // SSwitch *sswitch = nullptr; |
charly | 0:f4343071c8b1 | 308 | |
charly | 0:f4343071c8b1 | 309 | int available(); |
charly | 0:f4343071c8b1 | 310 | void preWriteCommunication(); |
charly | 0:f4343071c8b1 | 311 | void preReadCommunication(); |
charly | 0:f4343071c8b1 | 312 | int16_t serial_read(); |
charly | 0:f4343071c8b1 | 313 | uint8_t serial_write(const uint8_t data); |
charly | 0:f4343071c8b1 | 314 | void postWriteCommunication(); |
charly | 0:f4343071c8b1 | 315 | void postReadCommunication(); |
charly | 0:f4343071c8b1 | 316 | void write(uint8_t, uint32_t); |
charly | 0:f4343071c8b1 | 317 | uint32_t read(uint8_t); |
charly | 0:f4343071c8b1 | 318 | const uint8_t slave_address; |
charly | 0:f4343071c8b1 | 319 | uint8_t calcCRC(uint8_t datagram[], uint8_t len); |
charly | 0:f4343071c8b1 | 320 | static constexpr uint8_t TMC2208_SYNC = 0x05, |
charly | 0:f4343071c8b1 | 321 | TMC2208_SLAVE_ADDR = 0x00; |
charly | 0:f4343071c8b1 | 322 | static constexpr uint8_t replyDelay = 2; //ms |
charly | 0:f4343071c8b1 | 323 | static constexpr uint8_t abort_window = 5; |
charly | 0:f4343071c8b1 | 324 | static constexpr uint8_t max_retries = 2; |
charly | 0:f4343071c8b1 | 325 | |
charly | 0:f4343071c8b1 | 326 | uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t); |
charly | 0:f4343071c8b1 | 327 | }; |
charly | 0:f4343071c8b1 | 328 | |
charly | 0:f4343071c8b1 | 329 | class TMC2209Stepper : public TMC2208Stepper { |
charly | 0:f4343071c8b1 | 330 | public: |
charly | 0:f4343071c8b1 | 331 | TMC2209Stepper(Stream * SerialPort, float RS, uint8_t addr) : |
charly | 0:f4343071c8b1 | 332 | TMC2208Stepper(SerialPort, RS, addr) {} |
charly | 0:f4343071c8b1 | 333 | |
charly | 0:f4343071c8b1 | 334 | #if SW_CAPABLE_PLATFORM |
charly | 0:f4343071c8b1 | 335 | TMC2209Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr) : |
charly | 0:f4343071c8b1 | 336 | TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, addr) {} |
charly | 0:f4343071c8b1 | 337 | #else |
charly | 0:f4343071c8b1 | 338 | TMC2209Stepper(PinName, PinName, float, uint8_t) = delete; // Your platform does not currently support Software Serial |
charly | 0:f4343071c8b1 | 339 | #endif |
charly | 0:f4343071c8b1 | 340 | void push(); |
charly | 0:f4343071c8b1 | 341 | |
charly | 0:f4343071c8b1 | 342 | // R: IOIN |
charly | 0:f4343071c8b1 | 343 | uint32_t IOIN(); |
charly | 0:f4343071c8b1 | 344 | bool enn(); |
charly | 0:f4343071c8b1 | 345 | bool ms1(); |
charly | 0:f4343071c8b1 | 346 | bool ms2(); |
charly | 0:f4343071c8b1 | 347 | bool diag(); |
charly | 0:f4343071c8b1 | 348 | bool pdn_uart(); |
charly | 0:f4343071c8b1 | 349 | bool step(); |
charly | 0:f4343071c8b1 | 350 | bool spread_en(); |
charly | 0:f4343071c8b1 | 351 | bool dir(); |
charly | 0:f4343071c8b1 | 352 | uint8_t version(); |
charly | 0:f4343071c8b1 | 353 | |
charly | 0:f4343071c8b1 | 354 | // W: TCOOLTHRS |
charly | 0:f4343071c8b1 | 355 | uint32_t TCOOLTHRS(); |
charly | 0:f4343071c8b1 | 356 | void TCOOLTHRS(uint32_t input); |
charly | 0:f4343071c8b1 | 357 | |
charly | 0:f4343071c8b1 | 358 | // W: SGTHRS |
charly | 0:f4343071c8b1 | 359 | void SGTHRS(uint8_t B); |
charly | 0:f4343071c8b1 | 360 | uint8_t SGTHRS(); |
charly | 0:f4343071c8b1 | 361 | |
charly | 0:f4343071c8b1 | 362 | // R: SG_RESULT |
charly | 0:f4343071c8b1 | 363 | uint16_t SG_RESULT(); |
charly | 0:f4343071c8b1 | 364 | |
charly | 0:f4343071c8b1 | 365 | // W: COOLCONF |
charly | 0:f4343071c8b1 | 366 | void COOLCONF(uint16_t B); |
charly | 0:f4343071c8b1 | 367 | uint16_t COOLCONF(); |
charly | 0:f4343071c8b1 | 368 | void semin(uint8_t B); |
charly | 0:f4343071c8b1 | 369 | void seup(uint8_t B); |
charly | 0:f4343071c8b1 | 370 | void semax(uint8_t B); |
charly | 0:f4343071c8b1 | 371 | void sedn(uint8_t B); |
charly | 0:f4343071c8b1 | 372 | void seimin(bool B); |
charly | 0:f4343071c8b1 | 373 | uint8_t semin(); |
charly | 0:f4343071c8b1 | 374 | uint8_t seup(); |
charly | 0:f4343071c8b1 | 375 | uint8_t semax(); |
charly | 0:f4343071c8b1 | 376 | uint8_t sedn(); |
charly | 0:f4343071c8b1 | 377 | bool seimin(); |
charly | 0:f4343071c8b1 | 378 | |
charly | 0:f4343071c8b1 | 379 | protected: |
charly | 0:f4343071c8b1 | 380 | INIT_REGISTER(TCOOLTHRS){.sr=0}; |
charly | 0:f4343071c8b1 | 381 | TMC2209_n::SGTHRS_t SGTHRS_register{.sr=0}; |
charly | 0:f4343071c8b1 | 382 | TMC2209_n::COOLCONF_t COOLCONF_register{{.sr=0}}; |
charly | 0:f4343071c8b1 | 383 | }; |