Vous êtes sur la page 1sur 10

Commande de moteurs courant continu et pas pas par

FPGA
Lobjectif de cette sance est de commander un moteur courant continu puis un moteur pas pas
par lassociation de la carte de dveloppement DE2 et dune carte auxiliaire intgrant les circuits de
puissances.
A travers la synthse de ces projets, nous nous familiariserons avec la notion de machine dtat.

1 Descriptif de la carte auxiliaire


Nous utilisons pour notre carte auxiliaire un circuit L298, au sein duquel sont implants deux ponts en
H, associ la logique de commande, comme lindique la structure interne de ce circuit sur la figure
suivante :

Comme on peut le noter sur la figure prcdente, les diodes de puissance ne sont pas intgres dans
le L298, il faut les ajouter sur la carte, comme le montre la figure suivante. Il est alors possible de
commander deux moteurs courant continu (sortie OUT1-OUT2 ou bien OUT3-OUT4) ou un moteur
pas pas bipolaire deux phases (les deux phases tant connecte respectivement en OUT1-OUT2 et
OUT3-OUT4).

Denis Rabast

1/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

Lalimentation Vss en 5V (partie commande) est faite directement par la carte DE2, tandis que
lalimentation de puissance Vs se fait par les entres + et masse de la carte auxiliaire via une
source externe, avec une tension dpendant des moteurs utiliss (maximum 46 V). Une diode de
protection vite linversion de polarit de lalimentation (mais cre une chute de tension de 0,7 V).
Deux rsistances shunt RS1 et RS2 permette de mesurer le courant passant par les transistors de
puissance.
Les bornes du FPGA relies au circuit L298 sont donnes en annexe.

2 Alimentation de puissance de la carte et mesure


Pour alimenter la partie puissance le la carte, respecter le protocole suivant :
- utiliser pour Vs une alimentation stabilise incluant une limitation de courant ;
- lalimentation tant dconnecte de la carte, rgler sa sortie 6 V ;
- mettre la sortie en court-circuit et limiter le courant 0,5 A ;
- supprimer le court-circuit et relier maintenant lalimentation la carte auxiliaire.
Pour effectuer des mesures loscilloscope, on placera les sondes aux points tests prvus cet
effet, et uniquement sur ces points. Les parties du schma associes ces points tests sont
donns en annexe.

3 Mise en uvre de la commande dun moteur courant continu


3.1

Descriptif du programme

Nous allons tester notre carte en pilotant un moteur courant continu. Nous implantons pour cela
dans le FPGA de la carte DE2, le programme correspondant au descriptif suivant :
div_50
H

INPUT
VCC

PIN_N2

C_OUT
S

PIN_R24
inst3

OUTPUT

MLI
Seq
bp_imp

PIN_G26
BP1
BP2

H
BP1
BP2

INPUT
VCC
INPUT
VCC

PIN_N23

RST
IMP_BP1
IMP_BP2

CONS[7..0]

PIN_M19
OUTPUT

S_MLI
NS_MLI

OUTPUT

S_MLI
NS_MLI

OUTPUT

NS_MLIB

PIN_M23
PIN_R20
VCC

inst

BP1

clock
RST
reset
BPLUS
BMOINS

H
C_EN
CONS[7..0]
inst5

S_MLIB

inst4

OUTPUT

LED_BP2

PIN_W19

OUTPUT

LED_BP1

PIN_AE22

OUTPUT

LED_RST

PIN_AA20

PIN_N24
OUTPUT

ENA

OUTPUT

ENB

PIN_K25
RST

INPUT
VCC

PIN_W26

Ce programme gnre en sortie un signal modul en largeur dimpulsion, S_MLI est envoy sur
lentre In1 du circuit L298, tandis que son complmentaire NS_MLI est envoy sur lentr In2.
Lentre ENA du L298 est fixe au niveau logique 1.
Les mmes signaux S_MLIB NS_MLIB et Vcc sont envoys sur les commandes du second
pont via les entres In3, In4 et ENB.
Les signaux modul en largeur dimpulsion sont obtenus en comparant la valeur dun signal de
consigne CONS[7..0] sur huit bits, la valeur de sortie dun compteur huit bits, incrment par le
signal dhorloge 50 Mz lorsque le signal dautorisation C_EN (Clock Enable), environ 5 MHz le
permet. Le cycle complet de 28=256 impulsions, correspond alors a une frquence de dcoupage de
5 MHz/256, soit environ 20 kHz.

