svpwm.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "foc/svpwm.h"
  2. #include "math/fast_math.h"
  3. void svpwm(alpha_beta_t *alpha_beta, float vbus, uint32_t PWM_half_period, phase_time_t *phase_out, u8 *sector_out){
  4. float alpha = alpha_beta->alpha / (2.0f/2.0f * vbus);
  5. float beta = alpha_beta->beta / (2.0f/2.0f * vbus);
  6. uint32_t sector;
  7. if (beta >= 0.0f) {
  8. if (alpha >= 0.0f) {
  9. //quadrant I
  10. if (ONE_BY_SQRT3 * beta > alpha) {
  11. sector = SECTOR_2;
  12. } else {
  13. sector = SECTOR_1;
  14. }
  15. } else {
  16. //quadrant II
  17. if (-ONE_BY_SQRT3 * beta > alpha) {
  18. sector = SECTOR_3;
  19. } else {
  20. sector = SECTOR_2;
  21. }
  22. }
  23. } else {
  24. if (alpha >= 0.0f) {
  25. //quadrant IV5
  26. if (-ONE_BY_SQRT3 * beta > alpha) {
  27. sector = SECTOR_5;
  28. } else {
  29. sector = SECTOR_6;
  30. }
  31. } else {
  32. //quadrant III
  33. if (ONE_BY_SQRT3 * beta > alpha) {
  34. sector = SECTOR_4;
  35. } else {
  36. sector = SECTOR_5;
  37. }
  38. }
  39. }
  40. // PWM timings
  41. u32 tA, tB, tC;
  42. u32 low, midle, high;
  43. switch (sector) {
  44. // sector 1-2
  45. case SECTOR_1: {
  46. // Vector on-times
  47. uint32_t t1 = (alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  48. uint32_t t2 = (TWO_BY_SQRT3 * beta) * PWM_half_period;
  49. // PWM timings
  50. tA = (PWM_half_period - t1 - t2) / 2;
  51. tB = tA + t1;
  52. tC = tB + t2;
  53. low = tA;
  54. midle = tB;
  55. high = tC;
  56. break;
  57. }
  58. // sector 2-3
  59. case SECTOR_2: {
  60. // Vector on-times
  61. uint32_t t2 = (alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  62. uint32_t t3 = (-alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  63. // PWM timings
  64. tB = (PWM_half_period - t2 - t3) / 2;
  65. tA = tB + t3;
  66. tC = tA + t2;
  67. low = tB;
  68. midle = tA;
  69. high = tC;
  70. break;
  71. }
  72. // sector 3-4
  73. case SECTOR_3: {
  74. // Vector on-times
  75. uint32_t t3 = (TWO_BY_SQRT3 * beta) * PWM_half_period;
  76. uint32_t t4 = (-alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  77. // PWM timings
  78. tB = (PWM_half_period - t3 - t4) / 2;
  79. tC = tB + t3;
  80. tA = tC + t4;
  81. low = tB;
  82. midle = tC;
  83. high = tA;
  84. break;
  85. }
  86. // sector 4-5
  87. case SECTOR_4: {
  88. // Vector on-times
  89. uint32_t t4 = (-alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  90. uint32_t t5 = (-TWO_BY_SQRT3 * beta) * PWM_half_period;
  91. // PWM timings
  92. tC = (PWM_half_period - t4 - t5) / 2;
  93. tB = tC + t5;
  94. tA = tB + t4;
  95. low = tC;
  96. midle = tB;
  97. high = tA;
  98. break;
  99. }
  100. // sector 5-6
  101. case SECTOR_5: {
  102. // Vector on-times
  103. uint32_t t5 = (-alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  104. uint32_t t6 = (alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  105. // PWM timings
  106. tC = (PWM_half_period - t5 - t6) / 2;
  107. tA = tC + t5;
  108. tB = tA + t6;
  109. low = tC;
  110. midle = tA;
  111. high = tB;
  112. break;
  113. }
  114. // sector 6-1
  115. case SECTOR_6: {
  116. // Vector on-times
  117. uint32_t t6 = (-TWO_BY_SQRT3 * beta) * PWM_half_period;
  118. uint32_t t1 = (alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  119. // PWM timings
  120. tA = (PWM_half_period - t6 - t1) / 2;
  121. tC = tA + t1;
  122. tB = tC + t6;
  123. low = tA;
  124. midle = tC;
  125. high = tB;
  126. break;
  127. }
  128. }
  129. phase_out->A = tA;
  130. phase_out->B = tB;
  131. phase_out->C = tC;
  132. phase_out->low = low;
  133. phase_out->midle = midle;
  134. phase_out->high = high;
  135. *sector_out = sector;
  136. }