Commande un moteur asynchrone

bonjour , j'ai un projet PFE , une réalisation d'une carte de commande d' un moteur asynchrone .

je veux crée 3 signaux MLI ( PWM) pour commande les 6 IGBT pour varier le vitesse du moteur et affiche le vitesse sur un lcd .

j'utilise arduino mega2560 pour ce projet , pour la commande du l'onduleur .

je fait des recherches et je trouve que il faut crée 3 signaux sinusoïdale décaler a 120 degrés chacun puis filtrer pour obtenir un signal MLI { http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinewave-generator/ } .
et il faut utilise Timer Interrupt .

svp COMMENT Je PEUX ECRIRE le code et donner les informations pour le Timer Interrupt.
et merci

Bonjour,
Un peu de lecture.
Fait une recherche sur google avec : commande moteur triphasé arduino
@+

icare:
Bonjour,
Un peu de lecture.
Fait une recherche sur google avec : commande moteur triphasé arduino
@+

MERCI POUR VOTRE RÉPONSE MAIS J'AI 4 SEMAINES DE RECHERCHE ET JE TROUVE RIEN QUE L'UTILISATION LE TIMER

pour Arduino Mega:
timer 0 (controls pin 13, 4)
timer 1 (controls pin 12, 11)
timer 2 (controls pin 10, 9)
timer 3 (controls pin 5, 3, 2)
timer 4 (controls pin 8, 7, 6)

TCCRnB, where 'n' is the number for the timer.
TCCR2B for timer 2, TCCR3B for timer 3.

donc je touve ce code mais j'ai quelque chose c pas clair.

  • DDS Sine Generator mit ATMEGS 328
  • Timer2 generates the 31250 KHz Clock Interrupt
  • Use Timer2 Interrupt to change duty cycle for the output PWM signals
  • D. Tolken
  • 120 degress out of phase signals for 3 phase

#include "avr/pgmspace.h" //Store data in flash (program) memory instead of SRAM

// Look Up table of a single sine period divied up into 256 values. Refer to PWM to sine.xls on how the values was calculated
PROGMEM prog_uchar sine256[] = {
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //define a bit to have the properties of a clear bit operator
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))//define a bit to have the properties of a set bit operator

int PWM1= 11;// PWM1 output, phase 1
int PWM2 = 3; //[WM2 ouput, phase 2
int PWM3 = 10; //PWM3 output, phase 3
int offset_1 = 85; //offset 1 is 120 degrees out of phase with previous phase, Refer to PWM to sine.xls
int offset_2 = 170; //offset 2 is 120 degrees out of phase with offset 1. Refer to PWM to sine.xls
int program_exec_time = 6; //monitor how quickly the interrupt trigger
int ISR_exec_time = 7; //monitor how long the interrupt takes

double dfreq;
const double refclk=31376.6; // measured output frequency

// variables used inside interrupt service declared as voilatile
volatile byte current_count; // Keep track of where the current count is in sine 256 array
volatile byte ms4_delay; //variable used to generate a 4ms delay
volatile byte c4ms; // after every 4ms this variable is incremented, its used to create a delay of 1 second
volatile unsigned long phase_accumulator; // pahse accumulator
volatile unsigned long tword_m; // dds tuning word m, refer to DDS_calculator (from Martin Nawrath) for explination.