Denis Rabast

2/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

Le signal C_OUT (alimentant C_EN) 5 MHz est obtenu par la division par 10 de lhorloge
50 MHz de la carte DE2, par le bloc div_50 .
Grce au bloc squenceur SEQ , ce programme test va permettre de rgler 5 vitesses diffrentes
pour le moteur, en fonction de lappui sur les boutons poussoir BP1 et BP2 (ce qui gnrera les
signaux BPLUS et BMOINS) de la carte DE2.
Pour passer la vitesse suprieure ou infrieure ; ces 5 vitesses correspondent 5 valeurs de la
consigne CONS et donc 5 valeurs de rapport cyclique aux bornes du moteur.
On tabli sans difficult que le rapport cyclique est donn par lexpression :
= CONS/255,
et la tension moyenne aux bornes du moteur par la relation classique dun pont en H :
Umoy = Vs (2 -1)
Vs tant la tension dalimentation du pont
Les 5 valeurs de consigne imposes par le squenceur sont :
- 0, ce qui correspond une vitesse maximale du moteur en sens ngatif (=0, Umoy=-Vs) ;
- 64, soit la moiti de la vitesse maximale du moteur, en sens ngatif (=0,25, Umoy=-Vs/2) ;
- 128, soit une vitesse nulle (=0,5, Umoy=0) ;
- 192, soit la moiti de la vitesse maximale en sens positif (=0,75, Umoy=Vs/2) ;
- 255, soit la vitesse maximale en sens positif (=1, Umoy=Vs).
Le fonctionnement du squenceur a t dcrit par la machine dtat suivante (voir le sujet sur la
machine dtat pour plus de prcisions) :

Le passage dun tat au suivant, se fait chaque coup dhorloge en testant les boutons poussoir :
-

pour augmenter la vitesse (en valeur relative), il faut vrifier la condition BPUS . BMOINS
(ce qui se traduit par BPLUS & ~BMOINS dans la syntaxe de description de machine
dtat au sein de Quartus),

pour diminuer la vitesse, il faut vrifier la condition BMOINS . BPLUS ;


une rinitialisation de la machine dtat, par appui sur le bouton poussoir RST , place celleci dans ltat E128, qui correspond larrt du moteur ;

Remarques : lutilitaire de description de machine dtat de Quartus impose que les conditions de
passage dun tat lautre soit exclusives (deux conditions ne peuvent tre valides en mme temps) ;
on ne peut donc avoir comme conditions BPLUS pour une branche et BMOINS pour lautre.
Lhorloge du systme fonctionnant 50 MHz, les informations BPLUS et BMOINS sont testes 50
millions de fois par secondes ; pour un fonctionnement correct, un appui sur les boutons poussoirs
correspondants, doit donc durer une impulsion dhorloge.

Denis Rabast

3/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

Le bloc BP_IMP a pour rle de convertir le NL0 de dure alatoire, obtenu lors de lappui sur les
boutons poussoir BP1 et BP2, en signaux au NL1 de dure 20 ns (soit une priode de lhorloge 50
MHz).
Le bloc BP_IMP peut tre vu comme un dtecteur de front descendant.
Comme on peut le voir sur le schma gnral associ au programme, les diffrents boutons poussoirs
sont associs des DEL, afin den visualiser lappui.

3.2

Mise en uvre

Ouvrir un nouveau projet dans Quartus.


Proposer un programme VHDL permettant de synthtiser les blocs div_50 et MLI ; simuler les
solutions obtenues.
Etudier la syntaxe VHDL du bloc BP_IMP donn en annexe et dans le dossier ressource
ressources/TP_Quartus/TP6_mcc_pap/mcc et simuler le fonctionnement du programme.
Synthtiser le squenceur Seq laide de lutilitaire de Quartus (voir le cours sur les machines
dtat) et simuler le rsultat.
Regrouper ces sous ensembles dans un schma gnral, compiler le projet et programmer le FPGA
sans alimenter la carte auxiliaire et vrifier loscilloscope que le fonctionnement est bien celui
attendu.
Connecter le moteur et lalimentation suivant le protocole indiqu au chapitre 2, et tester le
fonctionnement.
En cas de problmes, on trouvera des exemples de solutions dans le dossier ressource et en annexe.

