Skip to content

Commit 275897c

Browse files
committed
TMC flux filter always active
1 parent efb368a commit 275897c

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

Firmware/FFBoard/UserExtensions/Inc/TMC4671.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ struct TMC4671HardwareTypeConf{
9595
float vSenseMult = VOLTAGE_MULT_DEFAULT;
9696
float clockfreq = 25e6;
9797
uint8_t bbm = 20;
98-
float fluxDissipationScaler = 1;
98+
float fluxDissipationScaler = 0.5;
9999
bool allowFluxDissipationDeactivation = true;
100100
// Todo restrict allowed motor and encoder types
101101
};
@@ -297,10 +297,20 @@ class TMC4671Biquad{
297297
this->params.b2 = (int32_t)(bq.a2 * (float)(1 << 29));
298298
this->params.enable = bq.getFc() > 0 ? enable : false;
299299
}
300+
void enable(bool enable){
301+
params.enable = enable;
302+
}
300303

301304
TMC4671Biquad_t params;
302305
};
303306

307+
// Stores currently active filters
308+
struct TMC4671BiquadFilters{
309+
TMC4671Biquad torque;
310+
TMC4671Biquad flux;
311+
TMC4671Biquad pos;
312+
TMC4671Biquad vel;
313+
};
304314

305315

306316

@@ -627,6 +637,8 @@ friend class TMCDebugBridge;
627637

628638

629639
TMC4671Biquad_conf torqueFilterConf;
640+
TMC4671BiquadFilters curFilters;
641+
const float fluxFilterFreq = 350.0;
630642

631643
// External encoder timer fires interrupts to trigger a new commutation position update
632644
#ifdef TIM_TMC