void setup()
{
pinMode(PWM1, OUTPUT); //sets the digital pin as output
pinMode(PWM2, OUTPUT); //sets the digital pin as output
pinMode(PWM3, OUTPUT); //sets the digital pin as output
pinMode(program_exec_time, OUTPUT); //sets the digital pin as output
pinMode(9, OUTPUT); //sets the digital pin as output
sbi(PORTD,program_exec_time); //Sets the pin
Setup_timer1();
Setup_timer2();

//Disable Timer 1 interrupt to avoid any timing delays
cbi (TIMSK0,TOIE0); //disable Timer0 !!! delay() is now not available
sbi (TIMSK2,TOIE2); //enable Timer2 Interrupt

dfreq=1000.0; //initial output frequency = 1000.o Hz
tword_m=pow(2,32)*dfreq/refclk; //calulate DDS new tuning word

}
void loop()
{
while(1)
{
sbi(PORTD,program_exec_time); //Sets the pin
if (c4ms > 250) // c4ms = 4ms, thus 4ms *250 = 1 second delay
{
c4ms=0; //Reset c4ms
dfreq=analogRead(0); //Read voltage on analog 1 to see desired output frequency, 0V = 0Hz, 5V = 1.023kHz
cbi (TIMSK2,TOIE2); //Disable Timer2 Interrupt
tword_m=pow(2,32)*dfreq/refclk; //Calulate DDS new tuning word
sbi (TIMSK2,TOIE2); //Enable Timer2 Interrupt
}
}
}

//Timer 1 setup
//Set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer1(void)
{
// Timer1 Clock Prescaler to : 1
sbi (TCCR1B, CS10);
cbi (TCCR1B, CS11);
cbi (TCCR1B, CS12);

// Timer1 PWM Mode set to Phase Correct PWM
cbi (TCCR1A, COM1A0);
sbi (TCCR1A, COM1A1);
cbi (TCCR1A, COM1B0);
sbi (TCCR1A, COM1B1);

// Mode 1 / Phase Correct PWM
sbi (TCCR1A, WGM10);
cbi (TCCR1A, WGM11);
cbi (TCCR1B, WGM12);
cbi (TCCR1B, WGM13);
}

//Timer 1 setup
//Set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer2()
{
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);

// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
cbi (TCCR2A, COM2B0);
sbi (TCCR2A, COM2B1);

// Mode 1 / Phase Correct PWM
sbi (TCCR2A, WGM20);
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}

//Timer2 Interrupt Service at 31372,550 KHz = 32uSec
//This is the timebase REFCLOCK for the DDS generator
//FOUT = (M (REFCLK)) / (2 exp 32)
//Runtime : 8 microseconds
ISR(TIMER2_OVF_vect)
{
cbi(PORTD,program_exec_time); //Clear the pin
sbi(PORTD,ISR_exec_time); // Sets the pin

phase_accumulator=phase_accumulator+tword_m; //Adds tuning M word to previoud phase accumulator. refer to DDS_calculator (from Martin Nawrath) for explination.
current_count=phase_accumulator >> 24; // use upper 8 bits of phase_accumulator as frequency information

OCR2A=pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR2B=pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1

OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2

//increment variable ms4_delay every 4mS/125 = milliseconds 32uS
if(ms4_delay++ == 125)
{
c4ms++;
ms4_delay=0; //reset count
}

cbi(PORTD,ISR_exec_time); //Clear the pin
}

adelo14:
donc je touve ce code mais j'ai quelque chose c pas clair.

C'est quoi le problème ?

Christian_R:

adelo14:
donc je touve ce code mais j'ai quelque chose c pas clair.

C'est quoi le problème ?

le problème est-ce-que je peut le compiler sur arduino mega2560 et je peut le changer la fréquence de sortie a 1.5KHZ aussi intégré un afficheur pour affiche le fréquence de sortie et merci

JE SIMULE LE PROGRAMME SUR ARDUINO MEGA2560 ET VOILA LES 3 PWM

EST-CE-QUE SI CORRECTE PUISQUE JE PEUT PAS VARIER LES 3 ?

VOILA DEUX IMAGES DE PWM DE DEUX TEMPS DIFFÉRENT VARIER AUTOMATIQUE

comment je peut varier ? ( RP : le potentiometre est declarer dans le programme )

quelqu’un aide moi ?

Pour aider toi :
Un excellant sujet de discussion , 6 pages, 80 échanges :
http://forum.arduino.cc/index.php?topic=236778.0