4 Mise en uvre de la commande dun pas pas


4.1

Descriptif du programme

Le programme implant dans le FPGA de la carte DE2 est associ au schma suivant :
div_1s
INPUT
VCC

C_EN
H

PIN_N2

C_OUT
S
OUTPUT

PH[3..0]

PIN_M19
PIN_M23
PIN_R24
PIN_R20

inst2

SEQ
DECODEUR
C_EN
RST

INPUT
VCC

PIN_W26
Sens

INPUT
VCC

PIN_G26
P_demiP

INPUT
VCC

RST

PIN_N23
Sens
P_demiP

clock
C_EN
reset
S
P
inst

PH[3..0]
ETAT[3..0]

BCD[3..0]

OUTPUT

SEG[6..0]

PIN_AF10
PIN_AB12
PIN_V13
PIN_V14
PIN_AC12
PIN_AD11
PIN_AE11

inst1

OUTPUT

LED_RST

PIN_AA20

OUTPUT

LED_SENS

PIN_AE22

OUTPUT

SEG[6..0]

LED_p_demip

PIN_W19

VCC
OUTPUT

ENA

PIN_N24

OUTPUT

ENB

PIN_K25

Le bloc div_1s nous gnre un signal dhorloge de priode 1 secondes, en divisant par 50 millions
lhorloge 50 MHz de la carte DE2.
Cette horloge dune seconde va commander un squenceur, permettant au moteur de fonctionner
dans un sens ou dans lautre suivant que le bouton poussoir reli lentre Sens est appuy ou
non, et en mode pas entiers une phase ou en mode demi-pas suivant que le bouton poussoir
associ lentre P_demiP est appuy ou non.
La sortie PH[3..0] du squenceur envoie les signaux adquat sur les entres In1 In4 du circuit
L298, suivant les chronogrammes reprsents ci-dessous :

Denis Rabast

4/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

Fonctionnement en mode pas entier une phase


(un seul sens de rotation reprsent)

Fonctionnement en mode demi-pas


(un seul sens de rotation reprsent)

Un bouton poussoir associ lentre RST permet de rinitialiser le squenceur.


Des diodes lectroluminescentes de la carte DE2 permettent de visualiser lappui sur ces boutons.
On notera que le squenceur est rendu synchrone grce une entre dautorisation dhorloge
C_EN . Contrairement au programme prcdent, le rapport de division de lhorloge tant important,
cette option est ici indispensable.
La machine dtat suivant dcrit le fonctionnement de notre squenceur :

Comme indiqu prcdemment, le passage dun tat lautre se fait :


- uniquement si C_EN est au NL1 quel que soit les tats,
- dans un sens ou dans lautre suivant lentre S ,
- en passant par tous les tats, ou juste les tats pairs, suivant lentre P .
La sortie PH[3..0] du squenceur commande les entrs Inx du L298, tandis que la sortie
ETAT[3..0] permet de visualiser le numro de ltat actif, et de lindiquer sur un afficheur 7
segments de la carte DE2, grce au bloc DECODEUR , ralisant la conversion BCD / 7 segments.
Denis Rabast

5/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

4.2

Mise en uvre

Ouvrir un nouveau projet sous Quartus, importer le diviseur de projet prcdent, le sauvegarder dans
le nouveau projet afin dviter que sa modification naffecte ltude prcdente, et modifier le
programme pour rpondre au nouveau cahier des charges.
Proposer un programme VHDL pour le dcodeur.
Synthtiser le squenceur laide de lutilitaire de Quartus et tester la solution obtenue.
Regrouper les sous ensembles en un schma gnral et programmer le FPGA sans alimenter la carte
auxiliaire, vrifier au niveau de lafficheur que le fonctionnement est bien celui attendu (dans un sens
dans lautre, en mode pas entier, demi-pas).
Connecter la sonde de loscilloscope sur les points tests correspondants aux entres In1 et In4 et
vrifier leffet des diffrents modes de fonctionnement.
Connecter le moteur et lalimentation suivant le protocole indiqu au chapitre 2, et tester le
fonctionnement.
En cas de problme, on trouvera un exemple de solution en annexe et dans le dossier ressources
ressources/TP_Quartus/TP6_mcc_pap/pap

