7
7
float CurrentSense::getDCCurrent (float motor_electrical_angle){
8
8
// read current phase currents
9
9
PhaseCurrent_s current = getPhaseCurrents ();
10
- // currnet sign - if motor angle not provided the magnitude is always positive
11
- float sign = 1 ;
12
-
10
+
13
11
// calculate clarke transform
14
- float i_alpha, i_beta;
15
- if (!current.c ){
16
- // if only two measured currents
17
- i_alpha = current.a ;
18
- i_beta = _1_SQRT3 * current.a + _2_SQRT3 * current.b ;
19
- }if (!current.a ){
20
- // if only two measured currents
21
- float a = -current.c - current.b ;
22
- i_alpha = a;
23
- i_beta = _1_SQRT3 * a + _2_SQRT3 * current.b ;
24
- }if (!current.b ){
25
- // if only two measured currents
26
- float b = -current.a - current.c ;
27
- i_alpha = current.a ;
28
- i_beta = _1_SQRT3 * current.a + _2_SQRT3 * b;
29
- }else {
30
- // signal filtering using identity a + b + c = 0. Assumes measurement error is normally distributed.
31
- float mid = (1 .f /3 ) * (current.a + current.b + current.c );
32
- float a = current.a - mid;
33
- float b = current.b - mid;
34
- i_alpha = a;
35
- i_beta = _1_SQRT3 * a + _2_SQRT3 * b;
36
- }
12
+ ABCurrent_s ABcurrent = getABCurrents (current);
13
+
14
+ // current sign - if motor angle not provided the magnitude is always positive
15
+ float sign = 1 ;
37
16
38
17
// if motor angle provided function returns signed value of the current
39
18
// determine the sign of the current
@@ -42,20 +21,38 @@ float CurrentSense::getDCCurrent(float motor_electrical_angle){
42
21
float ct;
43
22
float st;
44
23
_sincos (motor_electrical_angle, &st, &ct);
45
- sign = (i_beta *ct - i_alpha *st) > 0 ? 1 : -1 ;
24
+ sign = (ABcurrent. beta *ct - ABcurrent. alpha *st) > 0 ? 1 : -1 ;
46
25
}
47
26
// return current magnitude
48
- return sign*_sqrt (i_alpha*i_alpha + i_beta*i_beta );
27
+ return sign*_sqrt (ABcurrent. alpha *ABcurrent. alpha + ABcurrent. beta *ABcurrent. beta );
49
28
}
50
29
51
30
// function used with the foc algorihtm
52
31
// calculating DQ currents from phase currents
53
32
// - function calculating park and clarke transform of the phase currents
54
- // - using getPhaseCurrents internally
33
+ // - using getPhaseCurrents and getABCurrents internally
55
34
DQCurrent_s CurrentSense::getFOCCurrents (float angle_el){
56
35
// read current phase currents
57
36
PhaseCurrent_s current = getPhaseCurrents ();
58
37
38
+ // calculate clarke transform
39
+ ABCurrent_s ABcurrent = getABCurrents (current);
40
+
41
+ // calculate park transform
42
+ float ct;
43
+ float st;
44
+ _sincos (angle_el, &st, &ct);
45
+ DQCurrent_s return_current;
46
+ return_current.d = ABcurrent.alpha * ct + ABcurrent.beta * st;
47
+ return_current.q = ABcurrent.beta * ct - ABcurrent.alpha * st;
48
+ return return_current;
49
+ }
50
+
51
+ // function used with the foc algorihtm
52
+ // calculating Alpha Beta currents from phase currents
53
+ // - function calculating Clarke transform of the phase currents
54
+ ABCurrent_s CurrentSense::getABCurrents (PhaseCurrent_s current){
55
+
59
56
// calculate clarke transform
60
57
float i_alpha, i_beta;
61
58
if (!current.c ){
@@ -81,14 +78,10 @@ DQCurrent_s CurrentSense::getFOCCurrents(float angle_el){
81
78
i_beta = _1_SQRT3 * a + _2_SQRT3 * b;
82
79
}
83
80
84
- // calculate park transform
85
- float ct;
86
- float st;
87
- _sincos (angle_el, &st, &ct);
88
- DQCurrent_s return_current;
89
- return_current.d = i_alpha * ct + i_beta * st;
90
- return_current.q = i_beta * ct - i_alpha * st;
91
- return return_current;
81
+ ABCurrent_s return_ABcurrent;
82
+ return_ABcurrent.alpha = i_alpha;
83
+ return_ABcurrent.beta = i_beta;
84
+ return return_ABcurrent;
92
85
}
93
86
94
87
/* *
0 commit comments