Ben Katz
/
Hobbyking_Cheetah_V1
FOC Implementation for putting multirotor motors in robots
SVM/SVM.cpp@14:80ce59119d93, 2016-10-31 (annotated)
- Committer:
- benkatz
- Date:
- Mon Oct 31 16:48:16 2016 +0000
- Revision:
- 14:80ce59119d93
- Parent:
- 10:370851e6e132
Misc. changes. Finally fixed transforms (turns out B and C current measurements were accidentally swapped)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
benkatz | 0:4e1c4df6aabd | 1 | |
benkatz | 0:4e1c4df6aabd | 2 | #include "mbed.h" |
benkatz | 0:4e1c4df6aabd | 3 | #include "SVM.h" |
benkatz | 0:4e1c4df6aabd | 4 | #include "Inverter.h" |
benkatz | 6:4ee1cdc43aa8 | 5 | #define min(x,y,z) (x < y ? (x < z ? x : z) : (y < z ? y : z)) |
benkatz | 6:4ee1cdc43aa8 | 6 | #define max(x,y,z) (x > y ? (x > z ? x : z) : (y > z ? y : z)) |
benkatz | 0:4e1c4df6aabd | 7 | |
benkatz | 0:4e1c4df6aabd | 8 | SPWM::SPWM(Inverter *inverter, float V_Bus){ |
benkatz | 0:4e1c4df6aabd | 9 | _inverter = inverter; |
benkatz | 0:4e1c4df6aabd | 10 | _V_Bus = V_Bus; |
benkatz | 0:4e1c4df6aabd | 11 | } |
benkatz | 5:51c6560bf624 | 12 | |
benkatz | 10:370851e6e132 | 13 | //sinusoidal PWM |
benkatz | 5:51c6560bf624 | 14 | void SPWM::Update_DTC(float V_A, float V_B, float V_C){ |
benkatz | 5:51c6560bf624 | 15 | float DTC_A = V_A/_V_Bus + .5f; |
benkatz | 5:51c6560bf624 | 16 | float DTC_B = V_B/_V_Bus + .5f; |
benkatz | 5:51c6560bf624 | 17 | float DTC_C = V_C/_V_Bus + .5f; |
benkatz | 0:4e1c4df6aabd | 18 | |
benkatz | 0:4e1c4df6aabd | 19 | if(DTC_A > .95f) DTC_A = .95f; |
benkatz | 0:4e1c4df6aabd | 20 | else if(DTC_A < .05f) DTC_A = .05f; |
benkatz | 0:4e1c4df6aabd | 21 | if(DTC_B > .95f) DTC_B = .95f; |
benkatz | 0:4e1c4df6aabd | 22 | else if(DTC_B < .05f) DTC_B = .05f; |
benkatz | 0:4e1c4df6aabd | 23 | if(DTC_C > .95f) DTC_C = .95f; |
benkatz | 0:4e1c4df6aabd | 24 | else if(DTC_C < .05f) DTC_C = .05f; |
benkatz | 0:4e1c4df6aabd | 25 | _inverter->SetDTC(DTC_A, DTC_B, DTC_C); |
benkatz | 5:51c6560bf624 | 26 | } |
benkatz | 5:51c6560bf624 | 27 | |
benkatz | 5:51c6560bf624 | 28 | SVPWM::SVPWM(Inverter *inverter, float V_Bus){ |
benkatz | 5:51c6560bf624 | 29 | _inverter = inverter; |
benkatz | 5:51c6560bf624 | 30 | _V_Bus = V_Bus; |
benkatz | 5:51c6560bf624 | 31 | } |
benkatz | 5:51c6560bf624 | 32 | |
benkatz | 10:370851e6e132 | 33 | //space vector pwm (better bus utilization) |
benkatz | 5:51c6560bf624 | 34 | void SVPWM::Update_DTC(float V_A, float V_B, float V_C){ |
benkatz | 6:4ee1cdc43aa8 | 35 | |
benkatz | 6:4ee1cdc43aa8 | 36 | float Voff = (min(V_A, V_B, V_C) + max(V_A, V_B, V_C))/2.0f; |
benkatz | 6:4ee1cdc43aa8 | 37 | |
benkatz | 6:4ee1cdc43aa8 | 38 | V_A = V_A - Voff; |
benkatz | 6:4ee1cdc43aa8 | 39 | V_B = V_B - Voff; |
benkatz | 6:4ee1cdc43aa8 | 40 | V_C = V_C - Voff; |
benkatz | 6:4ee1cdc43aa8 | 41 | |
benkatz | 5:51c6560bf624 | 42 | float DTC_A = V_A/_V_Bus + .5f; |
benkatz | 5:51c6560bf624 | 43 | float DTC_B = V_B/_V_Bus + .5f; |
benkatz | 5:51c6560bf624 | 44 | float DTC_C = V_C/_V_Bus + .5f; |
benkatz | 5:51c6560bf624 | 45 | |
benkatz | 6:4ee1cdc43aa8 | 46 | |
benkatz | 6:4ee1cdc43aa8 | 47 | |
benkatz | 5:51c6560bf624 | 48 | if(DTC_A > .95f) DTC_A = .95f; |
benkatz | 5:51c6560bf624 | 49 | else if(DTC_A < .05f) DTC_A = .05f; |
benkatz | 5:51c6560bf624 | 50 | if(DTC_B > .95f) DTC_B = .95f; |
benkatz | 5:51c6560bf624 | 51 | else if(DTC_B < .05f) DTC_B = .05f; |
benkatz | 5:51c6560bf624 | 52 | if(DTC_C > .95f) DTC_C = .95f; |
benkatz | 5:51c6560bf624 | 53 | else if(DTC_C < .05f) DTC_C = .05f; |
benkatz | 5:51c6560bf624 | 54 | _inverter->SetDTC(DTC_A, DTC_B, DTC_C); |
benkatz | 5:51c6560bf624 | 55 | } |
benkatz | 5:51c6560bf624 | 56 |