Annexe 1 : connectique de la carte


Broche du L298
sur la carte
auxiliaire

Broche du FPGA
sur la carte DE2

Nom de la
borne sur la
carte DE2

Borne du
connecteur
GPIO_1
Carte DE2

Repre
sur la
carte
DE2

Couleur
sur la
carte
auxiliaire

5 : In1
6 : EnA
7 : In2
10 : In3
11 : EnB
12 : In4

M19
N24
M23
R24
K25
R20

GPIO_1[4]
GPIO_1[10]
GPIO_1[3]
GPIO_1[13]
GPIO_1[0]
GPIO_1[14]

5
13
4
16
1
17

IO_B4
IO_B10
IO_B3
IO_B13
IO_B0
IO_B14

Blanc
Vert
Jaune
Jaune
Vert
Blanc

Denis Rabast

6/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

Annexe 2 : Programmes associs la commande dun moteur


courant continu
Block BP_IMP : dtecteur de front descendant
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
-- chaque appui sur les boutons poussoirs (NL0 sur la carte DE2),
-- les sorties correspondantes gnre une impulsion unique
--d'un seul coup d'horloge (dtection du front descendant)
ENTITY bp_imp IS
port (

H
BP1, BP2
IMP_BP1, IMP_BP2

: IN STD_LOGIC;
: IN STD_LOGIC;
: OUT STD_LOGIC);

END bp_imp;
ARCHITECTURE arch OF bp_imp IS
SIGNAL BP10, BP11, BP20, BP21

: STD_LOGIC;

