31#define TMC_THREAD_MEM 256
32#define TMC_THREAD_PRIO 25
33#define TMC_ADCOFFSETFAIL 5000
35extern SPI_HandleTypeDef
HSPIDRV;
38extern TIM_HandleTypeDef
TIM_TMC;
41enum class TMC_ControlState : uint32_t {
uninitialized,
waitPower,
Shutdown,
Running,
EncoderInit,
EncoderFinished,
HardError,
OverTemp,
IndexSearch,
FullCalibration,
ExternalEncoderInit,
Pidautotune};
53enum class PosSelection : uint8_t {
PhiE=0,
PhiE_ext=1,
PhiE_openloop=2,
PhiE_abn=3,
res1=4,
PhiE_hal=5,
PhiE_aenc=6,
PhiA_aenc=7,
res2=8,
PhiM_abn=9,
PhiM_abn2=10,
PhiM_aenc=11,
PhiM_hal=12};
54enum class VelSelection : uint8_t {
PhiE=0,
PhiE_ext=1,
PhiE_openloop=2,
PhiE_abn=3,
res1=4,
PhiE_hal=5,
PhiE_aenc=6,
PhiA_aenc=7,
res2=8,
PhiM_abn=9,
PhiM_abn2=10,
PhiM_aenc=11,
PhiM_hal=12};
94 float vmScaler = (2.5 / 0x7fff) * ((1.5+71.5)/1.5);
200 uint16_t
cpr = ADR_TMC1_CPR;
293 this->
params.
a1 = -(int32_t)(bq.
b1 * (
float)(1 << 29));
294 this->
params.
a2 = -(int32_t)(bq.
b2 * (
float)(1 << 29));
295 this->
params.
b0 = (int32_t)(bq.
a0 * (
float)(1 << 29));
296 this->
params.
b1 = (int32_t)(bq.
a1 * (
float)(1 << 29));
297 this->
params.
b2 = (int32_t)(bq.
a2 * (
float)(1 << 29));
329 svpwm,
fullCalibration,
calibrated,
abnindexenabled,
findIndex,
getState,
encpol,
combineEncoder,
invertForce,
vmTmc,
370 void writeReg(uint8_t reg,uint32_t dat);
372 void updateReg(uint8_t reg,uint32_t dat,uint32_t mask,uint8_t shift);
377 void runOpenLoop(uint16_t ud,uint16_t uq,int32_t speed,int32_t accel,
bool torqueMode =
false);
395 void setAdcOffset(uint32_t adc_I0_offset,uint32_t adc_I1_offset);
396 void setAdcScale(uint32_t adc_I0_scale,uint32_t adc_I1_scale);
420 void setBBM(uint8_t bbml,uint8_t bbmh);
461 void rampFlux(uint16_t target,uint16_t time_ms);
485 void setUdUq(int16_t ud,int16_t uq);
511 void setEncoder(std::shared_ptr<Encoder>& encoder)
override;
514 int32_t
getPos()
override;
525 void exti(uint16_t GPIO_Pin);
528 bool findEncoderIndex(int32_t speed=10, uint16_t
power=2500,
bool offsetPhiM=
false,
bool zeroCount=
false);
619 void initAdc(uint16_t mdecA, uint16_t mdecB,uint32_t mclkA,uint32_t mclkB);
620 void setPwm(uint8_t val,uint16_t maxcnt,uint8_t bbmL,uint8_t bbmH);
SPI_HandleTypeDef HSPIDRV
TIM_HandleTypeDef TIM_TMC
const std::vector< std::pair< TMC_HW_Ver, std::string > > tmcHwVersionNames
std::shared_ptr< Encoder > drvEncoder
TMC_ExternalEncoderUpdateThread(TMC4671 *tmc)
TMC4671Biquad(bool enable=false)
TMC4671Biquad(const Biquad &bq, bool enable=true)
TMC4671Biquad(const TMC4671Biquad_t bq)
void writeReg(uint8_t reg, uint32_t dat)
static ClassIdentifier info
void beginSpiTransfer(SPIPort *port)
void setFluxTorque(int16_t flux, int16_t torque)
void saveFlash() override
void setBBM(uint8_t bbml, uint8_t bbmh)
int16_t controlFluxDissipate()
int16_t externalEncoderPhieOffset
TMC_ControlState getState()
void setExternalEncoderAllowed(bool allow)
bool externalEncoderAllowed()
bool allowExternalEncoder
const ClassType getClassType() override
void setLimits(TMC4671Limits limits)
void runOpenLoop(uint16_t ud, uint16_t uq, int32_t speed, int32_t accel, bool torqueMode=false)
bool hasIntegratedEncoder() override
volatile bool encoderIndexHitFlag
void setupFeedForwardVelocity(int32_t gain, int32_t constant)
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
uint8_t calibrationFailCount
bool fullCalibrationInProgress
void setEncoderIndexFlagEnabled(bool enabled, bool zeroEncoder=false)
void initializeWithPower()
bool zeroEncoderOnIndexHit
void setPos(int32_t pos) override
void bangInitEnc(int16_t power)
bool reachedPosition(uint16_t tolerance)
void setPids(TMC4671PIDConf pids)
MotionMode lastMotionMode
const float fluxDissipationLimit
TMC_ControlState requestedState
bool usingExternalEncoder()
void setUdUq(int16_t ud, int16_t uq)
virtual std::string getHelpstring()
void changeState(TMC_ControlState newState, bool force=false)
const Error lowVoltageError
void setVelSel(VelSelection vsel, uint8_t mode=0)
void setEncoderType(EncoderType_TMC type)
TIM_HandleTypeDef * externalEncoderTimer
TMC4671BiquadFilters curFilters
MotionMode getMotionMode()
TMC_ControlState laststate
void setBrakeLimits(uint16_t low, uint16_t high)
TMC4671PidPrecision pidPrecision
bool recalibrationRequired
uint16_t encodeEncHallMisc()
void setPhiE_ext(int16_t phiE)
int32_t getTargetVelocity()
void timerElapsed(TIM_HandleTypeDef *htim)
void setStatusFlags(uint32_t flags)
void setFluxTorqueFF(int16_t flux, int16_t torque)
void setBiquadVel(const TMC4671Biquad &filter)
void restoreEncHallMisc(uint16_t val)
static uint16_t encodeMotToInt(TMC4671MotConf mconf)
void setTorque(int16_t torque)
bool calibrateAdcOffset(uint16_t time=500)
int32_t getPosAbs() override
bool setSpiAddr(uint8_t chan)
void setStatusMask(StatusFlags mask)
void zeroAbnUsingPhiM(bool offsetPhiE=false)
void setSequentialPI(bool sequential)
const float fluxFilterFreq
const Error indexNotHitError
void setup_AENC(TMC4671AENCConf encconf)
Encoder * getEncoder() override
void setGpioPins(uint8_t pins)
void setMotionMode(MotionMode mode, bool force=false)
void setTargetPos(int32_t pos)
void setMotorType(MotorType motor, uint16_t poles)
int32_t getPos() override
void rampFlux(uint16_t target, uint16_t time_ms)
void setPwm(uint8_t val, uint16_t maxcnt, uint8_t bbmL, uint8_t bbmH)
void setGpioMode(TMC_GpioMode mode)
void endSpiTransfer(SPIPort *port)
void errorCallback(const Error &error, bool cleared)
bool motorEnabledRequested
void setHwType(TMC_HW_Ver type)
void setTorqueFilter(TMC4671Biquad_conf &conf)
void emergencyStop(bool reset)
std::pair< int32_t, int32_t > getActualTorqueFlux()
void setup_HALL(TMC4671HALLConf hallconf)
TMC_StartupType startupType
void setTmcPos(int32_t pos)
void setFFMode(FFMode mode)
void setTargetVelocity(int32_t vel)
void setupFeedForwardTorque(int32_t gain, int32_t constant)
void setPhiEtype(PhiE type)
TMC4671(SPIPort &spiport, OutputPin cspin, uint8_t address=1)
void setOpenLoopSpeedAccel(int32_t speed, uint32_t accel)
TMC4671Limits getLimits()
void restoreFlash() override
void updateReg(uint8_t reg, uint32_t dat, uint32_t mask, uint8_t shift)
void setup_ABN_Enc(TMC4671ABNConf encconf)
void setAdcOffset(uint32_t adc_I0_offset, uint32_t adc_I1_offset)
void setPwmMaxCnt(uint16_t maxcnt)
void setCpr(uint32_t cpr)
const Error communicationError
void setBiquadTorque(const TMC4671Biquad &filter)
void setBiquadFlux(const TMC4671Biquad &filter)
uint32_t posToEnc(uint32_t pos)
StatusFlags readFlags(bool maskedOnly=true)
void setUqUdLimit(uint16_t limit)
std::pair< uint32_t, std::string > getTmcType()
void setAddress(uint8_t address)
void exti(uint16_t GPIO_Pin)
void initAdc(uint16_t mdecA, uint16_t mdecB, uint32_t mclkA, uint32_t mclkB)
TMC4671Biquad_conf torqueFilterConf
void setPosSel(PosSelection psel)
void setPwmFreq(float freq)
void writeRegAsync(uint8_t reg, uint32_t dat)
int16_t getPhiEfromExternalEncoder()
std::unique_ptr< TMC_ExternalEncoderUpdateThread > extEncUpdater
void setSvPwm(bool enable)
TMC4671FlashAddrs flashAddrs
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
void setFlux(int16_t flux)
void setPidPrecision(TMC4671PidPrecision setting)
EncoderType getEncoderType() override
MotionMode nextMotionMode
uint32_t readReg(uint8_t reg)
int32_t getActualTorque()
void setBiquadPos(const TMC4671Biquad &filter)
void setAdcScale(uint32_t adc_I0_scale, uint32_t adc_I1_scale)
bool findEncoderIndex(int32_t speed=10, uint16_t power=2500, bool offsetPhiM=false, bool zeroCount=false)
void setEncoder(std::shared_ptr< Encoder > &encoder) override
uint32_t encToPos(uint32_t enc)
void setPositionExt(int32_t pos)
static TMC4671MotConf decodeMotFromInt(uint16_t val)
void setTorqueLimit(uint16_t limit)
static ClassIdentifier info
static bool isCreatable()
static bool isCreatable()
static ClassIdentifier info
uint32_t pid_v_target_ddt_limit
uint32_t pid_x_target_limit
uint32_t pid_iq_target_ddt_limit
uint32_t pid_v_output_limit
uint32_t ipark_cirlim_limit_u_d
uint32_t pid_id_target_ddt_limit
uint32_t pid_iq_target_limit
uint32_t adc_aenc_clipped
uint32_t pid_id_errsum_limit
uint32_t pid_id_output_limit
uint32_t pid_x_output_limit
uint32_t ipark_cirlim_limit_u_q
uint32_t pid_v_errsum_limit
uint32_t pid_iq_errsum_limit
uint32_t ipark_cirlim_limit_u_r
uint32_t pid_v_target_limit
uint32_t pid_x_errsum_limit
uint32_t pid_id_target_limit
uint32_t pid_x_target_ddt_limit
uint32_t pid_iq_output_limit
int16_t posOffsetFromIndex
bool allowFluxDissipationDeactivation
float fluxDissipationScaler
uint16_t pid_torque_flux_ddt
TMC4671HardwareTypeConf hwconf
bool enableFluxDissipation