TMCStepper
Library supporting Trinamic Stepper Drivers for Arduino platforms
Loading...
Searching...
No Matches
TMC2160Stepper.cpp
Go to the documentation of this file.
1
6#include "../TMCStepper.h"
7#include "TMC_MACROS.h"
8
9TMC2160Stepper::TMC2160Stepper(uint16_t pinCS, float RS, int8_t link) : TMC2130Stepper(pinCS, RS, link)
10 { defaults(); }
11TMC2160Stepper::TMC2160Stepper(uint16_t pinCS, float RS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK, int8_t link) :
12 TMC2130Stepper(pinCS, RS, pinMOSI, pinMISO, pinSCK, link)
13 { defaults(); }
14TMC2160Stepper::TMC2160Stepper(uint16_t pinCS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK, int8_t link) :
15 TMC2130Stepper(pinCS, default_RS, pinMOSI, pinMISO, pinSCK, link)
16 { defaults(); }
17
19 //set pins
21 switchCSpin(HIGH);
22
23 if (TMC_SW_SPI != nullptr) TMC_SW_SPI->init();
24
25 GCONF(GCONF_register.sr);
26 CHOPCONF(CHOPCONF_register.sr);
27 COOLCONF(COOLCONF_register.sr);
28 PWMCONF(PWMCONF_register.sr);
29 IHOLD_IRUN(IHOLD_IRUN_register.sr);
30
31 toff(8); //off_time(8);
32 tbl(1); //blank_time(24);
33}
34
36 SHORT_CONF_register.s2vs_level = 6;
37 SHORT_CONF_register.s2g_level = 6;
38 SHORT_CONF_register.shortfilter = 0b01;
39 SHORT_CONF_register.shortdelay = 0;
40
41 DRV_CONF_register.bbmtime = 0;
42 DRV_CONF_register.bbmclks = 4;
43 DRV_CONF_register.otselect = 0b00;
44 DRV_CONF_register.drvstrength = 0b10;
45 DRV_CONF_register.filt_isense = 0b00;
46
47 TPOWERDOWN_register.sr = 10;
48
49 //MSLUT0_register.sr = ???;
50 //MSLUT1_register.sr = ???;
51 //MSLUT2_register.sr = ???;
52 //MSLUT3_register.sr = ???;
53 //MSLUT4_register.sr = ???;
54 //MSLUT5_register.sr = ???;
55 //MSLUT6_register.sr = ???;
56 //MSLUT7_register.sr = ???;
57
58 //MSLUTSEL_register.sr = ???;
59
60 //MSLUTSTART_register.start_sin = 0;
61 //MSLUTSTART_register.start_sin90 = 247;
62
63 //CHOPCONF_register.sr = 0x10410150;
64 CHOPCONF_register.toff = 0;
65 CHOPCONF_register.hstrt = 5;
66 CHOPCONF_register.hend = 2;
67 CHOPCONF_register.disfdcc = false;
68 CHOPCONF_register.rndtf = false;
69 CHOPCONF_register.chm = false;
70 CHOPCONF_register.tbl = 2;
71 CHOPCONF_register.vsense = false;
72 CHOPCONF_register.vhighfs = false;
73 CHOPCONF_register.vhighchm = false;
74 CHOPCONF_register.sync = 4;
75 CHOPCONF_register.mres = 0;
76 CHOPCONF_register.intpol = true;
77 CHOPCONF_register.dedge = false;
78 CHOPCONF_register.diss2g = false;
79
80 //PWMCONF_register.sr = 0xC40C001E;
81 PWMCONF_register.pwm_ofs = 30;
82 PWMCONF_register.pwm_grad = 0;
83 PWMCONF_register.pwm_freq = 0;
84 PWMCONF_register.pwm_autoscale = true;
85 PWMCONF_register.pwm_autograd = true;
86 PWMCONF_register.freewheel = 0;
87 PWMCONF_register.pwm_reg = 4;
88 PWMCONF_register.pwm_lim = 12;
89}
90
91/*
92 Requested current = mA = I_rms/1000
93 Equation for current:
94 I_rms = GLOBALSCALER/256 * (CS+1)/32 * V_fs/R_sense * 1/sqrt(2)
95 Solve for GLOBALSCALER ->
96
97 32 * 256 * sqrt(2) * I_rms * R_sense |
98 GLOBALSCALER = ------------------------------------ |
99 (CS + 1) * V_fs | V_fs = 0.325
100
101*/
103 constexpr uint32_t V_fs = 325; // 0.325 * 1000
104 uint8_t CS = 31;
105 uint32_t scaler = 0; // = 256
106
107 const uint16_t RS_scaled = Rsense * 0xFFFF; // Scale to 16b
108 uint32_t numerator = 11585; // 32 * 256 * sqrt(2)
109 numerator *= RS_scaled;
110 numerator >>= 8;
111 numerator *= mA;
112
113 do {
114 uint32_t denominator = V_fs * 0xFFFF >> 8;
115 denominator *= CS+1;
116 scaler = numerator / denominator;
117
118 if (scaler > 255) scaler = 0; // Maximum
119 else if (scaler < 128) CS--; // Try again with smaller CS
120 } while(0 < scaler && scaler < 128);
121
122
123 if (CS > 31)
124 CS = 31;
125
126 GLOBAL_SCALER(scaler);
127 irun(CS);
129}
130void TMC2160Stepper::rms_current(uint16_t mA, float mult) {
131 holdMultiplier = mult;
132 rms_current(mA);
133}
134uint16_t TMC2160Stepper::cs2rms(uint8_t CS) {
135 uint16_t scaler = GLOBAL_SCALER();
136 if (!scaler) scaler = 256;
137 uint32_t numerator = scaler * (CS+1);
138 numerator *= 325;
139 numerator >>= (8+5); // Divide by 256 and 32
140 numerator *= 1000000;
141 uint32_t denominator = Rsense*1000;
142 denominator *= 1414;
143
144 return numerator / denominator;
145}
146uint16_t TMC2160Stepper::rms_current() { return cs2rms(irun()); }
147
149 GCONF(GCONF_register.sr);
150 IHOLD_IRUN(IHOLD_IRUN_register.sr);
151 TPOWERDOWN(TPOWERDOWN_register.sr);
152 TPWMTHRS(TPWMTHRS_register.sr);
153 TCOOLTHRS(TCOOLTHRS_register.sr);
154 THIGH(THIGH_register.sr);
155 XDIRECT(XDIRECT_register.sr);
156 VDCMIN(VDCMIN_register.sr);
157 CHOPCONF(CHOPCONF_register.sr);
158 COOLCONF(COOLCONF_register.sr);
159 DCCTRL(DCCTRL_register.sr);
160 PWMCONF(PWMCONF_register.sr);
161 SHORT_CONF(SHORT_CONF_register.sr);
162 DRV_CONF(DRV_CONF_register.sr);
163 GLOBAL_SCALER(GLOBAL_SCALER_register.sr);
164}
165
166// R: OFFSET_READ
168
169// R: PWM_SCALE
SW_SPIClass * TMC_SW_SPI
TMC2130Stepper(uint16_t pinCS, float RS=default_RS, int8_t link_index=-1)
uint32_t CHOPCONF()
Definition CHOPCONF.cpp:16
const uint16_t _pinCS
uint32_t COOLCONF()
Definition COOLCONF.cpp:16
uint8_t toff()
Definition CHOPCONF.cpp:39
uint8_t tbl()
Definition CHOPCONF.cpp:46
uint32_t read(uint8_t addressByte)
void switchCSpin(bool state)
uint32_t GCONF()
Definition GCONF.cpp:16
uint16_t rms_current()
TMC2160Stepper(uint16_t pinCS, float RS=default_RS, int8_t link_index=-1)
uint8_t GLOBAL_SCALER()
static constexpr float default_RS
uint8_t pwm_scale_sum()
uint16_t cs2rms(uint8_t CS)
uint16_t OFFSET_READ()
uint32_t DRV_CONF()
Definition DRV_CONF.cpp:16
uint32_t PWMCONF()
Definition PWMCONF.cpp:40
uint16_t pwm_scale_auto()
uint32_t SHORT_CONF()
const float Rsense
uint32_t IHOLD_IRUN()
uint8_t ihold()
uint8_t TPOWERDOWN()
uint8_t irun()
float holdMultiplier
uint32_t TPWMTHRS()
#define pinMode(PIN, MODE)
Definition rpi_bcm2835.h:13
#define OUTPUT
Definition rpi_bcm2835.h:11
static constexpr uint8_t address
uint8_t uint16_t pwm_scale_auto
static constexpr uint8_t address