BEGIN
-- chaque front d'horloge, le niveau de l'entre BPx est affect BPx0
-- au coup d'horloge suivant BPx0 est affecte BPx1
-- une fonction ET entre BPx0 et le complmentaire de BPx1 permet de dtecter le front descendant
sur BPx
PROCESS (H)
BEGIN
IF (H'EVENT AND H = '1') THEN
BP10<= BP1; BP11<= BP10;
BP20<= BP2; BP21<= BP20;
END IF;
END PROCESS;
IMP_BP1<=BP11 AND NOT BP10;
IMP_BP2<=BP21 AND NOT BP20;
END arch;
Block div_50 : division de lhorloge
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
--H est le signal d'horloge 50 MHz
--S est un signal de rapport cyclique 1/2, rsultant de la division de l'horloge
--C_OUT est le signal de retenue qui passe au NL1 lorsque le compteur est plein
--le rapport de division dpend du modulo M
--ajuster en consquence le nombre de bits du compteur interne X
Denis Rabast

7/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

--pour notre application on souhaite un signal environ 256*20 kHz


--il faut donc diviser par 10, ce qui ncessite 4 bits pour X
ENTITY div_50 IS
port (
H
C_OUT
S

: IN STD_LOGIC;
: OUT STD_LOGIC;
: OUT STD_LOGIC);

END div_50;
ARCHITECTURE archdiv OF div_50 IS
SIGNAL X
: STD_LOGIC_VECTOR (3 downto 0);
CONSTANT M : INTEGER :=10 ;
BEGIN
PROCESS (H)
BEGIN
--compteur modulo M
IF (H'EVENT AND H = '1') THEN
IF X >= M-1
THEN X <= (others=>'0');
--mise 0 de tous les bits de X
ELSE X <= X + 1 ;
END IF;
END IF;
END PROCESS;
-- la moiti du comptage on change la valeur de S (rapport cyclique 1/2)
S<='1' when X>=M/2 else '0';
--mise 1 de la retenue lorsque X passe 0
C_OUT<='1' when X=M-1 else '0';
END archdiv;
Block MLI : Modulateur de largeur dimpulsion
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
ENTITY MLI IS
--gnration d'un signal MLI et son complmentaire en S_MLI et NS_MLI
--l'horloge H incrmente un compteur X , si C_EN l'autorise
--la sortie du compteur X est compare la consigne CONS
port (

H
C_EN
CONS
S_MLI
NS_MLI

: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
: OUT STD_LOGIC;
: OUT STD_LOGIC);

END MLI;
ARCHITECTURE archdiv OF MLI IS
SIGNAL X
: STD_LOGIC_VECTOR (7 downto 0);
CONSTANT M: INTEGER :=256 ;
Denis Rabast

8/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

BEGIN
PROCESS (H)
BEGIN
--compteur modulo M
IF (H'EVENT AND H = '1') THEN
IF C_EN='1' then
IF X >= M-1
THEN X <= (others=>'0');
--mise 0 de tous les bits de X
ELSE X <= X + 1 ;
END IF;
END IF;
END IF;
END PROCESS;
--lorsque la consigne devient suprieure au comptage S_MLI passe au NL1
S_MLI <='0' when X>= CONS else '1';
NS_MLI <='1' when X>= CONS else '0';
END archdiv;

Annexe 3 : Programmes associs la commande dun moteur pas


pas
Block div_1s
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
ENTITY div_1s IS
--H est le signal d'horloge 50 MHz
--S est un signal de rapport cyclique 1/2, rsultant de la division de l'horloge
--C_OUT est le signal de retenue qui passe au NL1 lorsque le compteur est plein
--le rapport de division dpend du modulo M
--ajuster en consquence le nombre de bits du compteur interne X
--pour notre application on souhaite un signal 1 Hz
--il faut donc diviser par 50 000 000, ce qui ncessite 26 bits pour X (2^26=67 108 864)

port (

H
C_OUT
S

: IN STD_LOGIC;
: OUT STD_LOGIC;
: OUT STD_LOGIC);

END div_1s;
ARCHITECTURE archdiv OF div_1s IS
SIGNAL X
: STD_LOGIC_VECTOR (25 downto 0);
CONSTANT M: INTEGER :=50000000 ;
BEGIN
PROCESS (H)
Denis Rabast

9/10

IUFM Aix Marseille

Commande de moteur courant continu et pas pas par FPGA

BEGIN
--compteur modulo M
IF (H'EVENT AND H = '1') THEN
IF X >= M-1
THEN X <= (others=>'0');
--mise 0 de tous les bits de X
ELSE X <= X + 1 ;
END IF;
END IF;
END PROCESS;
-- la moiti du comptage on change la valeur de S (rapport cyclique 1/2)
S<='1' when X>=M/2 else '0';
--mise 1 de la retenue lorsque X passe 0
C_OUT<='1' when X=M-1 else '0';
END archdiv;
Bloc DECODEUR
-- la bibliothque ieee contient les paquetages dont la dclaration suit
library ieee;
--ce paquetage permet l'utilisation des types STD_LOGIC et STD_LOGIC_VECTOR
use ieee.std_logic_1164.all;
-- permet d'utiliser le type STD_LOGIC_VECTOR avec des entiers
use ieee.std_logic_unsigned.all;
entity DECODEUR is
port
(BCD
SEG
end DECODEUR;
0
------------l 0
l
-5
l
l1
-l
l
---------l 6
l
-4
l
l2
-l
l
-----------3

: in
STD_LOGIC_VECTOR (3 downto 0);
: out STD_LOGIC_VECTOR ( 6 downto 0) );

architecture ARCH_DEC of DECODEUR is


begin
-- attention les leds s'allument pour une sortie 0
SEG <=
"1000000"
when BCD=0 else
"1111001"
when BCD=1 else
"0100100"
when BCD=2 else
"0110000"
when BCD=3 else
"0011001"
when BCD=4 else
"0010010"
when BCD=5 else
"0000010"
when BCD=6 else
"1111000"
when BCD=7 else
"0000000"
when BCD=8 else
"0010000"
when BCD=9 else
"1111111" ;
end ARCH_DEC ;
Denis Rabast

10/10

IUFM Aix Marseille