Open FFBoard
Open source force feedback firmware
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"
18#include "CommandHandler.h"
19#include "SpiHandler.h"
20#include "thread.hpp"
21#include "ExtiHandler.h"
22#include "SPI.h"
23#include "TimerHandler.h"
24
25#include "semaphore.hpp"
26#include <GPIOPin.h>
27#include "cpp_target_config.h"
28#include "Filters.h"
29
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
42
43enum 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};
44
46
48
49enum class MotorType : uint8_t {NONE=0,DC=1,STEPPER=2,BLDC=3,ERR};
50enum class PhiE : uint8_t {ext=1,openloop=2,abn=3,hall=5,aenc=6,aencE=7,NONE,extEncoder};
52enum class FFMode : uint8_t {none=0,velocity=1,torque=2};
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};
55enum class EncoderType_TMC : uint8_t {NONE=0,abn=1,sincos=2,uvw=3,hall=4,ext=5}; // max 7
56
57// Hardware versions for identifying different types. 31 versions valid
59// Selectable version names to be listed in commands
60const std::vector<std::pair<TMC_HW_Ver,std::string>> tmcHwVersionNames{
61 std::make_pair(TMC_HW_Ver::NONE,"Undefined"), // Do not select. Default but disables some safety features
62 std::make_pair(TMC_HW_Ver::v1_0,"v1.0 AD8417"),
63 std::make_pair(TMC_HW_Ver::v1_2,"v1.2 AD8417"),
64 std::make_pair(TMC_HW_Ver::v1_2_2,"v1.2.2 LEM GO 10 (80mV/A)"),
65 std::make_pair(TMC_HW_Ver::v1_2_2_LEM20,"v1.2.2 LEM GO 20 (40mV/A)"),
66 std::make_pair(TMC_HW_Ver::v1_2_2_100mv,"v1.2/3 100mV/A"),
67 std::make_pair(TMC_HW_Ver::v1_3_66mv,"v1.3 ACS724 30A (66mV/A)")
68};
69
74 uint16_t pole_pairs = 4; //saved
77 bool svpwm = true; // enable space vector PWM for 3 phase motors
78};
79
85 int adcOffset = 0;
86 float thermistor_R2 = 1500;
87 float thermistor_R = 22000;
88 float thermistor_Beta = 4300;
89 bool temperatureEnabled = false; // Enables temperature readings
90 float temp_limit = 90;
91 float currentScaler = 2.5 / (0x7fff * 60.0 * 0.0015); // Converts from adc counts to current in Amps
92 uint16_t brakeLimLow = 50700;
93 uint16_t brakeLimHigh = 50900;
94 float vmScaler = (2.5 / 0x7fff) * ((1.5+71.5)/1.5);
95 float vSenseMult = VOLTAGE_MULT_DEFAULT;
96 float clockfreq = 25e6;
97 uint8_t bbm = 20;
100 // Todo restrict allowed motor and encoder types
101};
102
103
104// Mapping of bits in status flag register and mask
107 uint32_t pid_x_target_limit : 1,
135 ENC_N : 1,
139 };
140 uint32_t asInt;
142};
143
144
145// Basic failsafe hardware boot config for inits
149 uint16_t pwmcnt = 4095; // PWM resolution is 12 bit internally
150 uint8_t bbmL = 50;
151 uint8_t bbmH = 50;
152 uint16_t mdecA = 660; // 334 default. 331 recommended by datasheet,662 double. 660 lowest noise
153 uint16_t mdecB = 331; // Encoder ADC fast rate recommended
154 uint32_t mclkA = 0x20000000; //0x20000000 default
155 uint32_t mclkB = 0x20000000; // For AENC
156 uint16_t adc_I0_offset = 33415;
157 uint16_t adc_I1_offset = 33415;
158 uint16_t adc_I0_scale = 256;
159 uint16_t adc_I1_scale = 256;
160 bool canChangeHwType = true; // Allows changing the hardware version by commands
161 bool encoderReversed = false;
162 bool combineEncoder = false;
163 bool invertForce = false;
165};
166
168 uint16_t fluxI = 800;
169 uint16_t fluxP = 700;
170 uint16_t torqueI = 800;
171 uint16_t torqueP = 700;
172 uint16_t velocityI = 0;
173 uint16_t velocityP = 256;
174 uint16_t positionI = 0;
175 uint16_t positionP = 128;
176 bool sequentialPI = true; // Advanced pid
177};
178
180 uint16_t pid_torque_flux_ddt = 32767;
181 uint16_t pid_uq_ud = 30000;
182 uint16_t pid_torque_flux = 32767;
183 uint32_t pid_acc_lim = 2147483647;
184 uint32_t pid_vel_lim = 2147483647;
185 int32_t pid_pos_low = -2147483647;
186 int32_t pid_pos_high = 2147483647;
187};
188
189struct TMC4671PidPrecision{ // Switch between Q8.8 (false) and Q4.12 (true) precision for pid controller
190 bool current_I = false;
191 bool current_P = false;
192 bool velocity_I = false;
193 bool velocity_P = false;
194 bool position_I = false;
195 bool position_P = false;
196};
197
199 uint16_t mconf = ADR_TMC1_MOTCONF;
200 uint16_t cpr = ADR_TMC1_CPR;
201 uint16_t encA = ADR_TMC1_ENCA;
202 uint16_t offsetFlux = ADR_TMC1_OFFSETFLUX;
203 uint16_t torque_p = ADR_TMC1_TORQUE_P;
204 uint16_t torque_i = ADR_TMC1_TORQUE_I;
205 uint16_t flux_p = ADR_TMC1_FLUX_P;
206 uint16_t flux_i = ADR_TMC1_FLUX_I;
207 uint16_t ADC_i0_ofs = ADR_TMC1_ADC_I0_OFS;
208 uint16_t ADC_i1_ofs = ADR_TMC1_ADC_I1_OFS;
209 uint16_t encOffset = ADR_TMC1_ENC_OFFSET;
210 uint16_t phieOffset = ADR_TMC1_PHIE_OFS;
211 uint16_t torqueFilter = ADR_TMC1_TRQ_FILT;
212};
213
215 uint32_t cpr = 10000;
216 bool apol = true;
217 bool bpol = true;
218 bool npol = true;
219 bool rdir = false;
220 bool ab_as_n = false;
221 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
222 int16_t phiEoffset = 0; // Depends on phiM!
223 int16_t phiMoffset = 0;
224 int16_t posOffsetFromIndex = 0; // offset position to load after homing
225 bool useIndex = false;
226
227};
228
230 uint32_t cpr = 1; //0x40
231 int16_t phiAoffset = 0; // Main offset. 0x3e
232
233 int16_t phiEoffset = 0; // 0x45&0xffff
234 int16_t phiMoffset = 0; // 0x45&0xffff0000
235
236 uint16_t AENC0_offset = 0x7fff;
237 int16_t AENC0_scale = 256;
238 uint16_t AENC1_offset = 0x7fff;
239 int16_t AENC1_scale = 256;
240 uint16_t AENC2_offset = 20000;
241 int16_t AENC2_scale = 256;
242
243 int16_t nMask = 0; // 0x3c & 0xffff0000
244 int16_t nThreshold = 0; // 0x3c & 0xffff
245 // 0x3b
246 bool uvwmode = false; // 0 = sincos, 1 = uvw
247 bool rdir = false;
248
249};
250
252 bool hallEnabled = false;
253 bool polarity = true;
254 bool interpolation = true;
255 bool direction = false;
256 bool filter = true;
257 uint16_t blank = 100;
258 int16_t pos0 = 0;
259 int16_t pos60 = 10922;
260 int16_t pos120 = 21845;
261 int16_t pos180 = -32768;
262 int16_t pos240 = -21846;
263 int16_t pos300 = -10923;
264 int16_t phiEoffset = 0;
265 int16_t phiMoffset = 0;
266 uint16_t dPhiMax = 10922;
267};
268
269enum class TMCbiquadpreset : uint8_t {none=0,lowpass=1,notch=2,peak=3};
270// Use TMCL IDE with TMC4671 devkit to generate values
272 int32_t a1 = 0;
273 int32_t a2 = 0;
274 int32_t b0 = 0;
275 int32_t b1 = 0;
276 int32_t b2 = 0;
277 bool enable = false;
278};
281 biquad_constant_t params = {1000,50}; // Q = 1/100 for lowpass and 1/10 for notch and peak mode
282 float gain = 10.0; // Gain for peak mode
283};
284
286public:
287 TMC4671Biquad(bool enable = false){
289 }
291 TMC4671Biquad(const Biquad& bq,bool enable = true){
292 // 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
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));
298 this->params.enable = bq.getFc() > 0 ? enable : false;
299 }
300 void enable(bool enable){
302 }
303
305};
306
307// Stores currently active filters
313};
314
315
316
317class TMC4671 :
318 public MotorDriver, public PersistentStorage, public Encoder,
320#ifdef TIM_TMC
321 ,public TimerHandler
322#endif
323{
324
325 enum class TMC4671_commands : uint32_t{
331 };
332
333#ifdef TMCDEBUG
334friend class TMCDebugBridge;
335#endif
336
337public:
338
340 const ClassIdentifier getInfo();
342
343 static TMC4671MotConf decodeMotFromInt(uint16_t val);
344 static uint16_t encodeMotToInt(TMC4671MotConf mconf);
345
346
347 TMC4671(SPIPort& spiport,OutputPin cspin,uint8_t address=1);
348
349 void setHwType(TMC_HW_Ver type);
350
351 void setAddress(uint8_t address);
352
353 uint8_t getSpiAddr();
354 bool setSpiAddr(uint8_t chan);
355 virtual ~TMC4671();
356
358
359 bool initialize();
360 void initializeWithPower();
361
362 void Run();
363 bool motorReady();
364
365 bool hasPower();
366 int32_t getTmcVM();
367 bool isSetUp();
368
369 uint32_t readReg(uint8_t reg);
370 void writeReg(uint8_t reg,uint32_t dat);
371 void writeRegAsync(uint8_t reg,uint32_t dat);
372 void updateReg(uint8_t reg,uint32_t dat,uint32_t mask,uint8_t shift);
373 //void SpiTxCplt(SPI_HandleTypeDef *hspi);
374
375 void setMotorType(MotorType motor,uint16_t poles);
376
377 void runOpenLoop(uint16_t ud,uint16_t uq,int32_t speed,int32_t accel,bool torqueMode = false);
378 void setOpenLoopSpeedAccel(int32_t speed,uint32_t accel);
379
380 // Setup routines
381 bool calibrateAdcOffset(uint16_t time = 500);
382 void setup_ABN_Enc(TMC4671ABNConf encconf);
383 void setup_AENC(TMC4671AENCConf encconf);
385 void bangInitEnc(int16_t power);
386 void estimateABNparams();
387 void estimateExtEnc();
388 bool checkEncoder();
389 void calibrateAenc();
390 void calibrateEncoder();
391
393 uint32_t getEncCpr();
394
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);
397
398 void setupFeedForwardTorque(int32_t gain, int32_t constant);
399 void setupFeedForwardVelocity(int32_t gain, int32_t constant);
400 void setFFMode(FFMode mode);
401 void setSequentialPI(bool sequential);
402
403 void setBiquadFlux(const TMC4671Biquad &filter);
404 void setBiquadTorque(const TMC4671Biquad &filter);
405 void setBiquadPos(const TMC4671Biquad &filter);
406 void setBiquadVel(const TMC4671Biquad &filter);;
408
409 bool pingDriver();
410 std::pair<uint32_t,std::string> getTmcType();
411
412 void changeState(TMC_ControlState newState,bool force = false);
413
415 void setExternalEncoderAllowed(bool allow);
416
417 float getPwmFreq();
418 void setPwmFreq(float freq);
419
420 void setBBM(uint8_t bbml,uint8_t bbmh);
421
422
423#ifdef TIM_TMC
424 void timerElapsed(TIM_HandleTypeDef* htim);
425#endif
426
427 void setPositionExt(int32_t pos); // External position register (For external encoders. Choose external phiE).
428
429 void stopMotor();
430 void startMotor();
431
432 void emergencyStop(bool reset);
433 bool emergency = false;
434 bool estopTriggered = false;
435 void turn(int16_t power);
436 int16_t nextFlux = 0;
437 int16_t idleFlux = 0;
438 uint16_t maxOffsetFlux = 0;
439
440 int16_t bangInitPower = 5000; // Default current in setup routines
441
442 int16_t controlFluxDissipate();
443 const float fluxDissipationLimit = 1000;
444
445 void setTorque(int16_t torque);
446
447 void setTargetPos(int32_t pos);
448 int32_t getTargetPos();
449 void setTargetVelocity(int32_t vel);
450 int32_t getTargetVelocity();
451 int32_t getVelocity();
452 int16_t getTorque();
453 void setFlux(int16_t flux);
454 int16_t getFlux();
455 void setFluxTorque(int16_t flux, int16_t torque);
456 void setFluxTorqueFF(int16_t flux, int16_t torque);
457 std::pair<int32_t,int32_t> getActualTorqueFlux();
458 int32_t getActualFlux();
459 int32_t getActualTorque();
460
461 void rampFlux(uint16_t target,uint16_t time_ms);
462
463 bool checkAdc();
464
465 float getTemp();
467
468 void setPhiEtype(PhiE type);
470 void setPhiE_ext(int16_t phiE);
471 int16_t getPhiE();
473 int16_t getPhiE_Enc();
474
475 void setGpioMode(TMC_GpioMode mode);
476 uint8_t getGpioPins();
477 void setGpioPins(uint8_t pins);
478
479 void setPosSel(PosSelection psel);
480 void setVelSel(VelSelection vsel,uint8_t mode = 0);
481
482 void setMotionMode(MotionMode mode,bool force = false); // force true sets it immediately. use false to change mode when tmc is ready on startMotor
484
485 void setUdUq(int16_t ud,int16_t uq);
486 void setBrakeLimits(uint16_t low, uint16_t high); // Raw brake resistor limits (see tmc reg 0x75)
487
488 bool reachedPosition(uint16_t tolerance);
489
490 // Pids
491 void setPids(TMC4671PIDConf pids);
494
496 void setLimits(TMC4671Limits limits);
498
499 void setUqUdLimit(uint16_t limit);
500 void setTorqueLimit(uint16_t limit);
501
504
508
509 //Encoder
510 Encoder* getEncoder() override;
511 void setEncoder(std::shared_ptr<Encoder>& encoder) override;
512 bool hasIntegratedEncoder() override;
513 inline bool usingExternalEncoder(){return conf.motconf.enctype == EncoderType_TMC::ext && drvEncoder != nullptr && drvEncoder->getEncoderType() != EncoderType::NONE;}
514 int32_t getPos() override;
515 int32_t getPosAbs() override;
516 void setPos(int32_t pos) override;
517 void setTmcPos(int32_t pos);
518 //uint32_t getPosCpr();
519 uint32_t getCpr();
520 void setCpr(uint32_t cpr);
521 EncoderType getEncoderType() override;
522 uint32_t posToEnc(uint32_t pos);
523 uint32_t encToPos(uint32_t enc);
524
525 void exti(uint16_t GPIO_Pin);
526
527
528 bool findEncoderIndex(int32_t speed=10, uint16_t power=2500,bool offsetPhiM=false,bool zeroCount=false);
529 bool autohome();
530 void zeroAbnUsingPhiM(bool offsetPhiE=false);
531
532 StatusFlags readFlags(bool maskedOnly = true);
533 void setStatusMask(StatusFlags mask);
534 void setStatusMask(uint32_t mask); // Mask for status pin.
535 void setStatusFlags(uint32_t flags);
536 void setStatusFlags(StatusFlags flags);
537 void setEncoderIndexFlagEnabled(bool enabled,bool zeroEncoder = false);
538 void statusCheck();
542
543 void saveFlash() override;
544 void restoreFlash() override;
546
547 uint16_t encodeEncHallMisc();
548 void restoreEncHallMisc(uint16_t val);
549
550 bool allowSlowSPI = true; // For engineering sample
551
552 void beginSpiTransfer(SPIPort* port);
553 void endSpiTransfer(SPIPort* port);
554 //void spiTxCompleted(SPIPort* port);
555
556 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies);
557 void registerCommands();
558
559 virtual std::string getHelpstring(){return "TMC4671 interface";}
560
561protected:
563 public:
565 //~TMC_ExternalEncoderUpdateThread();
566 void Run();
567 void updateFromIsr();
568
569 private:
571 };
572
573private:
574 OutputPin enablePin = OutputPin(*DRV_ENABLE_GPIO_Port,DRV_ENABLE_Pin);
578 const Error estopError = Error(ErrorCode::emergencyStop, ErrorType::critical, "TMC emergency stop triggered");
579
586
588
589 bool ES_TMCdetected = false; // ES versions are not made anymore and have some critical issues
590
591 bool encoderAligned = false;
592 //bool encoderIndexFound = false;
593 bool initialized = false; // Init ran once
594 bool powerInitialized = false;
595 bool adcCalibrated = false;
596 bool adcSettingsStored = false;
598 volatile bool encoderIndexHitFlag = false;
601 bool phiErestored = false;
602 bool encHallRestored = false;
603 //int32_t phiEOffsetRestored = 0; //-0x8000 to 0x7fff
605
606 int16_t externalEncoderPhieOffset = 0; // PhiE offset for external encoders
608
609 bool allowStateChange = false;
611
612 uint8_t enc_retry = 0;
613 uint8_t enc_retry_max = 3;
614
615 uint32_t lastStatTime = 0;
616
617 uint8_t spi_buf[5] = {0};
618
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);// 100MHz/maxcnt+1
621 void setPwm(TMC_PwmMode val);// pwm mode
622 void setPwmMaxCnt(uint16_t maxcnt);
623 void setSvPwm(bool enable);
624 void encInit();
625 void encoderIndexHit();
626 void saveAdcParams();
627 void calibFailCb();
628
629
630// state machine
631// void ABN_init();
632// void AENC_init();
633
634 void encoderInit();
635 void errorCallback(const Error &error, bool cleared);
636 bool pidAutoTune();
637
638 uint32_t initTime = 0;
639 bool manualEncAlign = false;
640 bool spiActive = false; // Flag for tx interrupt that the transfer was started by this instance
641
642
645 const float fluxFilterFreq = 350.0;
646
647 // External encoder timer fires interrupts to trigger a new commutation position update
648#ifdef TIM_TMC
649
650 TIM_HandleTypeDef* externalEncoderTimer = &TIM_TMC;
651 std::unique_ptr<TMC_ExternalEncoderUpdateThread> extEncUpdater = nullptr;
652#else
653 TIM_HandleTypeDef* externalEncoderTimer = nullptr;
654#endif
655 void setUpExtEncTimer();
656};
657
658
659
660class TMC_1 : public TMC4671 {
661public:
662 TMC_1() : TMC4671{motor_spi,*motor_spi.getCsPin(0),1} {}
663
664 //const ClassIdentifier getInfo() override;
665 static bool isCreatable();
667};
668
669class TMC_2 : public TMC4671 {
670public:
671 TMC_2() : TMC4671{motor_spi,*motor_spi.getCsPin(1),2} {}
672
673 //const ClassIdentifier getInfo() override;
674 static bool isCreatable();
676};
677#endif
678#endif /* TMC4671_H_ */
679
680
ClassType
Definition: ClassIDs.h:12
CommandStatus
EncoderType
Definition: Encoder.h:27
@ encoderIndexMissed
@ tmcCommunicationError
TMC_HW_Ver
Definition: TMC4671.h:58
MotionMode
Definition: TMC4671.h:51
EncoderType_TMC
Definition: TMC4671.h:55
SPI_HandleTypeDef HSPIDRV
MotorType
Definition: TMC4671.h:49
FFMode
Definition: TMC4671.h:52
VelSelection
Definition: TMC4671.h:54
TMCbiquadpreset
Definition: TMC4671.h:269
TMC_GpioMode
Definition: TMC4671.h:47
TIM_HandleTypeDef TIM_TMC
TMC_PwmMode
Definition: TMC4671.h:43
const std::vector< std::pair< TMC_HW_Ver, std::string > > tmcHwVersionNames
Definition: TMC4671.h:60
TMC_ControlState
Definition: TMC4671.h:41
PhiE
Definition: TMC4671.h:50
@ extEncoder
@ openloop
TMC_StartupType
Definition: TMC4671.h:45
PosSelection
Definition: TMC4671.h:53
Definition: Filters.h:31
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:34
float a2
Definition: Filters.h:48
uint32_t cpr
Definition: Encoder.h:53
std::shared_ptr< Encoder > drvEncoder
Definition: MotorDriver.h:46
Definition: SPI.h:100
Definition: SPI.h:43
void enable(bool enable)
Definition: TMC4671.h:300
TMC4671Biquad_t params
Definition: TMC4671.h:304
TMC4671Biquad(bool enable=false)
Definition: TMC4671.h:287
TMC4671Biquad(const Biquad &bq, bool enable=true)
Definition: TMC4671.h:291
TMC4671Biquad(const TMC4671Biquad_t bq)
Definition: TMC4671.h:290
void writeReg(uint8_t reg, uint32_t dat)
Definition: TMC4671.cpp:2502
static ClassIdentifier info
Definition: TMC4671.h:339
int16_t bangInitPower
Definition: TMC4671.h:440
void beginSpiTransfer(SPIPort *port)
Definition: TMC4671.cpp:2537
void setFluxTorque(int16_t flux, int16_t torque)
Definition: TMC4671.cpp:2049
void calibrateEncoder()
Definition: TMC4671.cpp:648
void saveFlash() override
Definition: TMC4671.cpp:107
void setBBM(uint8_t bbml, uint8_t bbmh)
Definition: TMC4671.cpp:2385
int16_t controlFluxDissipate()
Definition: TMC4671.cpp:1710
int32_t getTargetPos()
Definition: TMC4671.cpp:903
int16_t externalEncoderPhieOffset
Definition: TMC4671.h:606
PhiE getPhiEtype()
Definition: TMC4671.cpp:1595
bool pidAutoTune()
Definition: TMC4671.cpp:666
bool adcSettingsStored
Definition: TMC4671.h:596
TMC_ControlState getState()
Definition: TMC4671.cpp:776
TMC4671Limits curLimits
Definition: TMC4671.h:495
int16_t getFlux()
Definition: TMC4671.cpp:2046
void setExternalEncoderAllowed(bool allow)
Definition: TMC4671.cpp:1993
bool externalEncoderAllowed()
Definition: TMC4671.cpp:2006
TMC4671PIDConf getPids()
Definition: TMC4671.cpp:2089
bool allowExternalEncoder
Definition: TMC4671.h:607
bool autohome()
Definition: TMC4671.cpp:762
const ClassType getClassType() override
Definition: TMC4671.h:341
bool encHallRestored
Definition: TMC4671.h:602
void statusCheck()
Definition: TMC4671.cpp:2577
void startMotor()
Definition: TMC4671.cpp:1661
const Error estopError
Definition: TMC4671.h:578
bool spiActive
Definition: TMC4671.h:640
void setLimits(TMC4671Limits limits)
Definition: TMC4671.cpp:2126
void runOpenLoop(uint16_t ud, uint16_t uq, int32_t speed, int32_t accel, bool torqueMode=false)
Definition: TMC4671.cpp:1625
bool hasIntegratedEncoder() override
Definition: TMC4671.cpp:1856
volatile bool encoderIndexHitFlag
Definition: TMC4671.h:598
TMC_ControlState state
Definition: TMC4671.h:580
uint32_t initTime
Definition: TMC4671.h:638
void setupFeedForwardVelocity(int32_t gain, int32_t constant)
Definition: TMC4671.cpp:1973
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
Definition: TMC4671.cpp:2890
uint32_t getCpr()
Definition: TMC4671.cpp:1909
uint8_t calibrationFailCount
Definition: TMC4671.h:604
bool fullCalibrationInProgress
Definition: TMC4671.h:600
void setEncoderIndexFlagEnabled(bool enabled, bool zeroEncoder=false)
Definition: TMC4671.cpp:877
void initializeWithPower()
Definition: TMC4671.cpp:385
bool zeroEncoderOnIndexHit
Definition: TMC4671.h:599
void setPos(int32_t pos) override
Definition: TMC4671.cpp:1864
void bangInitEnc(int16_t power)
Definition: TMC4671.cpp:957
bool reachedPosition(uint16_t tolerance)
Definition: TMC4671.cpp:792
int16_t nextFlux
Definition: TMC4671.h:436
TMC4671_commands
Definition: TMC4671.h:325
void setPids(TMC4671PIDConf pids)
Definition: TMC4671.cpp:2080
MotionMode lastMotionMode
Definition: TMC4671.h:584
const float fluxDissipationLimit
Definition: TMC4671.h:443
TMC4671ABNConf abnconf
Definition: TMC4671.h:505
TMC_ControlState requestedState
Definition: TMC4671.h:582
bool usingExternalEncoder()
Definition: TMC4671.h:513
void setUdUq(int16_t ud, int16_t uq)
Definition: TMC4671.cpp:1646
virtual std::string getHelpstring()
Definition: TMC4671.h:559
StatusFlags statusMask
Definition: TMC4671.h:541
void changeState(TMC_ControlState newState, bool force=false)
Definition: TMC4671.cpp:780
int16_t idleFlux
Definition: TMC4671.h:437
const Error lowVoltageError
Definition: TMC4671.h:576
void setVelSel(VelSelection vsel, uint8_t mode=0)
Definition: TMC4671.cpp:1764
void setEncoderType(EncoderType_TMC type)
Definition: TMC4671.cpp:1513
uint16_t maxOffsetFlux
Definition: TMC4671.h:438
TMC4671PIDConf curPids
Definition: TMC4671.h:493
TIM_HandleTypeDef * externalEncoderTimer
Definition: TMC4671.h:650
bool allowSlowSPI
Definition: TMC4671.h:550
TMC4671BiquadFilters curFilters
Definition: TMC4671.h:644
MotionMode getMotionMode()
Definition: TMC4671.cpp:1614
bool ES_TMCdetected
Definition: TMC4671.h:589
TMC_ControlState laststate
Definition: TMC4671.h:581
void setBrakeLimits(uint16_t low, uint16_t high)
Definition: TMC4671.cpp:2267
TMC4671PidPrecision pidPrecision
Definition: TMC4671.h:503
bool recalibrationRequired
Definition: TMC4671.h:610
uint16_t encodeEncHallMisc()
Definition: TMC4671.cpp:2631
void setPhiE_ext(int16_t phiE)
Definition: TMC4671.cpp:930
int32_t getTargetVelocity()
Definition: TMC4671.cpp:919
void calibFailCb()
Definition: TMC4671.cpp:1420
void timerElapsed(TIM_HandleTypeDef *htim)
Definition: TMC4671.cpp:3205
bool emergency
Definition: TMC4671.h:433
void setStatusFlags(uint32_t flags)
Definition: TMC4671.cpp:2566
void setFluxTorqueFF(int16_t flux, int16_t torque)
Definition: TMC4671.cpp:2056
void setBiquadVel(const TMC4671Biquad &filter)
Definition: TMC4671.cpp:2194
void restoreEncHallMisc(uint16_t val)
Definition: TMC4671.cpp:2657
TMC4671MainConfig conf
Definition: TMC4671.h:357
bool phiErestored
Definition: TMC4671.h:601
void setUpExtEncTimer()
Definition: TMC4671.cpp:3218
static uint16_t encodeMotToInt(TMC4671MotConf mconf)
Definition: TMC4671.cpp:2623
virtual ~TMC4671()
Definition: TMC4671.cpp:81
void setTorque(int16_t torque)
Definition: TMC4671.cpp:2030
bool pingDriver()
Definition: TMC4671.cpp:223
bool calibrateAdcOffset(uint16_t time=500)
Definition: TMC4671.cpp:1359
int32_t getPosAbs() override
Definition: TMC4671.cpp:1893
int32_t getTmcVM()
Definition: TMC4671.cpp:231
bool setSpiAddr(uint8_t chan)
void setStatusMask(StatusFlags mask)
Definition: TMC4671.cpp:2558
void zeroAbnUsingPhiM(bool offsetPhiE=false)
Definition: TMC4671.cpp:802
bool isSetUp()
Definition: TMC4671.cpp:198
void encoderIndexHit()
Definition: TMC4671.cpp:2605
int16_t getPhiE()
Definition: TMC4671.cpp:946
void setSequentialPI(bool sequential)
Definition: TMC4671.cpp:1988
TMC4671AENCConf aencconf
Definition: TMC4671.h:507
TMC4671HALLConf hallconf
Definition: TMC4671.h:506
MotionMode curMotionMode
Definition: TMC4671.h:583
const float fluxFilterFreq
Definition: TMC4671.h:645
const Error indexNotHitError
Definition: TMC4671.h:575
void setup_AENC(TMC4671AENCConf encconf)
Definition: TMC4671.cpp:1313
Encoder * getEncoder() override
Definition: TMC4671.cpp:1840
void setGpioPins(uint8_t pins)
Definition: TMC4671.cpp:1808
int32_t getActualFlux()
Definition: TMC4671.cpp:2471
int16_t getTorque()
Definition: TMC4671.cpp:2036
bool encoderAligned
Definition: TMC4671.h:591
void setMotionMode(MotionMode mode, bool force=false)
Definition: TMC4671.cpp:1603
uint32_t lastStatTime
Definition: TMC4671.h:615
void setTargetPos(int32_t pos)
Definition: TMC4671.cpp:896
void setMotorType(MotorType motor, uint16_t poles)
Definition: TMC4671.cpp:2014
int32_t getPos() override
Definition: TMC4671.cpp:1887
void rampFlux(uint16_t target, uint16_t time_ms)
Definition: TMC4671.cpp:2066
void encInit()
bool checkAdc()
Definition: TMC4671.cpp:374
uint8_t spi_buf[5]
Definition: TMC4671.h:617
void setPwm(uint8_t val, uint16_t maxcnt, uint8_t bbmL, uint8_t bbmH)
Definition: TMC4671.cpp:2392
bool motorReady()
Definition: TMC4671.cpp:423
bool checkEncoder()
Definition: TMC4671.cpp:1167
void setGpioMode(TMC_GpioMode mode)
Definition: TMC4671.cpp:1774
void endSpiTransfer(SPIPort *port)
Definition: TMC4671.cpp:2540
void errorCallback(const Error &error, bool cleared)
Definition: TMC4671.cpp:3252
bool adcCalibrated
Definition: TMC4671.h:595
uint8_t enc_retry
Definition: TMC4671.h:612
void calibrateAenc()
Definition: TMC4671.cpp:1046
bool motorEnabledRequested
Definition: TMC4671.h:597
bool manualEncAlign
Definition: TMC4671.h:639
uint8_t enc_retry_max
Definition: TMC4671.h:613
void setHwType(TMC_HW_Ver type)
Definition: TMC4671.cpp:2692
void setTorqueFilter(TMC4671Biquad_conf &conf)
Definition: TMC4671.cpp:2236
void emergencyStop(bool reset)
Definition: TMC4671.cpp:1680
uint8_t getGpioPins()
Definition: TMC4671.cpp:1800
void turn(int16_t power)
Definition: TMC4671.cpp:1724
float getTemp()
Definition: TMC4671.cpp:349
std::pair< int32_t, int32_t > getActualTorqueFlux()
Definition: TMC4671.cpp:2461
int16_t getPhiE_Enc()
Definition: TMC4671.cpp:1150
void setup_HALL(TMC4671HALLConf hallconf)
Definition: TMC4671.cpp:1330
TMC_StartupType startupType
Definition: TMC4671.h:587
void setTmcPos(int32_t pos)
Definition: TMC4671.cpp:1882
uint32_t getEncCpr()
Definition: TMC4671.cpp:1573
void setFFMode(FFMode mode)
Definition: TMC4671.cpp:1980
void setTargetVelocity(int32_t vel)
Definition: TMC4671.cpp:912
void setupFeedForwardTorque(int32_t gain, int32_t constant)
Definition: TMC4671.cpp:1967
bool hasPower()
Definition: TMC4671.cpp:192
void registerCommands()
Definition: TMC4671.cpp:2842
void setPhiEtype(PhiE type)
Definition: TMC4671.cpp:1585
void estimateExtEnc()
Definition: TMC4671.cpp:2330
TMC4671(SPIPort &spiport, OutputPin cspin, uint8_t address=1)
Definition: TMC4671.cpp:49
void setOpenLoopSpeedAccel(int32_t speed, uint32_t accel)
Definition: TMC4671.cpp:1619
TMC4671Limits getLimits()
Definition: TMC4671.cpp:2137
void restoreFlash() override
Definition: TMC4671.cpp:145
void updateReg(uint8_t reg, uint32_t dat, uint32_t mask, uint8_t shift)
Definition: TMC4671.cpp:2530
void setup_ABN_Enc(TMC4671ABNConf encconf)
Definition: TMC4671.cpp:1289
void setAdcOffset(uint32_t adc_I0_offset, uint32_t adc_I1_offset)
Definition: TMC4671.cpp:1951
void setPwmMaxCnt(uint16_t maxcnt)
Definition: TMC4671.cpp:2425
bool estopTriggered
Definition: TMC4671.h:434
void setCpr(uint32_t cpr)
Definition: TMC4671.cpp:1920
void stopMotor()
Definition: TMC4671.cpp:1650
const Error communicationError
Definition: TMC4671.h:577
uint8_t getSpiAddr()
void setBiquadTorque(const TMC4671Biquad &filter)
Definition: TMC4671.cpp:2215
bool powerInitialized
Definition: TMC4671.h:594
void setBiquadFlux(const TMC4671Biquad &filter)
Definition: TMC4671.cpp:2152
uint32_t posToEnc(uint32_t pos)
Definition: TMC4671.cpp:1938
void Run()
Definition: TMC4671.cpp:427
StatusFlags readFlags(bool maskedOnly=true)
Definition: TMC4671.cpp:2549
void setUqUdLimit(uint16_t limit)
Definition: TMC4671.cpp:2102
std::pair< uint32_t, std::string > getTmcType()
Definition: TMC4671.cpp:1817
float getPwmFreq()
Definition: TMC4671.cpp:2416
void setAddress(uint8_t address)
Definition: TMC4671.cpp:93
void exti(uint16_t GPIO_Pin)
Definition: TMC4671.cpp:2599
void initAdc(uint16_t mdecA, uint16_t mdecB, uint32_t mclkA, uint32_t mclkB)
Definition: TMC4671.cpp:2444
TMC4671Biquad_conf torqueFilterConf
Definition: TMC4671.h:643
void setPosSel(PosSelection psel)
Definition: TMC4671.cpp:1755
void setPwmFreq(float freq)
Definition: TMC4671.cpp:2436
bool allowStateChange
Definition: TMC4671.h:609
void writeRegAsync(uint8_t reg, uint32_t dat)
Definition: TMC4671.cpp:2514
int16_t getPhiEfromExternalEncoder()
Definition: TMC4671.cpp:934
std::unique_ptr< TMC_ExternalEncoderUpdateThread > extEncUpdater
Definition: TMC4671.h:651
void setSvPwm(bool enable)
Definition: TMC4671.cpp:2403
void estimateABNparams()
Definition: TMC4671.cpp:2277
bool initialize()
Definition: TMC4671.cpp:244
bool flagCheckInProgress
Definition: TMC4671.h:539
bool initialized
Definition: TMC4671.h:593
TMC4671FlashAddrs flashAddrs
Definition: TMC4671.h:545
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
Definition: TMC4671.cpp:87
void setFlux(int16_t flux)
Definition: TMC4671.cpp:2040
void setPidPrecision(TMC4671PidPrecision setting)
Definition: TMC4671.cpp:2113
EncoderType getEncoderType() override
Definition: TMC4671.cpp:1942
MotionMode nextMotionMode
Definition: TMC4671.h:585
int32_t getVelocity()
Definition: TMC4671.cpp:922
uint32_t readReg(uint8_t reg)
Definition: TMC4671.cpp:2488
int32_t getActualTorque()
Definition: TMC4671.cpp:2480
void setBiquadPos(const TMC4671Biquad &filter)
Definition: TMC4671.cpp:2173
void setAdcScale(uint32_t adc_I0_scale, uint32_t adc_I1_scale)
Definition: TMC4671.cpp:1959
StatusFlags statusFlags
Definition: TMC4671.h:540
bool findEncoderIndex(int32_t speed=10, uint16_t power=2500, bool offsetPhiM=false, bool zeroCount=false)
Definition: TMC4671.cpp:823
void setEncoder(std::shared_ptr< Encoder > &encoder) override
Definition: TMC4671.cpp:1848
uint32_t encToPos(uint32_t enc)
Definition: TMC4671.cpp:1935
void saveAdcParams()
Definition: TMC4671.cpp:135
void encoderInit()
Definition: TMC4671.cpp:1429
void setPositionExt(int32_t pos)
Definition: TMC4671.cpp:926
static TMC4671MotConf decodeMotFromInt(uint16_t val)
Definition: TMC4671.cpp:2614
void setTorqueLimit(uint16_t limit)
Definition: TMC4671.cpp:2107
OutputPin enablePin
Definition: TMC4671.h:574
Definition: TMC4671.h:660
static ClassIdentifier info
Definition: TMC4671.h:666
static bool isCreatable()
Definition: TMC4671.cpp:25
TMC_1()
Definition: TMC4671.h:662
Definition: TMC4671.h:669
TMC_2()
Definition: TMC4671.h:671
static bool isCreatable()
Definition: TMC4671.cpp:36
static ClassIdentifier info
Definition: TMC4671.h:675
SPIPort motor_spi
uint32_t pid_v_target_ddt_limit
Definition: TMC4671.h:112
uint32_t pid_iq_target_ddt_limit
Definition: TMC4671.h:120
uint32_t ipark_cirlim_limit_u_d
Definition: TMC4671.h:123
uint32_t pid_id_target_ddt_limit
Definition: TMC4671.h:116
uint32_t pid_iq_target_limit
Definition: TMC4671.h:119
uint32_t pid_id_errsum_limit
Definition: TMC4671.h:117
uint32_t pid_id_output_limit
Definition: TMC4671.h:118
uint32_t ipark_cirlim_limit_u_q
Definition: TMC4671.h:124
uint32_t pid_iq_errsum_limit
Definition: TMC4671.h:121
uint32_t ipark_cirlim_limit_u_r
Definition: TMC4671.h:125
uint32_t pid_id_target_limit
Definition: TMC4671.h:115
uint32_t pid_x_target_ddt_limit
Definition: TMC4671.h:108
uint32_t pid_iq_output_limit
Definition: TMC4671.h:122
int16_t phiEoffset
Definition: TMC4671.h:222
uint32_t cpr
Definition: TMC4671.h:215
bool ab_as_n
Definition: TMC4671.h:220
int16_t posOffsetFromIndex
Definition: TMC4671.h:224
bool latch_on_N
Definition: TMC4671.h:221
bool useIndex
Definition: TMC4671.h:225
int16_t phiMoffset
Definition: TMC4671.h:223
int16_t AENC0_scale
Definition: TMC4671.h:237
int16_t phiMoffset
Definition: TMC4671.h:234
int16_t nThreshold
Definition: TMC4671.h:244
uint16_t AENC0_offset
Definition: TMC4671.h:236
int16_t phiEoffset
Definition: TMC4671.h:233
int16_t AENC2_scale
Definition: TMC4671.h:241
uint32_t cpr
Definition: TMC4671.h:230
uint16_t AENC1_offset
Definition: TMC4671.h:238
int16_t phiAoffset
Definition: TMC4671.h:231
uint16_t AENC2_offset
Definition: TMC4671.h:240
int16_t nMask
Definition: TMC4671.h:243
int16_t AENC1_scale
Definition: TMC4671.h:239
TMCbiquadpreset mode
Definition: TMC4671.h:280
biquad_constant_t params
Definition: TMC4671.h:281
int32_t b2
Definition: TMC4671.h:276
int32_t b0
Definition: TMC4671.h:274
int32_t b1
Definition: TMC4671.h:275
int32_t a1
Definition: TMC4671.h:272
int32_t a2
Definition: TMC4671.h:273
TMC4671Biquad pos
Definition: TMC4671.h:311
TMC4671Biquad torque
Definition: TMC4671.h:309
TMC4671Biquad flux
Definition: TMC4671.h:310
TMC4671Biquad vel
Definition: TMC4671.h:312
uint16_t encA
Definition: TMC4671.h:201
uint16_t phieOffset
Definition: TMC4671.h:210
uint16_t ADC_i0_ofs
Definition: TMC4671.h:207
uint16_t offsetFlux
Definition: TMC4671.h:202
uint16_t encOffset
Definition: TMC4671.h:209
uint16_t torqueFilter
Definition: TMC4671.h:211
uint16_t flux_p
Definition: TMC4671.h:205
uint16_t torque_p
Definition: TMC4671.h:203
uint16_t torque_i
Definition: TMC4671.h:204
uint16_t cpr
Definition: TMC4671.h:200
uint16_t flux_i
Definition: TMC4671.h:206
uint16_t ADC_i1_ofs
Definition: TMC4671.h:208
uint16_t mconf
Definition: TMC4671.h:199
int16_t phiEoffset
Definition: TMC4671.h:264
int16_t phiMoffset
Definition: TMC4671.h:265
int16_t pos120
Definition: TMC4671.h:260
uint16_t dPhiMax
Definition: TMC4671.h:266
int16_t pos0
Definition: TMC4671.h:258
int16_t pos60
Definition: TMC4671.h:259
uint16_t blank
Definition: TMC4671.h:257
bool direction
Definition: TMC4671.h:255
int16_t pos240
Definition: TMC4671.h:262
int16_t pos300
Definition: TMC4671.h:263
int16_t pos180
Definition: TMC4671.h:261
bool hallEnabled
Definition: TMC4671.h:252
bool interpolation
Definition: TMC4671.h:254
uint16_t brakeLimLow
Definition: TMC4671.h:92
uint16_t brakeLimHigh
Definition: TMC4671.h:93
bool allowFluxDissipationDeactivation
Definition: TMC4671.h:99
float fluxDissipationScaler
Definition: TMC4671.h:98
TMC_HW_Ver hwVersion
Definition: TMC4671.h:84
uint32_t pid_vel_lim
Definition: TMC4671.h:184
uint16_t pid_torque_flux
Definition: TMC4671.h:182
uint16_t pid_torque_flux_ddt
Definition: TMC4671.h:180
uint32_t pid_acc_lim
Definition: TMC4671.h:183
int32_t pid_pos_low
Definition: TMC4671.h:185
int32_t pid_pos_high
Definition: TMC4671.h:186
uint16_t pid_uq_ud
Definition: TMC4671.h:181
uint16_t adc_I1_offset
Definition: TMC4671.h:157
bool canChangeHwType
Definition: TMC4671.h:160
uint16_t pwmcnt
Definition: TMC4671.h:149
TMC4671MotConf motconf
Definition: TMC4671.h:148
uint32_t mclkB
Definition: TMC4671.h:155
uint8_t bbmH
Definition: TMC4671.h:151
uint8_t bbmL
Definition: TMC4671.h:150
uint16_t adc_I0_scale
Definition: TMC4671.h:158
TMC4671HardwareTypeConf hwconf
Definition: TMC4671.h:147
uint32_t mclkA
Definition: TMC4671.h:154
uint16_t mdecB
Definition: TMC4671.h:153
bool combineEncoder
Definition: TMC4671.h:162
uint16_t mdecA
Definition: TMC4671.h:152
uint16_t adc_I1_scale
Definition: TMC4671.h:159
uint16_t adc_I0_offset
Definition: TMC4671.h:156
bool enableFluxDissipation
Definition: TMC4671.h:164
bool encoderReversed
Definition: TMC4671.h:161
bool svpwm
Definition: TMC4671.h:77
MotorType motor_type
Definition: TMC4671.h:71
uint16_t pole_pairs
Definition: TMC4671.h:74
EncoderType_TMC enctype
Definition: TMC4671.h:72
PosSelection pos_sel
Definition: TMC4671.h:75
PhiE phiEsource
Definition: TMC4671.h:73
VelSelection vel_sel
Definition: TMC4671.h:76
bool sequentialPI
Definition: TMC4671.h:176
uint16_t positionP
Definition: TMC4671.h:175
uint16_t fluxP
Definition: TMC4671.h:169
uint16_t velocityI
Definition: TMC4671.h:172
uint16_t positionI
Definition: TMC4671.h:174
uint16_t fluxI
Definition: TMC4671.h:168
uint16_t velocityP
Definition: TMC4671.h:173
uint16_t torqueP
Definition: TMC4671.h:171
uint16_t torqueI
Definition: TMC4671.h:170
StatusFlags_s flags
Definition: TMC4671.h:141
uint32_t asInt
Definition: TMC4671.h:140