@@ -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 */
21192134void 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 */
21392155void 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 */
21592176void 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 */
21792197void 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