From fd78d2ed70d9969f5fb97d709b393a46735ef760 Mon Sep 17 00:00:00 2001 From: Stefan Dessens Date: Wed, 28 Apr 2021 16:44:47 +0200 Subject: [PATCH 1/3] Fix consistency error in calibrateOffsets. --- src/current_sense/InlineCurrentSense.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/current_sense/InlineCurrentSense.cpp b/src/current_sense/InlineCurrentSense.cpp index d5d10881..2e9c4421 100644 --- a/src/current_sense/InlineCurrentSense.cpp +++ b/src/current_sense/InlineCurrentSense.cpp @@ -28,21 +28,23 @@ void InlineCurrentSense::init(){ } // Function finding zero offsets of the ADC void InlineCurrentSense::calibrateOffsets(){ + const int calibration_rounds = 1000; + // find adc offset = zero current voltage - offset_ia =0; - offset_ib= 0; - offset_ic= 0; + offset_ia = 0; + offset_ib = 0; + offset_ic = 0; // read the adc voltage 1000 times ( arbitrary number ) - for (int i = 0; i < 1000; i++) { + for (int i = 0; i < calibration_rounds; i++) { offset_ia += _readADCVoltage(pinA); offset_ib += _readADCVoltage(pinB); if(_isset(pinC)) offset_ic += _readADCVoltage(pinC); _delay(1); } // calculate the mean offsets - offset_ia = offset_ia / 1000.0; - offset_ib = offset_ib / 1000.0; - if(_isset(pinC)) offset_ic = offset_ic / 500.0; + offset_ia = offset_ia / calibration_rounds; + offset_ib = offset_ib / calibration_rounds; + if(_isset(pinC)) offset_ic = offset_ic / calibration_rounds; } // read all three phase currents (if possible 2 or 3) From 7bacc20a63f574978676bb925f25369e928165d4 Mon Sep 17 00:00:00 2001 From: Stefan Dessens Date: Wed, 28 Apr 2021 17:02:12 +0200 Subject: [PATCH 2/3] CurrentSense::gain_x must be a float --- src/current_sense/InlineCurrentSense.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/current_sense/InlineCurrentSense.h b/src/current_sense/InlineCurrentSense.h index 64c658d1..da46d104 100644 --- a/src/current_sense/InlineCurrentSense.h +++ b/src/current_sense/InlineCurrentSense.h @@ -29,9 +29,9 @@ class InlineCurrentSense: public CurrentSense{ // ADC measuremnet gain for each phase // support for different gains for different phases of more commonly - inverted phase currents // this should be automated later - int gain_a; //!< phase A gain - int gain_b; //!< phase B gain - int gain_c; //!< phase C gain + float gain_a; //!< phase A gain + float gain_b; //!< phase B gain + float gain_c; //!< phase C gain private: From dd73d88a0e07b387877258d1a098902120fc1870 Mon Sep 17 00:00:00 2001 From: Stefan Dessens Date: Thu, 29 Apr 2021 12:06:10 +0200 Subject: [PATCH 3/3] CurrentSense correct filtering if 3 current measurements are available --- src/common/base_classes/CurrentSense.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/common/base_classes/CurrentSense.cpp b/src/common/base_classes/CurrentSense.cpp index accaebb3..2cec8dd5 100644 --- a/src/common/base_classes/CurrentSense.cpp +++ b/src/common/base_classes/CurrentSense.cpp @@ -17,8 +17,12 @@ float CurrentSense::getDCCurrent(float motor_electrical_angle){ i_alpha = current.a; i_beta = _1_SQRT3 * current.a + _2_SQRT3 * current.b; }else{ - i_alpha = 2*(current.a - (current.b - current.c))/3.0; - i_beta = _2_SQRT3 *( current.b - current.c ); + // signal filtering using identity a + b + c = 0. Assumes measurement error is normally distributed. + float mid = (1.f/3) * (current.a + current.b + current.c); + float a = current.a - mid; + float b = current.b - mid; + i_alpha = a; + i_beta = _1_SQRT3 * a + _2_SQRT3 * b; } // if motor angle provided function returns signed value of the current @@ -44,9 +48,13 @@ DQCurrent_s CurrentSense::getFOCCurrents(float angle_el){ // if only two measured currents i_alpha = current.a; i_beta = _1_SQRT3 * current.a + _2_SQRT3 * current.b; - }else{ - i_alpha = 0.6666667*(current.a - (current.b - current.c)); - i_beta = _2_SQRT3 *( current.b - current.c ); + } else { + // signal filtering using identity a + b + c = 0. Assumes measurement error is normally distributed. + float mid = (1.f/3) * (current.a + current.b + current.c); + float a = current.a - mid; + float b = current.b - mid; + i_alpha = a; + i_beta = _1_SQRT3 * a + _2_SQRT3 * b; } // calculate park transform