Il existe plusieurs type de moteurs asynchrones : monophasé, biphasé , triphasé et des exotiques. Essayes d'être plus précis dans le titre. Je pense qu'on t'a déjà fait la remarque et le point délicat de ton sujet c'est justement le fait d'être triphasé.

Ensuite si tu veux des réponses soit plus clair : " EST-CE-QUE SI CORRECTE PUISQUE JE PEUT PAS VARIER LES 3 ? ".
C'est pas facile à comprendre !
De plus sur TOUS les fora il est interdit d'écrire en majuscules.

Voici ce que j'ai compris (sous réserves) : Cela pose-t-il problème si le changement de fréquence ne se fait pas simultanément sur tous les enroulements ?
Si je ne me suis pas mis le doigt dans l'œil jusqu'au coude il faut que tu quantifies le décalage, ensuite consulter la doc sur les triphasés asynchrones pour voir quel décalage ils acceptent. Quel est la conséquence d'un décalage temporel ? Aupassage un lien vers les caractéristiques du moteur serait intéressant.
J'imagine aussi que les moteurs asynchrones n'acceptent pas des changements de fréquences trop rapides.

en compilant ce programme ci dessous j'ai une erreur de "sine" qui fait obstacle quelle est la solution à suivre?svp urgent

  • DDS Sine Generator mit ATMEGS 328
  • Timer2 generates the 31250 KHz Clock Interrupt
  • Use Timer2 Interrupt to change duty cycle for the output PWM signals
  • D. Tolken
  • 120 degress out of phase signals for 3 phase

#include "avr/pgmspace.h" //Store data in flash (program) memory instead of SRAM

// Look Up table of a single sine period divied up into 256 values. Refer to PWM to sine.xls on how the values was calculated
PROGMEM prog_uchar sine256[] = {
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //define a bit to have the properties of a clear bit operator
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))//define a bit to have the properties of a set bit operator

int PWM1= 11;// PWM1 output, phase 1
int PWM2 = 3; //[WM2 ouput, phase 2
int PWM3 = 10; //PWM3 output, phase 3
int offset_1 = 85; //offset 1 is 120 degrees out of phase with previous phase, Refer to PWM to sine.xls
int offset_2 = 170; //offset 2 is 120 degrees out of phase with offset 1. Refer to PWM to sine.xls
int program_exec_time = 6; //monitor how quickly the interrupt trigger
int ISR_exec_time = 7; //monitor how long the interrupt takes

double dfreq;
const double refclk=31376.6; // measured output frequency

// variables used inside interrupt service declared as voilatile
volatile byte current_count; // Keep track of where the current count is in sine 256 array
volatile byte ms4_delay; //variable used to generate a 4ms delay
volatile byte c4ms; // after every 4ms this variable is incremented, its used to create a delay of 1 second
volatile unsigned long phase_accumulator; // pahse accumulator
volatile unsigned long tword_m; // dds tuning word m, refer to DDS_calculator (from Martin Nawrath) for explination.

void setup()
{
pinMode(PWM1, OUTPUT); //sets the digital pin as output
pinMode(PWM2, OUTPUT); //sets the digital pin as output
pinMode(PWM3, OUTPUT); //sets the digital pin as output
pinMode(program_exec_time, OUTPUT); //sets the digital pin as output
pinMode(9, OUTPUT); //sets the digital pin as output
sbi(PORTD,program_exec_time); //Sets the pin
Setup_timer1();
Setup_timer2();

//Disable Timer 1 interrupt to avoid any timing delays
cbi (TIMSK0,TOIE0); //disable Timer0 !!! delay() is now not available
sbi (TIMSK2,TOIE2); //enable Timer2 Interrupt

dfreq=1000.0; //initial output frequency = 1000.o Hz
tword_m=pow(2,32)*dfreq/refclk; //calulate DDS new tuning word

}
void loop()
{
while(1)
{
sbi(PORTD,program_exec_time); //Sets the pin
if (c4ms > 250) // c4ms = 4ms, thus 4ms *250 = 1 second delay
{
c4ms=0; //Reset c4ms
dfreq=analogRead(0); //Read voltage on analog 1 to see desired output frequency, 0V = 0Hz, 5V = 1.023kHz
cbi (TIMSK2,TOIE2); //Disable Timer2 Interrupt
tword_m=pow(2,32)*dfreq/refclk; //Calulate DDS new tuning word
sbi (TIMSK2,TOIE2); //Enable Timer2 Interrupt
}
}
}

