Hello guys, I've been working on a poject where i want to control an ac motor with arduino, using space vector modulation for 3 phase inverter , yet when I try to modify the phase by adjusting the potentiometer position so I can vary the voltage destinated to the motor it doesn't change.
this is the circuit I worked with:
and this is the code I tried to work with:
// Déclaration des broches pour le contrôle du moteur
int AA1 = 3;
int AA2 = 5;
int BB1 = 6;
int BB2 = 9;
int CC1 = 10;
int CC2 = 11;
// Variable pour suivre la phase actuelle du moteur
int fase = 1;
// Variable pour régler le temps entre les changements de phase (vitesse du moteur)
int tiempo = 100;
unsigned long previousMillis = 0;
// Variable pour indiquer si le moteur est en arrêt (0) ou en mouvement (1)
int Stop = 0;
// Broche pour la lecture de la valeur du potentiomètre
int val = A0;
void setup() {
// Initialise la communication série pour afficher des messages de débogage
Serial.begin(9600);
// Configure les broches de contrôle du moteur en sorties
pinMode(AA1, OUTPUT);
pinMode(AA2, OUTPUT);
pinMode(BB1, OUTPUT);
pinMode(BB2, OUTPUT);
pinMode(CC1, OUTPUT);
pinMode(CC2, OUTPUT);
// Configure la broche du potentiomètre en entrée
pinMode(val, INPUT);
// Attends 1 seconde (1000 millisecondes) pour l'initialisation
delay(1000);
// Initialise la variable previousMillis avec le temps actuel en microsecondes
previousMillis = micros();
}
void loop() {
// Si le temps entre les changements de phase est trop long, arrête le moteur
if (tiempo > 1950) {
Stop = 0;
tiempo = 1950;
// Met les broches de contrôle du moteur en basse tension (arrêt)
digitalWrite(AA1, LOW);
digitalWrite(AA2, LOW);
digitalWrite(BB1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(BB2, LOW);
digitalWrite(CC1, LOW);
} else {
Stop = 1;
}
// Si le moteur est en mouvement
if (Stop == 1) {
// Enregistre le temps actuel en microsecondes
unsigned long currentMillis = micros();
// Si le temps écoulé dépasse le temps défini
if (currentMillis - previousMillis >= tiempo) {
previousMillis += tiempo;
// Commute la phase du moteur en fonction de la variable fase
switch (fase) {
case 1:
// Phase 1 : C-B
digitalWrite(AA1, LOW);
digitalWrite(AA2, LOW);
digitalWrite(BB1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(BB2, HIGH);
digitalWrite(CC1, HIGH);
break;
case 2:
// Phase 2 : A-B
digitalWrite(AA2, LOW);
digitalWrite(BB1, LOW);
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(AA1, HIGH);
digitalWrite(BB2, HIGH);
break;
case 3:
// Phase 3 : A-C
digitalWrite(AA2, LOW);
digitalWrite(BB1, LOW);
digitalWrite(BB2, LOW);
digitalWrite(CC1, LOW);
digitalWrite(CC2, HIGH);
digitalWrite(AA1, HIGH);
break;
case 4:
// Phase 4 : B-C
digitalWrite(AA1, LOW);
digitalWrite(AA2, LOW);
digitalWrite(BB2, LOW);
digitalWrite(CC1, LOW);
digitalWrite(BB1, HIGH);
digitalWrite(CC2, HIGH);
break;
case 5:
// Phase 5 : B-A
digitalWrite(AA1, LOW);
digitalWrite(BB2, LOW);
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(AA2, HIGH);
digitalWrite(BB1, HIGH);
break;
case 6:
// Phase 6 : C-A
digitalWrite(AA1, LOW);
digitalWrite(BB1, LOW);
digitalWrite(BB2, LOW);
digitalWrite(CC2, LOW);
digitalWrite(CC1, HIGH);
digitalWrite(AA2, HIGH);
break;
}
// Augmente la phase actuelle ou retourne à la phase 1
if (fase < 6) {
fase = fase + 1;
} else {
fase = 1;
}
}
}
// Lit la valeur analogique du potentiomètre
int potValue = analogRead(val);
// Ajuste le temps entre les changements de phase en fonction de la valeur du potentiomètre
tiempo = map(potValue, 0, 1023, 1, 2000);
// Affiche la phase actuelle et la vitesse sur le moniteur série à des fins de débogage
Serial.print(fase);
Serial.print(" ");
Serial.println(tiempo);
}