Testprogram for TMC2209-Library. Uses Speed-Control via VACTUAL instead of Step/Dir
Dependencies: TMCStepper mRotaryEncoder-os
Revision 5:7f250f463aa2, committed 2021-03-21
- Comitter:
- charly
- Date:
- Sun Mar 21 13:31:53 2021 +0000
- Parent:
- 4:12bfa2c1729f
- Child:
- 6:6ad7bc10ac20
- Commit message:
- Speed limit; Show direction on leds
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TMCStepper.lib Sun Mar 21 13:31:53 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/charly/code/TMCStepper/#f4343071c8b1
--- a/TMCStepper/CHOPCONF.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" - -#define SET_REG(SETTING) CHOPCONF_register.SETTING = B; write(CHOPCONF_register.address, CHOPCONF_register.sr) - -// CHOPCONF -/* -uint32_t TMC2130Stepper::CHOPCONF() { - return read(CHOPCONF_register.address); -} -void TMC2130Stepper::CHOPCONF(uint32_t input) { - CHOPCONF_register.sr = input; - write(CHOPCONF_register.address, CHOPCONF_register.sr); -} - -void TMC2130Stepper::toff( uint8_t B ) { SET_REG(toff); } -void TMC2130Stepper::hstrt( uint8_t B ) { SET_REG(hstrt); } -void TMC2130Stepper::hend( uint8_t B ) { SET_REG(hend); } -//void TMC2130Stepper::fd( uint8_t B ) { SET_REG(fd); } -void TMC2130Stepper::disfdcc( bool B ) { SET_REG(disfdcc); } -void TMC2130Stepper::rndtf( bool B ) { SET_REG(rndtf); } -void TMC2130Stepper::chm( bool B ) { SET_REG(chm); } -void TMC2130Stepper::tbl( uint8_t B ) { SET_REG(tbl); } -void TMC2130Stepper::vsense( bool B ) { SET_REG(vsense); } -void TMC2130Stepper::vhighfs( bool B ) { SET_REG(vhighfs); } -void TMC2130Stepper::vhighchm( bool B ) { SET_REG(vhighchm);} -void TMC2130Stepper::sync( uint8_t B ) { SET_REG(sync); } -void TMC2130Stepper::mres( uint8_t B ) { SET_REG(mres); } -void TMC2130Stepper::intpol( bool B ) { SET_REG(intpol); } -void TMC2130Stepper::dedge( bool B ) { SET_REG(dedge); } -void TMC2130Stepper::diss2g( bool B ) { SET_REG(diss2g); } - -uint8_t TMC2130Stepper::toff() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff; } -uint8_t TMC2130Stepper::hstrt() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt; } -uint8_t TMC2130Stepper::hend() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend; } -//uint8_t TMC2130Stepper::fd() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.fd; } -bool TMC2130Stepper::disfdcc() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.disfdcc; } -bool TMC2130Stepper::rndtf() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.rndtf; } -bool TMC2130Stepper::chm() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.chm; } -uint8_t TMC2130Stepper::tbl() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl; } -bool TMC2130Stepper::vsense() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense; } -bool TMC2130Stepper::vhighfs() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighfs; } -bool TMC2130Stepper::vhighchm() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighchm;} -uint8_t TMC2130Stepper::sync() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.sync; } -uint8_t TMC2130Stepper::mres() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres; } -bool TMC2130Stepper::intpol() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol; } -bool TMC2130Stepper::dedge() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge; } -bool TMC2130Stepper::diss2g() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g; } - -void TMC5160Stepper::diss2vs(bool B){ SET_REG(diss2vs); } -void TMC5160Stepper::tpfd(uint8_t B){ SET_REG(tpfd); } -bool TMC5160Stepper::diss2vs() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs; } -uint8_t TMC5160Stepper::tpfd() { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tpfd; } -*/ -void TMC2208Stepper::CHOPCONF(uint32_t input) { - CHOPCONF_register.sr = input; - write(CHOPCONF_register.address, CHOPCONF_register.sr); -} -uint32_t TMC2208Stepper::CHOPCONF() { - return read(CHOPCONF_register.address); -} -void TMC2208Stepper::toff ( uint8_t B ) { SET_REG(toff); } -void TMC2208Stepper::hstrt ( uint8_t B ) { SET_REG(hstrt); } -void TMC2208Stepper::hend ( uint8_t B ) { SET_REG(hend); } -void TMC2208Stepper::tbl ( uint8_t B ) { SET_REG(tbl); } -void TMC2208Stepper::vsense ( bool B ) { SET_REG(vsense); } -void TMC2208Stepper::mres ( uint8_t B ) { SET_REG(mres); } -void TMC2208Stepper::intpol ( bool B ) { SET_REG(intpol); } -void TMC2208Stepper::dedge ( bool B ) { SET_REG(dedge); } -void TMC2208Stepper::diss2g ( bool B ) { SET_REG(diss2g); } -void TMC2208Stepper::diss2vs( bool B ) { SET_REG(diss2vs); } - -uint8_t TMC2208Stepper::toff() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff; } -uint8_t TMC2208Stepper::hstrt() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt; } -uint8_t TMC2208Stepper::hend() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend; } -uint8_t TMC2208Stepper::tbl() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl; } -bool TMC2208Stepper::vsense() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense; } -uint8_t TMC2208Stepper::mres() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres; } -bool TMC2208Stepper::intpol() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol; } -bool TMC2208Stepper::dedge() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge; } -bool TMC2208Stepper::diss2g() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g; } -bool TMC2208Stepper::diss2vs() { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs; } -/* -#define GET_REG_2660(SETTING) return CHOPCONF_register.SETTING; - -uint32_t TMC2660Stepper::CHOPCONF() { return CHOPCONF_register.sr; } -void TMC2660Stepper::CHOPCONF(uint32_t data) { - CHOPCONF_register.sr = data; - write(CHOPCONF_register.address, CHOPCONF_register.sr); -} - -void TMC2660Stepper::toff(uint8_t B) { - SET_REG(toff); - if (B>0) _savedToff = B; -} -void TMC2660Stepper::hstrt(uint8_t B) { SET_REG(hstrt); } -void TMC2660Stepper::hend(uint8_t B) { SET_REG(hend); } -void TMC2660Stepper::hdec(uint8_t B) { SET_REG(hdec); } -void TMC2660Stepper::rndtf(bool B) { SET_REG(rndtf); } -void TMC2660Stepper::chm(bool B) { SET_REG(chm); } -void TMC2660Stepper::tbl(uint8_t B) { SET_REG(tbl); } - -uint8_t TMC2660Stepper::toff() { GET_REG_2660(toff); } -uint8_t TMC2660Stepper::hstrt() { GET_REG_2660(hstrt); } -uint8_t TMC2660Stepper::hend() { GET_REG_2660(hend); } -uint8_t TMC2660Stepper::hdec() { GET_REG_2660(hdec); } -bool TMC2660Stepper::rndtf() { GET_REG_2660(rndtf); } -bool TMC2660Stepper::chm() { GET_REG_2660(chm); } -uint8_t TMC2660Stepper::tbl() { GET_REG_2660(tbl); } -*/ \ No newline at end of file
--- a/TMCStepper/DRV_STATUS.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" - -#define GET_REG(NS, SETTING) NS::DRV_STATUS_t r{0}; r.sr = DRV_STATUS(); return r.SETTING -/* -uint32_t TMC2130Stepper::DRV_STATUS() { return read(DRV_STATUS_t::address); } - -uint16_t TMC2130Stepper::sg_result(){ GET_REG(TMC2130_n, sg_result); } -bool TMC2130Stepper::fsactive() { GET_REG(TMC2130_n, fsactive); } -uint8_t TMC2130Stepper::cs_actual() { GET_REG(TMC2130_n, cs_actual); } -bool TMC2130Stepper::stallguard() { GET_REG(TMC2130_n, stallGuard); } -bool TMC2130Stepper::ot() { GET_REG(TMC2130_n, ot); } -bool TMC2130Stepper::otpw() { GET_REG(TMC2130_n, otpw); } -bool TMC2130Stepper::s2ga() { GET_REG(TMC2130_n, s2ga); } -bool TMC2130Stepper::s2gb() { GET_REG(TMC2130_n, s2gb); } -bool TMC2130Stepper::ola() { GET_REG(TMC2130_n, ola); } -bool TMC2130Stepper::olb() { GET_REG(TMC2130_n, olb); } -bool TMC2130Stepper::stst() { GET_REG(TMC2130_n, stst); } -*/ -uint32_t TMC2208Stepper::DRV_STATUS() { - return read(TMC2208_n::DRV_STATUS_t::address); -} - -bool TMC2208Stepper::otpw() { GET_REG(TMC2208_n, otpw); } -bool TMC2208Stepper::ot() { GET_REG(TMC2208_n, ot); } -bool TMC2208Stepper::s2ga() { GET_REG(TMC2208_n, s2ga); } -bool TMC2208Stepper::s2gb() { GET_REG(TMC2208_n, s2gb); } -bool TMC2208Stepper::s2vsa() { GET_REG(TMC2208_n, s2vsa); } -bool TMC2208Stepper::s2vsb() { GET_REG(TMC2208_n, s2vsb); } -bool TMC2208Stepper::ola() { GET_REG(TMC2208_n, ola); } -bool TMC2208Stepper::olb() { GET_REG(TMC2208_n, olb); } -bool TMC2208Stepper::t120() { GET_REG(TMC2208_n, t120); } -bool TMC2208Stepper::t143() { GET_REG(TMC2208_n, t143); } -bool TMC2208Stepper::t150() { GET_REG(TMC2208_n, t150); } -bool TMC2208Stepper::t157() { GET_REG(TMC2208_n, t157); } -uint16_t TMC2208Stepper::cs_actual() { GET_REG(TMC2208_n, cs_actual); } -bool TMC2208Stepper::stealth() { GET_REG(TMC2208_n, stealth); } -bool TMC2208Stepper::stst() { GET_REG(TMC2208_n, stst); } \ No newline at end of file
--- a/TMCStepper/GCONF.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" - -#define SET_REG(SETTING) GCONF_register.SETTING = B; write(GCONF_register.address, GCONF_register.sr) - -// GCONF -/* -uint32_t TMC2130Stepper::GCONF() { - return read(GCONF_register.address); -} -void TMC2130Stepper::GCONF(uint32_t input) { - GCONF_register.sr = input; - write(GCONF_register.address, GCONF_register.sr); -} - -void TMC2130Stepper::I_scale_analog(bool B) { SET_REG(i_scale_analog); } -void TMC2130Stepper::internal_Rsense(bool B) { SET_REG(internal_rsense); } -void TMC2130Stepper::en_pwm_mode(bool B) { SET_REG(en_pwm_mode); } -void TMC2130Stepper::enc_commutation(bool B) { SET_REG(enc_commutation); } -void TMC2130Stepper::shaft(bool B) { SET_REG(shaft); } -void TMC2130Stepper::diag0_error(bool B) { SET_REG(diag0_error); } -void TMC2130Stepper::diag0_otpw(bool B) { SET_REG(diag0_otpw); } -void TMC2130Stepper::diag0_stall(bool B) { SET_REG(diag0_stall); } -void TMC2130Stepper::diag1_stall(bool B) { SET_REG(diag1_stall); } -void TMC2130Stepper::diag1_index(bool B) { SET_REG(diag1_index); } -void TMC2130Stepper::diag1_onstate(bool B) { SET_REG(diag1_onstate); } -void TMC2130Stepper::diag1_steps_skipped(bool B) { SET_REG(diag1_steps_skipped); } -void TMC2130Stepper::diag0_int_pushpull(bool B) { SET_REG(diag0_int_pushpull); } -void TMC2130Stepper::diag1_pushpull(bool B) { SET_REG(diag1_poscomp_pushpull); } -void TMC2130Stepper::small_hysteresis(bool B) { SET_REG(small_hysteresis); } -void TMC2130Stepper::stop_enable(bool B) { SET_REG(stop_enable); } -void TMC2130Stepper::direct_mode(bool B) { SET_REG(direct_mode); } - -bool TMC2130Stepper::I_scale_analog() { GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog; } -bool TMC2130Stepper::internal_Rsense() { GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense; } -bool TMC2130Stepper::en_pwm_mode() { GCONF_t r{0}; r.sr = GCONF(); return r.en_pwm_mode; } -bool TMC2130Stepper::enc_commutation() { GCONF_t r{0}; r.sr = GCONF(); return r.enc_commutation; } -bool TMC2130Stepper::shaft() { GCONF_t r{0}; r.sr = GCONF(); return r.shaft; } -bool TMC2130Stepper::diag0_error() { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_error; } -bool TMC2130Stepper::diag0_otpw() { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_otpw; } -bool TMC2130Stepper::diag0_stall() { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_stall; } -bool TMC2130Stepper::diag1_stall() { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_stall; } -bool TMC2130Stepper::diag1_index() { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_index; } -bool TMC2130Stepper::diag1_onstate() { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_onstate; } -bool TMC2130Stepper::diag1_steps_skipped() { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_steps_skipped; } -bool TMC2130Stepper::diag0_int_pushpull() { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_int_pushpull; } -bool TMC2130Stepper::diag1_pushpull() { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_poscomp_pushpull;} -bool TMC2130Stepper::small_hysteresis() { GCONF_t r{0}; r.sr = GCONF(); return r.small_hysteresis; } -bool TMC2130Stepper::stop_enable() { GCONF_t r{0}; r.sr = GCONF(); return r.stop_enable; } -bool TMC2130Stepper::direct_mode() { GCONF_t r{0}; r.sr = GCONF(); return r.direct_mode; } -*/ -/* -bit 18 not implemented: -test_mode 0: -Normal operation 1: -Enable analog test output on pin DCO. IHOLD[1..0] selects the function of DCO: -0…2: T120, DAC, VDDH Attention: -Not for user, set to 0 for normal operation! -*/ -/* -void TMC5160Stepper::recalibrate(bool B) { SET_REG(recalibrate); } -void TMC5160Stepper::faststandstill(bool B) { SET_REG(faststandstill); } -void TMC5160Stepper::multistep_filt(bool B) { SET_REG(multistep_filt); } -bool TMC5160Stepper::recalibrate() { GCONF_t r{0}; r.sr = GCONF(); return r.recalibrate; } -bool TMC5160Stepper::faststandstill() { GCONF_t r{0}; r.sr = GCONF(); return r.faststandstill; } -bool TMC5160Stepper::multistep_filt() { GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt; } -*/ -uint32_t TMC2208Stepper::GCONF() { - return read(GCONF_register.address); -} -void TMC2208Stepper::GCONF(uint32_t input) { - GCONF_register.sr = input; - write(GCONF_register.address, GCONF_register.sr); -} - -void TMC2208Stepper::I_scale_analog(bool B) { SET_REG(i_scale_analog); } -void TMC2208Stepper::internal_Rsense(bool B) { SET_REG(internal_rsense); } -void TMC2208Stepper::en_spreadCycle(bool B) { SET_REG(en_spreadcycle); } -void TMC2208Stepper::shaft(bool B) { SET_REG(shaft); } -void TMC2208Stepper::index_otpw(bool B) { SET_REG(index_otpw); } -void TMC2208Stepper::index_step(bool B) { SET_REG(index_step); } -void TMC2208Stepper::pdn_disable(bool B) { SET_REG(pdn_disable); } -void TMC2208Stepper::mstep_reg_select(bool B) { SET_REG(mstep_reg_select);} -void TMC2208Stepper::multistep_filt(bool B) { SET_REG(multistep_filt); } - -bool TMC2208Stepper::I_scale_analog() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog; } -bool TMC2208Stepper::internal_Rsense() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense; } -bool TMC2208Stepper::en_spreadCycle() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.en_spreadcycle; } -bool TMC2208Stepper::shaft() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.shaft; } -bool TMC2208Stepper::index_otpw() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_otpw; } -bool TMC2208Stepper::index_step() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_step; } -bool TMC2208Stepper::pdn_disable() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.pdn_disable; } -bool TMC2208Stepper::mstep_reg_select() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.mstep_reg_select; } -bool TMC2208Stepper::multistep_filt() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt; } \ No newline at end of file
--- a/TMCStepper/IHOLD_IRUN.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" - -#define SET_REG(SETTING) IHOLD_IRUN_register.SETTING = B; write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr); -#define GET_REG(SETTING) return IHOLD_IRUN_register.SETTING; - -// IHOLD_IRUN -uint32_t TMCStepper::IHOLD_IRUN() { return IHOLD_IRUN_register.sr; } -void TMCStepper::IHOLD_IRUN(uint32_t input) { - IHOLD_IRUN_register.sr = input; - write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr); -} - -void TMCStepper::ihold(uint8_t B) { SET_REG(ihold); } -void TMCStepper::irun(uint8_t B) { SET_REG(irun); } -void TMCStepper::iholddelay(uint8_t B) { SET_REG(iholddelay); } - -uint8_t TMCStepper::ihold() { GET_REG(ihold); } -uint8_t TMCStepper::irun() { GET_REG(irun); } -uint8_t TMCStepper::iholddelay() { GET_REG(iholddelay); } \ No newline at end of file
--- a/TMCStepper/PWMCONF.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" - -#define SET_REG(SETTING) PWMCONF_register.SETTING = B; write(PWMCONF_register.address, PWMCONF_register.sr) -#define GET_REG(SETTING) return PWMCONF_register.SETTING - -// PWMCONF -/* -uint32_t TMC2130Stepper::PWMCONF() { return PWMCONF_register.sr; } -void TMC2130Stepper::PWMCONF(uint32_t input) { - PWMCONF_register.sr = input; - write(PWMCONF_register.address, PWMCONF_register.sr); -} - -void TMC2130Stepper::pwm_ampl( uint8_t B ) { SET_REG(pwm_ampl); } -void TMC2130Stepper::pwm_grad( uint8_t B ) { SET_REG(pwm_grad); } -void TMC2130Stepper::pwm_freq( uint8_t B ) { SET_REG(pwm_freq); } -void TMC2130Stepper::pwm_autoscale( bool B ) { SET_REG(pwm_autoscale); } -void TMC2130Stepper::pwm_symmetric( bool B ) { SET_REG(pwm_symmetric); } -void TMC2130Stepper::freewheel( uint8_t B ) { SET_REG(freewheel); } - -uint8_t TMC2130Stepper::pwm_ampl() { GET_REG(pwm_ampl); } -uint8_t TMC2130Stepper::pwm_grad() { GET_REG(pwm_grad); } -uint8_t TMC2130Stepper::pwm_freq() { GET_REG(pwm_freq); } -bool TMC2130Stepper::pwm_autoscale() { GET_REG(pwm_autoscale); } -bool TMC2130Stepper::pwm_symmetric() { GET_REG(pwm_symmetric); } -uint8_t TMC2130Stepper::freewheel() { GET_REG(freewheel); } - -uint32_t TMC2160Stepper::PWMCONF() { - return PWMCONF_register.sr; -} -void TMC2160Stepper::PWMCONF(uint32_t input) { - PWMCONF_register.sr = input; - write(PWMCONF_register.address, PWMCONF_register.sr); -} - -void TMC2160Stepper::pwm_ofs ( uint8_t B ) { PWMCONF_register.pwm_ofs = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_grad ( uint8_t B ) { PWMCONF_register.pwm_grad = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_freq ( uint8_t B ) { PWMCONF_register.pwm_freq = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_autoscale ( bool B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_autograd ( bool B ) { PWMCONF_register.pwm_autograd = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::freewheel ( uint8_t B ) { PWMCONF_register.freewheel = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_reg ( uint8_t B ) { PWMCONF_register.pwm_reg = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2160Stepper::pwm_lim ( uint8_t B ) { PWMCONF_register.pwm_lim = B; write(PWMCONF_register.address, PWMCONF_register.sr); } - -uint8_t TMC2160Stepper::pwm_ofs() { return PWMCONF_register.pwm_ofs; } -uint8_t TMC2160Stepper::pwm_grad() { return PWMCONF_register.pwm_grad; } -uint8_t TMC2160Stepper::pwm_freq() { return PWMCONF_register.pwm_freq; } -bool TMC2160Stepper::pwm_autoscale() { return PWMCONF_register.pwm_autoscale;} -bool TMC2160Stepper::pwm_autograd() { return PWMCONF_register.pwm_autograd; } -uint8_t TMC2160Stepper::freewheel() { return PWMCONF_register.freewheel; } -uint8_t TMC2160Stepper::pwm_reg() { return PWMCONF_register.pwm_reg; } -uint8_t TMC2160Stepper::pwm_lim() { return PWMCONF_register.pwm_lim; } -*/ -uint32_t TMC2208Stepper::PWMCONF() { - return read(PWMCONF_register.address); -} -void TMC2208Stepper::PWMCONF(uint32_t input) { - PWMCONF_register.sr = input; - write(PWMCONF_register.address, PWMCONF_register.sr); -} - -void TMC2208Stepper::pwm_ofs ( uint8_t B ) { PWMCONF_register.pwm_ofs = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_grad ( uint8_t B ) { PWMCONF_register.pwm_grad = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_freq ( uint8_t B ) { PWMCONF_register.pwm_freq = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_autoscale ( bool B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_autograd ( bool B ) { PWMCONF_register.pwm_autograd = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::freewheel ( uint8_t B ) { PWMCONF_register.freewheel = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_reg ( uint8_t B ) { PWMCONF_register.pwm_reg = B; write(PWMCONF_register.address, PWMCONF_register.sr); } -void TMC2208Stepper::pwm_lim ( uint8_t B ) { PWMCONF_register.pwm_lim = B; write(PWMCONF_register.address, PWMCONF_register.sr); } - -uint8_t TMC2208Stepper::pwm_ofs() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_ofs; } -uint8_t TMC2208Stepper::pwm_grad() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_grad; } -uint8_t TMC2208Stepper::pwm_freq() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_freq; } -bool TMC2208Stepper::pwm_autoscale() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autoscale; } -bool TMC2208Stepper::pwm_autograd() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autograd; } -uint8_t TMC2208Stepper::freewheel() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.freewheel; } -uint8_t TMC2208Stepper::pwm_reg() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_reg; } -uint8_t TMC2208Stepper::pwm_lim() { TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_lim; } -
--- a/TMCStepper/TMC2208Stepper.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,459 +0,0 @@ -#include "TMCStepper.h" -#include "TMC_MACROS.h" -//#include "SERIAL_SWITCH.h" - -// Protected -// addr needed for TMC2209 -TMC2208Stepper::TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr) : - TMCStepper(RS), - slave_address(addr) - { - HWSerial = SerialPort; - defaults(); - } - -TMC2208Stepper::TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr, uint16_t mul_pin1, uint16_t mul_pin2) : - TMC2208Stepper(SerialPort, RS) - { -// SSwitch *SMulObj = new SSwitch(mul_pin1, mul_pin2, addr); -// sswitch = SMulObj; - } - -#if SW_CAPABLE_PLATFORM - // Protected - // addr needed for TMC2209 - TMC2208Stepper::TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr) : - TMCStepper(RS), - RXTX_pin(SW_RX_pin == SW_TX_pin ? SW_RX_pin : 0), - slave_address(addr) - { - BufferedSerial *SWSerialObj = new BufferedSerial(SW_TX_pin, SW_RX_pin); - SWSerial = SWSerialObj; - defaults(); - } - - void TMC2208Stepper::beginSerial(uint32_t baudrate) { - if (SWSerial != nullptr) - { - //SWSerial->begin(baudrate); - //SWSerial->end(); - SWSerial->set_baud(baudrate); - SWSerial->set_format( - /* bits */ 8, - /* parity */ BufferedSerial::None, - /* stop bit */ 1 - ); - SWSerial->set_blocking(true); - } -// #if defined(ARDUINO_ARCH_AVR) -// if (RXTX_pin > 0) { -// digitalWrite(RXTX_pin, HIGH); -// pinMode(RXTX_pin, OUTPUT); -// } -// #endif - } -#endif - -void TMC2208Stepper::begin() { - #if SW_CAPABLE_PLATFORM - beginSerial(115200); - //beginSerial(9600); - #endif - pdn_disable(true); - mstep_reg_select(true); - //Wait to initialize - wait_us(replyDelay*1000); - -} - -void TMC2208Stepper::defaults() { - GCONF_register.i_scale_analog = 1; - GCONF_register.internal_rsense = 0; // OTP - GCONF_register.en_spreadcycle = 0; // OTP - GCONF_register.multistep_filt = 1; // OTP - IHOLD_IRUN_register.iholddelay = 1; // OTP - TPOWERDOWN_register.sr = 20; - CHOPCONF_register.sr = 0x10000053; - PWMCONF_register.sr = 0xC10D0024; - //MSLUT0_register.sr = ???; - //MSLUT1_register.sr = ???; - //MSLUT2_register.sr = ???; - //MSLUT3_register.sr = ???; - //MSLUT4_register.sr = ???; - //MSLUT5_register.sr = ???; - //MSLUT6_register.sr = ???; - //MSLUT7_register.sr = ???; - //MSLUTSTART_register.start_sin90 = 247; -} - -void TMC2208Stepper::push() { - GCONF(GCONF_register.sr); - IHOLD_IRUN(IHOLD_IRUN_register.sr); - SLAVECONF(SLAVECONF_register.sr); - TPOWERDOWN(TPOWERDOWN_register.sr); - TPWMTHRS(TPWMTHRS_register.sr); - VACTUAL(VACTUAL_register.sr); - CHOPCONF(CHOPCONF_register.sr); - PWMCONF(PWMCONF_register.sr); -} - -bool TMC2208Stepper::isEnabled() { return !enn() && toff(); } - -uint8_t TMC2208Stepper::calcCRC(uint8_t datagram[], uint8_t len) { - uint8_t crc = 0; - for (uint8_t i = 0; i < len; i++) { - uint8_t currentByte = datagram[i]; - for (uint8_t j = 0; j < 8; j++) { - if ((crc >> 7) ^ (currentByte & 0x01)) { - crc = (crc << 1) ^ 0x07; - } else { - crc = (crc << 1); - } - crc &= 0xff; - currentByte = currentByte >> 1; - } - } - return crc; -} - -__attribute__((weak)) -int TMC2208Stepper::available() { - int out = 0; - #if SW_CAPABLE_PLATFORM - if (SWSerial != nullptr) { -// out = SWSerial->available(); -out = 1; - } else - #endif - if (HWSerial != nullptr) { -// out = HWSerial->available(); -out = 1; - } - - return out; -} - -__attribute__((weak)) -void TMC2208Stepper::preWriteCommunication() { - if (HWSerial != nullptr) { -// if (sswitch != nullptr) -// sswitch->active(); - } -} - -__attribute__((weak)) -void TMC2208Stepper::preReadCommunication() { - #if SW_CAPABLE_PLATFORM - if (SWSerial != nullptr) { -// SWSerial->listen(); - } else - #endif - if (HWSerial != nullptr) { -// if (sswitch != nullptr) -// sswitch->active(); - } -} - -__attribute__((weak)) -int16_t TMC2208Stepper::serial_read() { - int16_t out = 0; - int16_t count = 0; - - #if SW_CAPABLE_PLATFORM - if (SWSerial != nullptr) { -// out = SWSerial->read(); - count = SWSerial->read(&out, 1); // read one character -// if (SWSerial->readable()) { -// SWSerial->read(&out, 1); // read one character -// } - - } else - #endif - if (HWSerial != nullptr) { -// out = HWSerial->read(); - HWSerial->read(&out, 1); // read one character - } - if (count >= 1) { -// printf("<%02X|",out); - return out; - } else { - return -1; - } -} - -__attribute__((weak)) -uint8_t TMC2208Stepper::serial_write(const uint8_t data) { - int out = 0; - #if SW_CAPABLE_PLATFORM - if (SWSerial != nullptr) { -// printf(">%02X|",data); - return SWSerial->write(&data,1); - } else - #endif - if (HWSerial != nullptr) { - return HWSerial->write(&data,1); - } - - return out; -} - -__attribute__((weak)) -void TMC2208Stepper::postWriteCommunication() {} - -__attribute__((weak)) -void TMC2208Stepper::postReadCommunication() { - #if SW_CAPABLE_PLATFORM -// if (SWSerial != nullptr) { -// SWSerial->end(); -// } - #endif -} - -void TMC2208Stepper::write(uint8_t addr, uint32_t regVal) { - uint8_t len = 7; - addr |= TMC_WRITE; - uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, (uint8_t)(regVal>>24), (uint8_t)(regVal>>16), (uint8_t)(regVal>>8), (uint8_t)(regVal>>0), 0x00}; - - datagram[len] = calcCRC(datagram, len); - - preWriteCommunication(); - - for(uint8_t i=0; i<=len; i++) { - bytesWritten += serial_write(datagram[i]); - } - postWriteCommunication(); - - //delay(replyDelay); - wait_us(replyDelay*1000); -} - -uint64_t TMC2208Stepper::_sendDatagram(uint8_t datagram[], const uint8_t len, uint16_t timeout) { - -// while (available() > 0) serial_read(); // Flush - SWSerial->sync(); -/* uint8_t dummy; - while (SWSerial->readable()) { - SWSerial->read(&dummy, 1); // read one character - } -*/ -/* uint8_t dummy; - while (SWSerial->read(&dummy, 1) >= 0) { - ; - } -*/ - - #if defined(ARDUINO_ARCH_AVR) - if (RXTX_pin > 0) { - digitalWrite(RXTX_pin, HIGH); - pinMode(RXTX_pin, OUTPUT); - } - #endif - - for(int i=0; i<=len; i++) serial_write(datagram[i]); - - #if defined(ARDUINO_ARCH_AVR) - if (RXTX_pin > 0) { - pinMode(RXTX_pin, INPUT_PULLUP); - } - #endif - - //delay(this->replyDelay); - wait_us(this->replyDelay*1000); - - // scan for the rx frame and read it - -// uint32_t ms = millis(); - uint32_t sync_target = (static_cast<uint32_t>(datagram[0])<<16) | 0xFF00 | datagram[2]; - uint32_t sync = 0; - - - do { -/* uint32_t ms2 = millis(); - if (ms2 != ms) { - // 1ms tick - ms = ms2; - timeout--; - } - if (!timeout) return 0; -*/ - int16_t res = serial_read(); - if (res < 0) continue; - - sync <<= 8; - sync |= res & 0xFF; - sync &= 0xFFFFFF; - - } while (sync != sync_target); - - uint64_t out = sync; - // ms = millis(); - // timeout = this->abort_window; - - for(uint8_t i=0; i<5;) { -/* uint32_t ms2 = millis(); - if (ms2 != ms) { - // 1ms tick - ms = ms2; - timeout--; - } - if (!timeout) return 0; -*/ - int16_t res = serial_read(); - if (res < 0) continue; - - out <<= 8; - out |= res & 0xFF; - - i++; - } - - #if defined(ARDUINO_ARCH_AVR) - if (RXTX_pin > 0) { - digitalWrite(RXTX_pin, HIGH); - pinMode(RXTX_pin, OUTPUT); - } - #endif - -// while (available() > 0) serial_read(); // Flush - SWSerial->sync(); - - return out; - - -} - -uint32_t TMC2208Stepper::read(uint8_t addr) { - constexpr uint8_t len = 3; - addr |= TMC_READ; - uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, 0x00}; - datagram[len] = calcCRC(datagram, len); - uint64_t out = 0x00000000UL; - - for (uint8_t i = 0; i < max_retries; i++) { - preReadCommunication(); - out = _sendDatagram(datagram, len, abort_window); - postReadCommunication(); - -// delay(replyDelay); -// wait_us(replyDelay*1000); - - CRCerror = false; - uint8_t out_datagram[] = { - static_cast<uint8_t>(out>>56), - static_cast<uint8_t>(out>>48), - static_cast<uint8_t>(out>>40), - static_cast<uint8_t>(out>>32), - static_cast<uint8_t>(out>>24), - static_cast<uint8_t>(out>>16), - static_cast<uint8_t>(out>> 8), - static_cast<uint8_t>(out>> 0) - }; - uint8_t crc = calcCRC(out_datagram, 7); - if ((crc != static_cast<uint8_t>(out)) || crc == 0 ) { - CRCerror = true; - out = 0; - } else { - break; - } - } - - return out>>8; -} - -uint8_t TMC2208Stepper::IFCNT() { - return read(IFCNT_t::address); -} - -void TMC2208Stepper::SLAVECONF(uint16_t input) { - SLAVECONF_register.sr = input&0xF00; - write(SLAVECONF_register.address, SLAVECONF_register.sr); -} -uint16_t TMC2208Stepper::SLAVECONF() { - return SLAVECONF_register.sr; -} -void TMC2208Stepper::senddelay(uint8_t B) { SLAVECONF_register.senddelay = B; write(SLAVECONF_register.address, SLAVECONF_register.sr); } -uint8_t TMC2208Stepper::senddelay() { return SLAVECONF_register.senddelay; } - -void TMC2208Stepper::OTP_PROG(uint16_t input) { - write(OTP_PROG_t::address, input); -} - -uint32_t TMC2208Stepper::OTP_READ() { - return read(OTP_READ_t::address); -} - -uint32_t TMC2208Stepper::IOIN() { - return read(TMC2208_n::IOIN_t::address); -} -bool TMC2208Stepper::enn() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn; } -bool TMC2208Stepper::ms1() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1; } -bool TMC2208Stepper::ms2() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2; } -bool TMC2208Stepper::diag() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag; } -bool TMC2208Stepper::pdn_uart() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; } -bool TMC2208Stepper::step() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.step; } -bool TMC2208Stepper::sel_a() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a; } -bool TMC2208Stepper::dir() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir; } -uint8_t TMC2208Stepper::version() { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.version; } - -/* -uint32_t TMC2224Stepper::IOIN() { - return read(TMC2224_n::IOIN_t::address); -} -bool TMC2224Stepper::enn() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn; } -bool TMC2224Stepper::ms1() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1; } -bool TMC2224Stepper::ms2() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2; } -bool TMC2224Stepper::pdn_uart() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; } -bool TMC2224Stepper::spread() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread; } -bool TMC2224Stepper::step() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.step; } -bool TMC2224Stepper::sel_a() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a; } -bool TMC2224Stepper::dir() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir; } -uint8_t TMC2224Stepper::version() { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.version; } -*/ -uint16_t TMC2208Stepper::FACTORY_CONF() { - return read(FACTORY_CONF_register.address); -} -void TMC2208Stepper::FACTORY_CONF(uint16_t input) { - FACTORY_CONF_register.sr = input; - write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); -} -void TMC2208Stepper::fclktrim(uint8_t B){ FACTORY_CONF_register.fclktrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); } -void TMC2208Stepper::ottrim(uint8_t B) { FACTORY_CONF_register.ottrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); } -uint8_t TMC2208Stepper::fclktrim() { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.fclktrim; } -uint8_t TMC2208Stepper::ottrim() { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.ottrim; } - -void TMC2208Stepper::VACTUAL(uint32_t input) { - VACTUAL_register.sr = input; - write(VACTUAL_register.address, VACTUAL_register.sr); -} -uint32_t TMC2208Stepper::VACTUAL() { - return VACTUAL_register.sr; -} - -uint32_t TMC2208Stepper::PWM_SCALE() { - return read(TMC2208_n::PWM_SCALE_t::address); -} -uint8_t TMC2208Stepper::pwm_scale_sum() { - TMC2208_n::PWM_SCALE_t r{0}; - r.sr = PWM_SCALE(); - return r.pwm_scale_sum; -} - -int16_t TMC2208Stepper::pwm_scale_auto() { - TMC2208_n::PWM_SCALE_t r{0}; - r.sr = PWM_SCALE(); - return r.pwm_scale_auto; - // Not two's complement? 9nth bit determines sign - /* - uint32_t d = PWM_SCALE(); - int16_t response = (d>>PWM_SCALE_AUTO_bp)&0xFF; - if (((d&PWM_SCALE_AUTO_bm) >> 24) & 0x1) return -response; - else return response; - */ -} - -// R: PWM_AUTO -uint32_t TMC2208Stepper::PWM_AUTO() { - return read(PWM_AUTO_t::address); -} -uint8_t TMC2208Stepper::pwm_ofs_auto() { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_ofs_auto; } -uint8_t TMC2208Stepper::pwm_grad_auto() { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_grad_auto; } \ No newline at end of file
--- a/TMCStepper/TMC2208_bitfields.h Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -#pragma once -#pragma pack(push, 1) - -namespace TMC2208_n { - struct GCONF_t { - constexpr static uint8_t address = 0x00; - union { - uint16_t sr : 10; - struct { - bool i_scale_analog : 1, - internal_rsense : 1, - en_spreadcycle : 1, - shaft : 1, - index_otpw : 1, - index_step : 1, - pdn_disable : 1, - mstep_reg_select : 1, - multistep_filt : 1, - test_mode : 1; - }; - }; - }; -} - -namespace TMC2208_n { - struct IOIN_t { - constexpr static uint8_t address = 0x06; - union { - uint32_t sr; - struct { - bool enn : 1, - : 1, - ms1 : 1, - ms2 : 1, - diag : 1, - : 1, - pdn_uart : 1, - step : 1, - sel_a : 1, - dir : 1; - uint16_t : 14; - uint8_t version : 8; - }; - }; - }; -} - -namespace TMC2224_n { - struct IOIN_t { - constexpr static uint8_t address = 0x06; - union { - uint32_t sr; - struct { - bool : 1, - pdn_uart : 1, - spread : 1, - dir : 1, - enn : 1, - step : 1, - ms1 : 1, - ms2 : 1, - sel_a : 1; - uint16_t : 15; - uint8_t version : 8; - }; - }; - }; -} - -struct FACTORY_CONF_t { - constexpr static uint8_t address = 0x07; - union { - uint16_t sr; - struct { - uint8_t fclktrim : 5, - : 3, - ottrim : 2; - }; - }; -}; - -namespace TMC2208_n { - struct VACTUAL_t { - constexpr static uint8_t address = 0x22; - uint32_t sr; - }; -} - -struct MSCURACT_t { - constexpr static uint8_t address = 0x6B; - union { - uint32_t sr : 25; - struct { - int16_t cur_a : 9, - : 7, - cur_b : 9; - }; - }; -}; - -namespace TMC2208_n { - struct CHOPCONF_t { - constexpr static uint8_t address = 0x6C; - union { - uint32_t sr; - struct { - uint8_t toff : 4, - hstrt : 3, - hend : 4, - : 4, - tbl : 2; - bool vsense : 1; - uint8_t : 6, - mres : 4; - bool intpol : 1, - dedge : 1, - diss2g : 1, - diss2vs : 1; - }; - }; - }; - - struct PWMCONF_t { - constexpr static uint8_t address = 0x70; - union { - uint32_t sr; - struct { - uint8_t pwm_ofs : 8, - pwm_grad : 8, - pwm_freq : 2; - bool pwm_autoscale : 1, - pwm_autograd : 1; - uint8_t freewheel : 2, - : 2, - pwm_reg : 4, - pwm_lim : 4; - }; - }; - }; - - struct DRV_STATUS_t { - constexpr static uint8_t address = 0x6F; - union { - uint32_t sr; - struct { - bool otpw : 1, - ot : 1, - s2ga : 1, - s2gb : 1, - s2vsa : 1, - s2vsb : 1, - ola : 1, - olb : 1, - t120 : 1, - t143 : 1, - t150 : 1, - t157 : 1; - uint8_t : 4, - cs_actual : 5, - : 3, - : 6; - bool stealth : 1, - stst : 1; - }; - }; - }; - - struct PWM_SCALE_t { - constexpr static uint8_t address = 0x71; - union { - uint32_t sr; - struct { - uint8_t pwm_scale_sum : 8, - : 8; - int16_t pwm_scale_auto : 9; - }; - }; - }; -} - -#pragma pack(pop) \ No newline at end of file
--- a/TMCStepper/TMC2209Stepper.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -#include "TMCStepper.h" - -uint32_t TMC2209Stepper::IOIN() { - return read(TMC2209_n::IOIN_t::address); -} -bool TMC2209Stepper::enn() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn; } -bool TMC2209Stepper::ms1() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1; } -bool TMC2209Stepper::ms2() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2; } -bool TMC2209Stepper::diag() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag; } -bool TMC2209Stepper::pdn_uart() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; } -bool TMC2209Stepper::step() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.step; } -bool TMC2209Stepper::spread_en() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread_en;} -bool TMC2209Stepper::dir() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir; } -uint8_t TMC2209Stepper::version() { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.version; } - -void TMC2209Stepper::push() { - IHOLD_IRUN(IHOLD_IRUN_register.sr); - TPOWERDOWN(TPOWERDOWN_register.sr); - TPWMTHRS(TPWMTHRS_register.sr); - GCONF(GCONF_register.sr); - SLAVECONF(SLAVECONF_register.sr); - VACTUAL(VACTUAL_register.sr); - CHOPCONF(CHOPCONF_register.sr); - PWMCONF(PWMCONF_register.sr); - TCOOLTHRS(TCOOLTHRS_register.sr); -} - -void TMC2209Stepper::SGTHRS(uint8_t input) { - SGTHRS_register.sr = input; - write(SGTHRS_register.address, SGTHRS_register.sr); -} -uint8_t TMC2209Stepper::SGTHRS() { - return SGTHRS_register.sr; -} - -// W: TCOOLTHRS -uint32_t TMC2209Stepper::TCOOLTHRS() { return TCOOLTHRS_register.sr; } -void TMC2209Stepper::TCOOLTHRS(uint32_t input) { - TCOOLTHRS_register.sr = input; - write(TCOOLTHRS_register.address, TCOOLTHRS_register.sr); -} - -uint16_t TMC2209Stepper::SG_RESULT() { - return read(TMC2209_n::SG_RESULT_t::address); -} \ No newline at end of file
--- a/TMCStepper/TMC2209_bitfields.h Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,247 +0,0 @@ -#pragma once -#pragma pack(push, 1) - -namespace TMC2209_n { - struct IOIN_t { - constexpr static uint8_t address = 0x06; - union { - uint32_t sr; - struct { - bool enn : 1, - : 1, - ms1 : 1, - ms2 : 1, - diag : 1, - : 1, - pdn_uart : 1, - step : 1, - spread_en : 1, - dir : 1; - uint16_t : 14; - uint8_t version : 8; - }; - }; - }; - - struct SGTHRS_t { - constexpr static uint8_t address = 0x40; - uint8_t sr : 8; - }; - - struct SG_RESULT_t { - constexpr static uint8_t address = 0x41; - uint16_t sr : 10; - }; - - struct COOLCONF_t { - constexpr static uint8_t address = 0x42; - union { - uint16_t sr; - struct { - uint8_t semin : 4, - : 1, - seup : 2, - : 1, - semax : 4, - : 1, - sedn : 2; - bool seimin : 1; - }; - }; - }; - -} //namespace -////////////////////////////////////////////////////// -struct SLAVECONF_t { - constexpr static uint8_t address = 0x03; - union { - uint16_t sr : 12; - struct { - uint8_t slaveaddr : 8; - uint8_t senddelay : 4; - }; - }; -}; - -struct PWM_AUTO_t { - constexpr static uint8_t address = 0x72; - union { - uint32_t sr : 24; - struct { - uint8_t pwm_ofs_auto : 8, - : 8, - pwm_grad_auto : 8; - }; - }; -}; - -struct GCONF_t { - constexpr static uint8_t address = 0x00; - union { - uint32_t sr : 18; - struct { - bool i_scale_analog : 1, // 2130, 5130 - internal_rsense : 1, // 2130, 5130 - en_pwm_mode : 1, - enc_commutation : 1, // 2130, 5130 - shaft : 1, - diag0_error : 1, - diag0_otpw : 1, - diag0_stall : 1, - diag1_stall : 1, - diag1_index : 1, - diag1_onstate : 1, - diag1_steps_skipped : 1, - diag0_int_pushpull : 1, - diag1_pushpull : 1, - small_hysteresis : 1, - stop_enable : 1, - direct_mode : 1; - }; - struct { // TMC5160 - bool recalibrate : 1, - faststandstill : 1, - : 1, - multistep_filt : 1, - : 3, - diag0_step : 1, - diag1_dir : 1, - : 4, - diag1_poscomp_pushpull : 1; - }; - }; -}; - -struct IHOLD_IRUN_t { - constexpr static uint8_t address = 0x10; - union { - uint32_t sr : 20; - struct { - uint8_t ihold : 5, - : 3, - irun : 5, - : 3, - iholddelay : 4; - }; - }; -}; - -struct GSTAT_t { - constexpr static uint8_t address = 0x01; - union { - uint8_t sr : 3; - struct { - bool reset : 1, - drv_err : 1, - uv_cp : 1; - }; - }; -}; - -struct TPOWERDOWN_t { - constexpr static uint8_t address = 0x11; - uint8_t sr : 8; -}; - -struct TPWMTHRS_t { - constexpr static uint8_t address = 0x13; - uint32_t sr : 20; -}; - -struct TCOOLTHRS_t { - constexpr static uint8_t address = 0x14; - uint32_t sr : 20; -}; - -struct THIGH_t { - constexpr static uint8_t address = 0x15; - uint32_t sr : 20; -}; - -struct XDIRECT_t { - constexpr static uint8_t address = 0x2D; - union { - uint32_t sr : 25; - struct { - int16_t coil_A : 9; - int8_t : 7; - int16_t coil_B : 9; - }; - }; -}; - -struct VDCMIN_t { - constexpr static uint8_t address = 0x33; - uint32_t sr : 23; -}; - -struct CHOPCONF_t { - constexpr static uint8_t address = 0x6C; - union { - uint32_t sr : 32; - struct { - uint8_t toff : 4, - hstrt : 3, - hend : 4, - : 1; - bool disfdcc : 1, - rndtf : 1, - chm : 1; - uint8_t tbl : 2; - bool vsense : 1, - vhighfs : 1, - vhighchm : 1; - uint8_t sync : 4, // 2130, 5130 - mres : 4; - bool intpol : 1, - dedge : 1, - diss2g : 1; - }; - struct { // TMC5160 - uint32_t : 20; - uint8_t tpfd : 4; // 5160 - uint16_t : 7; - bool diss2vs : 1; // TMC5160 only - }; - }; -}; - -struct DCCTRL_t { - constexpr static uint8_t address = 0x6E; - union { - uint32_t sr : 24; - struct { - uint16_t dc_time : 10, - : 6; - uint8_t dc_sg : 8; - }; - }; -}; - -struct PWMCONF_t { - constexpr static uint8_t address = 0x70; - union { - uint32_t sr : 22; - struct { - uint8_t pwm_ampl : 8, - pwm_grad : 8, - pwm_freq : 2; - bool pwm_autoscale : 1, - pwm_symmetric : 1; - uint8_t freewheel : 2; - }; - }; -}; - -struct ENCM_CTRL_t { - constexpr static uint8_t address = 0x72; - union { - uint8_t sr : 2; - struct { - bool inv : 1, - maxspeed : 1; - }; - }; -}; - -#pragma pack(pop) \ No newline at end of file
--- a/TMCStepper/TMCStepper.cpp Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -#include "TMCStepper.h" - - -/* - Requested current = mA = I_rms/1000 - Equation for current: - I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2) - Solve for CS -> - CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1 - - Example: - vsense = 0b0 -> V_fs = 0.325V - mA = 1640mA = I_rms/1000 = 1.64A - R_sense = 0.10 Ohm - -> - CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4 - CS = 26 -*/ - -uint16_t TMCStepper::cs2rms(uint8_t CS) { - return (float)(CS+1)/32.0 * (vsense() ? 0.180 : 0.325)/(Rsense+0.02) / 1.41421 * 1000; -} - -void TMCStepper::rms_current(uint16_t mA) { - uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1; - // If Current Scale is too low, turn on high sensitivity R_sense and calculate again - if (CS < 16) { - vsense(true); - CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1; - } else { // If CS >= 16, turn off high_sense_r - vsense(false); - } - - if (CS > 31) - CS = 31; - - irun(CS); - ihold(CS*holdMultiplier); - //val_mA = mA; -} -void TMCStepper::rms_current(uint16_t mA, float mult) { - holdMultiplier = mult; - rms_current(mA); -} - -uint16_t TMCStepper::rms_current() { - return cs2rms(irun()); -} - -uint8_t TMCStepper::test_connection() { - uint32_t drv_status = DRV_STATUS(); - switch (drv_status) { - case 0xFFFFFFFF: return 1; - case 0: return 2; - default: return 0; - } -} - -void TMCStepper::hysteresis_end(int8_t value) { hend(value+3); } -int8_t TMCStepper::hysteresis_end() { return hend()-3; }; - -void TMCStepper::hysteresis_start(uint8_t value) { hstrt(value-1); } -uint8_t TMCStepper::hysteresis_start() { return hstrt()+1; } - -void TMCStepper::microsteps(uint16_t ms) { - switch(ms) { - case 256: mres(0); break; - case 128: mres(1); break; - case 64: mres(2); break; - case 32: mres(3); break; - case 16: mres(4); break; - case 8: mres(5); break; - case 4: mres(6); break; - case 2: mres(7); break; - case 1: mres(8); break; - default: break; - } -} - -uint16_t TMCStepper::microsteps() { - switch(mres()) { - case 0: return 256; - case 1: return 128; - case 2: return 64; - case 3: return 32; - case 4: return 16; - case 5: return 8; - case 6: return 4; - case 7: return 2; - case 8: return 1; - } - return 1; -} - -void TMCStepper::blank_time(uint8_t value) { - switch (value) { - case 16: tbl(0b00); break; - case 24: tbl(0b01); break; - case 36: tbl(0b10); break; - case 54: tbl(0b11); break; - } -} - -uint8_t TMCStepper::blank_time() { - switch (tbl()) { - case 0b00: return 16; - case 0b01: return 24; - case 0b10: return 36; - case 0b11: return 54; - } - return 0; -} - -/////////////////////////////////////////////////////////////////////////////////////// -// R+C: GSTAT -uint8_t TMCStepper::GSTAT() { return read(GSTAT_t::address); } -void TMCStepper::GSTAT(uint8_t){ write(GSTAT_t::address, 0b111); } -bool TMCStepper::reset() { GSTAT_t r; r.sr = GSTAT(); return r.reset; } -bool TMCStepper::drv_err() { GSTAT_t r; r.sr = GSTAT(); return r.drv_err; } -bool TMCStepper::uv_cp() { GSTAT_t r; r.sr = GSTAT(); return r.uv_cp; } -/////////////////////////////////////////////////////////////////////////////////////// -// W: TPOWERDOWN -uint8_t TMCStepper::TPOWERDOWN() { return TPOWERDOWN_register.sr; } -void TMCStepper::TPOWERDOWN(uint8_t input) { - TPOWERDOWN_register.sr = input; - write(TPOWERDOWN_register.address, TPOWERDOWN_register.sr); -} -/////////////////////////////////////////////////////////////////////////////////////// -// R: TSTEP -uint32_t TMCStepper::TSTEP() { return read(TSTEP_t::address); } -/////////////////////////////////////////////////////////////////////////////////////// -// W: TPWMTHRS -uint32_t TMCStepper::TPWMTHRS() { return TPWMTHRS_register.sr; } -void TMCStepper::TPWMTHRS(uint32_t input) { - TPWMTHRS_register.sr = input; - write(TPWMTHRS_register.address, TPWMTHRS_register.sr); -} - -uint16_t TMCStepper::MSCNT() { - return read(MSCNT_t::address); -} - -uint32_t TMCStepper::MSCURACT() { return read(MSCURACT_t::address); } -int16_t TMCStepper::cur_a() { - MSCURACT_t r{0}; - r.sr = MSCURACT(); - int16_t value = r.cur_a; - if (value > 255) value -= 512; - return value; -} -int16_t TMCStepper::cur_b() { - MSCURACT_t r{0}; - r.sr = MSCURACT(); - int16_t value = r.cur_b; - if (value > 255) value -= 512; - return value; -} \ No newline at end of file
--- a/TMCStepper/TMCStepper.h Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,383 +0,0 @@ -#pragma once - -//#define TMCDEBUG - -#include "mbed.h" - -#define SW_CAPABLE_PLATFORM true - -//#include "TMC2130_bitfields.h" -//#include "TMC2160_bitfields.h" -//#include "TMC5130_bitfields.h" -//#include "TMC5160_bitfields.h" -#include "TMC2208_bitfields.h" -#include "TMC2209_bitfields.h" -//#include "TMC2660_bitfields.h" - -#define INIT_REGISTER(REG) REG##_t REG##_register = REG##_t -//#define INIT2130_REGISTER(REG) TMC2130_n::REG##_t REG##_register = TMC2130_n::REG##_t -//#define INIT2160_REGISTER(REG) TMC2160_n::REG##_t REG##_register = TMC2160_n::REG##_t -//#define INIT5130_REGISTER(REG) TMC5130_n::REG##_t REG##_register = TMC5130_n::REG##_t -//#define INIT5160_REGISTER(REG) TMC5160_n::REG##_t REG##_register = TMC5160_n::REG##_t -//#define INIT2660_REGISTER(REG) TMC2660_n::REG##_t REG##_register = TMC2660_n::REG##_t -#define INIT2208_REGISTER(REG) TMC2208_n::REG##_t REG##_register = TMC2208_n::REG##_t -//#define INIT2224_REGISTER(REG) TMC2224_n::REG##_t REG##_register = TMC2224_n::REG##_t -#define SET_ALIAS(TYPE, DRIVER, NEW, ARG, OLD) TYPE (DRIVER::*NEW)(ARG) = &DRIVER::OLD - -#define TMCSTEPPER_VERSION 0x000701 // v0.7.1 - -#if SW_CAPABLE_PLATFORM - #include <BufferedSerial.h> - #include <Stream.h> -#endif -class TMCStepper { - public: - uint16_t cs2rms(uint8_t CS); - void rms_current(uint16_t mA); - void rms_current(uint16_t mA, float mult); - uint16_t rms_current(); - void hold_multiplier(float val) { holdMultiplier = val; } - float hold_multiplier() { return holdMultiplier; } - uint8_t test_connection(); - - // Helper functions - void microsteps(uint16_t ms); - uint16_t microsteps(); - void blank_time(uint8_t value); - uint8_t blank_time(); - void hysteresis_end(int8_t value); - int8_t hysteresis_end(); - void hysteresis_start(uint8_t value); - uint8_t hysteresis_start(); - - // R+WC: GSTAT - void GSTAT( uint8_t input); - uint8_t GSTAT(); - bool reset(); - bool drv_err(); - bool uv_cp(); - - // W: IHOLD_IRUN - void IHOLD_IRUN( uint32_t input); - uint32_t IHOLD_IRUN(); - void ihold( uint8_t B); - void irun( uint8_t B); - void iholddelay( uint8_t B); - uint8_t ihold(); - uint8_t irun(); - uint8_t iholddelay(); - - // W: TPOWERDOWN - uint8_t TPOWERDOWN(); - void TPOWERDOWN( uint8_t input); - - // R: TSTEP - uint32_t TSTEP(); - - // W: TPWMTHRS - uint32_t TPWMTHRS(); - void TPWMTHRS( uint32_t input); - - // R: MSCNT - uint16_t MSCNT(); - - // R: MSCURACT - uint32_t MSCURACT(); - int16_t cur_a(); - int16_t cur_b(); - - protected: - TMCStepper(float RS) : Rsense(RS) {}; - INIT_REGISTER(IHOLD_IRUN){{.sr=0}}; // 32b - INIT_REGISTER(TPOWERDOWN){.sr=0}; // 8b - INIT_REGISTER(TPWMTHRS){.sr=0}; // 32b - - static constexpr uint8_t TMC_READ = 0x00, - TMC_WRITE = 0x80; - - struct TSTEP_t { constexpr static uint8_t address = 0x12; }; - struct MSCNT_t { constexpr static uint8_t address = 0x6A; }; - - virtual void write(uint8_t, uint32_t) = 0; - virtual uint32_t read(uint8_t) = 0; - virtual void vsense(bool) = 0; - virtual bool vsense(void) = 0; - virtual uint32_t DRV_STATUS() = 0; - virtual void hend(uint8_t) = 0; - virtual uint8_t hend() = 0; - virtual void hstrt(uint8_t) = 0; - virtual uint8_t hstrt() = 0; - virtual void mres(uint8_t) = 0; - virtual uint8_t mres() = 0; - virtual void tbl(uint8_t) = 0; - virtual uint8_t tbl() = 0; - - const float Rsense; - float holdMultiplier = 0.5; -}; - - -class TMC2208Stepper : public TMCStepper { - public: - TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr, uint16_t mul_pin1, uint16_t mul_pin2); - TMC2208Stepper(Stream * SerialPort, float RS) : - TMC2208Stepper(SerialPort, RS, TMC2208_SLAVE_ADDR) - {} - #if SW_CAPABLE_PLATFORM - TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS) : - TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR) - {} - - __attribute__((deprecated("Boolean argument has been deprecated and does nothing"))) - TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, bool) : - TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR) - {}; - #else - TMC2208Stepper(PinName, PinName, float) = delete; // Your platform does not currently support Software Serial - #endif - void defaults(); - void push(); - void begin(); - #if SW_CAPABLE_PLATFORM - void beginSerial(uint32_t baudrate) __attribute__((weak)); - #else - void beginSerial(uint32_t) = delete; // Your platform does not currently support Software Serial - #endif - bool isEnabled(); - - // RW: GCONF - void GCONF(uint32_t input); - void I_scale_analog(bool B); - void internal_Rsense(bool B); - void en_spreadCycle(bool B); - void shaft(bool B); - void index_otpw(bool B); - void index_step(bool B); - void pdn_disable(bool B); - void mstep_reg_select(bool B); - void multistep_filt(bool B); - uint32_t GCONF(); - bool I_scale_analog(); - bool internal_Rsense(); - bool en_spreadCycle(); - bool shaft(); - bool index_otpw(); - bool index_step(); - bool pdn_disable(); - bool mstep_reg_select(); - bool multistep_filt(); - - // R: IFCNT - uint8_t IFCNT(); - - // W: SLAVECONF - void SLAVECONF(uint16_t input); - uint16_t SLAVECONF(); - void senddelay(uint8_t B); - uint8_t senddelay(); - - // W: OTP_PROG - void OTP_PROG(uint16_t input); - - // R: OTP_READ - uint32_t OTP_READ(); - - // R: IOIN - uint32_t IOIN(); - bool enn(); - bool ms1(); - bool ms2(); - bool diag(); - bool pdn_uart(); - bool step(); - bool sel_a(); - bool dir(); - uint8_t version(); - - // RW: FACTORY_CONF - void FACTORY_CONF(uint16_t input); - uint16_t FACTORY_CONF(); - void fclktrim(uint8_t B); - void ottrim(uint8_t B); - uint8_t fclktrim(); - uint8_t ottrim(); - - // W: VACTUAL - void VACTUAL(uint32_t input); - uint32_t VACTUAL(); - - // RW: CHOPCONF - void CHOPCONF(uint32_t input); - void toff(uint8_t B); - void hstrt(uint8_t B); - void hend(uint8_t B); - void tbl(uint8_t B); - void vsense(bool B); - void mres(uint8_t B); - void intpol(bool B); - void dedge(bool B); - void diss2g(bool B); - void diss2vs(bool B); - uint32_t CHOPCONF(); - uint8_t toff(); - uint8_t hstrt(); - uint8_t hend(); - uint8_t tbl(); - bool vsense(); - uint8_t mres(); - bool intpol(); - bool dedge(); - bool diss2g(); - bool diss2vs(); - - // R: DRV_STATUS - uint32_t DRV_STATUS(); - bool otpw(); - bool ot(); - bool s2ga(); - bool s2gb(); - bool s2vsa(); - bool s2vsb(); - bool ola(); - bool olb(); - bool t120(); - bool t143(); - bool t150(); - bool t157(); - uint16_t cs_actual(); - bool stealth(); - bool stst(); - - // RW: PWMCONF - void PWMCONF(uint32_t input); - void pwm_ofs(uint8_t B); - void pwm_grad(uint8_t B); - void pwm_freq(uint8_t B); - void pwm_autoscale(bool B); - void pwm_autograd(bool B); - void freewheel(uint8_t B); - void pwm_reg(uint8_t B); - void pwm_lim(uint8_t B); - uint32_t PWMCONF(); - uint8_t pwm_ofs(); - uint8_t pwm_grad(); - uint8_t pwm_freq(); - bool pwm_autoscale(); - bool pwm_autograd(); - uint8_t freewheel(); - uint8_t pwm_reg(); - uint8_t pwm_lim(); - - // R: PWM_SCALE - uint32_t PWM_SCALE(); - uint8_t pwm_scale_sum(); - int16_t pwm_scale_auto(); - - // R: PWM_AUTO (0x72) - uint32_t PWM_AUTO(); - uint8_t pwm_ofs_auto(); - uint8_t pwm_grad_auto(); - - uint16_t bytesWritten = 0; - float Rsense = 0.11; - bool CRCerror = false; - protected: - INIT2208_REGISTER(GCONF) {{.sr=0}}; - INIT_REGISTER(SLAVECONF) {{.sr=0}}; - INIT_REGISTER(FACTORY_CONF) {{.sr=0}}; - INIT2208_REGISTER(VACTUAL) {.sr=0}; - INIT2208_REGISTER(CHOPCONF) {{.sr=0}}; - INIT2208_REGISTER(PWMCONF) {{.sr=0}}; - - struct IFCNT_t { constexpr static uint8_t address = 0x02; }; - struct OTP_PROG_t { constexpr static uint8_t address = 0x04; }; - struct OTP_READ_t { constexpr static uint8_t address = 0x05; }; - - TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr); - #if SW_CAPABLE_PLATFORM - TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr); - #endif - - Stream * HWSerial = nullptr; - #if SW_CAPABLE_PLATFORM - BufferedSerial * SWSerial = nullptr; - const uint16_t RXTX_pin = 0; // Half duplex - #endif - -// SSwitch *sswitch = nullptr; - - int available(); - void preWriteCommunication(); - void preReadCommunication(); - int16_t serial_read(); - uint8_t serial_write(const uint8_t data); - void postWriteCommunication(); - void postReadCommunication(); - void write(uint8_t, uint32_t); - uint32_t read(uint8_t); - const uint8_t slave_address; - uint8_t calcCRC(uint8_t datagram[], uint8_t len); - static constexpr uint8_t TMC2208_SYNC = 0x05, - TMC2208_SLAVE_ADDR = 0x00; - static constexpr uint8_t replyDelay = 2; //ms - static constexpr uint8_t abort_window = 5; - static constexpr uint8_t max_retries = 2; - - uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t); -}; - -class TMC2209Stepper : public TMC2208Stepper { - public: - TMC2209Stepper(Stream * SerialPort, float RS, uint8_t addr) : - TMC2208Stepper(SerialPort, RS, addr) {} - - #if SW_CAPABLE_PLATFORM - TMC2209Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr) : - TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, addr) {} - #else - TMC2209Stepper(PinName, PinName, float, uint8_t) = delete; // Your platform does not currently support Software Serial - #endif - void push(); - - // R: IOIN - uint32_t IOIN(); - bool enn(); - bool ms1(); - bool ms2(); - bool diag(); - bool pdn_uart(); - bool step(); - bool spread_en(); - bool dir(); - uint8_t version(); - - // W: TCOOLTHRS - uint32_t TCOOLTHRS(); - void TCOOLTHRS(uint32_t input); - - // W: SGTHRS - void SGTHRS(uint8_t B); - uint8_t SGTHRS(); - - // R: SG_RESULT - uint16_t SG_RESULT(); - - // W: COOLCONF - void COOLCONF(uint16_t B); - uint16_t COOLCONF(); - void semin(uint8_t B); - void seup(uint8_t B); - void semax(uint8_t B); - void sedn(uint8_t B); - void seimin(bool B); - uint8_t semin(); - uint8_t seup(); - uint8_t semax(); - uint8_t sedn(); - bool seimin(); - - protected: - INIT_REGISTER(TCOOLTHRS){.sr=0}; - TMC2209_n::SGTHRS_t SGTHRS_register{.sr=0}; - TMC2209_n::COOLCONF_t COOLCONF_register{{.sr=0}}; -};
--- a/TMCStepper/TMC_MACROS.h Thu Mar 18 20:48:31 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -#pragma once - -#define DEBUG_PRINT(CFG, VAL) Serial.print(CFG); Serial.print('('); Serial.print(VAL, HEX); Serial.println(')') -//#define WRITE_REG(R) write(R##_register.address, R##_register.sr) -//#define READ_REG(R) read(R##_register.address) \ No newline at end of file
--- a/main.cpp Thu Mar 18 20:48:31 2021 +0000 +++ b/main.cpp Sun Mar 21 13:31:53 2021 +0000 @@ -12,12 +12,14 @@ */ -DigitalOut ledDir(LED2); +DigitalOut ledCW(LED1); // Show totation clockwise +DigitalOut ledCCW(LED2); // Show rotation counterclockwise + //Virtual serial port over USB with 15200 baud 8N1 static BufferedSerial host(USBTX, USBRX,115200); //mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1000) -mRotaryEncoder wheel(p16, p17, p18,PullUp,1500); +mRotaryEncoder wheel(p16, p17, p18,PullUp,3000); // default 1500 // hardware parameters: // MOTOR Steps per Revolution ( 1/8 Microsteps, 200Steps per Rev / 1.8 degrees per FullStep) @@ -26,16 +28,18 @@ #define GR 288 #define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2 -#define R_SENSE 0.11f // R-Sense in OHM.Match to your driver +#define R_SENSE 0.11f // R-Sense in OHM. Match to your driver #define MICROSTEPS 128 // # of microsteps -#define RMSCURRENT 600 // RMS current of Stepper Coil in mA +#define RMSCURRENT 800 // RMS current of Stepper Coil in mA +#define MAXSPEED 5000 // Maximaum speed (5000 with RMS800 @12V/06Amax) // A TMCStepper-object with UART and given address and R-Sense //RX, TX, RS, Addr TMC2209Stepper stepper(p14, p13, R_SENSE, DRIVER_ADDRESS); -bool enc_pressed = false; // Button of rotaryencoder was pressed -bool enc_rotated = false; // rotary encoder was totaded left or right +volatile bool enc_pressed = false; // Button of rotaryencoder was pressed +volatile bool enc_rotated = false; // rotary encoder was totaded left or right +volatile bool enc_action = false; // any change happened int lastGet; int thisGet; @@ -69,7 +73,7 @@ { printf("\r\nConnected to mbed\r\n"); - //Int-Handler for RotaryEncoder + //Intitiallize RotaryEncoder // call trigger_sw() when button of rotary-encoder is pressed wheel.attachSW(&trigger_sw); // call trigger_rot() when the shaft is rotaded left or right @@ -77,20 +81,30 @@ lastGet = 0; // set encrotated, so startup enc_rotated = true; - + enc_action = true; + ledCW = 1; + ledCCW = 1; + + // Initialize Stepper + printf("connecting to TMC-Module...\r\n"); stepper.begin(); // UART: Init SW UART (if selected) with default baudrate + printf("TMC-Version: %02X\r\n",stepper.version()); stepper.toff(3); // Enables driver in software - 3, 5 ???? stepper.rms_current(RMSCURRENT); // Set motor RMS current in mA / min 500 for 24V/speed:3000 // 1110, 800 + // working: 800 12V/0,6Amax, Speed up to 5200=4U/min + stepper.microsteps(MICROSTEPS); // Set microsteps to 1:Fullstep ... 256: 1/256th stepper.en_spreadCycle(true); // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!! stepper.pwm_autoscale(true); // Needed for stealthChop - printf("TMC-Version: %02X\r\n",stepper.version()); - bool shaft = false; //direction CW or CCW + uint32_t status = stepper.DRV_STATUS(); + printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n"); + + //bool shaft = false; //direction CW or CCW while(1) { -/* +/* Spped-UP/Down-Cycles // printf("TSTEP(): %i\r\n", stepper.TSTEP()); uint32_t status = stepper.DRV_STATUS(); printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n"); @@ -135,22 +149,51 @@ printf("IFCNT(): %zu \r\n",stepper.IFCNT()); printf("...\r\n"); */ +////// Control motor-speed by rotary-encoder + // shaft has been rotated? if (enc_rotated) { enc_rotated = false; + enc_action = true; thisGet = wheel.Get(); + if (thisGet*100 > MAXSPEED) { //on upper limit? + wheel.Set( MAXSPEED/100); + thisGet = wheel.Get(); + } + if (thisGet*100 < MAXSPEED*(-1)) { //on lower limit? + wheel.Set( MAXSPEED*(-1)/100); + thisGet = wheel.Get(); + } stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value printf("actspeed: %i\r\n",thisGet*100); - + } // Button pressed? if (enc_pressed) { enc_pressed = false; + enc_action = true; wheel.Set(0); thisGet = wheel.Get(); stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value printf("actspeed: %i\r\n",thisGet*100); } + // anything changed? + if (enc_action) { + enc_action = false; + // show direction of motor on leds + if (thisGet > 0) { + ledCW = 1; + ledCCW= 0; + } + if (thisGet < 0) { + ledCW = 0; + ledCCW= 1; + } + if (thisGet == 0) { + ledCW = 1; + ledCCW= 1; + } + } } // while 1 } \ No newline at end of file