Commande_de_moteur

19
Commande de moteur pas à pas En micro pas

Transcript of Commande_de_moteur

Page 1: Commande_de_moteur

Commande de moteurpas à pas

En micro pas

Page 2: Commande_de_moteur

Les différents moteurs d’asservissement

• Les moteurs DC à balais

• Les moteurs DC sans balais

• Les moteurs Synchrones

• Les moteurs pas à pas

Page 3: Commande_de_moteur

Moteurs pas à pas

• AvantagesAsservissement de position

ou de vitesse en boucle ouverte

Fort couple à basse vitesse

Simplicité de mise en œuvre

Positionnement statique

Fiabilité

Faible prix

• InconvénientsPositionnement discret

Faible vitesse maximale

Bruyant, source d’oscillations

Faible puissance

Faible rendement

Page 4: Commande_de_moteur

Différents type de moteurspas à pas

• Aimant permanentUn aimant permanent est solidaire de l'axe du moteur.

Couple élevé, faible résolution, couple résiduel moteur hors tension.

• Réluctance variableRotor à encoches en fer doux se positionnant dans la direction de la plus faible réluctance.

Couple faible, bonne résolution, pas couple résiduel moteur hors tension.

• HybrideDeux rotor à encoches en fer doux reliés par un aimant permanent.

Couple élevé, très bonne résolution, faible couple résiduel moteur hors tension.

• EnroulementsDeux enroulements par phases: commande unipolaires, électronique simple, couple faible.

Un enroulement par phase : commande bipolaire, pont en H, couple fort.

Page 5: Commande_de_moteur

La commande

• Principe: – alimenter successivement les phases, si possible en courant.

• Partie logique:– CI combinatoire

– CI Spécialisés

– µ contrôleurs

• Partie puissance– Composants discrets (Bip/Mos résistance limitation courant)

– CI interface (Ponts en H intégrés, avec PWM, CNA....)

Page 6: Commande_de_moteur

Pas/demi pas/quart de pastaratata

• Pas entier : – Un seul enroulement alimenté à chaque pas

– Deux enroulements alimentés à chaque pas (plus de couple)

Page 7: Commande_de_moteur

Pas/demi pas/quart de pastaratata

• Demi pas

! Variation importante de couple (Soit 1, soit 2 enroulements alimentés)

Page 8: Commande_de_moteur

Pas/demi pas/quart de pastaratata

• Demi pas avec compensation de couple– Même cycle que précédemment, mais i = 0.707 i0 (sin π/4) lorsque les deux

enroulements sont alimentés pour obtenir une force magnétomotrice constante

Nécessité d’une régulation de courant

Sans compensation de couple Avec compensation de couple

Page 9: Commande_de_moteur

Pas/demi pas/quart de pas

• Quart de pas– Même cycle que précédemment,

en rajoutant des valeurs intermédiaires du courant

Nécessité d’un CNA

Angle I/I0 Phi A I/I0 Phi B

0 1 0

22.5 0.924 0.383

45 0.707 0.707

67.5 0.383 0.924

90 0 1

112.5 -0.383 0.924

135 -0.707 0.707

157.5 -0.924 0.383

180 -1 0

202.5 -0.924 -0.383

225 -0.707 -0.707

247.5 -0.383 -0.924

270 0 -1

292.5 0.383 -0.924

315 0.707 -0.707

337.5 0.924 -0.383

Page 10: Commande_de_moteur

Pas/demi pas/quart de pas

• Les options possibles pour le DAC– DAC « standard », 4,8,12... bits

• Moins bonne résolution à nb équivalent • Correction possible d’angle par soft (non linéarité du

moteurs)• Composant hyper classiques

– DAC « sinus », 3 ou 4 bits• Excellente résolution• Mouton à 5 pattes difficile d’approvisionnement

– Inutile d’espérer mieux que le 1/16 de pas sans correction logicielle

Page 11: Commande_de_moteur

Les circuits de commande

• Les ultra classiques – SAA 1027 Unipolaire SAA 1024 Bipolaire L6506/L296 (ST)

• Les fabricants– Alegro (le spécialiste en CNA sinus)– Fairchild – Mitsubishi– NS– PMD (Performance Motion Devices) ( produits très spécifiques )– ST

Page 12: Commande_de_moteur

Exemple de circuit de commande

• Cahier des charges– Commande de moteur bipolaire– 3A 30V– Commande pas entier à huitième de pas– Vitesses très lente (qqs µm/min)– Affichage de la vitesse de translation– Interface RS232

Page 13: Commande_de_moteur

Choix des circuits

• Pour la partie commande :– µ contrôleur pour gérer l’interface, le moteur,

l’affichage• 4+7+3 sorties cmd afficheurs et pts décimaux• 2+2+2 entrées butées, poussoirs, sélection vitesse• 2*4 + 2 bits CNA et direction30 E/S + RS232 = 16F877

• Pour la partie puissance :– Pont en H avec CNA 4bits intégré

LMD18245 National semiconductor

Page 14: Commande_de_moteur

Présentation du LMD18245

• 3A, 55V DMOS Full-Bridge Motor Driver

Page 15: Commande_de_moteur

Schéma général

16F877Affichage 4digits

7 segments#14

Bts cmdButtées

#6

MAX232#2

2*LMD18245#10

Page 16: Commande_de_moteur

Code de commande moteur

• Rotation des phases et valeurs du courant dans un tableau de constantes– Par exemple en pas entiers phase A

0b00001111

0b00000000

0b00001111

0b00000000

• A chaque interruption timer on avance d’un pas dans le tableau modulo 4,8,16 ou 32

Page 17: Commande_de_moteur

Code de commande moteur• Fonction avance/recule d’un pas

void step(char dir){

static int16 pos = 0;int16 steps,indice;

steps= microstep<<2; // il y a 4 temps pour un pas entiers, 8 pour 1/2pas...

pos = (steps + pos + (int16)dir) & (steps-1);// Step sert d’offset dans le tableau, dir donne le sens de parcourt, le & (steps-1) fait un modulo pour reprendre au début lorsque l’on est arrivé au bout du tableau

indice = pos+steps-4;// calcule l’indice ou trouver la constante dans le tableau petit complication du au fait qu’il n’y a qu’un tableau de 60 valeurs

PORTD=(PD[indice]);PORTB=(PB[indice]);// envoie les valeurs aux deux DAC des pont en H

}

Page 18: Commande_de_moteur

Code d’affichage de vitesse

• L’affichage est multiplexé

• Les valeurs correspondant aux segments allumés pour chaque chiffre sont stockées dans des tableaux de constantes

• Opération en deux temps– Calcul de la valeur de chaque digit– Affichage de ces valeurs

Page 19: Commande_de_moteur

Code d’affichage de vitesse

• Calcul des valeurs des 4 digitsanciennne_valeur=abs(valeur);reste=anciennne_valeur;for (i=0;i<4;i++) //calcul des quatre{ //digits par division successives

digit[i]=reste/diviseur[i]; //par 1000 100 10 1reste = reste-(digit[i]*diviseur[i]); //et calcul du reste

}

• Affichage des donnéesfor (i=0;i<4;i++) //pour chaque digit

{PORTA = port_a[digit[i]]; //port_a[] et port_b[] contiennent les

valeursPORTE = port_e[digit[i]]; //de segment pour chaque chiffre}