Firmware/FFBoard/UserExtensions/Src/TMC4671.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ bool TMC4671::initialize(){
287287
setAdcOffset(conf.adc_I0_offset, conf.adc_I1_offset);
288288
setAdcScale(conf.adc_I0_scale, conf.adc_I1_scale);
289289
setTorqueFilter(torqueFilterConf);
290+
setBiquadFlux(TMC4671Biquad(Biquad(BiquadType::lowpass, fluxFilterFreq / getPwmFreq(), 0.7,0.0), true)); // Create flux filter
290291

291292
// Initial adc calibration and check without PWM if power off to get basic offsets. PWM is off!
292293
if(!hasPower()){
@@ -486,7 +487,8 @@ void TMC4671::Run(){
486487
while(!hasPower()){
487488
Delay(100);
488489
}
489-
490+
curFilters.flux.params.enable = false;
491+
setBiquadFlux(curFilters.flux);
490492
// Calibrate ADC
491493
enablePin.set();
492494
setPwm(TMC_PwmMode::PWM_FOC); // enable foc to calibrate adc
@@ -502,6 +504,8 @@ void TMC4671::Run(){
502504
calibrateEncoder();
503505
setEncoderType(conf.motconf.enctype);
504506
recalibrationRequired = false;
507+
curFilters.flux.params.enable = true;
508+
setBiquadFlux(curFilters.flux);
505509
break;
506510
}
507511
case TMC_ControlState::Pidautotune:
@@ -589,6 +593,8 @@ void TMC4671::Run(){
589593

590594
case TMC_ControlState::EncoderFinished: // Startup sequence done
591595
//setEncoderIndexFlagEnabled(false); // TODO
596+
// curFilters.flux.params.enable = true;
597+
// setBiquadFlux(curFilters.flux); // Enable flux filter
592598
encoderAligned = true;
593599
if(motorEnabledRequested && isSetUp()){
594600
startMotor();
@@ -656,6 +662,8 @@ bool TMC4671::pidAutoTune(){
656662
* Ramp up flux P until 50% of target, then lower increments until targetflux_p is reached
657663
* Increase I until oscillation is found. Back off a bit
658664
*/
665+
curFilters.flux.params.enable = false;
666+
setBiquadFlux(curFilters.flux);
659667
PhiE lastphie = getPhiEtype();
660668
MotionMode lastmode = getMotionMode();
661669
setPhiE_ext(getPhiE());
@@ -721,6 +729,8 @@ bool TMC4671::pidAutoTune(){
721729
fluxI += step_i;
722730

723731
}
732+
curFilters.flux.params.enable = true;
733+
setBiquadFlux(curFilters.flux);
724734

725735
if(fluxP && fluxP < 20000 && fluxI && fluxI < 20000){
726736
newpids.fluxP = fluxP;
@@ -810,6 +820,8 @@ bool TMC4671::findEncoderIndex(int32_t speed, uint16_t power,bool offsetPhiM,boo
810820

811821
PhiE lastphie = getPhiEtype();
812822
MotionMode lastmode = getMotionMode();
823+
curFilters.flux.params.enable = false;
824+
setBiquadFlux(curFilters.flux);
813825
setFluxTorque(0, 0);
814826
// setPhiE_ext(getPhiE());
815827
// setPhiEtype(PhiE::openloop);
@@ -846,6 +858,8 @@ bool TMC4671::findEncoderIndex(int32_t speed, uint16_t power,bool offsetPhiM,boo
846858

847859
// abnconf.clear_on_N = false;
848860
// setup_ABN_Enc(abnconf);
861+
curFilters.flux.params.enable = true;
862+
setBiquadFlux(curFilters.flux);
849863

850864
setMotionMode(lastmode,true);
851865
setPhiEtype(lastphie);
@@ -1694,7 +1708,8 @@ int16_t TMC4671::controlFluxDissipate(){
16941708

16951709
int32_t vDiff = getIntV() - getExtV();
16961710
if(vDiff > fluxDissipationLimit){
1697-
return(clip(vDiff * conf.hwconf.fluxDissipationScaler,0,0x7fff));
1711+
// Reaches limit at +5v if scaler is 1
1712+
return(clip<int32_t,int32_t>(vDiff * conf.hwconf.fluxDissipationScaler * curLimits.pid_torque_flux * 0.0002,0,curLimits.pid_torque_flux));
16981713
}
16991714
}
17001715

@@ -2118,6 +2133,7 @@ TMC4671Limits TMC4671::getLimits(){
21182133
*/
21192134
void TMC4671::setBiquadFlux(const TMC4671Biquad &filter){
21202135
const TMC4671Biquad_t& bq = filter.params;
2136+
curFilters.flux = filter;
21212137
writeReg(0x4E, 25);
21222138
writeReg(0x4D, bq.a1);
21232139
writeReg(0x4E, 26);
@@ -2138,6 +2154,7 @@ void TMC4671::setBiquadFlux(const TMC4671Biquad &filter){
21382154
*/
21392155
void TMC4671::setBiquadPos(const TMC4671Biquad &filter){
21402156
const TMC4671Biquad_t& bq = filter.params;
2157+
curFilters.pos = filter;
21412158
writeReg(0x4E, 1);
21422159
writeReg(0x4D, bq.a1);
21432160
writeReg(0x4E, 2);
@@ -2158,6 +2175,7 @@ void TMC4671::setBiquadPos(const TMC4671Biquad &filter){
21582175
*/
21592176
void TMC4671::setBiquadVel(const TMC4671Biquad &filter){
21602177
const TMC4671Biquad_t& bq = filter.params;
2178+
curFilters.vel = filter;
21612179
writeReg(0x4E, 9);
21622180
writeReg(0x4D, bq.a1);
21632181
writeReg(0x4E, 10);
@@ -2178,6 +2196,7 @@ void TMC4671::setBiquadVel(const TMC4671Biquad &filter){
21782196
*/
21792197
void TMC4671::setBiquadTorque(const TMC4671Biquad &filter){
21802198
const TMC4671Biquad_t& bq = filter.params;
2199+
curFilters.torque = filter;
21812200
writeReg(0x4E, 17);
21822201
writeReg(0x4D, bq.a1);
21832202
writeReg(0x4E, 18);

0 commit comments

Comments
 (0)