Professional Documents
Culture Documents
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.
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
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.
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
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),
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
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
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
5/10
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
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
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
: 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
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;
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
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) );
10/10