Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
TMC4671.h
Go to the documentation of this file.
1/*
2 * TMC4671.h
3 *
4 * Created on: Feb 1, 2020
5 * Author: Yannick
6 */
7
8#ifndef TMC4671_H_
9#define TMC4671_H_
10#include "constants.h"
11#ifdef TMC4671DRIVER
12#include <vector>
13#include "cppmain.h"
14#include "MotorDriver.h"
15#include "Encoder.h"
16#include "ChoosableClass.h"
17#include "PersistentStorage.h"
19#include "SpiHandler.h"
20#include "thread.hpp"
21#include "ExtiHandler.h"
22#include "SPI.h"
23#include "TimerHandler.h"
24#include <span>
25#include "semaphore.hpp"
26#include <GPIOPin.h>
27#include "cpp_target_config.h"
28#include "Filters.h"
30#define SPITIMEOUT 500
31#define TMC_THREAD_MEM 256
32#define TMC_THREAD_PRIO 25 // Must be higher than main thread
33#define TMC_ADCOFFSETFAIL 5000 // How much offset from 0x7fff to allow before a calibration is failed
34
35extern SPI_HandleTypeDef HSPIDRV;
36
37#ifdef TIM_TMC
38extern TIM_HandleTypeDef TIM_TMC;
39#endif
40
41#ifndef TMC4671_DEFAULT_CURRENT_SCALER
42#define TMC4671_DEFAULT_CURRENT_SCALER 0
43#endif
44#ifndef TMC4671_DEFAULT_CLOCKFREQ
45#define TMC4671_DEFAULT_CLOCKFREQ 25e6
46#endif
47#ifndef TMC4671_DEFAULT_BBM
48#define TMC4671_DEFAULT_BBM 20
49#endif
50#ifndef TMC4671_DEFAULT_ANALOGENC_SKIPCAL
51#define TMC4671_DEFAULT_ANALOGENC_SKIPCAL 0
52#endif
53#ifndef TMC4671_ITUNE_CUTOFF
54#define TMC4671_ITUNE_CUTOFF 0.04
55#endif
56#ifndef TIM_TMC_ARR
57#define TIM_TMC_ARR 250
58#endif
59
60
62
63enum class TMC_PwmMode : uint8_t {off = 0,HSlow_LShigh = 1, HShigh_LSlow = 2, res2 = 3, res3 = 4, PWM_LS = 5, PWM_HS = 6, PWM_FOC = 7};
64
66
68
69enum class MotorType : uint8_t {NONE=0,DC=1,STEPPER=2,BLDC=3};
70enum class PhiE : uint8_t {ext=1,openloop=2,abn=3,hall=5,aenc=6,aencE=7,NONE,extEncoder};
72enum class FFMode : uint8_t {none=0,velocity=1,torque=2};
73enum 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};
74enum 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};
75enum class EncoderType_TMC : uint8_t {NONE=0,abn=1,sincos=2,uvw=3,hall=4,ext=5}; // max 7
76
79
89
94 const char* name="CUSTOM";
95 uint8_t hwVersion = 0;
96 int adcOffset = 0;
97
99 float thermistor_R2 = 1500;
100 float thermistor_R = 22000;
101 float thermistor_Beta = 4300;
102 float temp_limit = 90;
103 bool temperatureEnabled = false; // Enables temperature readings
104 };
106
107
108 float currentScaler = TMC4671_DEFAULT_CURRENT_SCALER; // Converts from adc counts to current in Amps
109 uint16_t brakeLimLow = 0xffff;
110 uint16_t brakeLimHigh = 0xffff;
111 float vmScaler = (2.5 / 0x7fff) * ((1.5+71.5)/1.5);
112 float vSenseMult = VOLTAGE_MULT_DEFAULT;
113 float clockfreq = TMC4671_DEFAULT_CLOCKFREQ;
114 uint8_t bbm = TMC4671_DEFAULT_BBM;
116
121 uint32_t mot_none: 1 = 1,
122 mot_dc : 1 = 1,
123 mot_bldc: 1 = 1,
125
126 enc_none:1 = 1,
127 enc_abn:1 = 1,
129 enc_uvw:1 = 1,
130 enc_hall:1 = 1,
131 enc_ext:1 = 1,
132
133 analog_enc_skip_cal:1 = TMC4671_DEFAULT_ANALOGENC_SKIPCAL,
134
136 };
139 switch(type){
140 case EncoderType_TMC::NONE: return flags.enc_none;
141 case EncoderType_TMC::abn: return flags.enc_abn;
142 case EncoderType_TMC::ext: return flags.enc_ext;
143 case EncoderType_TMC::sincos: return flags.enc_sincos;
144 case EncoderType_TMC::hall: return flags.enc_hall;
145 case EncoderType_TMC::uvw: return flags.enc_uvw;
146 default: return false;
147 }
148 }
150 switch(type){
151 case MotorType::NONE: return flags.mot_none;
152 case MotorType::DC: return flags.mot_dc;
153 case MotorType::STEPPER: return flags.mot_stepper;
154 case MotorType::BLDC: return flags.mot_bldc;
155 default: return false;
156 }
157 }
158};
159
160
161// Mapping of bits in status flag register and mask
200
201
202// Basic failsafe hardware boot config for inits
206 uint16_t pwmcnt = 4095; // PWM resolution is 12 bit internally
207 uint8_t bbmL = 50;
208 uint8_t bbmH = 50;
209 uint16_t mdecA = 660; // 334 default. 331 recommended by datasheet,662 double. 660 lowest noise
210 uint16_t mdecB = 331; // Encoder ADC fast rate recommended
211 uint32_t mclkA = 0x20000000; //0x20000000 default
212 uint32_t mclkB = 0x20000000; // For AENC
213 uint16_t adc_I0_offset = 33415;
214 uint16_t adc_I1_offset = 33415;
215 uint16_t adc_I0_scale = 256;
216 uint16_t adc_I1_scale = 256;
217 bool encoderReversed = false;
218 bool combineEncoder = false;
219 bool invertForce = false;
221};
222
224 uint16_t fluxI = 800;
225 uint16_t fluxP = 700;
226 uint16_t torqueI = 800;
227 uint16_t torqueP = 700;
228 uint16_t velocityI = 0;
229 uint16_t velocityP = 256;
230 uint16_t positionI = 0;
231 uint16_t positionP = 128;
232 bool sequentialPI = true; // Advanced pid
233};
234
236 uint16_t pid_torque_flux_ddt = 32767;
237 uint16_t pid_uq_ud = 30000;
238 uint16_t pid_torque_flux = 32767;
239 uint32_t pid_acc_lim = 2147483647;
240 uint32_t pid_vel_lim = 2147483647;
241 int32_t pid_pos_low = -2147483647;
242 int32_t pid_pos_high = 2147483647;
243};
244
245struct TMC4671PidPrecision{ // Switch between Q8.8 (false) and Q4.12 (true) precision for pid controller
246 bool current_I = false;
247 bool current_P = false;
248 bool velocity_I = false;
249 bool velocity_P = false;
250 bool position_I = false;
251 bool position_P = false;
252};
253
255 uint16_t mconf = ADR_TMC1_MOTCONF;
256 uint16_t cpr = ADR_TMC1_CPR;
257 uint16_t encA = ADR_TMC1_ENCA;
258 uint16_t offsetFlux = ADR_TMC1_OFFSETFLUX;
259 uint16_t torque_p = ADR_TMC1_TORQUE_P;
260 uint16_t torque_i = ADR_TMC1_TORQUE_I;
261 uint16_t flux_p = ADR_TMC1_FLUX_P;
262 uint16_t flux_i = ADR_TMC1_FLUX_I;
263 uint16_t ADC_i0_ofs = ADR_TMC1_ADC_I0_OFS;
264 uint16_t ADC_i1_ofs = ADR_TMC1_ADC_I1_OFS;
265 uint16_t encOffset = ADR_TMC1_ENC_OFFSET;
266 uint16_t phieOffset = ADR_TMC1_PHIE_OFS;
267 uint16_t torqueFilter = ADR_TMC1_TRQ_FILT;
268};
269
271 uint32_t cpr = 10000;
272 bool apol = true;
273 bool bpol = true;
274 bool npol = true;
275 bool rdir = false;
276 bool ab_as_n = false;
277 bool latch_on_N = false; // Restore ABN_DECODER_COUNT_N into encoder count if true on pulse. otherwise store encoder count in ABN_DECODER_COUNT_N
278 int16_t phiEoffset = 0; // Depends on phiM!
279 int16_t phiMoffset = 0;
280 int16_t posOffsetFromIndex = 0; // offset position to load after homing
281 bool useIndex = false;
282
283};
284
286 uint32_t cpr = 1; //0x40
287 int16_t phiAoffset = 0; // Main offset. 0x3e
288
289 int16_t phiEoffset = 0; // 0x45&0xffff
290 int16_t phiMoffset = 0; // 0x45&0xffff0000
291
292 uint16_t AENC0_offset = 0x7fff;
293 int16_t AENC0_scale = 256;
294 uint16_t AENC1_offset = 0x7fff;
295 int16_t AENC1_scale = 256;
296 uint16_t AENC2_offset = 0x7fff;
297 int16_t AENC2_scale = 256;
298
299 int16_t nMask = 0; // 0x3c & 0xffff0000
300 int16_t nThreshold = 0; // 0x3c & 0xffff
301 // 0x3b
302 bool uvwmode = false; // 0 = sincos, 1 = uvw
303 bool rdir = false;
304
305};
306
308 bool hallEnabled = false;
309 bool polarity = true;
310 bool interpolation = true;
311 bool direction = false;
312 bool filter = true;
313 uint16_t blank = 100;
314 int16_t pos0 = 0;
315 int16_t pos60 = 10922;
316 int16_t pos120 = 21845;
317 int16_t pos180 = -32768;
318 int16_t pos240 = -21846;
319 int16_t pos300 = -10923;
320 int16_t phiEoffset = 0;
321 int16_t phiMoffset = 0;
322 uint16_t dPhiMax = 10922;
323};
324
325enum class TMCbiquadpreset : uint8_t {none=0,lowpass=1,notch=2,peak=3};
326// Use TMCL IDE with TMC4671 devkit to generate values
328 int32_t a1 = 0;
329 int32_t a2 = 0;
330 int32_t b0 = 0;
331 int32_t b1 = 0;
332 int32_t b2 = 0;
333 bool enable = false;
334};
337 biquad_constant_t params = {1000,50}; // Q = 1/100 for lowpass and 1/10 for notch and peak mode
338 float gain = 10.0; // Gain for peak mode
339};
340
342public:
343 TMC4671Biquad(bool enable = false){
344 params.enable = enable;
345 }
347 TMC4671Biquad(const Biquad& bq,bool enable = true){
348 // Note: trinamic swapped the naming of b and a from the regular convention in the datasheet and a and b are possibly inverse to b in our filter class
349 this->params.a1 = -(int32_t)(bq.b1 * (float)(1 << 29));
350 this->params.a2 = -(int32_t)(bq.b2 * (float)(1 << 29));
351 this->params.b0 = (int32_t)(bq.a0 * (float)(1 << 29));
352 this->params.b1 = (int32_t)(bq.a1 * (float)(1 << 29));
353 this->params.b2 = (int32_t)(bq.a2 * (float)(1 << 29));
354 this->params.enable = bq.getFc() > 0 ? enable : false;
355 }
356 void enable(bool enable){
357 params.enable = enable;
358 }
359
361};
362
363// Stores currently active filters
370
371
372
373class TMC4671 :
374 public MotorDriver, public PersistentStorage, public Encoder,
376#ifdef TIM_TMC
377 ,public TimerHandler
378#endif
379{
380
388
389#ifdef TMCDEBUG
390friend class TMCDebugBridge;
391#endif
392
393public:
394
395 static ClassIdentifier info;
396 const ClassIdentifier getInfo();
398
399 static TMC4671MotConf decodeMotFromInt(uint16_t val);
400 static uint16_t encodeMotToInt(TMC4671MotConf mconf);
401
402
403 TMC4671(SPIPort& spiport,OutputPin cspin,uint8_t address=1);
404
405 void setHwType(uint8_t type);
406
407 void setAddress(uint8_t address);
408
409 uint8_t getSpiAddr();
410 bool setSpiAddr(uint8_t chan);
411 virtual ~TMC4671();
412
414
415 bool initialize();
416 void initializeWithPower();
417
418 void Run();
419 bool motorReady();
420
421 bool hasPower();
422 int32_t getTmcVM();
423 bool isSetUp();
424
425 uint32_t readReg(uint8_t reg);
426 void writeReg(uint8_t reg,uint32_t dat);
427 void writeRegAsync(uint8_t reg,uint32_t dat);
428 void updateReg(uint8_t reg,uint32_t dat,uint32_t mask,uint8_t shift);
429 //void SpiTxCplt(SPI_HandleTypeDef *hspi);
430
431 void setMotorType(MotorType motor,uint16_t poles);
432
433 void runOpenLoop(uint16_t ud,uint16_t uq,int32_t speed,int32_t accel,bool torqueMode = false);
434 void setOpenLoopSpeedAccel(int32_t speed,uint32_t accel);
435
436 // Setup routines
437 bool calibrateAdcOffset(uint16_t time = 500);
438 void setup_ABN_Enc(TMC4671ABNConf encconf);
439 void setup_AENC(TMC4671AENCConf encconf);
441 void bangInitEnc(int16_t power);
442 void estimateABNparams();
443 void estimateExtEnc();
444 bool checkEncoder();
445 void calibrateAenc();
446 void calibrateEncoder();
447
449 uint32_t getEncCpr();
450
451 void setAdcOffset(uint32_t adc_I0_offset,uint32_t adc_I1_offset);
452 void setAdcScale(uint32_t adc_I0_scale,uint32_t adc_I1_scale);
453
454 void setupFeedForwardTorque(int32_t gain, int32_t constant);
455 void setupFeedForwardVelocity(int32_t gain, int32_t constant);
456 void setFFMode(FFMode mode);
457 void setSequentialPI(bool sequential);
458
459 void setBiquadFlux(const TMC4671Biquad &filter);
460 void setBiquadTorque(const TMC4671Biquad &filter);
461 void setBiquadPos(const TMC4671Biquad &filter);
462 void setBiquadVel(const TMC4671Biquad &filter);;
464
465 bool pingDriver();
466 std::pair<uint32_t,std::string> getTmcType();
467
468 void changeState(TMC_ControlState newState,bool force = false);
469
471 void setExternalEncoderAllowed(bool allow);
472
473 float getPwmFreq();
474 void setPwmFreq(float freq);
475
476 void setBBM(uint8_t bbml,uint8_t bbmh);
477
478
479#ifdef TIM_TMC
480 void timerElapsed(TIM_HandleTypeDef* htim);
481#endif
482
483 void setPositionExt(int32_t pos); // External position register (For external encoders. Choose external phiE).
484
485 void stopMotor();
486 void startMotor();
487
488 void emergencyStop(bool reset);
489 bool emergency = false;
490 bool estopTriggered = false;
491 void turn(int16_t power);
492 int16_t nextFlux = 0;
493 int16_t idleFlux = 0;
494 uint16_t maxOffsetFlux = 0;
495
496 int16_t bangInitPower = 5000; // Default current in setup routines
497
498 int16_t controlFluxDissipate();
499 const float fluxDissipationLimit = 1000;
500
501 void setTorque(int16_t torque);
502
503 void setTargetPos(int32_t pos);
504 int32_t getTargetPos();
505 void setTargetVelocity(int32_t vel);
506 int32_t getTargetVelocity();
507 int32_t getVelocity();
508 int16_t getTorque();
509 void setFlux(int16_t flux);
510 int16_t getFlux();
511 void setFluxTorque(int16_t flux, int16_t torque);
512 void setFluxTorqueFF(int16_t flux, int16_t torque);
513 std::pair<int32_t,int32_t> getActualTorqueFlux();
514 int32_t getActualFlux();
515 int32_t getActualTorque();
516
517 void rampFlux(uint16_t target,uint16_t time_ms);
518
519 bool checkAdc();
520
521 float getTemp();
523
524 void setPhiEtype(PhiE type);
526 void setPhiE_ext(int16_t phiE);
527 int16_t getPhiE();
529 int16_t getPhiE_Enc();
530
531 void setGpioMode(TMC_GpioMode mode);
532 uint8_t getGpioPins();
533 void setGpioPins(uint8_t pins);
534
535 void setPosSel(PosSelection psel);
536 void setVelSel(VelSelection vsel,uint8_t mode = 0);
537
538 void setMotionMode(MotionMode mode,bool force = false); // force true sets it immediately. use false to change mode when tmc is ready on startMotor
540
541 void setUdUq(int16_t ud,int16_t uq);
542 void setBrakeLimits(uint16_t low, uint16_t high); // Raw brake resistor limits (see tmc reg 0x75)
543
544 bool reachedPosition(uint16_t tolerance);
545
546 // Pids
547 void setPids(TMC4671PIDConf pids);
550
552 void setLimits(TMC4671Limits limits);
554
555 void setUqUdLimit(uint16_t limit);
556 void setTorqueLimit(uint16_t limit);
557
560
564
565 //Encoder
566 Encoder* getEncoder() override;
567 void setEncoder(std::shared_ptr<Encoder>& encoder) override;
568 bool hasIntegratedEncoder() override;
569 inline bool usingExternalEncoder(){return conf.motconf.enctype == EncoderType_TMC::ext && drvEncoder != nullptr && drvEncoder->getEncoderType() != EncoderType::NONE;}
570 int32_t getPos() override;
571 int32_t getPosAbs() override;
572 void setPos(int32_t pos) override;
573 void setTmcPos(int32_t pos);
574 //uint32_t getPosCpr();
575 uint32_t getCpr();
576 void setCpr(uint32_t cpr);
577 EncoderType getEncoderType() override;
578 uint32_t posToEnc(uint32_t pos);
579 uint32_t encToPos(uint32_t enc);
580
581 void exti(uint16_t GPIO_Pin);
582
583
584 bool findEncoderIndex(int32_t speed=10, uint16_t power=2500,bool offsetPhiM=false,bool zeroCount=false);
585 bool autohome();
586 void zeroAbnUsingPhiM(bool offsetPhiE=false);
587
588 StatusFlags readFlags(bool maskedOnly = true);
589 void setStatusMask(StatusFlags mask);
590 void setStatusMask(uint32_t mask); // Mask for status pin.
591 void setStatusFlags(uint32_t flags);
592 void setStatusFlags(StatusFlags flags);
593 void setEncoderIndexFlagEnabled(bool enabled,bool zeroEncoder = false);
594 void statusCheck();
598
599 void saveFlash() override;
600 void restoreFlash() override;
602
603 uint16_t encodeEncHallMisc();
604 void restoreEncHallMisc(uint16_t val);
605
606 bool allowSlowSPI = true; // For engineering sample
607
608 void beginSpiTransfer(SPIPort* port);
609 void endSpiTransfer(SPIPort* port);
610 //void spiTxCompleted(SPIPort* port);
611
612 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies);
613 void registerCommands();
614
615 virtual std::string getHelpstring(){return "TMC4671 interface";}
616
617protected:
619 public:
621 //~TMC_ExternalEncoderUpdateThread();
622 void Run();
623 void updateFromIsr();
624
625 private:
627 };
628
629 static std::span<const TMC4671HardwareTypeConf> tmc4671_hw_configs; // Can override in external target file
630
631private:
632 OutputPin enablePin = OutputPin(*DRV_ENABLE_GPIO_Port,DRV_ENABLE_Pin);
636 const Error estopError = Error(ErrorCode::emergencyStop, ErrorType::critical, "TMC emergency stop triggered");
637
644
646
647 bool ES_TMCdetected = false; // ES versions are not made anymore and have some critical issues
648
649 bool encoderAligned = false;
650 //bool encoderIndexFound = false;
651 bool initialized = false; // Init ran once
652 bool powerInitialized = false;
653 bool adcCalibrated = false;
654 bool adcSettingsStored = false;
656 volatile bool encoderIndexHitFlag = false;
659 bool phiErestored = false;
660 bool encHallRestored = false;
661 bool canChangeHwType = true; // Allows changing the hardware version by commands
662 //int32_t phiEOffsetRestored = 0; //-0x8000 to 0x7fff
664
665 int16_t externalEncoderPhieOffset = 0; // PhiE offset for external encoders
667
668 bool allowStateChange = false;
670
671 uint8_t enc_retry = 0;
672 uint8_t enc_retry_max = 3;
673
674 uint32_t lastStatTime = 0;
675
676 uint8_t spi_buf[5] = {0};
677
678 void initAdc(uint16_t mdecA, uint16_t mdecB,uint32_t mclkA,uint32_t mclkB);
679 void setPwm(uint8_t val,uint16_t maxcnt,uint8_t bbmL,uint8_t bbmH);// 100MHz/maxcnt+1
680 void setPwm(TMC_PwmMode val);// pwm mode
681 void setPwmMaxCnt(uint16_t maxcnt);
682 void setSvPwm(bool enable);
683 void encInit();
684 void encoderIndexHit();
685 void saveAdcParams();
686 void calibFailCb();
687
688
689// state machine
690// void ABN_init();
691// void AENC_init();
692
693 void encoderInit();
694 void errorCallback(const Error &error, bool cleared);
695 bool pidAutoTune();
696
697 void replyHardwareVersions(const std::span<const TMC4671HardwareTypeConf>& versions,std::vector<CommandReply>& replies);
698
699 uint32_t initTime = 0;
700 bool manualEncAlign = false;
701 bool spiActive = false; // Flag for tx interrupt that the transfer was started by this instance
702
703
706 const float fluxFilterFreq = 350.0;
707
708 // External encoder timer fires interrupts to trigger a new commutation position update
709#ifdef TIM_TMC
710
711 TIM_HandleTypeDef* externalEncoderTimer = &TIM_TMC;
712 std::unique_ptr<TMC_ExternalEncoderUpdateThread> extEncUpdater = nullptr;
713#else
714 TIM_HandleTypeDef* externalEncoderTimer = nullptr;
715#endif
716 void setUpExtEncTimer();
717};
718
719
720
721class TMC_1 : public TMC4671 {
722public:
723 TMC_1() : TMC4671{motor_spi,*motor_spi.getCsPin(0),1} {}
724
725 //const ClassIdentifier getInfo() override;
726 static bool isCreatable();
727 static ClassIdentifier info;
728};
729
730class TMC_2 : public TMC4671 {
731public:
732 TMC_2() : TMC4671{motor_spi,*motor_spi.getCsPin(1),2} {}
733
734 //const ClassIdentifier getInfo() override;
735 static bool isCreatable();
736 static ClassIdentifier info;
737};
738#endif
739#endif /* TMC4671_H_ */
740
741
ClassType
Definition ClassIDs.h:12
@ Motordriver
Definition ClassIDs.h:16
CommandStatus
EncoderType
Definition Encoder.h:27
@ encoderIndexMissed
@ tmcCommunicationError
TMC_HW_Ver
Definition TMC4671.h:78
@ v1_2_2_100mv
Definition TMC4671.h:78
@ v1_3_66mv
Definition TMC4671.h:78
@ v1_2_2_LEM20
Definition TMC4671.h:78
MotionMode
Definition TMC4671.h:71
@ encminimove
Definition TMC4671.h:71
@ prbsvelocity
Definition TMC4671.h:71
@ prbstorque
Definition TMC4671.h:71
EncoderType_TMC
Definition TMC4671.h:75
SPI_HandleTypeDef HSPIDRV
MotorType
Definition TMC4671.h:69
@ STEPPER
Definition TMC4671.h:69
FFMode
Definition TMC4671.h:72
VelSelection
Definition TMC4671.h:74
TMCbiquadpreset
Definition TMC4671.h:325
TMC_GpioMode
Definition TMC4671.h:67
TIM_HandleTypeDef TIM_TMC
TMC_PwmMode
Definition TMC4671.h:63
@ HSlow_LShigh
Definition TMC4671.h:63
@ HShigh_LSlow
Definition TMC4671.h:63
TMC_ControlState
Definition TMC4671.h:61
PhiE
Definition TMC4671.h:70
@ aenc
Definition TMC4671.h:70
@ abn
Definition TMC4671.h:70
@ extEncoder
Definition TMC4671.h:70
@ aencE
Definition TMC4671.h:70
@ hall
Definition TMC4671.h:70
@ ext
Definition TMC4671.h:70
@ openloop
Definition TMC4671.h:70
TMC_StartupType
Definition TMC4671.h:65
PosSelection
Definition TMC4671.h:73
@ PhiE_openloop
Definition TMC4671.h:73
float a0
Definition Filters.h:48
float b1
Definition Filters.h:48
float b2
Definition Filters.h:48
float a1
Definition Filters.h:48
float getFc() const
Definition Filters.cpp:36
float a2
Definition Filters.h:48
CommandHandler(const char *clsname, uint16_t clsid, uint8_t instance=0)
Encoder()
Definition Encoder.cpp:18
std::shared_ptr< Encoder > drvEncoder
Definition MotorDriver.h:46
SPIDevice(SPIPort &port, OutputPin csPin)
Definition SPI.cpp:333
Definition SPI.h:44
void enable(bool enable)
Definition TMC4671.h:356
TMC4671Biquad_t params
Definition TMC4671.h:360
TMC4671Biquad(bool enable=false)
Definition TMC4671.h:343
TMC4671Biquad(const Biquad &bq, bool enable=true)
Definition TMC4671.h:347
TMC4671Biquad(const TMC4671Biquad_t bq)
Definition TMC4671.h:346
void writeReg(uint8_t reg, uint32_t dat)
Definition TMC4671.cpp:2521
static ClassIdentifier info
Definition TMC4671.h:42
int16_t bangInitPower
Definition TMC4671.h:496
void beginSpiTransfer(SPIPort *port)
Definition TMC4671.cpp:2556
void setFluxTorque(int16_t flux, int16_t torque)
Definition TMC4671.cpp:2064
void calibrateEncoder()
Definition TMC4671.cpp:651
void saveFlash() override
Definition TMC4671.cpp:107
void setBBM(uint8_t bbml, uint8_t bbmh)
Definition TMC4671.cpp:2404
int16_t controlFluxDissipate()
Definition TMC4671.cpp:1718
int32_t getTargetPos()
Definition TMC4671.cpp:908
int16_t externalEncoderPhieOffset
Definition TMC4671.h:665
PhiE getPhiEtype()
Definition TMC4671.cpp:1603
bool pidAutoTune()
Definition TMC4671.cpp:671
bool adcSettingsStored
Definition TMC4671.h:654
TMC_ControlState getState()
Definition TMC4671.cpp:781
TMC4671Limits curLimits
Definition TMC4671.h:551
int16_t getFlux()
Definition TMC4671.cpp:2061
void setExternalEncoderAllowed(bool allow)
Definition TMC4671.cpp:2003
bool externalEncoderAllowed()
Definition TMC4671.cpp:2016
TMC4671PIDConf getPids()
Definition TMC4671.cpp:2108
bool allowExternalEncoder
Definition TMC4671.h:666
bool autohome()
Definition TMC4671.cpp:767
const ClassType getClassType() override
returns the used classchooser selection id of this instance
Definition TMC4671.h:397
bool encHallRestored
Definition TMC4671.h:660
void statusCheck()
Definition TMC4671.cpp:2596
void startMotor()
Definition TMC4671.cpp:1669
const Error estopError
Definition TMC4671.h:636
bool spiActive
Definition TMC4671.h:701
void setLimits(TMC4671Limits limits)
Definition TMC4671.cpp:2145
void runOpenLoop(uint16_t ud, uint16_t uq, int32_t speed, int32_t accel, bool torqueMode=false)
Definition TMC4671.cpp:1633
bool hasIntegratedEncoder() override
Definition TMC4671.cpp:1866
volatile bool encoderIndexHitFlag
Definition TMC4671.h:656
TMC_ControlState state
Definition TMC4671.h:638
uint32_t initTime
Definition TMC4671.h:699
void setupFeedForwardVelocity(int32_t gain, int32_t constant)
Definition TMC4671.cpp:1983
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition TMC4671.cpp:2795
uint32_t getCpr()
Definition TMC4671.cpp:1919
uint8_t calibrationFailCount
Definition TMC4671.h:663
bool fullCalibrationInProgress
Definition TMC4671.h:658
void setEncoderIndexFlagEnabled(bool enabled, bool zeroEncoder=false)
Definition TMC4671.cpp:882
void initializeWithPower()
Definition TMC4671.cpp:388
bool zeroEncoderOnIndexHit
Definition TMC4671.h:657
static std::span< const TMC4671HardwareTypeConf > tmc4671_hw_configs
Definition TMC4671.h:629
void setPos(int32_t pos) override
Definition TMC4671.cpp:1874
void bangInitEnc(int16_t power)
Definition TMC4671.cpp:962
bool reachedPosition(uint16_t tolerance)
Definition TMC4671.cpp:797
int16_t nextFlux
Definition TMC4671.h:492
TMC4671_commands
Definition TMC4671.h:381
void setPids(TMC4671PIDConf pids)
Definition TMC4671.cpp:2099
MotionMode lastMotionMode
Definition TMC4671.h:642
const float fluxDissipationLimit
Definition TMC4671.h:499
TMC4671ABNConf abnconf
Definition TMC4671.h:561
TMC_ControlState requestedState
Definition TMC4671.h:640
bool usingExternalEncoder()
Definition TMC4671.h:569
void setUdUq(int16_t ud, int16_t uq)
Definition TMC4671.cpp:1654
virtual std::string getHelpstring()
Definition TMC4671.h:615
StatusFlags statusMask
Definition TMC4671.h:597
void changeState(TMC_ControlState newState, bool force=false)
Definition TMC4671.cpp:785
int16_t idleFlux
Definition TMC4671.h:493
const Error lowVoltageError
Definition TMC4671.h:634
void replyHardwareVersions(const std::span< const TMC4671HardwareTypeConf > &versions, std::vector< CommandReply > &replies)
Definition TMC4671.cpp:2738
void setVelSel(VelSelection vsel, uint8_t mode=0)
Definition TMC4671.cpp:1772
void setEncoderType(EncoderType_TMC type)
Definition TMC4671.cpp:1520
uint16_t maxOffsetFlux
Definition TMC4671.h:494
TMC4671PIDConf curPids
Definition TMC4671.h:549
TIM_HandleTypeDef * externalEncoderTimer
Definition TMC4671.h:711
bool allowSlowSPI
Definition TMC4671.h:606
TMC4671BiquadFilters curFilters
Definition TMC4671.h:705
MotionMode getMotionMode()
Definition TMC4671.cpp:1622
bool ES_TMCdetected
Definition TMC4671.h:647
TMC_ControlState laststate
Definition TMC4671.h:639
void setBrakeLimits(uint16_t low, uint16_t high)
Definition TMC4671.cpp:2286
TMC4671PidPrecision pidPrecision
Definition TMC4671.h:559
bool recalibrationRequired
Definition TMC4671.h:669
uint16_t encodeEncHallMisc()
Definition TMC4671.cpp:2650
void setPhiE_ext(int16_t phiE)
Definition TMC4671.cpp:935
int32_t getTargetVelocity()
Definition TMC4671.cpp:924
void calibFailCb()
Definition TMC4671.cpp:1425
void timerElapsed(TIM_HandleTypeDef *htim)
Definition TMC4671.cpp:3115
friend class TMCDebugBridge
Definition TMC4671.h:390
bool emergency
Definition TMC4671.h:489
void setStatusFlags(uint32_t flags)
Definition TMC4671.cpp:2585
void setFluxTorqueFF(int16_t flux, int16_t torque)
Definition TMC4671.cpp:2075
bool canChangeHwType
Definition TMC4671.h:661
void setBiquadVel(const TMC4671Biquad &filter)
Definition TMC4671.cpp:2213
void restoreEncHallMisc(uint16_t val)
Definition TMC4671.cpp:2676
TMC4671MainConfig conf
Definition TMC4671.h:413
bool phiErestored
Definition TMC4671.h:659
void setUpExtEncTimer()
Definition TMC4671.cpp:3128
static uint16_t encodeMotToInt(TMC4671MotConf mconf)
Definition TMC4671.cpp:2642
virtual ~TMC4671()
Definition TMC4671.cpp:81
void setTorque(int16_t torque)
Definition TMC4671.cpp:2045
bool pingDriver()
Definition TMC4671.cpp:226
bool calibrateAdcOffset(uint16_t time=500)
Definition TMC4671.cpp:1364
int32_t getPosAbs() override
Definition TMC4671.cpp:1903
int32_t getTmcVM()
Definition TMC4671.cpp:234
bool setSpiAddr(uint8_t chan)
void setStatusMask(StatusFlags mask)
Definition TMC4671.cpp:2577
void zeroAbnUsingPhiM(bool offsetPhiE=false)
Definition TMC4671.cpp:807
bool isSetUp()
Definition TMC4671.cpp:201
void encoderIndexHit()
Definition TMC4671.cpp:2624
int16_t getPhiE()
Definition TMC4671.cpp:951
void setSequentialPI(bool sequential)
Definition TMC4671.cpp:1998
TMC4671AENCConf aencconf
Definition TMC4671.h:563
TMC4671HALLConf hallconf
Definition TMC4671.h:562
MotionMode curMotionMode
Definition TMC4671.h:641
const float fluxFilterFreq
Definition TMC4671.h:706
const Error indexNotHitError
Definition TMC4671.h:633
void setup_AENC(TMC4671AENCConf encconf)
Definition TMC4671.cpp:1318
Encoder * getEncoder() override
Definition TMC4671.cpp:1848
void setGpioPins(uint8_t pins)
Definition TMC4671.cpp:1816
int32_t getActualFlux()
Definition TMC4671.cpp:2490
int16_t getTorque()
Definition TMC4671.cpp:2051
bool encoderAligned
Definition TMC4671.h:649
void setMotionMode(MotionMode mode, bool force=false)
Definition TMC4671.cpp:1611
uint32_t lastStatTime
Definition TMC4671.h:674
void setTargetPos(int32_t pos)
Definition TMC4671.cpp:901
void setMotorType(MotorType motor, uint16_t poles)
Definition TMC4671.cpp:2024
int32_t getPos() override
Definition TMC4671.cpp:1897
void rampFlux(uint16_t target, uint16_t time_ms)
Definition TMC4671.cpp:2085
void encInit()
bool checkAdc()
Definition TMC4671.cpp:377
uint8_t spi_buf[5]
Definition TMC4671.h:676
void setPwm(uint8_t val, uint16_t maxcnt, uint8_t bbmL, uint8_t bbmH)
Definition TMC4671.cpp:2411
bool motorReady()
Definition TMC4671.cpp:426
bool checkEncoder()
Definition TMC4671.cpp:1172
void setGpioMode(TMC_GpioMode mode)
Definition TMC4671.cpp:1782
void endSpiTransfer(SPIPort *port)
Definition TMC4671.cpp:2559
void errorCallback(const Error &error, bool cleared)
Definition TMC4671.cpp:3162
bool adcCalibrated
Definition TMC4671.h:653
uint8_t enc_retry
Definition TMC4671.h:671
void calibrateAenc()
Definition TMC4671.cpp:1051
bool motorEnabledRequested
Definition TMC4671.h:655
bool manualEncAlign
Definition TMC4671.h:700
uint8_t enc_retry_max
Definition TMC4671.h:672
void setTorqueFilter(TMC4671Biquad_conf &conf)
Definition TMC4671.cpp:2255
uint8_t getGpioPins()
Definition TMC4671.cpp:1808
void turn(int16_t power)
Definition TMC4671.cpp:1732
float getTemp()
Definition TMC4671.cpp:352
std::pair< int32_t, int32_t > getActualTorqueFlux()
Definition TMC4671.cpp:2480
int16_t getPhiE_Enc()
Definition TMC4671.cpp:1155
void setup_HALL(TMC4671HALLConf hallconf)
Definition TMC4671.cpp:1335
TMC_StartupType startupType
Definition TMC4671.h:645
void setTmcPos(int32_t pos)
Definition TMC4671.cpp:1892
uint32_t getEncCpr()
Definition TMC4671.cpp:1581
void setFFMode(FFMode mode)
Definition TMC4671.cpp:1990
void setTargetVelocity(int32_t vel)
Definition TMC4671.cpp:917
void setupFeedForwardTorque(int32_t gain, int32_t constant)
Definition TMC4671.cpp:1977
bool hasPower()
Definition TMC4671.cpp:195
void registerCommands()
Definition TMC4671.cpp:2747
void setPhiEtype(PhiE type)
Definition TMC4671.cpp:1593
void estimateExtEnc()
Definition TMC4671.cpp:2349
TMC4671(SPIPort &spiport, OutputPin cspin, uint8_t address=1)
Definition TMC4671.cpp:49
void setOpenLoopSpeedAccel(int32_t speed, uint32_t accel)
Definition TMC4671.cpp:1627
TMC4671Limits getLimits()
Definition TMC4671.cpp:2156
void restoreFlash() override
Definition TMC4671.cpp:145
void updateReg(uint8_t reg, uint32_t dat, uint32_t mask, uint8_t shift)
Definition TMC4671.cpp:2549
void setup_ABN_Enc(TMC4671ABNConf encconf)
Definition TMC4671.cpp:1294
void setAdcOffset(uint32_t adc_I0_offset, uint32_t adc_I1_offset)
Definition TMC4671.cpp:1961
void setPwmMaxCnt(uint16_t maxcnt)
Definition TMC4671.cpp:2444
bool estopTriggered
Definition TMC4671.h:490
void setCpr(uint32_t cpr)
Definition TMC4671.cpp:1930
void stopMotor()
Definition TMC4671.cpp:1658
const Error communicationError
Definition TMC4671.h:635
uint8_t getSpiAddr()
void setBiquadTorque(const TMC4671Biquad &filter)
Definition TMC4671.cpp:2234
bool powerInitialized
Definition TMC4671.h:652
void setBiquadFlux(const TMC4671Biquad &filter)
Definition TMC4671.cpp:2171
uint32_t posToEnc(uint32_t pos)
Definition TMC4671.cpp:1948
void Run()
Definition TMC4671.cpp:430
StatusFlags readFlags(bool maskedOnly=true)
Definition TMC4671.cpp:2568
void setUqUdLimit(uint16_t limit)
Definition TMC4671.cpp:2121
std::pair< uint32_t, std::string > getTmcType()
Definition TMC4671.cpp:1825
float getPwmFreq()
Definition TMC4671.cpp:2435
void setAddress(uint8_t address)
Definition TMC4671.cpp:93
void exti(uint16_t GPIO_Pin)
Definition TMC4671.cpp:2618
void initAdc(uint16_t mdecA, uint16_t mdecB, uint32_t mclkA, uint32_t mclkB)
Definition TMC4671.cpp:2463
void setHwType(uint8_t type)
Definition TMC4671.cpp:2713
TMC4671Biquad_conf torqueFilterConf
Definition TMC4671.h:704
void setPosSel(PosSelection psel)
Definition TMC4671.cpp:1763
void setPwmFreq(float freq)
Definition TMC4671.cpp:2455
bool allowStateChange
Definition TMC4671.h:668
void writeRegAsync(uint8_t reg, uint32_t dat)
Definition TMC4671.cpp:2533
int16_t getPhiEfromExternalEncoder()
Definition TMC4671.cpp:939
std::unique_ptr< TMC_ExternalEncoderUpdateThread > extEncUpdater
Definition TMC4671.h:712
void setSvPwm(bool enable)
Definition TMC4671.cpp:2422
void estimateABNparams()
Definition TMC4671.cpp:2296
bool initialize()
Definition TMC4671.cpp:247
bool flagCheckInProgress
Definition TMC4671.h:595
bool initialized
Definition TMC4671.h:651
TMC4671FlashAddrs flashAddrs
Definition TMC4671.h:601
const ClassIdentifier getInfo()
Definition TMC4671.cpp:87
void setFlux(int16_t flux)
Definition TMC4671.cpp:2055
void setPidPrecision(TMC4671PidPrecision setting)
Definition TMC4671.cpp:2132
EncoderType getEncoderType() override
Definition TMC4671.cpp:1952
MotionMode nextMotionMode
Definition TMC4671.h:643
int32_t getVelocity()
Definition TMC4671.cpp:927
uint32_t readReg(uint8_t reg)
Definition TMC4671.cpp:2507
int32_t getActualTorque()
Definition TMC4671.cpp:2499
void setBiquadPos(const TMC4671Biquad &filter)
Definition TMC4671.cpp:2192
void setAdcScale(uint32_t adc_I0_scale, uint32_t adc_I1_scale)
Definition TMC4671.cpp:1969
StatusFlags statusFlags
Definition TMC4671.h:596
bool findEncoderIndex(int32_t speed=10, uint16_t power=2500, bool offsetPhiM=false, bool zeroCount=false)
Definition TMC4671.cpp:828
void setEncoder(std::shared_ptr< Encoder > &encoder) override
Definition TMC4671.cpp:1856
uint32_t encToPos(uint32_t enc)
Definition TMC4671.cpp:1945
void saveAdcParams()
Definition TMC4671.cpp:135
void encoderInit()
Definition TMC4671.cpp:1434
void setPositionExt(int32_t pos)
Definition TMC4671.cpp:931
static TMC4671MotConf decodeMotFromInt(uint16_t val)
Definition TMC4671.cpp:2633
void setTorqueLimit(uint16_t limit)
Definition TMC4671.cpp:2126
OutputPin enablePin
Definition TMC4671.h:632
static bool isCreatable()
Definition TMC4671.cpp:24
TMC_1()
Definition TMC4671.h:723
TMC_2()
Definition TMC4671.h:732
static bool isCreatable()
Definition TMC4671.cpp:35
SPIPort motor_spi
uint32_t pid_v_target_ddt_limit
Definition TMC4671.h:169
uint32_t pid_iq_target_ddt_limit
Definition TMC4671.h:177
uint32_t ipark_cirlim_limit_u_d
Definition TMC4671.h:180
uint32_t pid_id_target_ddt_limit
Definition TMC4671.h:173
uint32_t ipark_cirlim_limit_u_q
Definition TMC4671.h:181
uint32_t ipark_cirlim_limit_u_r
Definition TMC4671.h:182
uint32_t pid_x_target_ddt_limit
Definition TMC4671.h:165
int16_t phiEoffset
Definition TMC4671.h:278
uint32_t cpr
Definition TMC4671.h:271
int16_t posOffsetFromIndex
Definition TMC4671.h:280
bool latch_on_N
Definition TMC4671.h:277
int16_t phiMoffset
Definition TMC4671.h:279
int16_t AENC0_scale
Definition TMC4671.h:293
int16_t phiMoffset
Definition TMC4671.h:290
int16_t nThreshold
Definition TMC4671.h:300
uint16_t AENC0_offset
Definition TMC4671.h:292
int16_t phiEoffset
Definition TMC4671.h:289
int16_t AENC2_scale
Definition TMC4671.h:297
uint32_t cpr
Definition TMC4671.h:286
uint16_t AENC1_offset
Definition TMC4671.h:294
int16_t phiAoffset
Definition TMC4671.h:287
uint16_t AENC2_offset
Definition TMC4671.h:296
int16_t nMask
Definition TMC4671.h:299
int16_t AENC1_scale
Definition TMC4671.h:295
TMCbiquadpreset mode
Definition TMC4671.h:336
biquad_constant_t params
Definition TMC4671.h:337
TMC4671Biquad pos
Definition TMC4671.h:367
TMC4671Biquad torque
Definition TMC4671.h:365
TMC4671Biquad flux
Definition TMC4671.h:366
TMC4671Biquad vel
Definition TMC4671.h:368
uint16_t encA
Definition TMC4671.h:257
uint16_t phieOffset
Definition TMC4671.h:266
uint16_t ADC_i0_ofs
Definition TMC4671.h:263
uint16_t offsetFlux
Definition TMC4671.h:258
uint16_t encOffset
Definition TMC4671.h:265
uint16_t torqueFilter
Definition TMC4671.h:267
uint16_t flux_p
Definition TMC4671.h:261
uint16_t torque_p
Definition TMC4671.h:259
uint16_t torque_i
Definition TMC4671.h:260
uint16_t flux_i
Definition TMC4671.h:262
uint16_t ADC_i1_ofs
Definition TMC4671.h:264
uint16_t mconf
Definition TMC4671.h:255
int16_t phiEoffset
Definition TMC4671.h:320
int16_t phiMoffset
Definition TMC4671.h:321
int16_t pos120
Definition TMC4671.h:316
uint16_t dPhiMax
Definition TMC4671.h:322
int16_t pos0
Definition TMC4671.h:314
int16_t pos60
Definition TMC4671.h:315
uint16_t blank
Definition TMC4671.h:313
int16_t pos240
Definition TMC4671.h:318
int16_t pos300
Definition TMC4671.h:319
int16_t pos180
Definition TMC4671.h:317
bool interpolation
Definition TMC4671.h:310
SupportedModes_s flags
Definition TMC4671.h:137
bool isEncSupported(EncoderType_TMC type)
Definition TMC4671.h:138
ThermistorSettings thermistorSettings
Definition TMC4671.h:105
const char * name
Definition TMC4671.h:94
bool isMotSupported(MotorType type)
Definition TMC4671.h:149
uint32_t pid_vel_lim
Definition TMC4671.h:240
uint16_t pid_torque_flux
Definition TMC4671.h:238
uint16_t pid_torque_flux_ddt
Definition TMC4671.h:236
uint32_t pid_acc_lim
Definition TMC4671.h:239
int32_t pid_pos_low
Definition TMC4671.h:241
int32_t pid_pos_high
Definition TMC4671.h:242
uint16_t pid_uq_ud
Definition TMC4671.h:237
uint16_t adc_I1_offset
Definition TMC4671.h:214
uint16_t pwmcnt
Definition TMC4671.h:206
TMC4671MotConf motconf
Definition TMC4671.h:205
uint32_t mclkB
Definition TMC4671.h:212
uint16_t adc_I0_scale
Definition TMC4671.h:215
TMC4671HardwareTypeConf hwconf
Definition TMC4671.h:204
uint32_t mclkA
Definition TMC4671.h:211
uint16_t mdecB
Definition TMC4671.h:210
uint16_t mdecA
Definition TMC4671.h:209
uint16_t adc_I1_scale
Definition TMC4671.h:216
uint16_t adc_I0_offset
Definition TMC4671.h:213
bool enableFluxDissipation
Definition TMC4671.h:220
MotorType motor_type
Definition TMC4671.h:81
uint16_t pole_pairs
Definition TMC4671.h:84
EncoderType_TMC enctype
Definition TMC4671.h:82
PosSelection pos_sel
Definition TMC4671.h:85
PhiE phiEsource
Definition TMC4671.h:83
VelSelection vel_sel
Definition TMC4671.h:86
bool sequentialPI
Definition TMC4671.h:232
uint16_t positionP
Definition TMC4671.h:231
uint16_t fluxP
Definition TMC4671.h:225
uint16_t velocityI
Definition TMC4671.h:228
uint16_t positionI
Definition TMC4671.h:230
uint16_t fluxI
Definition TMC4671.h:224
uint16_t velocityP
Definition TMC4671.h:229
uint16_t torqueP
Definition TMC4671.h:227
uint16_t torqueI
Definition TMC4671.h:226
StatusFlags_s flags
Definition TMC4671.h:198
uint32_t asInt
Definition TMC4671.h:197