#include <Arduino.h>
#include <TimerOne.h>
#define PWM_A_H 5 // High-side switch for phase A
#define PWM_A_L 6 // Low-side switch for phase A
#define PWM_B_H 9 // High-side switch for phase B
#define PWM_B_L 10 // Low-side switch for phase B
#define PWM_C_H 3 // High-side switch for phase C
#define PWM_C_L 11 // Low-side switch for phase C
const int switchingFrequency = 10000; // Example: 10 kHz switching frequency
const int outputFrequency = 50; // Example: 50 Hz output frequency
const float modulationIndex = 0.8; // Example modulation index
const int deadTime = 2; // Dead time in microseconds
int T1, T2, T0;
int stepCount;
void setup() {
pinMode(PWM_A_H, OUTPUT);
pinMode(PWM_A_L, OUTPUT);
pinMode(PWM_B_H, OUTPUT);
pinMode(PWM_B_L, OUTPUT);
pinMode(PWM_C_H, OUTPUT);
pinMode(PWM_C_L, OUTPUT);
stepCount = switchingFrequency / outputFrequency;
Timer1.initialize(1000000 / switchingFrequency);
Timer1.attachInterrupt(generateSVPWM);
}
void generateSVPWM() {
static int step = 0;
float theta = (360.0 * step) / stepCount;
int sector = (int)(theta / 60) + 1;
float theta_r = (theta - (sector - 1) * 60) * PI / 180;
float Ts = 1.0 / switchingFrequency;
T1 = modulationIndex * sin(PI / 3 - theta_r) * Ts / sqrt(3) * 1e6;
T2 = modulationIndex * sin(theta_r) * Ts / sqrt(3) * 1e6;
T0 = (Ts * 1e6 - (T1 + T2)) / 2;
T1 = max(T1 - deadTime, 0);
T2 = max(T2 - deadTime, 0);
T0 = max(T0 - deadTime, 0);
switch (sector) {
case 1:
digitalWrite(PWM_A_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_B_H, HIGH); delayMicroseconds(T2);
digitalWrite(PWM_C_H, LOW);
break;
case 2:
digitalWrite(PWM_A_H, LOW);
digitalWrite(PWM_B_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_C_H, HIGH); delayMicroseconds(T2);
break;
case 3:
digitalWrite(PWM_A_H, LOW);
digitalWrite(PWM_B_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_C_H, HIGH); delayMicroseconds(T2);
break;
case 4:
digitalWrite(PWM_A_H, LOW);
digitalWrite(PWM_B_H, LOW);
digitalWrite(PWM_C_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_A_H, HIGH); delayMicroseconds(T2);
break;
case 5:
digitalWrite(PWM_A_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_B_H, LOW);
digitalWrite(PWM_C_H, HIGH); delayMicroseconds(T2);
break;
case 6:
digitalWrite(PWM_A_H, HIGH); delayMicroseconds(T1);
digitalWrite(PWM_B_H, HIGH); delayMicroseconds(T2);
digitalWrite(PWM_C_H, LOW);
break;
}
step = (step + 1) % stepCount;
}
void loop() {
// Main loop does nothing, all handled in Timer1 interrupt
}