变更
This commit is contained in:
128
BoooomCTL/Controller/SVPWM/SVPWM.c
Normal file
128
BoooomCTL/Controller/SVPWM/SVPWM.c
Normal file
@@ -0,0 +1,128 @@
|
||||
//
|
||||
// Created by ZK on 2023/3/16.
|
||||
//
|
||||
|
||||
#include "SVPWM.h"
|
||||
|
||||
|
||||
inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
|
||||
int Sextant;
|
||||
if (beta >= 0.0f) {
|
||||
if (alpha >= 0.0f) {
|
||||
//quadrant I
|
||||
if (ONE_BY_SQRT3 * beta > alpha)
|
||||
Sextant = 2; //sextant v2-v3
|
||||
else
|
||||
Sextant = 1; //sextant v1-v2
|
||||
|
||||
} else {
|
||||
//quadrant II
|
||||
if (-ONE_BY_SQRT3 * beta > alpha)
|
||||
Sextant = 3; //sextant v3-v4
|
||||
else
|
||||
Sextant = 2; //sextant v2-v3
|
||||
}
|
||||
} else {
|
||||
if (alpha >= 0.0f) {
|
||||
//quadrant IV
|
||||
if (-ONE_BY_SQRT3 * beta > alpha)
|
||||
Sextant = 5; //sextant v5-v6
|
||||
else
|
||||
Sextant = 6; //sextant v6-v1
|
||||
} else {
|
||||
//quadrant III
|
||||
if (ONE_BY_SQRT3 * beta > alpha)
|
||||
Sextant = 4; //sextant v4-v5
|
||||
else
|
||||
Sextant = 5; //sextant v5-v6
|
||||
}
|
||||
}
|
||||
|
||||
switch (Sextant) {
|
||||
// sextant v1-v2
|
||||
case 1: {
|
||||
// Vector on-times
|
||||
float t1 = alpha - ONE_BY_SQRT3 * beta;
|
||||
float t2 = TWO_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tA = (1.0f - t1 - t2) * 0.5f;
|
||||
*tB = *tA + t1;
|
||||
*tC = *tB + t2;
|
||||
}
|
||||
break;
|
||||
|
||||
// sextant v2-v3
|
||||
case 2: {
|
||||
// Vector on-times
|
||||
float t2 = alpha + ONE_BY_SQRT3 * beta;
|
||||
float t3 = -alpha + ONE_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tB = (1.0f - t2 - t3) * 0.5f;
|
||||
*tA = *tB + t3;
|
||||
*tC = *tA + t2;
|
||||
}
|
||||
break;
|
||||
|
||||
// sextant v3-v4
|
||||
case 3: {
|
||||
// Vector on-times
|
||||
float t3 = TWO_BY_SQRT3 * beta;
|
||||
float t4 = -alpha - ONE_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tB = (1.0f - t3 - t4) * 0.5f;
|
||||
*tC = *tB + t3;
|
||||
*tA = *tC + t4;
|
||||
}
|
||||
break;
|
||||
|
||||
// sextant v4-v5
|
||||
case 4: {
|
||||
// Vector on-times
|
||||
float t4 = -alpha + ONE_BY_SQRT3 * beta;
|
||||
float t5 = -TWO_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tC = (1.0f - t4 - t5) * 0.5f;
|
||||
*tB = *tC + t5;
|
||||
*tA = *tB + t4;
|
||||
}
|
||||
break;
|
||||
|
||||
// sextant v5-v6
|
||||
case 5: {
|
||||
// Vector on-times
|
||||
float t5 = -alpha - ONE_BY_SQRT3 * beta;
|
||||
float t6 = alpha - ONE_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tC = (1.0f - t5 - t6) * 0.5f;
|
||||
*tA = *tC + t5;
|
||||
*tB = *tA + t6;
|
||||
}
|
||||
break;
|
||||
|
||||
// sextant v6-v1
|
||||
case 6: {
|
||||
// Vector on-times
|
||||
float t6 = -TWO_BY_SQRT3 * beta;
|
||||
float t1 = alpha + ONE_BY_SQRT3 * beta;
|
||||
|
||||
// PWM timings
|
||||
*tA = (1.0f - t6 - t1) * 0.5f;
|
||||
*tC = *tA + t1;
|
||||
*tB = *tC + t6;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// if any of the results becomes NaN, result_valid will evaluate to false
|
||||
int result_valid =
|
||||
*tA >= 0.0f && *tA <= 1.0f
|
||||
&& *tB >= 0.0f && *tB <= 1.0f
|
||||
&& *tC >= 0.0f && *tC <= 1.0f;
|
||||
|
||||
return result_valid ? 0 : -1;
|
||||
}
|
||||
14
BoooomCTL/Controller/SVPWM/SVPWM.h
Normal file
14
BoooomCTL/Controller/SVPWM/SVPWM.h
Normal file
@@ -0,0 +1,14 @@
|
||||
//
|
||||
// Created by ZK on 2023/3/16.
|
||||
//
|
||||
|
||||
#ifndef BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H
|
||||
#define BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H
|
||||
|
||||
#define M_PI (3.14159265358f)
|
||||
#define M_2PI (6.28318530716f)
|
||||
#define ONE_BY_SQRT3 (0.57735026919f)
|
||||
#define TWO_BY_SQRT3 (2.0f * 0.57735026919f)
|
||||
#define SQRT3_BY_2 (0.86602540378f)
|
||||
|
||||
#endif //BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H
|
||||
Reference in New Issue
Block a user