Catégories
Arduino Onduleur Projets Arduino Projets électroniques

Projet Onduleur Triphasé #2: Commande Adjacente (Symétrique)

Objectifs

  • Savoir le schéma d’un onduleur triphasé
  • Savoir les caractéristiques d’un onduleur
  • Savoir choisir les transistors de la partie puissance
  • Savoir commander un onduleur triphasé
  • Savoir implémenter la commande d’un onduleur triphasé
  • Savoir augmenter les performances de son code & améliorer la fréquence maximale de l’onduleur
  • Etc.

Applications

  • Alimentation AC à partir d’une source DC (Alimentation à panneaux solaires, batteries, etc.)
  • Conversion de réseaux : Monophasé vers triphasé, monophasé vers un réseau polyphasé, etc.
  • Convertisseur de fréquence d’un réseau 50 Hz vers 60 Hz, 50 Hz vers 400 Hz, etc.
  • Variateur de vitesse des machines asynchrones
  • Etc.

Fonctionnement

Schéma de principe onduleur triphasé

Un onduleur triphasé est un convertisseur DC/AC. L’onduleur triphasé est constitué de trois bras parallèles. Chaque bras contient deux transistors comme il est indiqué dans la figure. Il peut être alimenté par une batterie (ou pack batterie), un panneau solaire ou par la sortie d’un redresseur monophasé (Convertisseur AC/DC).  Le transformateur est utilisé pour booster la tension à la sortie de l’onduleur vers la tension désirée. Il peut être utilisé pour obtenir le conducteur du neutre également  (couplage étoile à l’entrée du transformateur). De plus, le transformateur peut jouer le rôle d’un filtre passé bas afin de réduire les harmoniques des signaux carrés.

Voir les cours ci-dessous pour plus de détails théoriques concernant le fonctionnement ainsi les chronogrammes des tensions de l’onduleur.

Cours onduleur triphasé

La Commande Adjacente (Symétrique, 180°)

La commande symétrique est une commande rapide d’un onduleur triphasé. Elle consiste à faire commuter un seul transistor par bras. La durée de commutation de chaque transistor est de 180° (1/2 période). Les transistors dans un seul bras sont complémentaires (T1 commuté ou T2 à la fois). On constate un déphasage de commutation entre les bras de 60° (1/6 de la période) comme il est indiqué dans la figure. Par conséquent, on obtient un signal carré par bras.

Onduleur triphasé - commande symétrique 1

On prolonge les chronogrammes ci-dessous, on obtient

Onduleur triphasé - commande symétrique 2

On extrait une période complète constituée par 6 cycles (le début et la fin de la période n’a pas d’importance). Puis, on définit les états des transistors par cycles, on obtient

 

Onduleur triphasé - commande symétrique 3

Voir le tuto pour plus d’informations.

Codes du projet

La fonction SetCMD1()

La fonction SetCMD1() permet de générer les signaux de commande de l’onduleur. Une période est continuée par 8 cycles/séquences périodiques. Chaque séquence est constituée par 6 bits pour la commande des 3 bras de l’onduleur comme il est indiqué par le tableau de la section précédente. L’idée consiste à coder la période par un tableau binaire de taille 6×6 éléments (voir la fonction). La fonction prend en entrée le pinout de six transistors, puis elle génère une séquence par itération de la boucle. L’incrémentation est effectuée d’une façon automatique par  l’intermédiaire d’une variable de type static .

Voir le tuto pour plus de détails.

void SetCMD1( int *pins)
{
static int I=0;
const bool Cmd[6][6]={{0,1,1,0,0,1},
{1,0,1,0,0,1},
{1,0,0,1,0,1},
{1,0,0,1,1,0},
{0,1,0,1,1,0},
{0,1,1,0,1,0}};

for (int i=0;i<6; i++) digitalWrite(pins[i], Cmd[I][i]);
I++; I%=6;

return 0;
}

L’implémentation de la fonction SetCMD1() n’est pas optimale. En effet, la synthèse des signaux des bras est effectuée d’une manière séquentielle non simultanée.  De plus, la boucle for de mise à jour des sorties réduit la fréquence maximale de l’onduleur (voir le tuto).

La fonction SetCMD2()

La fonction SetCMD2() est une version améliorée de la fonction SetCMD1(). Elle permet de générer les signaux d’une manière simultanée et augmenter la fréquence de l’onduleur avec un rapport supérieur à 3 au voisinage de 10 KHz! L’idée consiste à remplacer la boucle for par le PORTA de la carte Arduino Mega comme il est indiqué dans la figure ci-dessous. Pa conséquent, chaque séquence est constituée par un mot de 6 bits de type unsigned char.

Port A Arduino Mega

void SetCMD2( int *pins)
{
static int I=0;
const unsigned char Cmd[6]={B00011001,
B00101001,
B00100101,
B00100110,
B00010110,
B00011010};

PORTA=Cmd[I];
I++; I%=6;

return 0;
}

Le programme complet

#define Tr11            22         // Transistor 1/Bras 1 
#define Tr12 23 // Transistor 2/Bras 1
#define Tr21 24 // Transistor 1/Bras 2
#define Tr22 25 // Transistor 2/Bras 2
#define Tr31 26 // Transistor 1/Bras 3
#define Tr32 27 // Transistor 2/Bras 3

#define T0_us 3333 // Période de l'onduleur: T=6*T0 (µs)

int Trans[6];

void setup()
{
// Pinout
Trans[0]=Tr11; Trans[1]=Tr12;
Trans[2]=Tr21; Trans[3]=Tr22;
Trans[4]=Tr31; Trans[5]=Tr32;
for (int i=0;i<6; i++)
{
pinMode(Trans[i], OUTPUT);
digitalWrite(Trans[i], LOW);
}
// Ou bien: Init du port A en sortie
DDRA =0xff; PORTA=0x00;
}

void loop()
{
SetCMD1(Trans);
delayMicroseconds(T0_us);
}

void SetCMD1( int *pins)
{
static int I=0;
const bool Cmd[6][6]={{0,1,1,0,0,1},
{1,0,1,0,0,1},
{1,0,0,1,0,1},
{1,0,0,1,1,0},
{0,1,0,1,1,0},
{0,1,1,0,1,0}};

for (int i=0;i<6; i++) digitalWrite(pins[i], Cmd[I][i]);
I++; I%=6;

return 0;
}

void SetCMD2( int *pins)
{
static int I=0;
const unsigned char Cmd[6]={B00011001,
B00101001,
B00100101,
B00100110,
B00010110,
B00011010};

PORTA=Cmd[I];
I++; I%=6;

return 0;
}

On verra dans la prochaine partie la commande décalée. N’hésitez pas de poster un commentaire. Ça fait toujours plaisir de vous lire 🙂

Laisser un commentaire