MoteurSynchrone : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Les MLI)
(Description du projet)
Ligne 4 : Ligne 4 :
 
   
 
   
  
==={{Bleu| Composants utilisés  }}===
+
== Composants utilisés  ==
  
 
===== Moteur LMT Lehner 3080 =====
 
===== Moteur LMT Lehner 3080 =====
Ligne 11 : Ligne 11 :
  
 
[[Fichier:Platine-leonardo-arduino 275602 1.jpg|vignette|centré| Carte Arduino Leonardo avec microcontroleur 32u4]]
 
[[Fichier:Platine-leonardo-arduino 275602 1.jpg|vignette|centré| Carte Arduino Leonardo avec microcontroleur 32u4]]
 +
 +
==Etudes préliminaires==
 +
Dans un premier temps, il nous a fallu prendre connaissance et établir les différentes parties du projet, commençant par un schéma fonctionnel
 +
 +
 +
=== Schéma fonctionnel ===
 +
 +
=== Etude de la carte ===
 +
 +
 +
=== Etude du codeur ===
 +
 +
=== Etude du code pour les MLI ===
 +
 +
=== Amélioration du système ===
 +
 +
=== Supervision ===
  
 
= Etude et réalisation de la carte =
 
= Etude et réalisation de la carte =

Version du 11 avril 2021 à 13:09

Description du projet

Le but de notre projet est de piloter les trois phases d'un moteur synchrone par le biais du microcontrôleur ATMEGA 32u4 pour participer au challenge educeco.


Composants utilisés

Moteur LMT Lehner 3080
Leh-lmt3080-1.jpg


Carte Arduino Leonardo avec microcontroleur 32u4

Etudes préliminaires

Dans un premier temps, il nous a fallu prendre connaissance et établir les différentes parties du projet, commençant par un schéma fonctionnel


Schéma fonctionnel

Etude de la carte

Etude du codeur

Etude du code pour les MLI

Amélioration du système

Supervision

Etude et réalisation de la carte

Les MLI

Définitiion

Nous avons commencé le projet avec une carte demo, ce que nous a permis de faire de testes sur le moteur, pendant la réalisation de notre carte.
Pour la génération des MLI, d'abord nous avons commencé par une étude de la datasheet du microcontrôleur ATMEGA32u4.
La carte Arduino Leonardo, propose un timer (le Timer 4) avec une fréquence d'horloge de l'ordre de 64MHz, 3 sorties PWM avec ses complémentaires et un mode de génération de signaux appelé PWM6 permettant de contrôler un moteur brushless.
Nous avons donc utilisé ce timer pour générer 6 MLIavec une fréquence autour de 8kHz.
Photo à ajouter '


Aprés avoir étudié la datasheet, nous avons réussi à générer les signaux de tests par le code suivant :

Code MLI

int main()
{

DDRB|=(1<<PB5)|(1<<PB6);//  OCR4B 9 ET 10
DDRD|=(1<<PD6)|(1<<PD7);//  OCR4D 6 ET 12
DDRC|=(1<<PC6)|(1<<PC7);// OCR4A ET OPOSE 13 et 5

//pwm

TCCR4A|=(1<<PWM4A)|(1<<PWM4B);
TCCR4C|=(1<<PWM4D);





  //prediviseur:8
  TCCR4B|=(1<<CS42);


///Connection de complementarité entre les broches
TCCR4A|=(1<<COM4A0)|(1<<COM4B0);
TCCR4C|=(1<<COM4D0);


  OCR4C=255;//comparaison
  OCR4A=100; //rapport cyclique
  OCR4B=100;
  OCR4D=100;

// TEMPS MORT
  DT4 =0x80;

while(1)
{
  OCR4A++;
  OCR4B++;
  OCR4D++;
_delay_ms(20);
}

}

Filtrage


Nous avons ensuite utilisé un filtre passe bas afin de récupérer la valeur moyenne du signal. Pour avoir une idée, utilisons un tableau Excel, partant de 36 valeurs (360° du cercle).

Photo à ajouter...

Ensuite, nous avons pris les valeurs des l'angle des trois tableaux et rajouté au code, avec un potentiomètre pour aider à faire varier la vitesse de rotation:

Code MLI

  #include"avr/io.h"

unsigned char tab_v1[36]={127,149,170,190,208,224,236,246,252,254,252,246,236,224,208,190,170,149,127,104,83,63,45,29,17,7,1,0,1,7,17,29,45,63,83,104};
unsigned char tab_v2[36]={236,224,208,190,170,149,127,104,83,63,45,29,17,7,1,0,1,7,17,29,45,63,83,104,127,149,170,190,208,224,236,246,252,254,252,246};
unsigned char tab_v3[36]={17,7,1,0,1,7,17,29,45,63,83,104,127,149,170,190,208,224,236,246,252,254,252,246,236,224,208,190,170,149,127,104,83,63,45,29};
int i;
int pot;
int valPot;


void setup()
{

DDRB|=(1<<PB5)|(1<<PB6);//  OCR4B 9 ET 10
DDRD|=(1<<PD6)|(1<<PD7);//  OCR4D 6 ET 12
DDRC|=(1<<PC6)|(1<<PC7);// OCR4A ET OPOSE 13 et 5


//init config timer : Une fois les fonctions Arduino utilisées, on doit mettre à 0 les valeurs des registres.
TCCR4A=0;
TCCR4B=0;
TCCR4C=0;


//pwm

TCCR4A|=(1<<PWM4A)|(1<<PWM4B);
TCCR4C|=(1<<PWM4D);





  //prediviseur:8
  TCCR4B|=(1<<CS42);


///Connection de complementarité entre les broches
TCCR4A|=(1<<COM4A0)|(1<<COM4B0);
TCCR4C|=(1<<COM4D0);


  OCR4C=255;//comparaison
  OCR4A=100; //rapport cyclique
  OCR4B=100;
  OCR4D=100;

// TEMPS MORT
  DT4 =0x80;
}
void loop() {
  pot=analogRead(A0);
  valPot=pot/32;
 
   if(i==36)i=0;i++;
 
  OCR4A=tab_v1[i]/8;
  OCR4B=tab_v2[i]/8;
  OCR4D=tab_v3[i]/8;
delay(valPot);

}

Le codeur Incrémental

MLI + codeur

Après l'étude du codeur nous avons donc ressemblé les deux codes.
Le codeur permet de connaître la position des aimants du rotor et donc celle du champ rotorique. Les information s qu'il fournit permettent au système de commande d'alimenter les enrôlements adéquats via les transistors.

Asservissement de courant