Syst`emes num´eriques V4 04-02-2013
1
L’objectif de cet enseignement pratique est une initation aux syst`emes num´eriques, mettant en œuvre les concepts de d´eveloppement sur circuits programmables de type FPGA. L’application retenue est la commande d’un robot, fabriqu´e a` partir d’une base Rogue Blue ERS de chez ROGUE ROBOTICS. La carte de d´eveloppement FPGA utilis´ee est la carte d’ALTERA STATIX EP1S10. La documentation compl`ete de la carte et des logiciels Quartus, NIOS IDE ainsi que des composants utilis´es peuvent ˆetre t´el´echarg´es sue le site du fabriquant http ://www.altera.com/ Ce document comporte un tutorial qui permettra une prise en main rapide d’une part de l’environnement de d´eveloppement mat´eriel Quartus II et d’autre part de l’environnement de d´eveloppement logiciel NIOS IDE. Ensuite seront d´evelopp´es dans une s´erie de manipulations, les points suivants : – Etude et d´efinition de l’architecture du syst`eme robot – Implantation d’un processeur g´en´erique – Implantation de circuits d’ent´ee-sortie – Implantation d’un logiciel de commande de l’application en langage C
2
1
D´ ecouverte de l’environnement
1.1
– – – – – – – –
Pr´ esentation de la carte de d´ eveloppement Stratix
un FPGA Stratix 1P1S10 une horloge 50 MHz 4 interupteurs SW0..SW3, 7 LEDs : D7..D0 2 afficheurs 7 segments 1 port s´erie, 1 port JTAG 16 Moctets de m´emoire RAM statique 8 Moctets de m´emoire Flash 6 ports d’extension
3
2
Tutorial pour l’implantation du processeur NIOS II standard
Ce tutorial permet de cr´eer un syst`eme bati autour d’un cœur de la famille des processeurs embarqu´es NIOS II avec de la m´emoire vive, un port de mise au point JTAG et d’un coupleur parall`ele (PIO) permettant de piloter des LEDs. Ce premier syst`eme sera implant´e et test´e sur la carte d´eveloppement Stratix.
3
Sp´ ecification & G´ en´ eration du syst` eme
Dans cette section, nous allons d´efinir, param´etrer les diff´erents composants et g´en´erer le syst`eme correspondant a` la sp´ecification ci-dessus (Figure 1 : Tutorial Example Design). 1. D´ecompresser dans votre r´ epertoire de travail, l’archive niosII SN stratix 1s10.zip. Ce r´epertoire contient les fichiers suivants : nios2 quartus2 project.bdf nios2 quartus2 project.qpf nios2 quartus2 project.qsf nios2 quartus2 project.qws README.TXT
BlockSchematic File Quartus Project File
Le fichier BDF est une ´ebauche sous forme de sch´ema du syst`eme a` ´elaborer, et le fichier QPF repr´esente le projet du logiciel de d´eveloppement QUARTUS. 2. Lancer QUARTUS II Pour ouvrir le projet nios2 quartus2 project aller dans le menu File → Open Project ... Aller dans votre r´epertoire de travail et s´electionner le fichier nios2 quartus2 project.qpf
4
Il apparaˆıt alors (voir figure ci-dessous), un sch´ema (Block Diagram File) avec :
– un commentaire decrivant le syst`eme – une entr´ee d’horloge : PLD CLOCKINPUT[1] – une entr´ee connect´ee a` la tension d’alimentation : Vcc – et 8 sorties pour commander les LEDs : LEDG[7..0] (voir Annexe) L’objectif `a partir de cet embryon de projet est de bˆatir le syst`eme complet d´ecrit sur la figure 1 : Tutorial Example Design. 3. A partir du menu Tools lancer SOPC Builder... Une fenˆetre Create a New System s’ouvre alors. Dans la zone System name entrer : first nios2 system dans la zone Target HDL choisir l’option VHDL et cliquer sur OK. (cr´eation dans le r´epertoire de travail des fichiers first nios2 system.ptf et de first nios2 system.vhd L’interface SOPC Builder apparaˆıt alors, avec `a gauche l’onglet System Content. Il ne contient pour le moment aucun ´el´ement constituant le syst`eme, il faut tout sp´ecifier.
5
4. Sp´ecifier dans Target Board → Nios Development Board, Stratix (EP1S10) et v´erifier que dans Clock(MHz) il y a bien 50.0 qui est la valeur par d´efaut pour la carte de d´eveloppement Stratix. 5. Nous allons maintenant ajouter le coeur du syst`eme : Dans l’onglet System Content, s´electionner NIOS II Processor Altera Corporation, et cliquer sur Add... Il apparait alors une fenˆetre qui permet de choisir le type de processeur NIOS II que l’on souhaite implanter, on choisira ici le mod`ele Standard
Pour cela, s´electionner dans l’onglet NIOS II Core → NIOS II/s S´electionner dans Hardware Multiply → None et v´erifier que la case Hardware Divide n’est pas coch´ee (voir figure ci-dessus). Cliquer sur Next pour passer a` l’onglet Caches & Tightly Coupled Memories et sp´ecifiez les param`etres suivants : Instruction cache → 2kbytes Include Coupled Instruction Master Port(s) : → Off (case non coch´ee) 6. A ce stade, la sp´ecification du cœur du syst`eme est termin´ee, il suffit de cliquer sur Finish pour revenir a` la fenˆetre SOPC Builder 7. Pour faire fonctionner un processeur, il est indispensable d’y rajouter de la m´emoire. Ici, nous allons implanter de la m´emoire vive statique (SRAM) qui est incluse dans le FPGA (on Chip Memory). Elle sera utilis´ee pour y stocker aussi bien des donn´ees que des programmes. Dans la liste des composants disponibles (onglet de gauche : System Content), cliquer sur Memory et s´electionner On-Chip Memory (RAM or ROM) et cliquer sur Add...
6
Il faut maintenant pr´eciser les param`etres de la m´emoire a` savoir ici, une RAM de 32 bits, de taille totale 20 koctets Dans la zone Size entrer Total Memory Size → 20 et dans la zone Memory Type s´electionner Block Type → M4K Cliquer sur Finish pour quitter la fenˆetre de sp´ecification des param`etres de la m´emoire La figure ci-dessous repr´esente la configuration obtenue apr`es ajout de la RAM
Il est a` noter que le SOPC Builder cr´ee automatiquement les connexions entre le processeur et la m´emoire ! 8. Ajout du port JTAG :
Dans la liste des composants disponibles dans l’onglet System Content : s´electionner dans la cat´egorie Communications → JTAG-UART et cliquer sur Add... Ne pas modifier les param`etres par d´efaut et cliquer sur Finish pour accepter la configuration. On notera la connexion cr´e´ee entre la sortie IRQ du port JTAG et le processeur. 9. Ajout et sp´ecification des param`etres du Timer syst`eme
7
Dans la liste des composants disponibles : s´electionner dans la cat´egorie Other → Interval timer et cliquer sur Add... Dans la fenˆetre de configuration qui apparait, cliquer sur Finish pour accepter la configuration par d´efaut Avec le bouton droit de la souris, cliquer sur timer 0 et s´electionner Rename Entrer alors le nouveau nom sys clk timer et valider. 10. Ajout et sp´ecification du num´ero de p´eriph´erique (ID Peripheral) Dans la liste des composants disponibles, s´electionner dans la cat´egorie Other → System ID Peripheral et cliquer sur Add... Il n’y a pas ici, de param`etre a` configurer. 11. Ajout et sp´ecification des param`etres du PIO Dans la liste des composants disponibles : s´electionner dans la cat´egorie Other → PIO (Parallel I/O) et cliquer sur Add... Dans la fenˆetre de configuration qui apparait, ne pas changer la configuration par d´efaut, v´erifier que le port est bien de 8 bits et en sortie seule ! Cliquer sur Finish pour revenir a` la fenˆetre du SOPC Builer Avec le clic droit sur le nom pio 0 , s´electionner Rename et entrer le nouveau nom led pio A ce stade, tous les composants n´ecessaires ont ´et´e s´electionn´es et param´etr´es. Cependant, avant de g´en´erer le syst`eme ainsi d´efini, il faut encore assigner a` chaque p´eriph´erique, une adresse de base et d´efinir les niveaux d’interrruption. 12. Sp´ecification des adresses de base Le SOPC Builder permet de mettre en œuvre une m´ethode d’assignation automatique, nomm´ee Auto-Assign Base Addresses. On reste cependant libre de fixer les adresses de base “`a la main”. Dans le menu System s´electionner Auto-Assign Base Addresses. L’assignation des adresses de base se fait alors de fa¸con automatique. Cliquer sur la valeur de l’IRQ du composant jtag uart 0 et entrer la valeur 16 Le syst`eme est maintenant enti`erement configur´e, il ne reste plus qu’`a le g´en´erer et le charger dans le FPGA 13. Pour g´en´erer le syst`eme complet : Cliquer sur l’onglet System Generation Ne pas cocher la case Simulation 8
Cliquer sur Generate pour lancer la compilation. La compilation dure environ 1 minute et elle n’est pas termin´ ee tant que le message suivant n’est pas affich´e : # 2005.12.27 11 :46 :35 (*) SUCCESS : SYSTEM GENERATION COMPLETED. Press ’Exit’ to exit. 14. Cliquer alors sur Exit pour retourner dans l’environnement de d´eveloppement Quartus II
9
4
Int´ egration du syst` eme dans le projet
Pour instancier le module cr´ee dans la section pr´ec´edente, double cliquer sur une zone libre du sch´ema. Un fenˆetre Symbol s’ouvre. Dans Libraries ouvrir le dossier Projet S´electionner le composant first nios2 system et cliquer sur OK On retourne alors sur le sch´ema, une empreinte du composant ´etant attach´ee au pointeur de la souris. Il suffit de cliquer pour placer le composant. Il ne reste plus alors qu’`a connecter les 3 signaux au composant. Sauvegarder le sch´ ema ! ! !
On prendra soin `a ce niveau de v´erifier que le syst`eme r´ealis´e est bien associ´e `a la carte de d´eveloppement Stratix. Pour cela dans le menu Assignments, s´electionner Device et v´erifier dans la fenˆetre qui s’ouvre que le circuit EP1S10F780C6 est bien s´electionn´e.
10
D’autre part, toujours dans le menu Assignments s´electionner Pins et cliquer sur la case To afin de trier les broches par leur nom. On v´erifiera alors que : – le signal PLD CLOCKINPUT[1] est bien affect´e a` la broche K17 du FPGA – les signaux LEDG[7..0] (Led Green) sont bien affect´es aux broches H27, H28, L23, L24, J25, J26, L20, L19 Pour lancer la compilation : 1. Cliquer sur l’icone Start Compilation (ou dans le menu Processing → Start Compilation 2. La fenˆetre Status indique l’´etat d’avancement de la compilation, cela prend environ 2 minutes. 3. La compilation est termin´ee, lorsque qu’apparait la fenˆetre de dialogue affichant le message “Full compilation was successful” 4. Quelques caract´eristiques sont r´esum´ees dans la fenˆetre de droite : nombre d’´el´ements logiques utilis´es, m´emoire utili´ee ... 5. Il est indispensable de v´erifier que le syst`eme ainsi synth´etis´e peut fonctionner `a la fr´equence d’horloge sp´ecifi´ee (50 MHz). Pour cela, dans la fenˆetre Compilation Report, ouvrir Timing Analyzer et cliquer sur Summary Le contenu de la cellule Actual Time repr´esente la fr´equence maximale a` laquelle peut fonctionner le circuit. Cette valeur doit imp´ erativement ˆetre sup´erieure a` la fr´equence d’horloge sp´ecifi´ee `a la conception soit 50 MHz. Le syst`eme peut alors ˆetre charg´e dans le FPGA. Remarque : pour faire apparaˆıtre (ou supprimer) les noms des broches, aller dans le menu View et s´electionner Show Pins and Location Assignments
5
Chargement & Test
Le syst`eme ´etant g´en´er´e, il faut maintenant le charger dans le FPGA et d´evelopper un programme de test.
5.1
Programmation du FPGA
1. Dans le menu Tools s´electionner Programmer 2. S´electionner le fichier nios2 quartus2 project.sof 3. Cocher la case Program/Configure (voir figure page suivante) 4. Avant de lancer la programmation, cliquer sur Hardware Setup ... et v´erifier que dans la fenˆetre qui s’ouvre USB-Blaster est bien s´electionn´e. Fermer la fenˆetre Hardware Setup en cliquant sur Close 5. Pour lancer la programmation, cliquer sur Start. La programmation est termin´ee lorsque l’indicateur Progress indique 100% (voir figure page suivante) La programmation du FPGA est termin´ee, nous allons maintenant ´ecrire un programme de test en langage C. Quitter l’application Quartus II. 11
5.2
D´ eveloppement d’un programme
Il existe un environnement ind´ependant qui permet d’´ecrire et de mettre au point les logiciels a` implanter sur la carte de d´eveloppement, c’est le NIOS II IDE (Integrated Development Environment) 1. Lancer l’application NIOS II IDE 2. Avant de cr´ eer un nouveau projet, il faut tout d’abord vous placer dans votre r´epertoire de travail. Pour cela, dans le menu File → Switch workspace → Browse s´electionner votre r´epertoire de tracail C :\altera\qdesign51 ... 3. Dans le menu File → New → Project... choisir dans la fenˆetre qui apparaˆıt C/C++ Application et cliquer sur Next
12
4. Dans la fenˆetre qui s’ouvre, choisir un projet type dans Select Project Template. Par exemple Hello World 5. Il faut s´electionner la cible sur laquelle vous voulez faire ex´ecuter ce programme. Pour cela, dans Select Target Hardware → Browse... aller dans votre r´epertoire de travail et s´electionner le syst`eme qui vient d’ˆetre d´efini et charg´e dans le FPGA (fichier avec l’extension .ptf) 6. Cliquer sur Finish. Une fenˆetre hello world.c s’ouvrira alors. Elle contient un fonction main 7. Avant de lancer la compilation, avec le bouton droite de la souris, cliquer sur le nom du projet dans la fenˆetre C/C++ Project et s´electionner : System Library Properties. 8. D´ecocher la case Clean Exit et cocher Small C Library . Cliquer sur OK pour fermer la fenˆetre. 9. Avant de faire la moindre modification `a ce code source, avec le bouton droite, cliquer sur le nom du projet et lancer Build Projet. Cela permet au compilateur de g´en´erer les fichiers “system.h” ... de fa¸con a` les inclure ensuite dans le code source. 10. Pour l’ex´ecuter cliquer sur Run As → Nios II Hardware. 11. Dans la fenˆetre nomm´ee Console, doit s’afficher Hello from Nios II ! Compl´eter le programme ci-dessus, afin de faire afficher sur les 8 LEDs LEDG[7]..LEDG[0], la valeur d’une variable cmpt qui sera incr´ement´ee toute les demi-secondes. La fonction qui permet de cr´eer une temporisation s’appelle usleep(valeur du retard). D´eterminer exp´erimentalement en quelle unit´e s’exprime ce retard.
Pour ´ecrire une valeur dans le registre de donn´ees du PIO, on utilisera la fonction d´efinie par Altera : IOWR ALTERA AVALON PIO DATA( ). Son prototype se trouve dans le fichier altera avalon pio regs.h Ce fichier contient les d´efinitions des fonctions permettant : – de lire ou d´ecrire dans le regsitre de donn´ees du PIO – de lire ou d’´ecrire dans le regsitre de direction des donn´ees du PIO – de lire ou d’´ecrire dans le regsitre de masquage des interruptions du PIO – de lire ou d’´ecrire dans le regsitre de capture de front du PIO Remarque : les types suivant ont ´et´e d´efinis pour utiliser les fonctions d´evelopp´ees par Altera alt 8 signed char alt u8 unsigned char alt 16 signed short alt u16 unsigned short alt 32 signed long alt u32 unsigned long Exercices importants AVANT d’aborder la gestion des interruptions : Ecrire une fonction main() qui contient la d´eclaration locale d’un tableau de 5 entiers. 1. Faire une boucle qui permet d’afficher les ´el´ements du tableau a` l’aide d’un pointeur, en utilisant une syntaxe de la forme : p++. On affichera les ´el´ements et leurs adresses. 2. De mˆeme, faire une boucle qui permet d’afficher les ´el´ements du tableau, en utilisant une syntaxe de la forme : p+i o` u i est l’indice de boucle. Interpr´etation ! 3. Ecrire une fonction qui permet d’afficher la valeur des ´el´ements du tableau, l’adresse du tableau sera pass´ee en param`etre. 4. Reprendre les points ci dessus avec un tableau de char 13
6
Gestion des interruptions
L’objectif ici, est de g´ en´ erer enti` erement un nouveau syst` eme qui permettra de lire l’´etat des 4 interrupteurs SW3..SW0. Le fonctionnement sera pr´evu dans un premier temps sans interruptions, afin d’aborder le fonctionnement du registre de capture de front. Dans un deuxi`eme temps, la mise en place et la gestion des interruptions seront abord´ees. Pour cela on d´eveloppera un nouveau syst`eme int´egrant les mˆemes composants que ceux pr´ec´edemment d´evelopp´es. On y ajoutera un PIO nomm´e BUTTON PIO. Il devra poss´eder 4 entr´ees qui doivent ˆetre reli´ees aux interrupteurs SWi (i=0..3, cf Annexes pour la syntaxe pr´ecise de leur nom). Lors de la d´efinition du PIO, dans l’onglet Basic Settings, sp´ecifier : PIO en entr´ee seule. Dans l’onglet Input Option, sp´ecifier (par exemple) que le registre de d´etection de front (EDGE CAPTURE) doit ˆetre sensible a` un front montant (ou descendant, au choix...) et qu’il doit g´en´erer une interruption active sur front. Les param`etres du PIO ´etant d´efinis, cliquer sur Finish pour revenir au SOPC Builder et pr´eciser que l’interruption li´ee a` ce PIO est reli´ee a` la ligne IRQ 2, par exemple. Attention la ligne IRQ 0 est r´eserv´ee au syst`eme, ne pas l’utiliser ! ! Il faut maintenant reg´en´erer le syst`eme.
Avant de recompiler le projet, il faut rajouter sur le sch´ema quatre entr´ees correspondant aux interrupteurs SW0..SW3. On v´erifiera la syntaxe pr´ecise du noms de ces entr´ees dans le menu Assignement, Pins... Pour tester la nouvelle fonctionnalit´e implant´ee, ´ecrire un programme en langage C qui permet d’afficher en permanence les valeurs contenues dans les registres EDGE CAPTURE et DATA du PIO. Dans ce premier programme, les interruptions ne sont pas autoris´ees. Pour le tester : appuyer sur l’interrupteur SW0 par exemple, observer la valeur affich´ee. Appuyer ensuite sur SW1, observer la valeur affich´ee. Interpr´eter. Modifier le programme pr´ec´edent, de fa¸con `a remettre a` z´ero le registre EDGE CAPTURE lorsque la valeur lue est ´egale a` (1111)2 . Remarque : pour arrˆeter l’´excution d’un programme : dans la fenˆetre Console, cliquer sur l’icˆone Terminate.
14
Mise en place des interruptions La proc´edure suivante doit ˆetre suivie : – tout d’abord, effectuer une remise `a z´ero du registre EDGE CAPTURE pour ´eviter toute interruption parasite – Mise en place du sous programme de traitement d’interruption (voir ci-apr`es) – Autorisation des interruptions par la mise en place du masque d’interruption. Il existe une fonction dans la biblioth`eque HAL (Hardware Abstraction Layer) fournie par Altera, qui permet de mettre en place un vecteur d’interruption correspondant a` un niveau d’interruption spc´ecifique : alt irq register(). Son prototype est dans le fichier sys/alt irq.h et est de la forme : int alt irq register ( alt u32 id, void* context, void (*isr)(void*, alt u32) ) o` u ses param`etres sont d´efinis comme suit : – id est le num´ero de l’interruption – void* context est un pointeur g´en´erique permettant de passer un (ou des) param`etre(s) `a la fonction de traitement des IT – void (*isr)(void*, alt u32) est un pointeur sur la fonction de traitement des IT (nomm´ee ici isr ). C’est en fait l’adresse de la fonction de traitement des interruptions. Elle doit respecter le prototype d´efini ci-dessous. La fonction de traitement des interruptions que vous aller ´ecrire doit respecter le prototype suivant : void nom de votre fonction de traitement des IT(void* context, alt u32 id) Modifier le programme pr´ec´edent de fa¸con a` prendre en compte une interruption lors d’un appui sur SW1 (et uniquement sur SW1), par exemple.
Remarques : – le fabriquant pr´econise d’´ecrire des fonctions d’interruption comportant peu d’instructions – il est interdit d’utiliser des fonctions d’entr´ee-sortie standart du langage C, telles que printf(), dans les fonctions d’interruption (cf page 6.14) Exercies sur la gestion des interruptions : 1. Lors de l’appui sur un interrupteur, incr´ementation d’une variable et affichage sur les LEDs 2. En reprenant le programme pr´ec´edent, rajouter la d´ecr´ementation de la variable lors de l’appui sur un autre interrupteur 3. Soit 2 variables v1 et v2, locales ` a la fonction main(), on souhaite obtenir le fonctionnement suivant : v1 v2 Appui sur SW0 1 0 Appui sur SW1 0 1 Appui sur SW2 0 0 4. En reprenant le premier exercice du tutorial : a` partir de la valeur 0, incr´ementation automatique d’une variable toutes les 0.5s, on doit maintenant lors d’un appui sur un interrupteur avoir une temporisation de 0,25s (ralentissement). Lors d’un second appui sur le mˆeme interrupteur, la temporisation doit revenir `a sa valeur initiale de 0,5s (acc´el´eration).
15
7
G´ en´ eration du signal de commande des LEDs ´ emettrices IR
Au syst`eme pr´ec´edemment d´efini, on souhaite rajouter un circuit temporisateur qui permettra de g´en´erer le signal de commande des LEDs ´emettrices infra-rouges. 1. Rajouter au syst`eme un Timer que l’on nommera Timer LED IR poss´edant une sortie “Timeout Pulse” qui g´en`erera une impulsion `a une fr´equence de 38kHz. Pour observer ce signal, on le connectera a` une broche du port d’extension J15 , par exemple la broche LED IR. La syntaxe pr´ecise du nom de la broche sera trouv´ee dans le menu Assignments ⇒ Pins ... cf Tutorial page 11. 2. Ecrire un programme de test qui permet de lire et d’afficher les registres de ce circuit temporisateur et du Sys clk timer. Interpr´eter les r´esultats. Le prototype des fonctions permettant d’acc´eder aux registres du circuit temporisateur, se trouve dans le fichier altera avalon timer regs.h. 3. Afin de d´etecter le signal ´emis par les LEDs infra-rouges, il est n´ecessaire de g´en´erer un signal carr´e de fr´equence 38kHz. Comment doit on modifier ce syst`eme pour g´en´erer un signal carr´e ? On cherchera ici a` avoir une solution mat´erielle et non pas logicielle qui serait trop lourde `a mettre en place. R´ealiser la modification et visualiser le signal (il sera peut-ˆetre n´ecessaire de modifier le logiciel ´ecrit a` la question 2 ci-dessus)
8
Commande des servo-moteurs
Les moteurs qui servent `a piloter le robot sont r´ealis´es `a partir de servo-moteurs modifi´es pour fonctionner en moteurs a` courant continu. Le robot poss`ede pour se mouvoir 2 moteurs qui sont command´es de fa¸con in´ependante.
Ces servo-moteurs poss`edent un connecteur a` trois broches, dont le brochage est sp´ecifi´e ci-dessous : Masse +5V Commande
Le signal de commande est cod´e en PWM, la p´eriode de r´ep´etition des impulsions doit ˆetre d’environ 20ms. Selon l’allure de ce signal de commande, le fonctionnement suivant peut ˆetre obtenu : +5V
lorsque : To ' 1,5 ms le moteur est a` l’arrˆet – To ' 1,0 ms le moteur tourne dans un sens – To ' 2,0 ms le moteur tourne dans le sens oppos´e
t– To
T # 20ms
16
8.1
G´ en´ eration d’un signal de commande
Le signal de commande du moteur doit ˆetre du type PWM (Pulse Width Modulation). Il faut donc rajouter au syst`eme un composant capable de g´en´erer un signal PWM. Altera fournit ce type de composant sur son site, il n’est pas int´egr´e par d´efaut dans la version de base du SOPC Builder. Nous allons l’int´egrer en nous aidant de la documentation fournie par Altera. REMARQUE IMPORTANTE : les fichiers fournis par le constructeur sont ´ecrits en Verilog. On ne peut compiler ensemble que des fichiers du mˆeme type. Cela impose donc lors de la d´efinition d’un nouveau syst`eme devant comporter un module PWM, que celui-ci soit d´efinit en Verilog ( cf Tutorial page 5, choisir l’option Verilog). 1. En suivant les instructions fournies dans le fichier qts qii54007.pdf, inclure dans le SOPC Builder le composant PWM Avalon Interface. 2. R´ealiser un programme de test et visualiser le signal 3. Le syst`eme doit poss´eder un PIO capable de g´erer les boutons poussoirs SW0, SW1 et le signal de commande d’un servomoteur. Le fonctionnement doit ˆetre le suivant : – en absence d’action sur SW0 et SW1, le moteur doit ˆetre `a l’arrˆet – une action sur SW0 doit faire tourner le moteur dans un sens – une action sur SW1 doit faire tourner le moteur dans le sens oppos´e Pour r´ ealiser le test lorsque les moteurs seront connect´ es, on veillera ` a ce que les valeurs extr` emes de la dur´ ee To ne d´ epassent pas ± 10% de la valeur de r´ ef´ erence 1.5 ms ! ! !
8.2
Commande des 2 moteurs
Le syst`eme doit pouvoir maintenant commander les 2 moteurs, afin de permettre au robot de se d´eplacer. La commande sera g´en´er´ee par une action sur un des 2 boutons poussoirs : SW0 ou SW1. Un appui sur SW0 doit provoquer la rotation du robot sur lui mˆeme, dans le sens horaire, et un appui sur SW1 une rotation dans le sens anti-horaire. En absence d’action sur SW0 et SW1, le robot doit ˆetre a` l’arrˆet. Faire un nouveau syst`eme int´egrant la commande des 2 moteurs.
17
9
D´ etection d’obstacles & Pilotage
9.1
D´ etection
La d´etection d’obstacle sera r´ealis´ee a` l’aide d’un d´etecteur infrarouge TSOP2236 dont la documentation constructeur est fournie en annexe. Timer 36kHz Vcc 470
Ω 1 TSOP2236
LED IR
2
vers IR_PIO
3
1. A partir de la documentation constructeur, expliquer le fonctionnement du d´etecteur IR 2. G´ en´ erer un nouveau syst` eme qui comporte un timer capable de fournir le signal d’excitation de la LED IR `a la fr´equence de 36 kHz. Le syst`eme devra en outre comporter un PIO nomm´e IR PIO permettant de r´ealiser la d´etection, et qui pourra ´eventuellement fonctionner en interruption. 3. Ecrire un programme en C permettant de tester le fonctionnement du syst`eme. On testera en particulier la sensibilit´e de la d´etection : ´eloignement de l’obstacle, couleur de la surface r´efl´echissante ... 4. En faisant varier la fr´equence du signal d’exitation, ´evaluer la gamme de fonctionnement du d´etecteur
9.2
Commande
On souhaite maintenant r´ealiser un syst`eme qui permette au robot de se d´eplacer en ligne droite et de s’arrˆeter lorsqu’un obstacle est d´etect´e. Ce syst`eme devra en outre comporter un interrupteur qui permettra d’arrˆeter le robot a` n’importe quel moment (Arrˆet d’urgence). R´ealiser le syst`eme qui r´epond a` ce cahier des charges.
9.3
Capteur de temp´ erature
Le robot est dot´e d’un capteur de temp´erature DS1620, dont la documenation est fournie en annexe. Int´egrer le capteur de temp´erature dans un nouveau syst` eme et le tester. Pour connecter le capteur au FPGA, on se r´ef`erera au brochage donn´e en Annexe.
18
10
Annexes
Brochages : Noms des broches du FPGA BUTTON PIO IN[0] .. . BUTTON PIO IN[3]
LEDG[0] .. . LEDG[7]
1 3 5 7 9 11 13
19
GND DQ(DS1620) RST(DS1620) Moteur1 LED IR
2 4 6 8 10 12 14
+5V CLK(DS1620) Moteur2 DETECT IR (TSOP2236)