|
|
@@ -524,6 +524,14 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
+#define Duty_Sat(max, t1, t2) \
|
|
|
+ do { \
|
|
|
+ if (t1+t2 > max) { \
|
|
|
+ float r = (float)max/(float)(t1 + t2); \
|
|
|
+ t1 = r * t1; \
|
|
|
+ t2 = r * t2; \
|
|
|
+ } \
|
|
|
+ }while(0);
|
|
|
void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
float alpha = (alb->a) * SQRT3_BY_2;
|
|
|
float beta = (alb->b) * SQRT3_BY_2;
|
|
|
@@ -578,6 +586,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
case SECTOR_1: // 3
|
|
|
{ u32 T4 = -Z;
|
|
|
u32 T6 = X;
|
|
|
+ Duty_Sat(PWM_Period, T4, T6);
|
|
|
tC = (PWM_Period - T4 - T6)/4;
|
|
|
tB = tC + T6/2;
|
|
|
tA = tB + T4/2;
|
|
|
@@ -589,6 +598,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
{
|
|
|
u32 T6 = Y;
|
|
|
u32 T2 = Z;
|
|
|
+ Duty_Sat(PWM_Period, T2, T6);
|
|
|
tC = (PWM_Period - T6 - T2)/4;
|
|
|
tA = tC + T6/2;
|
|
|
tB = tA + T2/2;
|
|
|
@@ -600,6 +610,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
{
|
|
|
u32 T2 = X;
|
|
|
u32 T3 = -Y;
|
|
|
+ Duty_Sat(PWM_Period, T2, T3);
|
|
|
tA = (PWM_Period - T2 - T3)/4;
|
|
|
tC = tA + T3/2;
|
|
|
tB = tC + T2/2;
|
|
|
@@ -611,6 +622,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
{
|
|
|
u32 T1 = -X;
|
|
|
u32 T3 = Z;
|
|
|
+ Duty_Sat(PWM_Period, T1, T3);
|
|
|
tA = (PWM_Period - T1 - T3)/4;
|
|
|
tB = tA + T3/2;
|
|
|
tC = tB + T1/2;
|
|
|
@@ -622,6 +634,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
{
|
|
|
u32 T1 = -Y;
|
|
|
u32 T5 = -Z;
|
|
|
+ Duty_Sat(PWM_Period, T1, T5);
|
|
|
tB = (PWM_Period - T1 - T5)/4;
|
|
|
tA = tB + T5/2;
|
|
|
tC = tA + T1/2;
|
|
|
@@ -633,6 +646,7 @@ void SVM_Duty_Fix(AB_t *alb, s16q5_t vbus, u32 PWM_half_period, FOC_OutP *out) {
|
|
|
{
|
|
|
u32 T4 = Y;
|
|
|
u32 T5 = -X;
|
|
|
+ Duty_Sat(PWM_Period, T4, T5);
|
|
|
tB = (PWM_Period - T4 - T5)/4;
|
|
|
tC = tB + T5/2;
|
|
|
tA = tC + T4/2;
|