Académique Documents
Professionnel Documents
Culture Documents
Remerciements
Nous tenons tout d’abord, à remercier Dieu tout puissant, de nous avoir donné la santé et
la volonté pour accomplir ce travail.
En témoignage de notre reconnaissance, nous adressons aussi nos plus vifs remerciements
aux personnes suivantes, sans qui ce mémoire n’aurait été possible :
Les membres du jury qui ont consacrés leur temps pour examiner ce mémoire, qui sont :
- Monsieur RAKOTONIAINA Solofo Hery, Chef de département Génie Electrique et
Enseignant à l’E.S.P.A.
- Monsieur RATOVOHARISOA, Enseignant à l’E.S.P.A.
- Monsieur RAMELINA Arimonjy, Enseignant à l’E.S.P.A.
Tous les enseignants de la filière Génie Industriel qui nous a formés durant ces cinq
années d’études.
II.4.4- Conclusion………………………………………………………………………………...34
Chapitre 3 : CARACTERISTIQUES ET COMPORTEMENTS DU MOTEUR PAS A PAS………35
III.1- Caractéristiques des moteurs pas à pas ……………………………………………………….35
III.1.1- Caractéristiques mécaniques……………………………………………………………..35
a- Taille………………………………………………………………………………………..35
b- Masse……………………………………………………………………………………….35
c- Nombre de pas par tour Np…………………………………………………………………35
d- Précision du pas……………………………………………………………………………35
e- Inertie du rotor……………………………………………………………………………..35
f- Couple résiduel……………………………………………………………………………..35
III.1.2- Caractéristiques électriques et électromécaniques……………………………………….36
a- Résistance de phase……………………………………………………………………...36
b- Inductance de phase……………………………………………………………………..36
c- Courant de phase………………………………………………………………………..36
d- Couple de retenue……………………………………………………………………….36
e- Couple dynamique………………………………………………………………………37
f- Puissance nominale……………………………………………………………………...37
g- Force contre-électromotrice……………………………………………………………..37
III.2- Fonctionnement statique et dynamique……………………………………………………….38
III.2.1- Caractéristique couple-déflexion…………………………………………………………38
III.2.2- Caractéristiques de couple-vitesse………………………………………………………..39
III.2.3- Comportement dynamique du moteur……………………………………………………40
III.3- Comparaison sur les différents types de moteurs pas à pas…………………………………...42
III.3.1- Comparaison entre moteur bipolaire et unipolaire……………………………………….42
a- Moteur bipolaire………………………………………………………………………42
b- Moteur unipolaire……………………………………………………………………..43
III.3.2- Comparaison sur les trois types…………………………………………………………..44
PARTIE 2 : METHODOLOGIE
PARTIE 3 : APPLICATION
I.1- Alimentation…………………………………………………………………………………….89
I.1.1- Le courant que doit fournir l’alimentation…………………………………………………89
I.1.2- Transformateur……………………………………………………………………………..89
I.1.3- Redressement et filtrage……………………………………………………………………90
I.1.4- Alimentation du circuit…………………………………………………………………….91
I.2- Radiateurs………………………………………………………………………………………92
I.3- Réalisation pratique…………………………………………………………………………….93
Chapitre 2 : EXEMPLE D’APPLICATION : SYSTEME DE POSITIONNEMENT SUR UN PLAN
(X,Y)………………………………………………………………………………………….95
II.1- But et limite……………………………………………………………………………………95
PARTIE 2
Figure 2-1 : Mode demi-pas amélioré
Figure 2-2 : Forme d’onde réelle en mode demi-pas amélioré
Figure 2-3 : Mode quart de pas
Figure 2-4 : Mode quart de pas avec compensation de couple
Figure 2-5 : Mode micropas
Figure 2-6 : Allure du courant des 2 phases pour 16 micropas/pas
Figure 2-7 : Montage avec résistance additionnelle
Figure 2-8 : Montage pour une extinction plus rapide
Figure 2-9 : Montage avec alimentation bitension
Figure 2-10 : Montage avec hacheur
Figure 2-11 : Hachage du courant, réglage par Imax et Imin
Figure 2-12 : Hachage du courant, réglage par Imax et temps de coupure t0 fixe
Figure 2-13 : Hachage du courant, réglage par Imax et remise en conduction périodique
Figure 2-14 : Effet du type d’alimentation sur la caractéristique mécanique
Figure 2-15--a : Connecteur centronics
Figure 2-15--b : Connecteur DB 25
Figure 2-16 : Polarisation de l’entrée du port parallèle
Figure 2-17 : Entrée du port parallèle optocouplée
Figure 2-18 : Schéma interne du SAA 1027
Figure 2-19 : Diagramme des impulsions
Figure 2-20 : Schéma de principe de la carte
Figure 2-21 : Polarisation de l’optocoupleur
Figure 2-22 : Circuit de commande d’un entrée du SAA 1027
Figure 2-23 : Polarisation du SAA 1027
Figure 2-24 : Relation entre IQ, VB et RB
Figure 2-25 : Relation entre IQ, VB et PRB
Figure 2-26 : Schéma des phases alimentés du moteur
Figure 2-27 : Alimentation des phases avec résistance de limitation de courant
Figure 2-28 : Commande du relais
Figure 2-29 : Recherche de l’adresse de base du port LPT1
Figure 2-30 : Organigramme du fonctionnement d’Inpout32.dll
PARTIE 3
Figure 3-1 : Schéma géneral de l’alimentation
Figure 3-2 : Configuration du moteur en mode unipolaire
Figure 3-3 : Système de guidage du porte-outil
Figure 3-4 : Système S1
Figure 3-5 : Déplacement du point pour un pas
Figure 3-6 : Photo de la réalisation
Figure 3-7 : Diagramme des impulsions
Figure 3-8 : Syntaxe de l’instruction switch
Figure 3-9 : Affichage du menu dans la console
Figure 3-10 : Affichage à l’écran
PARTIE 1
Tableau 1-1 : Connexion des bobinages…………………………………………………………..24
PARTIE 2
Tableau 2-1 : Brochage et désignation de l’interface parallèle……………………………..…58
PARTIE 3
Tableau 3-1 : Table de vérité de l’opérateur OU……………………………………………….102
Introduction
Bien que les moteurs pas à pas sont utilisés dans de nombreux applications et depuis
une trentaines d’années déjà, par rapport aux autres moteurs, ils sont moins connus. Or, même
si leur commande est beaucoup plus complexe, ils offrent avec un faible coût, un contrôle de
vitesse ou de position en boucle ouverte, typiquement dans les systèmes de positionnement.
Ils sont ainsi beaucoup utilisés dans le domaine de la robotique.
Il existe plusieurs façons de commander ces moteurs, mais dans tous les cas, on a
besoin d’un circuit de commande et d’alimentation. La performance des moteurs dépend
considérablement de ces derniers.
Ainsi, le présent mémoire intitulé « Etude et commande de moteurs pas à pas par
ordinateur pour un positionnement sur le plan » a pour but :
- D’étudier les différents types et commandes de moteurs pas à pas tout en apportant
les améliorations nécessaires.
- D’étudier et de réaliser une carte d’interface entre PC, par l’intermédiaire du port
parallèle et moteurs pas à pas, en utilisant des circuits intégrés spécialisés.
- D’écrire un programme en C++ pour l’application d’une commande de système de
positionnement sur un plan, composé du port parallèle d’un PC, d’une carte
d’interface et de deux moteurs pas à pas.
Déjà vers les années 1850, les premiers moteurs pas à pas furent employés naturellement,
dans les systèmes d’horlogerie. Mais en 1936, Marius Lavet inventa spécialement pour
l’industrie horlogère. En 1919, une invention de l’ingénieur écossais C.L. WALKER fit l’objet
d’un dépôt de brevet au Royaume-Uni, la structure proposée est présentée sur la figure ci-
dessous.
Figure 1-1 : Moteur pas à pas (32 dents rotoriques) inventé par C.I. WALKER en 1919
I.2- Généralité
I.2-1 Définitions :
Le moteur pas à pas également connu sous le nom de « stepping motor » est un dispositif
électromécanique qui convertit les impulsions électriques en un mouvement angulaire. C'est-à-
dire qu’à chaque impulsion que le moteur recevra sur son enroulement statorique, son axe (rotor)
effectuera un angle θ déterminé. Un tour complet de l’axe peut donc être décomposé en un
nombre connu de pas N p .
Le moteur pas à pas est alimenté par une tension continue. Pour faire tourner le moteur
dans un sens ou dans l’autre, il faudra commuter cette tension successivement sur les différents
bobinages du stator et suivant un ordre bien défini.
θ est appelé « angle de pas » ou simplement « pas », son unité est le degré et s’obtient par la
formule suivante :
360
=θ [ °] (I - 1)
Np
Où N p est le nombre de pas par tour, donc le nombre de pas nécessaire pour faire une rotation
complète.
360
Np = [ pas / tour ] (I - 2)
θ
Cet angle peut varier dans de grande proportion, selon le moteur. Les valeurs les plus
couramment rencontrées sont :
f
n= [tours / s ] (I - 3)
Np
f × 60
n= [tours / min ] (I - 4)
Np
Les tensions d’alimentation des moteurs pas à pas et le courant consommé varient dans
de grandes proportions. Les tensions d’alimentation varient de 3 [V] continues à plusieurs
dizaines de Volts, la consommation est de 0,2[ A] à plusieurs Ampères, selon la résistance
ohmique des bobinages. Le couple développé est proportionnel au courant dans les bobinages, le
plus souvent exprimé en kilogrammes par centimètre [kg.cm-1]. Pour les moteurs à faible
couple, il conviendra d’opérer, à l’aide de pignons, un réducteur de vitesse afin d’augmenter le
couple et la précision en même temps.
Les moteurs pas à pas existent en différentes tailles, environ entre 1 cm et plus d’une
dizaine de centimètres de diamètre. Tout dépendra des applications dans lesquelles ils seront
utilisés. Les petites tailles seront utilisées dans les applications qui demandent un faible couple,
pour un couple plus important, des plus grandes tailles seront employées.
Les domaines d’applications les plus connus des moteurs pas à pas sont :
imprimantes
scanners
photocopieurs
lecteur de disque
traceurs
machines à coudre
robotiques
astronomie
horlogerie …
Avantages :
• Durée de vie quasi illimitée puisque l’usure mécanique est pratiquement inexistante
(absence de frottement), sans nécessiter d’entretien. Par conséquent, la durée de vie dépend de
celle du roulement.
• Commande en boucle ouverte, qui signifie qu’aucune rétroaction (boucle de retour) n’est
nécessaire.
• Positionnement précis.
• Un éventail de vitesse peut être réalisé étant donné que la vitesse est proportionnelle à la
fréquence d’impulsion. Il est possible de le faire tourner très lentement en contrôlant la vitesse.
• Faible prix.
Inconvénients :
• Vitesse de rotation réduite. Le moteur peut en effet ne pas suivre toutes les impulsions de
commande.
• Risque de perte de pas (et donc de dysfonctionnement du contrôle en position) en cas de
perturbation anormale notamment de la charge ou de fréquence excessive des impulsions.
• Des résonances peuvent se produire si la commande n’est pas bien contrôlée.
• Vibrations souvent génératrices de bruit acoustique.
Un aimant permanent ou tout simplement aimant est un objet fabriqué dans un matériau
magnétique dur, c’est-à-dire dont le champ rémanent et l'excitation coercitive sont grands. Cela
lui donne des propriétés particulières liées à l'existence du champ magnétique, comme celle
d'exercer une force d'attraction sur tout matériau ferromagnétique.
Dans toute zone de l’espace avoisinant un aimant ou un conducteur parcouru par un courant
Promotion 2010 Page 6
PRINCIPE DE FONCTIONNEMENT DU MOTEUR PAS A PAS
En faisant passer un courant électrique dans une bobine, on crée un champ magnétique
B parallèlement à son axe. Le sens du champ d’induction magnétique est déterminé par la règle
de l’observateur d’Ampère ou du tire-bouchon. On obtient ainsi sur les deux faces de la bobine
deux pôles différents tel que le pôle nord soit dans le sens de l’induction B .
Γ = M ∧ B = M × B × sin α [ N .m ] (I - 5)
Le moteur à aimant permanent fonctionne sur ce principe. L’induction B est créée par les
bobinages statoriques et le barreau aimanté représente le rotor. Le rotor est en aimant permanent
avec beaucoup de pôles. On impose la direction et le sens de B , donc la position du rotor, avec
le sens du courant dans les enroulements.
La figure ci-dessous montre le principe d’un moteur à aimant permanent. Les bobines de même
couleur sont reliées en série.
Le terme bipolaire vient du faite que, pour faire tourner l’axe, il faut inverser la polarité
de l’alimentation de leurs bobines, selon une séquence bien précise. En inversant les polarités
des enroulements statoriques, on inverse les pôles nord et sud au stator. Ces moteurs se
reconnaissent au 4 fils qui sortent de leurs corps.
Pour comprendre comment on procède pour faire tourner l’axe du moteur, analysons un
moteur théorique muni de 4 bobines excitatrices seulement et un rotor avec une paire de pôle,
comme la montre la figure 1-6.
Chaque bobine est composée d’un seul fil, on parle d’enroulements unifilaires.
Comme pour chaque type de moteur, le modèle bipolaire peut être commandé en mode
monophasé, biphasé ou demi-pas.
N.B : Les phases correspondent aux différentes sources d'énergies alimentant les bobinages.
Généralement un moteur bipolaire est un moteur 2 phases, un moteur unipolaire est un
moteur 4 phases.
Notations :
Egalement connue sous le nom de "one phase on full step" ou une phase à la fois en pas
entier. Cette séquence de commande ne réclame que l’alimentation d’un seul enroulement à
chaque pas.
La séquence de commande est : AB / CD / BA / DC / AB . . .
Pour obtenir une rotation dans la direction opposée, il suffit d’inverser les séquences de
commande, donc : AB / DC / BA / CD / AB . . .
En mode monophasé, le couple développé par le moteur n’est pas très important puisqu’un seul
enroulement est alimenté pour effectuer un pas.
Aussi appelé "two-phase-on full step" ou deux phases à la fois en pas entier. Il consiste à
alimenter deux enroulements à la fois de façon à ce que le rotor se positionne entre deux pôles.
La séquence sera : AB et CD / CD et BA / BA et DC / DC et AB / AB et CD . . .
et pour l’autre sens : AB et CD / DC et AB/ BA et DC/ CD et BA/ AB et CD . . .
Ce mode de commande est celui qui procure le couple le plus élevé car deux phases sont
alimentées en même temps.
On arrive ainsi à doubler le nombre de pas et à augmenter sa précision mais le couple devient
irrégulier. Dans ce cas, si la charge est importante, des pas risquent de « sauter ».
En constatant les figures, on voit que ce moteur a un angle de pas de 90° ou 4 pas par tour
en pas entier. Dans les moteurs réels le nombre de pôles est multiplié afin de réduire l’angle de
pas à quelques degrés seulement. Le nombre de phases et la séquence de commande restants,
quand à eux, inchangés. Plus le nombre de pôles sur le rotor et de bobines présentes dans le
stator sera important, plus grand sera le nombre de pas par tour du moteur.
Pour le moteur bipolaire, le nombre de phases est égal au nombre d’enroulements (en général 2
phases). Le nombre de pas par tour Np est obtenu par la formule suivante.
Les enroulements ont un point milieu et sont alimentés avec une polarité toujours de
même signe, attirant toujours le même pôle, d’où le nom « unipolaire ». Afin d’inverser le sens
du courant, les enroulements sont réalisés à l’aide de deux fils dont l’une des extrémités est relié
à la masse (ou au plus de l’alimentation). Pour obtenir la rotation de l’axe du moteur, il suffit
d’alimenter les enroulements à tour de rôle. Ils se reconnaissent au 5 ou 6 fils sortant de leurs
corps.
Pour comprendre comment on procède pour faire tourner l’axe du moteur, analysons un
moteur théorique de 4 pas par tour comme la montre la figure 1-10.
Notations :
Bien que la commande d’un moteur unipolaire est plus facile qu’un bipolaire, avec le
double enroulements, ce moteur est plus coûteux et plus encombrant. Un moteur unipolaire
présentera, à dimension équivalentes, un couple moins important qu’un moteur bipolaire. Ce
moteur est idéal pour les petites puissances.
Pour le moteur unipolaire, le nombre de phases est égal au nombre de demi-enroulements (en
général 4 phases). Le nombre de pas par tour Np est obtenu par la formule suivante.
I.3.4- Conclusion
Pour conclure cette brève description, signalons que ces moteurs (bipolaires et unipolaires) ne
peuvent présenter des vitesses de rotation très élevées. Cette limitation est en grande partie due à
la tension induite par le rotor dans le stator et produisant une force contre-électromotrice.
Quand des accélérations et des vitesses plus élevées sont nécessaires on utilisera de préférence
les moteurs à reluctance variable, dont le rotor est, comme nous le verrons dans le paragraphe
suivant, en fer doux non magnétique, et qui n’induit donc pas de tension dans le stator.
Un circuit magnétique est dit homogène lorsqu’il est constitué d’un seul matériau avec une
section homogène. [ http://fr.wikipedia.org]
La réluctance du circuit magnétique est représentée par R . Il existe une relation permettant de
calculer sa valeur en fonction du matériau qui le constitue et de ses dimensions.
1 l
ℜ= × H −1 (I - 8)
µ S
Où l est la longueur en [mètres]
S la section en [m²]
μ la perméabilité magnétique en [H/m] : μ = μ0 × μr
μ0 la perméabilité du vide et μr la perméabilité relative
e
ℜ2 = H −1 (I - 9)
µ0 × S 2
1 l −e
=
ℜ1 ×
µ0 × µr S1
l + e ( µr − 1)
ℜ=
d’où
µ r × µ0 × S
on voit que la réluctance R augmente avec l’épaisseur de l’entrefer e.
NI
φ=
ℜ
où φ flux [Wb]
Si des pièces du circuit magnétique sont mobiles, elles vont se placer de telle sorte que la
réluctance soit minimum et donc le flux maximum ce qui revient en fait à réduire les entrefers.
Dans un moteur, le circuit magnétique est constitué du stator, du rotor et des entrefers.
I.4.2- Constitution
Le rotor est fabriqué en acier doux non magnétique. Il n’est pas lisse et possède plusieurs
dents (pôles du rotor). Le stator est formé d’un empilage de tôles avec des encoches dans
lesquelles sont logés les bobinages. Les enroulements en série sont diamétralement opposés.
Le nombre de dents au rotor nr est différent du nombre de dents au stator ns avec nr < ns.
I.4.3- Fonctionnement
La figure 1-14 représente le schéma simplifié d’un tel moteur pas à pas. Le stator est
composé de 8 plots sur lesquels sont enroulés les bobinages, ce qui donne 4 phases, étant donné
qu’il faut au minimum 3 phases pour obtenir un cycle complet c’est-à-dire pour faire un tour. Le
rotor est composé de 6 dents. La séquence de commande est la même que celle d’un modèle
unipolaire et peut être commandé sous 3 séquences différentes.
ns × nr
Np = (I - 10)
ns − nr
8× 6
=
Np = 24 [ pas ]
8−6
360 360 360 360
Ou, en regardant la figure : − = − =60° − 45° =
15° , donc c’est un moteur de 24
nr ns 6 8
pas.
C’est une combinaison des 2 types de moteurs à aimant permanent et à réluctance variable. Il est
donc à réluctance variable mais avec un rotor en aimant permanent.
I.5.1- Constitution
Le stator possède des pôles dentés. Le rotor est composé de deux demi-rotors séparés par
un aimant suivant la direction de l’axe de la machine.
I.5.2- Fonctionnement
Prenons un modèle très simple qui produit 12 pas par tour comme le montre la figure
1-17. Le rotor est composé de 2 demi-rotors ayant chacune 3 dents. Entre les deux pièces se
trouve un aimant permanent magnétisé dans le sens de l'axe du rotor, créant ainsi un pôle sud sur
une pièce, et un pôle nord sur l'autre. Le stator consiste en un tube ayant quatre dents à l'intérieur
de celui-ci. Les bobines sont enroulées autour des dents du stator.
Lorsqu' aucun courant ne circule dans les bobines, le rotor va prendre une des positions
montrées dans les diagrammes. C'est parce que l'aimant permanent du rotor essaie de minimiser
la réluctance du champ magnétique. Le couple qui tend à maintenir le rotor dans ces positions est
habituellement petit et est appelé « couple de détente » ou « couple résiduel ». Le moteur ci-
dessous aura 12 positions de détente possibles.
Si le courant circule dans une paire de bobines du stator, comme le montre la figure 1-17, les
pôles résultants vont attirer les dents de la polarité inverse les plus proches, à chaque extrémité
du rotor. Il y a maintenant trois positions stables pour le rotor, le même nombre que le nombre de
dents sur le demi-rotor. Maintenant, le couple requis pour déplacer le rotor de sa position stable
est beaucoup plus grand, et est appelé "couple de maintien" ou « «couple de retenue ».
La séquence de commande est la même que celle d’un modèle bipolaire et peut être
commandé sous 3 séquences différentes. Pour avoir l’autre sens, il suffit d’inverser les séquences
de commande.
La séquence est : A et C / B et C / B et D / A et D
A / A et C / C / B et C / B / B et D / D / A et D
Np = 4.Nd (I - 11)
Le moteur Lavet utilise un rotor bipolaire et une structure très simple qui permet une
miniaturisation aisée, il est couramment utilisé en horlogerie (dans les montres à aiguilles).
Bien que sur le schéma, 4 bobines ont été représentées, ce moteur agit comme s'il ne
possédait que 2 bobines. Ce moteur oblige d'alimenter soit une bobine à la fois, ou les deux en
même temps. À tout moment, donc, le moteur a la moitié ou la totalité de ses bobines alimentées,
ce qui a comme avantage de lui donner plus de force. Par contre, il est plus complexe de
contrôler un moteur bipolaire, au niveau de l'interface de puissance, puisqu'il faut inverser la
polarité de la bobine.
Le moteur unipolaire est conçu de sorte que l'interface de puissance soit grandement
simplifiée, mais au détriment de la force. Le moteur comporte en quelque sorte deux bobines à
points centraux, ces derniers étant communs. Habituellement, on relie ces points centraux, et on
applique l'alimentation à un des 4 autres fils.
Le moteur à 8 fils est celui qui permet le plus de flexibilité, quant au nombre de façons
différentes de le contrôler.
Les différentes connexions possibles des bobines sont montrées dans le tableau suivant :
Notations :
utilisés. Le tableau ci-dessous résume, de façon plus pratique, les différentes séquences à
réaliser.
Figure 1-24 : Chronogramme des impulsions en mode monophasé pour moteur unipolaire
Figure 1-25 : Chronogramme des impulsions en mode biphasé pour moteur unipolaire
Dans le mode 2, le chronogramme laisse apparaître que pour le bobinage 1, les signaux de
contrôle de la phase 1 (B1, P1) et de la phase 2 (B1, P2) sont complémentaires ; il en va de
même pour le bobinage 2.
N.B : Comme on le sait déjà, pour avoir l’autre sens, il suffit d’inverser les séquences de
commutation, c’est pourquoi on montre seulement les séquences dans un seul sens.
Pour la commande d’un moteur bipolaire, c’est un peu plus compliqué puisqu’il faudra
inverser le sens du courant dans les bobinages à chaque pas effectué par le moteur. Deux
solutions sont envisageables : dans le premier cas, un pont de quatre transistors par phase doit
être utilisé ; dans le second, on peut n’utiliser que deux transistors, mais dans ce cas, une
alimentation symétrique sera nécessaire.
Le schéma est donné en figure 1-26. A chaque commande, deux des transistors placés en
diagonale de chacun des deux ponts seront commutés dans le même temps. Ainsi, on obtiendra
une inversion de la polarité de l’alimentation de la bobine, et donc une inversion du sens de
courant.
Figure 1-27 : Chronogramme des impulsions en mode monophasé pour moteur bipolaire
Figure 1-28 : Chronogramme des impulsions en mode biphasé pour moteur bipolaire
Ici, l’un des pôles de chaque bobinage est connecté à la masse. L’autre extrémité sera elle
reliée à un couple de transistors dont la commande séparée l’amènera soit au potentiel positif de
l’alimentation, soit au potentiel négatif. On obtient ainsi une inversion du courant dans la bobine.
Les séquences à réaliser et les chronogrammes correspondants sont les mêmes que le précédent.
La loi d’additivité des tensions nous donne l’expression de la tension aux bornes de la bobine :
U = U R + U L = Vcc
di
Or d’après la loi d’ohm, U R = r.i et par définition U L = L.
dt . Ce qui nous
donne l'équation différentielle de l'installation du courant i dans l’enroulement :
di
= r.i + L.
Vcc (I - 12)
dt
La résolution de cette équation différentielle, donnée en annexe-I, nous donne l’expression de
i(t).
t
Vcc −
=
i (t ) (1 − e ) τ
(I - 13)
r
L
avec τ =
r la constante de temps en [s]. Elle caractérise le retard que met l’intensité à
atteindre sa valeur maximale Vcc/r (intensité nominal).
IN = Vcc / r
Quand t = τ = L/R,
di
r.i + L. =0 (I - 14)
dt
La résolution de cette équation différentielle, donnée en annexe-I, nous donne l’expression de
i(t).
Vcc −τt
i (t ) = .e (I - 15)
r
L
avec τ =
r la constante de temps en [s]. Ici, elle caractérise le retard que met l’intensité à
disparaitre.
Lorsque t = 5τ, le régime permanent est atteint (quasiment car l'axe des abscisses est asymptote
horizontale à la courbe).
Quand t = τ = L/R,
Figure 1-33 : Courant dans les deux enroulements en plein pas pour une faible fréquence de
commutation
On constate que les formes des courants ne sont pas très éloignées de la forme idéale donnée plus
haut.
Figure 1-34 : Courant dans les deux enroulements en plein pas pour une fréquence de
commutation élevée
On constate que les formes des courants tendent vers la dent de scie. Ce qui donne une
commande moins brutale, mais on voit que l'amplitude est aussi sensiblement diminuée. Comme
un fonctionnement silencieux à vitesse constante peut être obtenu dans ce cas de figure, on le
trouve employé dans certaines imprimantes.
On vient de voir les problèmes liés à la constante de temps inductive. L'autre composante
du problème est la force contre-électromotrice. Le moteur étant un moteur synchrone et fournit
une tension sinusoïdale d'amplitude proportionnelle à la vitesse.
Ce paramètre n'est pas spécifié, mais on peut le mesurer facilement. Par exemple, en serrant l'axe
du moteur dans le mandrin d’un tour réglé à une vitesse constante en [tours/min], et en mesurant
la tension aux bornes de l’enroulement avec un voltmètre alternatif.
L'effet de la FCEM ne peut pas être simulé facilement car la FCEM est produite par le
mouvement du rotor, et dépend donc de la charge.
Dans le cas d’une alimentation en tension, les formes des courants sont très sensibles au
déplacement, en effet, le courant résulte de la différence entre la tension appliquée et la force
contre-électromotrice de nature complexe à cause des déplacements pulsants (dθ/dt non
constant). Le couple électromagnétique est alors lui-même très pulsé et la détermination des
formes d’onde résulte d’un couplage électromécanique complexe. Seule une résolution
numérique des équations permet de simuler ce fonctionnement.
II.4.4- Conclusion
On ne peut pas atteindre instantanément la valeur nominale du courant dans chaque bobinage ni
l’annuler instantanément à cause de l’inductance. Les variations du courant dans le circuit ne
subissent aucune discontinuité.
Le champ magnétique créé est proportionnel au courant qui traverse la bobine (B=4π x10-7 NI/L).
Le couple du moteur est donc lui aussi, proportionnel au courant, il croit exponentiellement.
Par son principe de fonctionnement, un moteur pas à pas ne travail que sur des régimes
transitoires, qui sont ceux d’un circuit RL (un enroulement) soumis à des échelons de tensions.
A l’arrêt, le courant est maximal, traversant la résistance r d’un enroulement, il entraîne des
pertes Joule (Pj = rIN² par enroulement) : c’est à l’arrêt que le moteur pas à pas chauffe le plus.
En marche, à haute fréquence le circuit RL n’a plus le temps de se charger et de se décharger
complètement. La valeur efficace du courant et le couple diminue quand la fréquence (vitesse du
moteur) augmente. Le couple finit par s’annuler au-delà d’une fréquence maximale de
fonctionnement, ce qu’on va découvrir dans le chapitre suivant.
Ils existent deux sortes de caractéristiques pour le moteur pas à pas : les caractéristiques
mécaniques et les caractéristiques électriques (électromagnétiques et électromécaniques)
C’est la dimension mécanique du moteur. Elle consiste en un diamètre (ou une cote sur plat pour
les moteurs carrés) et une longueur. Pour les moteurs hybrides, les cotes sont souvent données en
pouces, ce qui fait qu'un moteur de 2,3 pouces de diamètre et de 2 pouces de longueur est
désigné par "taille 23 longueur 2 pouces".
b- Masse
Il correspond au nombre de systèmes de pôles. Il est donné pour une commande dite "en plein
pas" et vaut 4 fois le nombre de systèmes de pôles pour les moteurs diphasés.
d- Précision du pas
C'est la tolérance non-cumulative de la position des pas par rapport à leur place théorique. Elle
est donnée en [%] de l'intervalle angulaire entre deux pas.
e- Inertie du rotor
f- Couple résiduel
C'est le couple qu'il faut fournir au moteur non alimenté pour vaincre l'attraction magnétique
rotor-stator. Il est assez fort pour un moteur à aimant permanent, moyen pour un hybride et nul
pour un moteur à réluctance variable qui ne comporte pas d’aimant. Les fabricants y incluent
aussi le frottement des paliers.
Promotion 2010 Page 35
CARACTERISTIQUES ET COMPORTEMENTS DU MOTEUR PAS A PAS
b- Inductance de phase
C'est l'inductance de chaque enroulement non couplé aux autres (tous les autres en circuit
ouvert).
c- Courant de phase
C'est l'intensité nominale moyenne par phase. Elle est limitée par des considérations
d'échauffement et par la saturation du circuit magnétique. Ces deux limitations agissent
différemment selon le mode de commande. Cette valeur ne constitue pas la limite supérieure
mais plutôt correspond à la performance optimum en service continu.
d- Couple de retenue
C’est le couple qu’il faut appliquer pour faire décrocher le moteur (le déplacer de façon
permanente de sa position initiale). Cette valeur est généralement donnée pour un moteur à
l’arrêt mais alimenté normalement.
Cr
Kc = (I - 16)
Ic
où Cr est le couple de retenue [N.m]
L’intensité composée est le module de la somme vectorielle des intensités des enroulements
alimentés. Dans le cas de la commande en plein pas (deux phases à la fois alimentés par des
courants égaux), elle vaut :
I=
c I ph × 2
Les champs magnétiques créés s’ajoutent aussi vectoriellement et en mode plein pas, le couple
l’intensité composée varie un pas sur deux entre I ph et I ph × 2 , et le couple varie dans la
même proportion.
e- Couple dynamique
C'est la valeur du couple résistant qui provoque le décrochage en marche. Cette valeur diminue
quand la vitesse augmente.
f- Puissance nominale
C'est la puissance qu'on peut tirer au régime de puissance maximum en alimentant avec un
circuit simple donné en référence.
g- Force contre-électromotrice
Ce paramètre est rarement donné dans les documentations, mais il peut être facilement mesuré. Il
peut aussi être estimé assez exactement comme suit.
E
Kv = (I - 17)
ω
où E est la force contre-électromotrice en [V]
π .K v
ou K ''v = [V / tour / min ]
30
Cr
K 'v = π . 2 [V / tour / s ] (I - 18)
I ph
Cr
K ''v = π . 2 [V / tour / min ] (I - 19)
60.I ph
Cette caractéristique est donnée dans la figure ci-dessus. On constate qu'il y a des points où le
couple s'annule ; cependant, il faut distinguer deux groupes de points :
S : Le couple décroît quand le rotor avance, il s’agit d’un rappel. La dérivée du couple est
négative, c'est à dire que le couple tend à ramener l'induit vers la position d'équilibre si on
l'en écarte : ce sont des points d'équilibre stable
I : Le couple augmente lorsque le rotor avance. La dérivée du couple est positive, c'est à
dire que le couple tend à écarter l'induit de la position d'équilibre si on l'en écarte : ce sont
des points d'équilibre instable ; le rotor tournera et s'arrêtera à la prochaine position
d'équilibre stable. (La convention sur le couple doit être moteur).
Le couple de retenue est la valeur maximum du couple : en partant d'une position d'équilibre
stable, si on exerce un couple sur le rotor, il se déplacera de sa position d'équilibre à vide et y
reviendra, si on ne dépasse pas ce couple. Si on le dépasse, le moteur tourne sans exercer aucun
couple résistant : il décroche.
La raideur est la dérivée du couple par rapport à la déflexion. Dans le cas d'un moteur ayant p
systèmes de pôles, la fonction du couple de retenue étant une sinusoïde d'amplitude Cr (couple
de retenue), elle vaut :
dC
=
R = p.Cr (I - 20)
dα
R est la raideur en [Nm/rad], C est le couple et α est l'angle en [radians].
On voit que la raideur augmente avec le nombre de systèmes de pôles.
Source : Moteurs pas à pas - Techniques de l’Ingénieur – Michel Abignoli et Clément Goeldel
Promotion 2010 Page 39
CARACTERISTIQUES ET COMPORTEMENTS DU MOTEUR PAS A PAS
Le calcul du couple disponible étant impossible parce qu’il dépend d’un grand nombre de
facteurs tels que : vitesse, type de circuit de commande, nature de la charge. Les constructeurs
donnent des courbes couple-vitesse pour plusieurs montages-type de commande et en supposant
une charge de friction pure. Ceci ne permet que de se faire une idée de ce qu'on est susceptible
d'obtenir dans le cas réel.
La courbe ci-dessous représente la position du rotor en fonction du temps lorsqu'on commute les
enroulements de un pas en avant.
La commande à vitesse constante très basse peut conduire à des phénomènes de résonance
qui entraînent des pertes de synchronisme pour certains moteurs.
Dans la figure 1-37, l’évolution oscillante passe par un maximum à la position θ max et par un
minimum à la position θmin .
La commutation vers le pas suivant arrive à la position θ pour laquelle la vitesse du rotor est
négative, et l’énergie cinétique emmagasinée sera notée Wc. De θ à θmin, le rotor est freiné par le
couple accélérateur résultant de la différence entre le couple moteur et le couple résistant.
L’énergie de freinage est notée Wf , l’énergie maximale de freinage W’f est obtenue si θ = θmin.
La condition de fonctionnement synchrone s’écrit donc : W’f > Wc
Si cette condition n’est pas satisfaite, le moteur continue sa rotation en sens inverse et entre dans
un fonctionnement instable.
Les résonances mécaniques peuvent être la source de décrochage à des certains fréquences
inférieures à celle de « arrêt-démarrage ». La figure suivante illustre la possibilité de décrochage
due à ces oscillations.
Pour atténuer ces défauts : le moteur peut-être équipé d’un amortisseur : frottements
mécaniques, magnétiques ou hydrauliques ; passer par une commande spéciale qui est le mode
« micropas » ou utilisation du freinage électrique. Un amortissement électrique peut être obtenu,
pour les moteurs alimentés en tension, en plaçant des diodes de roue libre aux bornes des
enroulements ; les courants induits dans ceux-ci créent un couple de freinage.
C’est dans la commande en plein pas (pas entier) que ce phénomène est plus susceptible
d’apparaître.
Un moteur démarré dans la zone d’arrêt-démarrage (zone I) peut être accéléré en accroissant
progressivement la fréquence des impulsions de commande jusqu’à la zone II (survitesse), puis
revenir dans la zone I pour effectuer l’arrêt.
Inconvénients :
La commande est plus compliquée car il faut inverser le sens du courant pour faire
tourner le moteur
b- Moteur unipolaire
Avantages :
La commande est beaucoup plus simple que le bipolaire
Inconvénients :
Couple plus faible que le moteur bipolaire
Le nombre d’enroulement est doublé (enroulement bifilaire), donc plus coûteux et
encombrant
Pour un moteur à aimant permanent ou hybride donné, le couple moteur obtenu avec une
alimentation bipolaire est toujours supérieur à celui que crée une alimentation unipolaire, pour la
même dissipation thermique. De même, pour un même couple moteur, on a des pertes inférieures
avec une alimentation bipolaire. La figure 1-40 montre les différentes performances limites d’un
moteur hybride alimenté à partir d’une même tension, mais pour différents couplages de ses
enroulements.
Figure 1-40 : Courbes de couples moteurs pour différents couplages à pertes Joule égales
Source : Moteurs pas à pas - Techniques de l’Ingénieur – Michel Abignoli et Clément Goeldel
I.1- Introduction
Comme nous avons vu auparavant que les performances statiques ou dynamiques d’un
entraînement par moteur pas à pas dépendent de beaucoup de paramètres. Toute amélioration du
comportement nécessite une amélioration sur la commande et/ou l’alimentation.
Nous allons voir quelque moyen pour améliorer la commande et l’alimentation dans les
paragraphes suivants dans le but de résoudre les problèmes cités avant.
Nous avons déjà vu les 3 modes les plus répandus qui sont : la mode monophasé, la mode
biphasé et la mode demi-pas.
Pour améliorer la résolution et la performance des moteurs pas à pas, nous allons voir
d’autre mode pour la commande de ces moteurs. Pour simplifier nous n’allons voir que pour les
moteurs bipolaires, mais il est facile de l’adapter pour l’unipolaire.
Le problème du demi-pas qu’on a vu avant était que le couple n’était pas régulier. Quand
une seule phase est alimentée, le couple est minimal ; quand deux phases sont alimentées, le
couple devient 2 fois plus élevé. Le couple est alors limité par le pas les plus faibles.
augmentant le courant d’un facteur 2 lorsqu'une seule phase est alimentée. L'utilisation de ce
courant plus élevé durant l'alimentation d'une seule phase produit approximativement un couple
égal pour tous les pas. Ainsi, on a les performances de couple du mode 2 avec une précision
double. Grâce à la plus grande régularité du couple et à la diminution des oscillations
mécaniques, la fréquence maximale des pas possible est plus élevée qu’en pas entier. Les circuits
intégrés de commande modernes, génèrent directement cette consigne.
Pour avoir des pas encore plus fins, on peut adopter le mode quart de pas, c'est-à-dire
qu’un pas entier est divisé par 4.
Ici, on constate sur la figure que le couple est moins régulier qu’en mode 4.
On peut l’améliorer pour avoir un couple régulier en rajoutant des valeurs intermédiaires du
courant. Voici la forme d’onde réelle pour cette amélioration.
Nous avons vu qu'en alimentant les deux phases avec des courants égaux, il apparait un
pas intermédiaire à mi-chemin entre les positions du mode "une phase à la fois". Si les deux
courants sont inégaux, comme dans le mode 5, la position du rotor sera décalée vers le pôle le
plus fort. Cet effet est utilisé dans le contrôle par micropas (microstepping), qui subdivise les pas
de base en proportionnant le courant dans les deux phases. De cette façon, la grandeur des pas est
réduite et la fluidité à basse vitesse est améliorée. Dans cette situation, le courant dans les
bobines ressemble de plus en plus à deux ondes sinusoïdales déphasées de 90 degrés (voir figure
2-6). Le moteur est alors contrôlé comme s'il s'agissait d'un moteur à courant alternatif (AC)
synchrone avec la faculté de s'arrêter à n'importe quelle position, c'est à dire avec une très grande
résolution.
le moteur a une raideur non infinie, c'est à dire qu'il présente une zone élastique de l'ordre
de + ou - un pas entier, ce qui donne une incertitude de positionnement dépendant de la
charge.
le champ circulaire est approximé de manière numérique, c'est à dire que le cercle est
simulé par un polygone à un grand nombre de côtés. Bien que l'on puisse donner le
nombre de côtés que l'on veut, en pratique il est sans intérêt d'aller au-delà de 512 pas par
période (le plein pas découpé en 128 parties).
le moteur réel a une précision du pas donnée par le constructeur qui est de l'ordre de 5%
du plein pas pour les moteurs ordinaires, et 2 ou 3% pour les moteurs de haute qualité.
Dans cette mode d’alimentation, on n’impose plus au rotor de franchir brutalement les pas.
Les vitesses de rotation peuvent alors être beaucoup plus élevées et ce sont les accélérations en
vitesse qui sont limitées par le moment d’inertie des parties tournantes.
La figure montre en réalité les consignes de courant. Les courants suivent une fonction
sinusoïdale et sont en quadrature.
On constate que la constante de temps τ = L/r peut être diminuée par l’addition d’une résistance
r’ en série avec l’enroulement. Cependant, la valeur du courant (régime permanent) est réduite.
Vcc / r+r’ < Vcc/r, le couple est donc diminué. Pour le rétablir, il faut augmenter la tension
L
est τ '
La nouvelle constante de temps = <τ
r+r'
Pour une extinction plus rapide, on place en série avec la diode une résistance r ′ ou une diode
Zener (figure 2-8).
Cette amélioration est facile à obtenir mais se paie par des pertes électriques dans la
résistance série, qui augmentent avec le degré de l’amélioration. Aussi, ce procédé ne sera utilisé
que pour les entraînements de faible puissance pour lesquels le prix de revient doit être
particulièrement réduit.
b- Alimentation bitension
Il est en théorie impossible d’avoir de parfait créneaux de courant dans les moteurs puisqu’ils
sont composés de bobines. Il est cependant possible d’accélérer la mise en place du courant en
augmentant la tension d’alimentation.
Comme IN = Vcc/r :
L
si Vcc ⇒ I N ⇒ τ = = cte
r
= : i (τ ) 0, 63.I N > 0, 63.I N
'
Soit V’cc > Vcc, le courant croit rapidement car
Vcc' V
I =
'
N > I N = cc
r r
T’ passant au bout d’un temps t0 de coupure (figure 2-12). Le C.I. PBL 3717 (Rifa ou
SGS Thomson) intègre cette commande avec un pont en H et un courant allant jusqu’à 1A. (2
C.I. sont nécessaires pour un moteur).
Figure 2-12 : Hachage du courant, réglage par Imax et temps de coupure t0 fixe
Une horloge remet T’en conduction avec une période te (figure 2-13). Le C.I. L 297
(SGS Thomson) réalise cette régulation, associé à deux ponts en H qui sont intégrés dans le C.I.
L 298 (SGS Thomson).
Figure 2-13 : Hachage du courant, réglage par Imax et remise en conduction périodique
Remarque : Dans ces deux derniers cas, le courant n’a pas une valeur moyenne et une ondulation
fixées, car elles dépendent de la vitesse et de la position du rotor (par la FCEM ou la réluctance).
Par contre, la fréquence de hachage est maîtrisée par la commande et seule la valeur Imax doit être
mesurée.
On a vu que le courant peut être régulé autour de sa valeur nominale Vcc/r. Sa vitesse de montée
est considérablement augmentée. Les performances en fréquence (arrêt - démarrage, survitesse)
du moteur sont donc largement améliorées. Le rendement du montage est supérieur au montage
avec résistance additionnelle.
I.4- Remarque
Dans le cas d’une alimentation en tension, les formes des courants sont très sensibles au
déplacement. En alimentation en courant, les formes de courant sont asservies à des créneaux
aux basses vitesses. Lorsque la vitesse augmente, les FCEM croissent et perturbent les formes de
courant qui ne peuvent plus être régulées.
I.5- Conclusion
Les alimentations peuvent être en pleine onde de tension (éventuellement avec résistance de
limitation) ou en courant avec régulation. Les performances obtenues dépendent
considérablement du mode d’alimentation comme en témoigne la figure ci-dessous.
Selon le besoin, l'utilisateur peut choisir le moteur qui lui convient à son application, avec
l'alimentation et le mode d'excitation correspondant.
Pour notre projet, on va utiliser deux moteurs pas à pas unipolaires qui seront commandés par
ordinateur via le port parallèle. Dans le chapitre suivant, on va voir l’étude d’une carte
d’interface entre le port parallèle et les moteurs.
Sur chaque sortie : courant entrant ≤ 24 [mA], courant sortant ≤ 10 [mA] . En réalité, ses valeurs
varient de port en port. Il faut prendre des mesures pour ne pas prélever beaucoup de courant du
port, par exemple utiliser un buffer.
Entrées :
en logique TTL :
• une entrée reliée au 5v par une résistance de rappel de 10[kΩ] retourne un 1 logique.
• une entrée reliée au 0 volt par une résistance de 1[kΩ] retourne un 0 logique.
• une entrée qui reste "en l’air" retourne un 1 logique.
Les entrées du port retournent donc un 1 par défaut si elles ne sont pas polarisées. Cet état
n’étant pas très stable, il est conseillé d’utiliser systématiquement des résistances de polarisation
(reliées au 5V de préférence).
Dans le cas où le port doit travailler dans une ambiance "difficile", il est conseillé de protéger les
entrées avec des optocoupleurs :
Pour utiliser une entrée optocouplée, comme le montre la figure ci-dessus : quand l’interrupteur
se ferme ou quand le transistor conduit, la masse remonte, allume la diode de l’optocoupleur qui
devient passant et porte l’entrée au potentiel 0 (par défaut, une entrée débranchée est donc à 1).
Dans notre réalisation, ce sont les sorties du port de donnée qui nous intéressent le plus.
Sorties :
En théorie, une sortie TTL ne peut délivrer qu’un niveau logique. En pratique, cette
tension de sortie peut être chargée de façon à débiter un courant faible de l’ordre de 10 [mA]
maximum. Ce courant peut commander un transistor en commutation ou un optocoupleur.
Il existe de nombreux C.I. proposés par différents constructeurs, regroupant une logique
de commande dont la fréquence détermine la fréquence de commutation des pas, et une
information logique supplémentaire qui impose le sens de rotation du moteur. Parfois, l’étage de
puissance (transistors et diodes de roue libre) est inséré dans ces C.I.
Ces C.I. gèrent eux-mêmes l’ordre de succession des informations pour les différentes phases du
moteur. Ils sont donc généralement spécifiques pour chaque type de moteur pas à pas
(unipolaire, bipolaire) et pour chaque mode de commande (plein pas, demi-pas, micropas …). Ils
ne nécessitent que quelques composants externes et simplifient au maximum l’envoi des
séquences de commande, c’est pourquoi nous avons choisi un de ces C.I. pour ce projet de
mémoire. Citons quelques-uns avec leurs caractéristiques générales :
TEA 3717 :
Commande bipolaire
Mode demi-pas et pas entier
Diodes de protection interne
Large gamme du courant de sortie de 5[mA] à 1[A]
Tout particulièrement désigné pour une utilisation avec une tension d’alimentation du
moteur non stabilisée.
La valeur du courant d’alimentation du moteur peut être choisie par pas à l’aide
d’entrés logiques, ou varier d’une façon continue.
2 circuits sont nécessaires.
MC3479C :
Commande bipolaire
Ce ne sont pas tous les C.I. spécialisés, il existe encore beaucoup d’autre qu’on ne va pas les
citer tous, mais ce sont les plus employés.
Il y a aussi le SAA 1027 que nous allons voir plus en détail car c’est ce que nous allons employer
dans notre circuit d’interface entre le port parallèle et le moteur pas à pas.
II.3- Utilisation d’un circuit intégré spécialisé SAA 1027 pour la commande
unipolaire.
Le SAA 1027 est un produit de RTC, conçu pour conduire un moteur 4 phases
unipolaire. Son schéma interne est donné en figure 2-18 (pour plus de détail, voir la data-sheet
du SAA 1027).
Promotion 2010 Page 61
ETUDE D’UNE CARTE D’INTERFACE POUR LA CONNEXION SUR LE PORT PARALLELLE
C’est l’entrée de l’étage de déclenchement, l’avance d’un pas se fera sur le front montant du
signal. Le diagramme de la figure 2-19 nous montre l’allure des signaux de sortie en fonction
des niveaux appliqués sur les 3 broches de commande.
Ce diagramme indique qu’il s’agit d’une commande unipolaire en mode biphasé et en pas
entier. La vitesse de rotation du moteur est obtenue en fonction de la fréquence des
impulsions sur cette entrée.
C’est l’entrée de l’étage de configuration du sens de rotation. Cette entrée peut être positionnée
indépendamment des entrées S et T. Suivant qu’elle est à L ou à H, le moteur tournera dans un
sens ou dans l’autre selon la table de vérité ci-dessous.
S=H
Sens horaire Sens anti-horaire
R=L R=H
T Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4
0 L H L H L H L H
1 H L L H L H H L
2 H L H L H L H L
3 L H H L H L L H
0 L H L H L H L H
Quand S = L et T = H, les 4 sorties prennent les niveaux montrés dans la ligne supérieure et
inférieure de la table ci-dessus. Si S n’est pas employé, il devrait être relié à l’alimentation.
Broche 4 :
Une résistance de polarisation devra relier cette entrée au + de l’alimentation. C’est cette
résistance qui commande le courant de base des transistors de sortie. Sa valeur doit être choisie
selon le courant de sortie exigé et déterminée à partir des graphiques donnés dans le fiche
technique.
Broche 14 :
Sorties du C.I. qui sont à collecteur ouvert. Les transistors de sortie sont protégés des surtensions
à l'aide de quatre diodes intégrées. Le point commun de ces diodes aboutit en broche 13.
Cependant, des diodes externes pourront être utilisées, la broche 13 étant alors laissée "en l'air".
Ces diodes devront être de type rapide.
La carte d’interface que nous allons étudier et réaliser est basé sur 2 circuits SAA 1027 pour
commander 2 moteurs pas à pas unipolaire.
Schéma de principe
Les signaux à appliquer sur les 3 broches de commande du SAA 1027 sont obtenus à
partir d’un programme commandant le port parallèle que nous verrons dans le prochain chapitre.
On ne peut pas brancher directement ce C.I. à la sortie du port parallèle car il n’est pas
compatible TTL.
Pour une raison de sécurité du port parallèle, on va utiliser un optocoupleur sur chacune des
lignes de bus de données. L’optocoupleur assure une isolation galvanique entre le port parallèle
et le reste du circuit, de plus on l’emploi pour ne pas tirer beaucoup de courant sur le port.
L’optocoupleur est composé d’une diode émettrice d’un côté, d’un phototransistor de l’autre
côté. On constate que la sortie est à collecteur ouvert, ce qui signifie que nous devons placer une
résistance de Pull-up à la sortie de manière à traduire la sortie en signal 0-5V.
IDmax = 50 [mA] ; VCEsat = 0,1 [V] ; ICmax = 30 [mA] ; VLED(VF) = 1,2 [V] ; fréquence = 80 [kHz]
D’après une mesure effectuée sur les ports de donnée, on trouve VD = 4,18 [V] ; Vcc = 5 [V] ;
ID < 20 [mA].
=
VD RD .I D + VF
VD − VF
⇒ RD min =
I D max
4,18 − 1, 2
A.N : ⇒ RD min
= = 149
0, 02
=
Vcc RC .I C + VCEsat
Vcc − VCEsat
⇒ RC =
IC
5 − 0,1
A.N : prenons IC = 20mA =
=> RC = 245
0, 02
D = H => S = L;
D = L => S = H
Maintenant, pour avoir les mêmes états logiques entre les sorties D et les entrées du SAA
1027, et pour garantir les niveaux L et H sur ces 3 entrées, on se sert de 3 transistors NPN
montés en inverseur comme le montre la figure ci-dessous. Le problème d’incompatibilité entre
les sorties aux niveaux TTL du port et les entrées du C.I. sont ainsi résolu.
Les transistors employés sont des BC 547 dont voici quelques caractéristiques :
VCE0 = 45 [V] ; Icmax = 100 [mA] ; β min ( hFE min ) = 110 ; VCEsat = 0,2 [V] ; VBEsat = 0,7 [V]
VIH > 7,5 [V] ; IIH = 1[μA] ; VIL < 4,5 [V] ; IIL = 30[μA]
La relation entre les signaux de sortie du port et l’entrée du SAA 1027 est :
D = H => T = H;
D = L => T = L
V=
CC 2 R5 .I 5 + VCEsat
VCC 2 − VCEsat
⇒ R5min =
I 5max
12 − 0, 2
A.N=
: R5min = 118
0,1
Les entrées du SAA 1027 n’ont besoin qu’un très peu de courant (IIH = 1[μA]), on peut prendre
la valeur R5 = 1 [kΩ]
VCC 2 − VCEsat 12 − 0, 2
=
⇒ I5 =
R5 1000
⇒ I 5 12 [ mA]
I5 12
I= =
1min
β min 110
⇒ I Bsat =I1 =0, 2 [ mA]
5 − 270.0, 2.10−3 − 0, 7
=
A.N : ⇒ R1 = 21230
0, 2.10−3
Prenons R1 = 18 [kΩ]
Chaque sortie du SAA 1027 ne peut fournir qu’un courant maximal de IQmax = 350 [mA]
(IOL(max)). On ne pourra donc pas brancher directement notre moteur à la sortie du C.I. car il a
besoin de Iph = 500 [mA] par phase. C’est pourquoi nous avons employé à chaque sortie du C.I.,
des transistors de puissance BD 135 (NPN) pour conduire les courants nécessaire dans les phases
des moteurs. L’alimentation des moteurs est différente de celle des SAA 1027, nous n’avons
donc pas besoin de la broche 13 du C.I, on va laisser cette entrée en l’air et utiliser des diodes
externes.
Sur la broche 14 se trouve l’alimentation de toute la logique interne du C.I .Une cellule de
filtrage R-C (100 [Ω] et 100 [nF]) est nécessaire pour éviter les perturbations.
Sortie
Les sorties du SAA 1027 sont à collecteur ouvert, des résistances de tirage de 1 [kΩ] sont donc
utilisées pour garantir les niveaux H nécessaire à la sortie comme montré sur la figure ci-dessus.
Détermination de RB
La valeur de la résistance RB sur la broche 4 est choisie en fonction du courant de sortie IQ.
Calcul de IQ :
=
VCC 2 R8 .I Q + Vsat
VCC 2 − Vsat
⇒ IQ =
R8
12 − 1
A.N : ⇒ IQ =
1000
IQ = 11 [mA]
La puissance nécessaire à la résistance RB est donnée par le graphique N°3. Dans notre cas,
1/4[W] suffit.
La puissance totale consommée par le SAA 1027 est donnée par le graphique N°4, ce qui nous
donne à peu près Ptot (SAA 1027) = 100 mW.
La résistance R18 de la figure ci-dessous est nécessaire pour avoir dans chaque phase du moteur,
un courant Iph = 0,5 [A]. En même temps, il permet un établissement de courant plus rapide dans
les enroulements du moteur.
Comme le SAA 1027 commande le moteur en mode biphasé, le schéma de la figure 2-25 nous
permet de dimensionner la résistance R18.
D’après la loi des nœud, on a I18 = 2.Iph , avec Iph = 0,5 [A].
Nous avons Vccm = 16 [V] ; résistance des enroulements Rm = 16 [Ω ]; VCEsat = 0,5 [V].
VCCm − VCEsat − Rm .I ph
⇒ R18 =
2.I ph
16 − 0,5 − 16.0,5
A.N : ⇒ R18 =
2.0,5
I ph
0,5
I Bsat > =
β 63
9.10−3
⇒ I Bsat =
VCC 2 − R8 .I B − VBEsat
⇒ RB =
IB
12 − 1000.0, 009 − 1
A.N : ⇒ RB =
0, 009
RB = 150 [Ω]
e- Amélioration du circuit
Quand les moteurs sont à l’arrêt mais alimentés, il conviendrait de diminuer le courant
traversant chaque bobinage afin de réduire l’échauffement du moteur et, évidemment, le courant
consommé. Pour cela, avec le bit de donnée D3, on va commander le transistor T4 (2N2222) qui
va déclencher ou non le relais placé dans son collecteur. Quand le relais n’est pas alimenté, le
contact au repos permet de connecter directement les moteurs à l’alimentation Vccm. Par contre,
quand il est alimenté, une résistance R16 = 100 [Ω] est placée entre l’alimentation et les moteurs,
qui limitera la dissipation de puissance.
N.B : Il faut remarquer que le couple de retenue va diminuer dans la même proportion que le
courant. Ceci conviendra pour les applications qui ne demandent pas beaucoup de couple
de retenue.
Puissance dissipée par les 2 moteurs et les résistances de limitation de courant (en négligeant
les pertes dans les transistors) :
4 enroulements sont parcourus par le courant Iph = 0,5 [A] à tout instant.
Pmot= VCCm × 4 × I ph
Pmot = 32 [W]
Calcul de I’ph :
V −V
⇒ I ph
'
= CCm CEsat
4.R16 + 2.R18 + Rm
16 − 0,5
A.N : ⇒ I ph
'
=
4.100 + 2.8, 2 + 16
I’ph = 36 mA
'
Pmot =
4 × VCCm × I ph
'
PR16 = R16 × ( 4 × I ph )
' 2
Puissance de la résistance R16 :
Commande du relais :
Relais : tension = 12 [V] ; courant maxi = 5 [A] ; résistance du bobinage Rrl = 400 [Ω]
2N2222 : VCE0 = 30[V] ; ICmax = 800 [mA] ; IBmax = 200 [mA] ; βmin = 75
La LED s’allume quand le relai est activé. La diode D1, diode de roue libre, assure la continuité
du courant lorsque le transistor T4 est bloqué, évitant ainsi une surtension qui pourra détruire le
transistor. Le port est toujours protéger par l’optocoupleur.
On a =
VCC 2 Rrl .I rl + VCEsat
VCC 2 − VCEsat
⇒ I rl =
Rrl
12 − 0, 4
I=
rl = 0, 029 ⇒ I=
rl 29 [ mA ]
400
I C=
4 I rl + I LED
I C 4 0, 039
I B= = = 5, 2.10−4
4 min
β min 75
−4 −4
Prenons un coefficient de saturation de 1,5 : I B=
4 sat 5, 2.10 ×=
1,5 7,8.10
5 − 270.7,8.10−4 − 1, 3
A.N : R4 =
7,8.10−4
R4 = 4,7 [kΩ]
VCC=
2 R17 .I LED + VLED + VCEsat
12 − 1, 6 − 0, 4
=
A.N : R17 = 1000
0, 01
R17 = 1 [kΩ]
Le port parallèle peut fonctionner selon différent modes. Les différentes modes avec leurs
principales caractéristiques sont :
• Le mode SPP (Standard Parallel Port):
C’est le protocole de base permettant l’envoi de données vers une imprimante.
Le SPP est devenu capable d’envoyer et de recevoir des données. Il peut donc être
bidirectionnel.
La vitesse de transmission maximale que l’on peut espérer obtenir avec ce port est de
l’ordre de 150[ko/s].
• Le mode EPP (Enhanced Parallel Port):
Il permet d’atteindre un débit de 2 [Mo/s].
Il est bidirectionnel.
• Le mode ECP (Extended Capacity Port):
C’est le plus récent. Il dérive du port EPP et possède les mêmes caractéristiques, avec des
possibilités supplémentaires :
« Plug and Play » (branchez et utilisez).
Il permet au périphérique de s’auto-identifier auprès de la machine dès le démarrage.
Il permet le Direct Memory Adress (DMA). Il est ainsi possible d’envoyer ou de
recevoir des données sans avoir besoin du processeur.
Généralement, sur les Bios modernes, les deux autres modes basculent automatiquement en SPP
quand ils reçoivent une commande destinée à un port SPP.
III.1.2- Adressage du port :
L’adresse de base du port peut ne pas être 0x378, il peut varier d’un ordinateur à un autre,
il peut être 0x278 ou 0x03BC ou autre. Mais dans la plupart des cas, si l’ordinateur ne possède
qu’un seul port parallèle, ce port est appelé LPT1 et possède l’adresse de base 0x378. Un
ordinateur peut avoir jusqu’à 3 ports parallèles pour lui tout seul et sont appelés : LPT1, LPT2 et
LPT3. Dans la majorité des cas, leurs adresses de base sont respectivement : 0x378, 0x278 et
0x3BC.
Pour voir quelle est l’adresse de base du port parallèle sous Windows XP :
"démarrer/programmes/accessoires/outils systèmes/informations système". "Cliquer sur
Ressources matérielles", puis sur "E/S" et rechercher le port imprimante LPT1.
Ici, dans notre cas, il s’agit de 0x378. 0x378 à 0x37F est la plage d’adresse utilisée par LPT1.
a- Le port DATA
Appelé aussi registre de donnée, utilisé usuellement pour envoyer des caractères à
l’imprimante, ce port dispose d’un octet complet en sortie, et on y accède grâce à l’adresse de
base. Les bits sont nommés D0 à D7 (broche 2 à 9) et autorisent, évidement, une combinaison de
256 valeurs. Ce port est accessible en écriture seulement dans le cas du port parallèle standard,
c'est à dire qu'une lecture se traduira par la lecture des dernières données écrites. Cependant,
avec un port bidirectionnel, on peut lire des données sur cette adresse.
C’est le port que nous allons utiliser dans notre application.
b- Le port STATUS
C’est le port d’entrée qui permet de connaître l’état de l’imprimante. Ce port peut
uniquement être lu, c'est à dire que toute écriture sera ignorée. II est accessible à l’adresse de
base +1. L’octet qui y est lu est shunté de ses trois bits de poids faible ; il reste donc cinq bits
d’entrée S0 à S4. Il est à noter que le bit S4 est câblé en inverse, et que le bit S3 peut être destiné
à détecter des interruptions matérielles selon un front descendant si celles-ci sont activées.
c- Le port CONTROL
Ce port, accessible à la fois en lecture et en écriture, est employé pour contrôler l'imprimante.
Les 4 premiers bits sont l'image des lignes STROBE, AUTOFEED, INIT et SELECT IN (voir
tableau 2-1). Le bit 4 autorise ou non le déclenchement d'une interruption lorsque ACK passe à
l'état bas (c'est à dire lorsque l'imprimante indique « a bien reçue l'octet envoyé »).
Dans DOS et les anciens systèmes d’exploitation (OS) Windows 95/Windows 98, la
communication avec le port parallèle était facile. Pour lire et écrire sur le port, en langage C, il
suffisait d’employer des fonctions outportb(adresse, valeur) ; et inportb(adresse) ;. Mais à partir
de Windows NT, 2000 ou XP, ces OS bloquent l’accès au port parallèle pour des raisons de
sécurité de celui-ci.
Pour contourner ce problème, il faut utiliser un driver qui autorise l’accès direct sur les ports.
Par exemple userport ou la librairie Inpout32.dll. Dans notre cas, on utilise Windows XP et on a
choisi d’utiliser Inpout32.dll qui se trouve à l’adresse http://www.logix4u.net pour les raisons
suivantes :
• On peut travailler sur le port parallèle avec toutes les versions de Windows
• Aucune installation de logiciel spécial ou driver n’est requise
• Le driver sera automatiquement installé et configuré quand le DLL est chargé
• Facilité d’emploi
Fonctionnement de Inpout32.dll :
Le DLL vérifiera la version de l’OS quand les fonctions (écriture ou lecture) sont
appelées, si l’OS est WIN 95 ou 98, le DLL emploiera les fonctions _inp() et outp pour
lire/écrire sur le port parallèle. Par contre, si l’OS est WIN NT , 2000 ou XP, il installera un
driver et communiquera au port parallèle par ce driver. L’organigramme du programme est
donné ci-dessous :
Promotion 2010 Page 79
PROGRAMMATION DU PORT PARALLELE PAR LE LANGAGE C++
Source : http://www.logix4u.net
Utilisation :
Pour pouvoir utiliser les deux fonctions d’écriture et de lecture sur le port, en langage C
(ou C++), il nous faut ce petit code pour charger la librairie et récupérer les adresses des
fonctions :
if (inp32 == NULL)
{
printf("GetProcAddress for Inp32 Failed.\n"); Vérification que la fonction existe
return -1;
}
/* Récupération de l'adresse de la fonction avec "GetProcAddress" */
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (oup32 == NULL)
{
printf("GetProcAddress for Oup32 Failed.\n"); Vérification que la fonction existe
return -1;
}
Après ce code, on peut utiliser les 2 fonctions. Pour libérer la librairie quand on en a plus besoin,
on utilise la fonction FreeLibrary(hLib);
Prototype
N.B : Pour que ce code fonctionne, il faudra placer le fichier « inpout32.dll » dans le même
répertoire que l’exécutable, ou le placer directement dans le répertoire système de
Windows C:\WINDOWS\system32.
Les 2 fonctions exportées sont :
inp32(adresse) : lit des données à partir du registre du port parallèle dont l’adresse est
donnée en paramètre. Cette fonction retourne la valeur lue sur le port.
oup32(adresse, données) : écrit des données au registre du port. Elle reçoit 2 paramètres :
l’adresse du port et la valeur à envoyer. Elle ne retourne rien.
III.2.1- Introduction
Le langage C++ a été conçu dans les laboratoires AT&T Bell. Son concepteur, Bjarne
Stroustrup, désirait étendre les fonctionnalités du langage C afin d’y intégrer les concepts de la
programmation par objet. Il désirait en effet conserver les habitudes des programmeurs C, leur
permettre de récupérer une bonne partie des programmes qu’ils avaient développés, tout en
intégrant les avantages de la programmation objet. Ceci a donné naissance en 1979 au langage
C++, qui intégrait quelques fonctionnalités objet, et en 1983 au langage C++, un peu plus
complet. Le langage C++ peut être considéré comme une extension de C, si bien que tout
programme C valide est un programme C++ valide.
Les principaux avantages du C++ qui nous ont amenés à choisir ce langage sont les suivants :
Comme on en a parlé plus haut, le langage C++ possède les fonctionnalités du C. Or, dans
notre projet, nous avons besoin de beaucoup d’entre eux, ainsi, dans la suite, on ne parlera que
du C++ même si certain instructions sont issues du langage C.
On a dit que pour pouvoir employer les 2 fonctions, il fallait écrire le code ci-dessus.
Pour ne pas réécrire ce code dans chaque bloc de fonction qui l’utilise, on va créer une macro.
Les macros sont des bouts de code qui sont directement remplacés dans le code source
par le préprocesseur juste avant la compilation, elles permettent d’accélérer la vitesse
Promotion 2010 Page 82
PROGRAMMATION DU PORT PARALLELE PAR LE LANGAGE C++
d’exécution du programme. La macro que nous allons utilisée est sans paramètre, sinon,
l’utilisation de la fonction « inline » est la bonne solution. Pour la macro, si le code possède
plusieurs lignes, il faut mettre un antislash (\) avant chaque nouvelle ligne.
Création de la macro :
La portée des fonctions est réduite au fichier où elles sont définies. Par conséquent, cette
macro doit être écrite dans un fichier en-tête (fichier « .h ») appelé « fonction.h », qui doit être
inclus dans tous les fichiers comportant des appels de ces fonctions.
Maintenant quand la macro est créée, au lieu de réécrire tous les codes, il suffit d’écrire
fonction()
{
fonction()
(oup32) (0x378,0x00) ; //écrit la valeur 0 à l’adresse 0x378
printf("lecture sur (% #X)= %#X\n",0x378,(inp32)(0x378)); /* affiche la valeur lue à
l’adresse 0x378*/
FreeLibrary(hLib);//libère la librairie
}
La spécification %#X amène printf à effectuer son affichage en hexadécimal.
III.3.1- Introduction
La conception par objet trouve ses fondements dans une réflexion menée autour de la vie
du logiciel. D’une part, le développement de logiciels de plus en plus importants nécessite
l’utilisation de règles permettant d’assurer une certaine qualité de réalisation. D’autre part, la
réalisation même de logiciel est composée de plusieurs phases, dont le développement ne
constitue que la première partie. Elle est suivie dans la plupart des cas d’une phase dite de
maintenance qui consiste à corriger le logiciel et à le faire évoluer. On estime que cette dernière
phase représente 70 % du coût total d’un logiciel, ce qui exige plus encore que la phase de
développement de produire du logiciel de qualité.
La conception objet est issue des réflexions effectuées autour de cette qualité. Celle-ci peut-être
atteinte à travers certains critères :
– la correction ou la validité : c’est-à-dire le fait qu’un logiciel effectue exactement les tâches
pour lesquelles il a été conçu ;
– l’extensibilité : c’est-à-dire la capacité à intégrer facilement de nouvelles spécifications,
qu’elles soient demandées par les utilisateurs ou imposées par un événement extérieur ;
– la réutilisabilité : les logiciels écrits doivent pouvoir être réutilisables, complètement ou en
partie. Ceci impose lors de la conception une attention particulière à l’organisation du logiciel et
à la définition de ses composantes ;
– la robustesse : c’est-à-dire l’aptitude d’un logiciel à bien réagir lorsque l'on s'écarte des
conditions normales d'utilisation.
III.3.2- Objet
La POO est fondée sur le concept d’objet, à savoir une association des données (appelées
attributs) indépendante de tout programme et des procédures (qu'on appelle méthodes) agissant
sur ces données. L’équation de la POO est :
III.3.3- Encapsulation
Dans la POO, on réalise ce que l'on nomme une encapsulation des données. Cela signifie
qu'il n'est pas possible d'agir directement sur les données d'un objet; il est nécessaire de passer
par l'intermédiaire de ses méthodes qui jouent ainsi le rôle d'interface obligatoire. On traduit
parfois cela en disant que l'appel d'une méthode est en fait l'envoi d'un "message" à l'objet.
La règle d’encapsulation dit que : « tous les attributs (appelés aussi variables membres
ou données membres) d’une classe doivent toujours être privés ».
III.3.4- Classe
On peut définir trois degrés d'accessibilité aux membres (arguments et méthodes) d'une classe :
private (privé) : seuls les autres membres de la même classe peuvent y accéder. C'est
l'accès par défaut pour une classe.
protected (protégé) : accès réservé aux membres de la classe, mais également aux classes
dérivées (ou classe fille).
public : même accessibilité que toute déclaration globale
III.3.4- Héritage
Cette technique permet donc de développer de nouveaux outils en se fondant sur un certain
acquis, ce qui justifie le terme d’héritage. Comme on peut s’y attendre, il sera possible de
développer à partir d’une classe de base, autant de classes dérivées qu’on le désire. De même,
une classe dérivée pourra à son tour servir de classe de base pour une nouvelle classe dérivée.
Nous allons créer une classe appelée « ParallelPort » qui a pour but d'envoyer des
données (un octet) sur le registre de donnée du port parallèle, qui se trouve donc à l'adresse de
base de celui-ci. Elle aura la flexibilité d’indiquer des différentes adresses. Elle va aussi lire les
valeurs sur une adresse spécifiée du port. Si c'est l'adresse de base du port, elle affichera donc les
dernières données qui y sont écrites. Comme notre programme est écrit en « console », ces
valeurs seront affichées dans une console. Elle ne prendra qu'un seul attribut qui stockera
l'adresse de base du port.
III.4.1- Attribut
La classe que nous développons a besoin de l’adresse de base du port pour fonctionner.
Cette donnée doit être stockée dans un membre de donnée (attribut) que nous appellerons
BaseAddress. Comme on l’a dit plus haut, l’adresse de base du port peut être différente d’un
ordinateur à un autre. Pour être sûr de pouvoir stocker la valeur de cette adresse, on va utiliser le
type de donnée unsigned int pour l’attribut BaseAddress. Puisqu’il n’existe pas d’adresse
négative, on emploie le modificateur « unsigned » qui signifie « non signé » pour ne prendre en
compte que les entiers (int) positifs, codés sur 32 bits (ou 16 bits selon les machines), élargissant
ainsi la gamme de valeur possible.
N.B : La taille d’une variable n’est pas forcement la même pour chaque ordinateur. Pour la
connaitre, il suffit d’utiliser l’opérateur sizeof() de C.
III.4.2- Méthodes
Pour écrire un octet de donnée sur le port à l’adresse de base, on va créer une fonction
nommée WritePort(). Un octet est représenté par le type de donnée unsigned char. La fonction
ne fait qu’envoyer des données donc elle ne retourne rien, son type de retour est donc void .Elle
ne prend qu’un seul paramètre, nommée data de type unsigned char, c’est cette valeur qui va
être envoyée au port à l’adresse spécifiée par la valeur de BaseAddress.
Pour lire et afficher la valeur sur une adresse spécifiée ou non, on utilise la fonction lecture().
Cette fonction va être surchargée. Si l’adresse n’est pas spécifiée, la lecture s’effectuera à
l’adresse de base par défaut, sinon l’adresse sera envoyer en paramètre de la fonction. Cette
fonction ne retourne rien.
Une autre fonction valPort() consiste à lire sur une adresse donnée en paramètre et à retourner
cette valeur. Son type de retour est donc unsigned char .
Dans notre cas, on utilise le port uniquement comme sortie. Les valeurs lues par les fonctions
sont donc les dernières valeurs écrites.
Un fichier header nommé ParallelPort.h qui contiendra les attributs et les prototypes
de la classe.
class ParallelPort
{
private:
unsigned int BaseAddress; // attribut
public:
ParallelPort(); // constructeur par défaut
ParallelPort(unsigned int); // surcharge de constructeur
~ParallelPort(); // déstructeur
void razPort(); // initialisation du port
void WritePort(unsigned char); // écriture sur le port
void lecture(); // lecture sur le port
void lecture(unsigned int); // surcharge de la fonction lecture
unsigned char valPort(unsigned int);
};
Un fichier source nommé ParallelPort.cpp qui contiendra la définition des méthodes
et leurs implémentations.
I.1- Alimentation
Ialim = 3 [A]
I.1.2- Transformateur
S = U2N × Ialim
S = 12 × 3 = 36 [VA]
I alim .T
C= (III - 1)
∆U
Avec :
U=
max U 2 m − 2.Vd ; U2m est la tension maximale du secondaire du
=
U max U 2 N . 2 − 2.Vd
I alim .T 3.0, 01
∆=
U = =−6
6, 4
C 4700.10
∆U = 6,4 [V]
Le condensateur devra supporter au moins 16 [V]. Pour la sécurité, on choisira une tension de
service de 63 [V].
Vccm = 16 [V] :
C’est ce qu’on obtient aux bornes du condensateur de filtrage.
Cette tension sert à alimenter les moteurs à travers les résistances de limitation de
courant.
Vcc1 = 5 [V] :
Pour la polarisation des optocoupleurs qui sont à collecteur ouvert.
Pour avoir cette tension, nous utiliserons un régulateur de tension fixe 7805 :
- Tension de sortie = 5 [V]
- Courant de sortie maximal = 1 [A]. Ici, le régulateur ne débitera que 140 [mA] au
maximum, ce qui va très bien pour notre cas.
- La tension d’entrée doit être au moins égale à la tension de sortie +2V : 5+ 2=7V.
Cette différence de tension est appelée tension de déchet (Droupout voltage) qui
est donnée par le constructeur. Dans notre cas, la tension d’entrée est de 16 [V]
qui est bien supérieure à 7[V].
Vcc2 = 12 [V] :
Pour l’alimentation des 2 C.I. SAA 1027 et du relais, un régulateur de tension 7812
est utilisé :
- Tension de sortie = 12 [V]
- Courant de sortie maximal = 1 [A]. Notre régulateur devra débiter un courant de
2I(SAA 1027) + Irelais = 77 + 39 = 116 [mA] qui est bien inférieur à 1 [A].
- Tension de déchet = 2 [V]
Les condensateurs à la sortie des régulateurs sont facultatifs. Ils servent à améliorer la
stabilité du régulateur et permet une meilleur réponse aux transitoires (appels de courant
important par exemple).
I.2- Radiateurs
Rth h-a est donnée par le fabricant du radiateur et c’est ce qu’il faut calculer.
Dans la situation la plus critique, la différence de température entre la jonction et l’ambiante est :
∆T
Pmax = (III - 2)
Rth
La somme de toutes les résistances thermiques, de la jonction à l’ambiant, doit être inférieure à
∆T 100
=
Rth = = 208 °C / W
Pmax 0, 48
Ici, Rth j-a = 65 [°C/W] < Rth , donc on n’a pas besoin d’un radiateur pour le 7812.
Sinon, il faudra calculer Rth h-a minimum du radiateur à utiliser comme suit :
La valeur de Rth mb-h dépend de l’absence ou de la présence d’un isolant (plaquette, pâte thermo
conductrice) entre le composant et le radiateur et, bien sur, du matériau dont est fait l’isolant.
Un Centronics femelle à 36 broches est soudé sur le circuit pour les entrées de commande
venant du port parallèle. Le port parallèle et la carte sont liés par l’intermédiaire d’un câble
DB25 mâle vers Centronics. Les sorties vers les moteurs s’effectueront sur des dominos.
Les 2 SAA 1027 et les optocoupleurs sont placés sur des supports de C.I.
Promotion 2010 Page 93
REALISATION DE LA CARTE D’INTERFACE
Enfin, la carte est mise dans un boitier afin de la protéger contre les poussières et tout
objet extérieur qui peut provoquer un court-circuit, et aussi pour la protection de l’utilisateur. À
l’extérieur du boitier, on ne voit plus donc, que ceux qui sont nécessaires à son utilisation, ce
sont :
Câblage du moteur :
Le moteur est constitué de quatre bobines et comporte huit fils accessibles de l’extérieur
comme le montre le schéma ci-dessous. La configuration des connexions des bobines nous
permet de pouvoir choisir entre une commande de type bipolaire et une commande de type
unipolaire.
Notre choix est porté sur la commande unipolaire. Nous avons donc construit un point milieu
comme sur la figure. Quatre fils sont donc communs et reliés en permanence à l’alimentation.
Pour connaitre les extrémités de chaque bobine, il faut effectuer une mesure à l’aide d’un
ohmmètre pour trouver la valeur de 16 [Ω] (résistance par phase du moteur).
Il faut faire des essais pour connaitre l’ordre de succession des phases (a, b, c, d) en reliant un à
un les quatre fils à la masse.
Notre but principal est de pouvoir positionner un porte-outil sur un plan et dans la suite,
pouvoir réaliser une perceuse de circuit imprimé. Nous allons considérer ce porte-outil comme
un point pour avoir plus de précision. Ce point est repéré à tout moment dans le plan par ces
coordonnées (x ; y), où x est l’abscisse et y l’ordonnée. Nous n’avons besoin que du premier
quadrant c'est-à-dire le plan où x et y sont positifs. x est compris entre 0 et 200 [mm]; y compris
entre 0 et 150 [mm].
Cette position est obtenue par la commande par programmation de deux moteurs pas à pas : un
moteur permet le positionnement sur l’axe ox et l’autre sur oy.
Mais dans le cas général des applications, en particulier pour la perceuse de circuit
imprimé, on a besoin de déplacer l’outil suivant un axe oz perpendiculaire au plan, on a alors 3
axes. Pour contrôler ce déplacement, il faut évidemment un troisième moteur pas à pas. Pour la
perceuse de circuit imprimé, un autre moteur sera nécessaire pour faire tourner la forêt.
Nous nous limiterons au positionnement de l’outil dans le plan (x, o, y) à l’aide de deux
moteurs pas à pas. Nous allons donc réaliser un prototype pour présenter le fonctionnement de ce
système. Cette réalisation est donc loin d’être la version finale, mais dans le but de montrer
l’efficacité du programme à contrôler le positionnement du point dans le plan et de montrer la
précision des moteurs.
Système S1 :
Un poulie est fixé sur le moteur, un autre est mené par l’intermédiaire du courroie, c'est-à-dire
qu’il tourne librement autour de son axe central, c’est un « poulie folle ». Un des deux brins de la
courroie est fixé sur le porte-outil pour le faire déplacer. Quand le moteur M1 tourne dans le sens
horaire, le porte-outil se déplace dans le sens de y, sinon il se déplace dans l’autre sens.
Le guidage en translation est effectué par deux axes sur lesquels il peut coulisser.
Moteur M2 :
Pour que le porte-outil puisse se déplacer suivant les deux directions, il faut que le
système S1 en entier soit guidé suivant la direction de x. C’est le moteur M2 qui se chargera de
ce travail. Le principe est le même que pour S1, avec 2 poulies et une courroie crantée, mais
cette fois, c’est S1 qui sera fixé sur un des brins de la courroie. Le guidage en translation est
identique au premier.
II.3.1- Théoriquement
Soit d le déplacement élémentaire c'est-à-dire le déplacement du point pour un pas effectué par le
moteur. En supposant que le système est parfait, on a la relation :
d = R× θ
où R : rayon du poulie
θ : angle de pas du moteur
1,8 × π
Nous avons θ = 1,8° = = 0,01.π [rad] ; R = 9 [mm]
180
Avec un pas, le déplacement est d = 9 × 0,01 × π
d = 0,3 [mm]
Le nombre de pas nécessaire pour un déplacement de 1 [mm] est :
1 1
nbPas= = = 3,5
d 0, 283
nbPas = 3,5
II.3.2- Pratiquement
La machine n’étant pas parfaite, les erreurs sont inévitables lors de sa fabrication. Les
résultats seront donc légèrement différents de la théorie. Pour le calcul du nombre de pas, nous
allons utiliser une autre méthode plus pratique pour palier ces erreurs.
Méthode :
En faisant le rapport entre le nombre de pas et le déplacement, on trouve le nombre de pas pour
un déplacement de 1 [mm].
Sur x [0 ; 200] :
Le nombre de pas nécessaire pour un déplacement de 200 [mm] est : 756 pas
Pour 1 [mm], le nombre de pas est donc :
756
=
nbPas = 3, 78
200
nbPas = 3,78
Pour x [mm], nbPas = 3,78x
Sur y [0 ; 150] :
Le nombre de pas nécessaire pour un déplacement de 150 [mm] est : 568 pas
Pour 1 [mm], le nombre de pas est donc :
568
=
nbPas = 3, 78
150
nbPas = 3,78
Le résultat est le même sur les deux axes. Ce nombre est un coefficient, le nombre de pas doit
être un nombre entier, il faut donc arrondir cette valeur à 4 pas pour 1 mm. Mais dans la
programmation, il ne faut arrondir aucune valeur que lorsqu’il s’agit du résultat final.
Résolution de la machine :
C’est le déplacement le plus petit que la machine peut effectuer c'est-à-dire le déplacement
effectué pour un pas du moteur.
1
d=
3, 78
d = 0,3 [mm]
Cette résolution peut très bien être améliorée en utilisant un système de réducteur par
exemple ou en utilisant d’autre type de transmission que « poulies et courroie ». Bref, la partie
mécanique doit être étudiée convenablement pour atténuer les vibrations, diminuer les jeux et
augmenter la précision.
III.1- Introduction
Nous avons déjà vue au chapitre 3 de la partie II, la création d'une classe
appelée:"ParallelPort" pour la communication sur le port parallèle. Nous allons maintenant
utiliser cette classe pour contrôler notre système de positionnement sur deux axes, réalisé ci-
dessus. Nous allons donc programmer de manière orientée objet. Pour cela, il nous faut créer
d'autres classes pour gérer les besoins du système. Au besoin, les classes vont se communiquer
entre elles, c’est l’un des particularités de la POO. Comme on a déjà évoqué auparavant, en
POO, on a la possibilité d’intégrer facilement de nouvelles spécifications si nécessaire. Dans
notre cas, ces spécifications sont innombrables, nous n’allons développer que ce qui sont
essentiels, en particulier l’obtention de la position sur une coordonnées données.
III.2- Faire tourner le moteur avec une vitesse et un nombre de pas connus
M2
M1
f
n= [tours / s ]
Np
d
v= [ mm / s ]
2t
Voici un programme lançant le moteur avec une vitesse v = d/2t et nbPas pas, en utilisant la
classe ParallelPort :
Le programme ci-dessus commande un moteur. Les valeurs val1 et val2 sont les octets à
envoyer pour faire avancer le moteur, les bits inutilisés sont mis à 0. val est la dernière valeur
utilisée pour la commande de l’autre moteur.
On utilise l’opérateur de manipulation de bit | qui signifie « OU inclusif bit à bit» entre la
valeur pour commander M1 et M2. Cet opérateur effectue, entre deux mots binaires, un OU
logique sur les bits de même rang. Sa table de vérité est donnée ci-dessous :
X Y X|Y
0 0 0
0 1 1
1 0 1
1 1 1
Les différentes valeurs à envoyer au port pour faire tourner les moteurs sont listées dans le
tableau ci-dessous :
Moteur M2 Moteur M1
Sens horaire Sens anti-horaire Sens horaire Sens anti-horaire
bin hex déc bin hex déc bin hex déc bin hex déc
val1 1011 0xB 11 1111 0xF 15 111000 0x38 56 1111000 0x78 120
val2 1010 0xA 10 1110 0xE 14 101000 0x28 40 1101000 0x68 104
Le relais n’est alimenté que lorsque les deux moteurs sont à l’arrêt. Pour alimenter le
relais, il suffit de mettre à 0 le bit de rang 4 qui le commande, c'est-à-dire, envoyer 0 à D3. Tant
qu’il y a un moteur qui tourne, on envoi 1 à D3. C’est pourquoi dans le tableau ci-dessus, la
valeur de D3 est toujours 1.
Cette fonction Sleep(t) n’est cependant pas parfaite, c'est-à-dire qu’on ne peut pas avoir
exactement t millisecondes de pause à cause du système d’exploitation (O.S.) multitâche
Windows.
La gestion du temps est l'un des problèmes majeurs des O.S. La raison est simple : les O.S.
modernes sont tous multitâche, or ils utilisent du matériel basé sur des processeurs qui ne le sont
pas, ce qui oblige le système à partager le temps du processeur entre les différentes tâches. Cette
notion de partage implique une gestion du passage d'une tâche à l'autre qui est effectuée par un
ensemble d'algorithmes appelé ordonnanceur.
Un O.S. classique comme Windows utilise la notion de temps partagé, par opposition au
temps réel. Dans ce type de système, le but de l'ordonnanceur est de donner à l'utilisateur une
impression de confort tout en s'assurant que toutes les tâches demandées sont finalement
exécutées. Ce type d'approche entraîne une grande complexité dans la structure même de
l'ordonnanceur qui doit tenir compte de notions comme la régulation de la charge du système ou
la date depuis laquelle une tâche donnée est en cours d'exécution.
Un système temps réel est une association logiciel/matériel où le logiciel permet, entre
autre, une gestion adéquate des ressources matérielles en vue de remplir certaines tâches ou
fonctions dans des limites temporelles bien précises. Voici quelques exemples de systèmes
d'exploitation temps réel :
- OS-9 ;
- RTlinux (RealTime Linux) ;
- ONX ;
- VxWorks.
Un système temps réel n'est pas forcément plus rapide qu'un système à temps partagé. Il devra
par contre satisfaire à des contraintes temporelles strictes, prévues à l'avance et imposées par le
processus extérieur à contrôler. Une confusion classique est de mélanger temps réel et rapidité de
calcul du système donc puissance du processeur.
b- Conclusion
Sous Windows, on ne peut pas obtenir exactement le temps d’attente d’une demi-période t =T/2.
La vitesse réellement obtenue par le moteur dépend donc de plusieurs paramètres, tels que : la
vitesse du processeur, la charge du CPU c'est-à-dire du nombre de processus qui sont en train de
s’exécuter, de l’ordre de priorité des différentes tâches …
III.3.1- Introduction
Nous allons créer deux autres classes appelés Point et Moteur qui vont se communiquer
entre eux et avec la classe ParallelPort pour bien gérer le fonctionnement du système. Nous
n’allons voir que les prototypes des méthodes utilisées, expliquer leur fonction mais n’allant pas
voir tous leurs implémentation car c’est trop long. Enfin, nous allons utiliser ces classes dans la
fonction main() pour communiquer avec l’utilisateur via une console. On a choisi la console
pour notre programme car elle est plus simple à élaborer, elle suffit pour notre application et plus
rapide qu’un programme avec fenêtre. Mais comme le programme est écrit de manière objet, il
est plus facile de la modifier en créant des fenêtres. L’IDE utilisé est Code ::Blocks.
Elle a pour attribut l’abscisse m_x, l’ordonnée m_y, la dernière abscisse m_x0 et la dernière
ordonnée m_y0 du point. Elles sont de type réel pour pouvoir stocker tous les coordonnées
compris dans les limites imposées.
Point() ;
Constructeur par défaut. Tous les attributs sont initialisés à 0 par défaut.
Point(double,double);
~Point();
Destructeur de la classe.
double getX() const; double getY() const; double getX0() const; double getY0() const;
Ce sont des méthodes accesseurs qui servent à retourner les valeurs des attributs.
Promotion 2010 Page 104
Programmation de LA COMMANDE DE POSITIONNEMENT
Elles prennent comme paramètre l’abscisse ou l’ordonnée à affecter aux attributs m_x ou m_y.
Avant l’affectation, elles vérifient si le paramètre reçu est compris entre 0 et 200 pour x et entre
0 et 150 pour y.
void afficher();
Affecte la valeur actuelle de l’abscisse m_x (respectivement m_y) à m_x0 (resp m_y0) et
d’enregistrer cette valeur dans un fichier. On enregistre cette valeur dans un fichier pour que,
même si on ferme le programme, il se souviendra toujours de la dernière position du point.
La classe Moteur gère la rotation des moteurs en tenant compte de la position du point.
m_point : C’est un objet de type Point donc contient tous les attributs de Point. Il sert à repérer le
point dans le plan.
m_valPortX et m_valPortY: Pour stocker les dernières valeurs envoyées au port pour la
commande de M2 et M1.
int getPasX() const; int getPasY() const; unsigned char getValPortX() const; unsigned
char getValPortY() const;
Ces méthodes vont appeler les fonctions recevoirX et recevoirY de la classe Point pour stocker
les valeurs de l’abscisse et l’ordonnée du point m_point.
756
- =
Sur x : m _ nbPasX × déplacement
200
568
=
m _ nbPasY × déplacement
150
Ces sont des booléens, elles retournent vrai (true) si le nombre de pas est positif c'est-à-dire
rotation en sens horaire, sinon elles retournent faux (false).
Cette fonction permet de lancer le moteur de 1 pas vers le sens voulu et avec une vitesse comme
nous avons déjà vue dans le paragraphe III-2-1.
Servent à affecter, après chaque rotation du moteur les valeurs val1 et val2 dans respectivement
m_valPortX et m_valPortY. Ces valeurs sont aussi enregistrées dans des fichiers. Les valeurs
stockées dans les fichiers changent tous le temps pendant l’évolution du programme.
Récupère les dernières valeurs enregistrées dans les fichiers en les réaffectant dans
m_valPortX et m_valPortY. Ces valeurs vont être le troisième paramètre val de la fonction
lancer1Pas c'est-à-dire, on effectuera l’operateur OU entre : val1|val et val2|val avec :
Cette fonction sert à accélérer le moteur avec au maximum 6 pas. On augmente petit à petit la
vitesse du moteur, c'est-à-dire on diminue progressivement la demi-période t.
Cette fonction sert à décélérer le moteur avec au maximum 6 pas. On diminue petit à petit la
vitesse du moteur, c'est-à-dire on augmente progressivement la demi-période t.
Ces fonctions gèrent toutes les données nécessaires avec les différentes méthodes pour faire
tourner les moteurs un à un. Elles reçoivent en paramètre la demi-période t qui déterminera la
vitesse.
void lancerXY(int);
Cette fonction va gérer toutes les données avec les conditions nécessaires pour faire tourner les
deux moteurs en même temps. Elle reçoit en paramètre la demi-période t.
En fait, les deux moteurs ne tournent pas vraiment en même temps. Ils tournent avec un
certain nombre de pas un à un jusqu’à accomplir le nombre de pas qu’ils doivent chacun
effectuer. Voici la méthode utilisée pour cela :
Nous avons donc 2 différents nombres de pas à accomplir, l’un m_nbPasX, et l’autre
m_nbPasY.
Désignons par P le plus petit des deux nombres et G le plus grand. Au total, il faut faire tourner
(P + G) pas, dont P pour un axe et G pour l’autre. Soit p et g les deux axes respectivement pour
P pas et pour G pas.
On va utiliser cette fonction pour communiquer avec l’utilisateur via une console, c'est-à-
dire pour recevoir les données nécessaires au programme.
On va créer des menus avec la condition switch qui permettra à l’utilisateur de choisir entre
plusieurs options.
switch(expression)
{
case constante_1 : [suite_d’instructions_1]
case constante_2 : [suite_d’instructions_2]
………………………………….
case constante_n : [suite_d’instructions_n]
default : [suite_d’instructions]
}
Figure 3-8 : Syntaxe de l’instruction switch
1- 1 point
2- sequence de points
3- remettre à zero
4- quitter
1 point :
Permet au système de se placer sur un seul point. Les instructions dans cette étiquette sont dans
l’ordre :
Sequence de points :
Permet au système de se placer sur une suite de points. Les instructions sont :
- Demande du nombre de point,
- Allocation dynamique d’un tableau de type Moteur pour stocker les données nécessaires pour
chaque objet. Le nombre de case correspond au nombre d’objet, donc au nombre de point.
Quitter :
On utilise la structure de répétition while pour que le programme ne se ferme pas à chaque fin
d’exécution des suites d’instructions. On demande à l’utilisateur s’il veut continuer ou quitter le
programme. Tant que l’utilisateur fait le choix de continuer, le programme se remet au début
sinon on met fin au programme.
L’utilisation de la console est facile puisqu’il suffit de suivre les instructions à l’écran. Voici ce
qui est affiché à l’écran lorsqu’on lance le programme.
Il faut taper 1 pour 1 point, 2 pour séquence de points, 3 pour remettre à zéro et 4 pour quitter
puis taper entrée au clavier
III.4.1- 1 point
- Saisir l’abscisse du point qui doit être compris entre 0 et 200 [mm] puis appuyer sur entrée : la
console affiche la dernière valeur de l’abscisse qui vient d’être récuperer et le nombre de pas à
effectuer. Si le nombre de pas est négatif, la rotation est dans le sens anti-horaire.
- Saisir l’ordonnée du point qui doit être compris entre 0 et 150 [mm] puis appuyer sur entrée :
la console affiche la dernière valeur de l’ordonnée qui vient d’être récuperer et le nombre de pas
à effectuer.
- Choisir entre les deux modes de lancement des moteurs : taper 1 pour lancer un à un, 2 pour les
deux à la fois puis appuyer sur entrée.
- Choisir la vitesse de lancement des moteurs : taper 1 pour lente, 2 pour rapide puis appuyer sur
entrée.
- Appuyer sur entrée pour lancer. Les valeurs envoyées au port sont affichées à l’écran.
La console affiche les dernières valeurs de l’abscisse et de l’ordonnée qui viennent d’être
récuperer et les nombres de pas à effectuer.
III.5- Conclusion
Conclusion
Ce mémoire nous a permis d’en savoir beaucoup plus sur les différents types et
commandes des moteurs pas à pas. Nous avons pu remarquer les problèmes liés aux
commandes et alimentations de ces moteurs et d’apporter les solutions nécessaires.
La programmation devient plus facile en utilisant des circuits intégrés spécialisés tel
que le SAA 1027. En effet, on n’a besoin que de deux signaux numériques pour la commande
d’un moteur dont un pour l’avance et la vitesse, l’autre pour le sens de rotation.
BIBLIOGRAPHIE ET WEBOGRAPHIE
Livres et documents :
[1] Bernard Multon - Historique des machines électromagnétiques - Revue 3E.In°3 - juin
1995
[2] Jean-Marc Delaplace – « Les moteurs pas à pas. Fonctionnement et utilisation » - 20 juin
2008
[5] Kris Jamsa, Ph.D.Lars Klander - La bible du programmeur - Edition Eyrolles 1999
[7] Patrice Oguic - Moteurs pas-à-pas et PC - Dunod, 2ème édition - Paris,2004 - 173p
[8] Dhananjay Gadre - Programming the Parallel Port – Miller Freeman - 1998 - 285p
Site web :
[13] http://www.otocoup.com/DocTech/alim_motpap_mm.htm
[15] http://www.sitelec.free.fr/cours
[16] http://vesta.homelinux.free.fr/site/wiki/cat_gorie_electronique
[17] http://www.datasheetcatalog.com
[18] http://www.logix4u.net
[19] http://www.Developpez.com
ANNEXE I
di
RESOLUTION DE L’EQUATION DIFFERENTIELLE : = r.i + L.
Vcc (1)
dt
Remarque préalable : - à l’instant initial t = 0, i(0) = 0
di Vcc
i = cte ⇒ = 0 ⇒ i=
dt r
Sans second membre
di di r
r.i + L. =
0 ⇔ = − i
dt dt L
di r
= − dt
i L
En intégrant membre à membre
r
ln i =
− t+A
L
r
− t
i = A.e L
(2)
di dA − Lr t r − Lr t
= .e − A. .e
dt dt L
dA − Lr t r − Lr t r
− t
(1) ⇒ L .e − A. .e + r. A.e =
L
Vcc
dt L
dA − Lr t
L. .e = Vcc
dt
dA Vcc Lr t
= .e
dt L
Vcc Lr t
dA = .e .dt
L
Vcc L Lr t
= A . .e + B
L r
Vcc Lr .t
= A .e + B
r
Vcc Lr t − Lr t
(2) ⇒ i = .e + B .e
r
r
Vcc − t
L
i= +B.e
r
Or à t = 0, i(0) = 0
Vcc Vcc
⇒ 0= +B ⇒ B =
−
r r
Vcc − t
r
⇒ i (t ) = 1 − e
L
r
di
RESOLUTION DE L’EQUATION DIFFERENTIELLE : r.i + L. =0 (3)
dt
Remarque préalable : - à l’instant initial t = 0, i(0) = Vcc / r
A t = 0,
r
Vcc − .0
i=
(0) = A.e L
r
Vcc
A=
r
Vcc − Lr .t
⇒ i (t ) =.e
r
ANNEXE II
ANNEXE III
ANNEXE IV
void Point::enregX()
{
cout<<"enregistrer x"<<endl;
m_x0 = m_x;
FILE* fichierX = NULL;
fichierX = fopen("enregX.point", "w+");
if (fichierX != NULL)
{
fprintf(fichierX, "%lf", m_x0);
fclose(fichierX);
}
}
void Point::recupereX()
{
cout<<"recuperer x"<<endl;
FILE* fichierX = NULL;
double tabX[1]={0};
fichierX = fopen("enregX.point", "r");
if (fichierX != NULL)
{
fscanf(fichierX, "%lf", &tabX[0]);
printf("La variable x0 est : %lf \n", tabX[0]);
fclose(fichierX);
}
m_x0 = tabX[0];
}
void Moteur::lancer1Pas(unsigned char val1, unsigned char val2, unsigned char val,int t)
{
ParallelPort ourPort;
ourPort.WritePort(val1|val); // | signifie OU inclusif (bit à bit)
ourPort.lecture();
Sleep(t);
ourPort.WritePort(val2|val);
ourPort.lecture();
Sleep(t);
void Moteur::accel(unsigned char val1, unsigned char val2, unsigned char val, int nbPas)
{
{
if(nbPas<=0)goto sortie;
lancer1Pas(val1, val2, val, 100);
if(nbPas==1)goto sortie;
lancer1Pas(val1, val2, val, 50);
if(nbPas==2)goto sortie;
lancer1Pas(val1, val2, val, 25);
if(nbPas==3)goto sortie;
lancer1Pas(val1, val2, val, 12);
if(nbPas==4)goto sortie;
lancer1Pas(val1, val2, val, 6);
if(nbPas==5)goto sortie;
lancer1Pas(val1, val2, val, 3);
}
sortie:;
}
void Moteur::decel(unsigned char val1, unsigned char val2, unsigned char val, int nbPas)
{
if(nbPas>=6)
lancer1Pas(val1, val2, val, 3);
if(nbPas>=5)
lancer1Pas(val1, val2, val, 6);
if(nbPas>=4)
lancer1Pas(val1, val2, val, 12);
if(nbPas>=3)
lancer1Pas(val1, val2, val, 25);
if(nbPas>=2)
lancer1Pas(val1, val2, val, 50);
if(nbPas>=1)
lancer1Pas(val1, val2, val,100);
}
void Moteur::calculPasX()
{
m_point.recupereX();
if((m_point.getX() - m_point.getX0())>=0)
{
m_nbPasX = (756*(m_point.getX() - m_point.getX0())/200)+0.5; //+ 0.5 pour arrondir
}
else
void Moteur::lancerX(int t)
{
recupValPortY();
if(horaireX())
{
recupValPortX();
if(m_valPortX==0x6)
{
lancer1Pas(0x2,0x2,m_valPortY,1); //changement de rotation
}
if(t==1)
{
if(m_nbPasX<=12)
{
if(m_nbPasX & 1 ==1) //s'il est impaire
{
accel(0xB,0xA,m_valPortY,m_nbPasX/2);
decel(0xB,0xA,m_valPortY,(m_nbPasX/2)+1);
}
else
{
accel(0xB,0xA,m_valPortY,m_nbPasX/2);
decel(0xB,0xA,m_valPortY,m_nbPasX/2);
}
}
else
{
accel(0xB,0xA,m_valPortY,6);
for(int i=0;i<(m_nbPasX-12);i++) //rotation en sens horaire
{
lancer1Pas(0xB,0xA,m_valPortY,1);
}
decel(0xB,0xA,m_valPortY,6);
}
}
else
for(int i=0;i<m_nbPasX;i++) //rotation en sens horaire
{
lancer1Pas(0xB,0xA,m_valPortY,t);
}
Sleep(100);
enregValPortX(0x2);
}
else if (!horaireX())
{
m_nbPasX = -m_nbPasX;
recupValPortX();//vaovao
if(m_valPortX==0x2)
{
lancer1Pas(0x6,0x6,m_valPortY,1);
}
if(t==1)
{
if(m_nbPasX<=12)
{
if(m_nbPasX & 1 ==1) //s'il est impaire
{
accel(0xF,0xE,m_valPortY,m_nbPasX/2);
decel(0xF,0xE,m_valPortY,(m_nbPasX/2)+1);
}
else
{
accel(0xF,0xE,m_valPortY,m_nbPasX/2);
decel(0xF,0xE,m_valPortY,m_nbPasX/2);
}
}
else
{
accel(0xF,0xE,m_valPortY,6);
for(int i=0;i<(m_nbPasX-12);i++) //rotation en sens anti-horaire
{
lancer1Pas(0xF,0xE,m_valPortY,1);
}
decel(0xF,0xE,m_valPortY,6);
}
}
else
for(int i=0;i<m_nbPasX;i++) //rotation en sens anti-horaire
{
lancer1Pas(0xF,0xE,m_valPortY,t);
}
Sleep(100);
enregValPortX(0x6);
}
m_point.enregX();
}
RESUME
Lorsqu’un système mécanique a besoin d’être positionné avec précision, ou besoin d’une vitesse variable, on peut
recourir aux moteurs pas à pas. Ces moteurs ont besoin d’une électronique de commande pour fonctionner. Ce qui fait
que ces moteurs sont l’interface idéale entre l’électronique numérique et la mécanique.
Dans ce mémoire, on trouve l’étude des différents types de moteurs pas à pas, les différentes commandes et quelques
solutions pour l’amélioration de la performance de ces moteurs.
La réalisation d’un prototype dans ce travail, consistant en un système de commande de positionnement sur le plan a
permis de juger la précision de ces moteurs. Pour cela, deux moteurs sont commandés par ordinateur en concevant et
réalisant une carte d’interface.
Enfin, on a pu constater l’intérêt de la programmation orientée objet et le langage C++ en l’appliquant pour gérer la
commande du système. Beaucoup d’applications pourront être envisagées pour ce projet.
Abstract
When a mechanical system needs to be positioned with precision, or need a variable speed, we can resort to the
steppers motors. These motors need an electronical command to function. That way these motors are the ideal
interface between numerical electronics and mechanics.
In this memory, we find the study of the various types of steppers motors, the various commands and some solutions to
get better the motor’s performance.
The realization of a prototype in this work, which is consist in a system of positioning control on the plan made it
possible to judge the precision of these engines. For that, two motors are ordered by computer by designing and
carrying out an interface board.
Finaly, we could note the interest of the object-oriented programming and the C++language by applying it to manage
the system’s command. Many applications could be considered for this project.
Rubrique: électrique
Mots clés : moteur pas à pas, carte d’interface, port parallèle, POO, C++, positionnement, boucle
ouverte