//Timer 1 setup
//Set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer1(void)
{
// Timer1 Clock Prescaler to : 1
sbi (TCCR1B, CS10);
cbi (TCCR1B, CS11);
cbi (TCCR1B, CS12);

// Timer1 PWM Mode set to Phase Correct PWM
cbi (TCCR1A, COM1A0);
sbi (TCCR1A, COM1A1);
cbi (TCCR1A, COM1B0);
sbi (TCCR1A, COM1B1);

// Mode 1 / Phase Correct PWM
sbi (TCCR1A, WGM10);
cbi (TCCR1A, WGM11);
cbi (TCCR1B, WGM12);
cbi (TCCR1B, WGM13);
}

//Timer 1 setup
//Set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer2()
{
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);

// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
cbi (TCCR2A, COM2B0);
sbi (TCCR2A, COM2B1);

// Mode 1 / Phase Correct PWM
sbi (TCCR2A, WGM20);
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}

//Timer2 Interrupt Service at 31372,550 KHz = 32uSec
//This is the timebase REFCLOCK for the DDS generator
//FOUT = (M (REFCLK)) / (2 exp 32)
//Runtime : 8 microseconds
ISR(TIMER2_OVF_vect)
{
cbi(PORTD,program_exec_time); //Clear the pin
sbi(PORTD,ISR_exec_time); // Sets the pin

phase_accumulator=phase_accumulator+tword_m; //Adds tuning M word to previoud phase accumulator. refer to DDS_calculator (from Martin Nawrath) for explination.
current_count=phase_accumulator >> 24; // use upper 8 bits of phase_accumulator as frequency information

OCR2A=pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR2B=pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1

OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2

//increment variable ms4_delay every 4mS/125 = milliseconds 32uS
if(ms4_delay++ == 125)
{
c4ms++;
ms4_delay=0; //reset count
}

cbi(PORTD,ISR_exec_time); //Clear the pin
}

Le code que tu donnes compile sans erreur.
Le code qui ne compile pas correctement c'est celui donné un peu plus haut parce que les 5 premières lignes doivent être mise en commentaire.

adelo14:
bonjour , j'ai un projet PFE , une réalisation d'une carte de commande d' un moteur asynchrone .

je veux crée 3 signaux MLI ( PWM) pour commande les 6 IGBT pour varier le vitesse du moteur et affiche le vitesse sur un lcd .

j'utilise arduino mega2560 pour ce projet , pour la commande du l'onduleur .

je fait des recherches et je trouve que il faut crée 3 signaux sinusoïdale décaler a 120 degrés chacun puis filtrer pour obtenir un signal MLI { http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinewave-generator/ } .
et il faut utilise Timer Interrupt .

svp COMMENT Je PEUX ECRIRE le code et donner les informations pour le Timer Interrupt.
et merci

bonjour ;actuellement je sui entrain de realiser le meme projet;
j'ia termener le programe c'est un peu pres comme celui que vous fait ,mais j'ai un probleme de simulation sur isis pouvez vous me donner le schema de votre simulation
svp c urgent merci d'avance

Il me semble avoir compris que les comptes "guest" sont des comptes fermés.
Je ne pense pas que tu aura une réponse.

68tjs:
Il me semble avoir compris que les comptes "guest" sont des comptes fermés.
Je ne pense pas que tu aura une réponse.

ops ça me fait mal hhh a tt cas merci pour l'aide