Cours:SaeCpld : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
 
(20 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
 
=Modalité d'évaluation=
 
=Modalité d'évaluation=
  
*note de résultat
 
**le classement à l'issu des missions constituera une note
 
**les fonctionnalités du robot constitueront une note
 
***on peut régler la vitesse de chaque moteur indépendamment
 
***le robot sait reconnaître une ligne
 
***...
 
*note de fabrication
 
**qualité du routage
 
**qualité du soudage
 
**assemblage du robot
 
*note de programmation
 
*note de présentation
 
**5 minutes + entretien
 
**objectif de vendre votre produit
 
*affiche + vidéo pour vanter les mérites de votre robot
 
  
 
=Organisation des travaux=
 
=Organisation des travaux=
  
* Le travail sera mené par trinôme. Vous devrez organiser vos travaux de manière à ce que chacun soit actif pour faire avancer le projet à un bon rythme et remplir le maximum de missions proposées.
+
*Le travail sera mené par trinôme. Vous devrez organiser vos travaux de manière à ce que chacun soit actif pour faire avancer le projet
 +
*Il y aura une partie individuelle
 +
*puis 1 travail de regroupement du travail
  
* Il vous est demandé :
 
  
*# de réaliser 2 cartes électroniques ( conception du schéma électronique, routage du circuit imprimé, fabrication de la carte, vérifications & tests, exploitation )
 
*# Il vous est demandé de rédiger une procédure de test de manière à vérifier le bon fonctionnement de l'une de vos cartes produites et des éléments du robot fournis. Les enseignants évalueront la qualité de votre rédaction et de votre procédure. Vous devrez fournir la procédure rédigée ainsi que un compte-rendu des tests.
 
*# Il vous est demandé de programmer le circuit CPLD de manière à remplir un certain nombre de missions de difficulté progressive. Il s'agit donc de concevoir et implanter les fonctions logiques permettant de remplir les missions proposées. Vous utiliserez le logiciel Quartus version 13 pour les circuits logiques Altera de la famille Max3000A. Vous aurez le choix entre une description purement schématique, purement VHDL ou un mix des 2.
 
*# Il vous est demandé de produire sur papier dessiner à la main des schémas fonctionnels propres de chaque application, quel que soit le mode de description de vos fonctions logiques ( VHDL, schéma, mix VHDL/schéma ) . Cela vous facilitera le développement et la mise au point de vos applications. Aucune aide ne sera fournie par les enseignants si vous n'etes pas en mesure de leur presenter le schéma fonctionnel de l'application en oeuvre.
 
  
 
=Calendrier indicatif=
 
=Calendrier indicatif=
*routage terminé et typons imprimés au plus tard mardi midi
 
*fabrication terminée/vérifiée mercredi soir
 
*programmation et test de chaque mission dans l'ordre jeudi
 
*présentation orale rapide ( "notre projet en 5 minutes" ) vendredi matin devant les enseignants (y compris l'enseignante de communication). Chaque étudiant du trinome doit prendre la parole. Quelques questions peuvent vous etre posées.
 
  
 
=Présentation du projet=
 
=Présentation du projet=
* Introduction-description
 
Vous allez réaliser un robot assurant diverses missions du type ''suiveur de ligne'', ''évitement d'obstacle'', ... Ce robot est basé sur le chassis en PLA ( impression 3D à l'IUT) , tel que vous avez eu l'occasion d'en utiliser en SAE de S2. Le chassis vous est fourni assemblé avec ses éléments mécaniques moteurs CC - roues, son électronique de puissance pour commander les moteurs ( Cartes Cytron MD13S ) et sa batterie au lithium associée à une carte d'alimentation ( conversion DC-DC ) et un bouton d'arret d'urgence.
 
  
Par ailleurs, une carte dotée d'un circuit logique programmable a été préparée. Elle permettra d'exploiter les informations issues de divers capteurs pour piloter les moteurs et ainsi mener à bien les missions qui vous sont proposées. Cette carte est dotée :
+
Vous allez réaliser la commande d'un moteur brushless (moteur synchrone à aimant permanent)
  
{|
+
[[Image:SaeMoteurSynchroneSchemaFonctionnel.png|600px]]
|-
 
| [[Fichier:ShieldCPLD44Face2.png|400px]] || [[Fichier:ShieldCPLD44Face1.png|400px]]
 
|}
 
  
 +
=Tâches à réaliser=
  
*d'un CPLD Altera de la famille MAX 3000A de référence EPM3064ALCA44-10n ;
+
==obtenir la position du rotor==
  
*d'un connecteur Harting HE10 permettant d'y brancher le programmateur de circuit logique programmable USB-BLASTER ;
+
==interface utilisateur==
  
*d'un quartz horloger à 32768Hz comme signal d'horloge de référence. Il est associé à un compteur (4060) pour disposer d'une horloge sous-multiple de cette fréquence de référence si besoin. On sélectionnera l'une de ces fréquences disponibles pour alimenter le CPLD en réalisant un court-circuit ( à voir par la suite ci-dessous ? );
+
On cherche à mettre en place une interface utilisateur pour faciliter le développement de l'application. Pour cela, on dispose sur la carte DE10-Lite :
 +
* des 6 afficheurs 7 segments et des 10 leds de la carte DE10 pour la visualisation
 +
* des 10 switch et des 2 boutons poussoirs pour positionner des entrées
  
*2 connecteurs : barettes mâles double rangée de 12 broches au pas de 0,1 inch (pouce), broches associées à des entrées/sorties configurables du CPLD ( GPIOs) ;
+
Une autre approche possible est la mise en oeuvre d'un afficheur à cristaux liquides ( Liquid Crystal Display) 2 lignes de 20 caractères.
  
*1 connecteur mâle 2 broches pour alimenter le CPLD. NB !!! On notera que le CPLD a besoin d'une alimentation en 3,3V exclusivement !!! ;
+
==génération des PWMs==
 +
On utilisera dans un 1er temps la carte DE10-Lite exploitée lors des TPs XR3.16. Le pdf de la documentation de la carte est fournie en ressources ci-dessous pour disposer des brochages des différents matériels ( switch, boutons poussoir, leds, afficheurs 7 segments, connecteur IDE40, empreinte shield arduino ... )
  
*la liste des broches du CPLD associées aux connecteurs est accessible via les fichiers ( schéma et board de la carte ) . Ces fichiers sont accessibles sur le wiki geii rubrique SAE CPLD. On prêtera une attention particulière à ne paas confondre les numéros de GPIO avec les numéros de broche/borne du composant pour l'usage de PinPlanner. PinPlanner requiert les numéro de broche/borne. Le tableau ci-dessous récapitule ces informations : numéro de borne du CPLD Versus numéro de borne des connecteurs mâles 2x12 broches
+
===module PWM===
  
{| class="wikitable"
+
créer un module PWM qui aura :
|-
+
*en entrées:
! J2 !! Borne CPLD !! J2 !! Borne CPLD !! J3 !! Borne CPLD !! J3 !! Borne CPLD
+
**clk : horloge à 50MHz
|-
+
**rcyclique : integer 0 à 1023
| 1 || 40 || 2 || 41 || 1 || 5 || 2 || 6
+
**enable : bit
|-
+
*2 sorties :
| 3 || NC || 4 || 39 || 3 || 9 || 4 || 8
+
**tH : bit qui pilotera le transistor du haut du 1/2 pont
|-
+
**tL : bit qui pilotera le transistor du bas du 1/2 pont
| 5 || 34 || 6 || 25 || 5 || 12 || 6 || 11
+
*description du fonctionnement
|-
+
**les changements d'état des sorties se feront uniquement sur un front montant de l'horloge
| 7 || 33 || 8 || 26 || 7 || 21 || 8 || 14
+
**un compteur modulo 1024 s'incrémente sur chaque front d'horloge
|-
+
**si enable=0 alors les sorties sont à 0
| 9 || 31 || 10 || 27 || 9 || 20 || 10 || 16
+
**si enable=1 alors :
|-
+
***si compteur<rcylique tH=1 et tL=0
| 11 || 29 || 12 || 28 || 11 || 19 || 12 || 18
+
***si compteur>rcyclique tH=0 et tL=1
|}
 
  
*Le CPLD reçoit potentiellement 2 signaux d'horloges. L'horloge de référence à 32768~Hz issu du quartz, sur la borne CPLD 2 ( input/oe2/Gclk2). Une horloge issue du 4060 ( sous-ultiple en puissance de 2 des 32768 Hz de référence ) , sur la borne CPLD 43 ( input/Gclk1) . Ces 2 broches sont dédiées à la collecte des signaux d'horloge de manière à diffuser efficacement les horloges au coeud du circuit.
 
  
=Analyse=
+
{{Question|vérifier le fonctionnement en utilisant des switch pour modifier le rapport cyclique}}
Vous devrez commencer par produire les documents suivants :
 
*schéma fonctionnel du robot
 
*schéma fonctionnel de chaque carte
 
*schéma des fonctions logiques et chronogrammes éventuels
 
  
Toute aide sera conditionnée par la présentation de ces documents.
+
===Incrémentation automatique du rapport cyclique===
  
=Objectif/challenge=
+
On ajoute un module qui incrémentera régulièrement la valeur du rapport cyclique.
  
Pour chaque épreuve, le robot est initialement sous tension et immobile. La mission est démarrée par la manipulation du dispositif de lancement.
+
créer un module :
 +
*avec 1 entrée d'horloge à 50MHz
 +
*1 sortie de type entier entre 0 et 1023
 +
*incrémente le rapport cyclique tous les 50000 fronts d'horloge
  
*Épreuve 1
+
{{Question|ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement}}
**le robot est placé dans la zone de départ (zone rouge)
+
 
**un dispositif (différent de la mise sous tension) permet de démarrer la mission
+
=== Modification automatique du rapport cyclique : via valeurs lues en mémoire ===
**le robot doit avancer en "ligne droite"
+
 
**dès que la ligne noire matérialisant la ligne d'arrivée il doit :
+
On s'appuiera sur le CM et les TPs de XR3.16 pour mener à bien cette partie description/utilisation de mémoire.
***s'arrêter dès que possible sans dépasser la ligne verte
+
 
***ne surtout pas redémarrer
+
* Mémoire :
**le temps mis donnera le classement
+
** Créer un module mémoire ROM à 1 Port de 128 mots de 10 bits ( une LPM_ROM depuis l'ip_catalog ou un type array en VHDL )
*Épreuve 2
+
** Initialiser le contenu de la mémoire (fichier .mif ou initialisation du tableau en VHDL) avec des valeurs régulièrement croissantes puis décroissantes entre 0 et 1023, l'enchaînement de ces valeurs numériques décrivant ainsi l'équivalent d'un signal triangulaire.
**le robot est placé devant la ligne noire (l'arrière du robot contre la ligne)
+
 
**le robot doit tourner autour du cercle jaune (sans franchir à aucun moment les lignes jaunes)
+
* Compteur : réaliser un compteur modulo 128 s'incrémentant de 1 tous les 50000 fronts d'horloge ( horloge à 50MHz) . On pourra éventuellement décomposer cela en 2 fonctions logiques
**mission 2A:
+
** préparer un signal d'horloge à 1KHz ( 1 front montant tous les 50000 fronts d'horloge de l'entrée à 50MHz )
***il faut faire uniquement un tour
+
** réaliser un compteur modulo 128 à cette fréquence de 1KHz dont on utilisera la valeur pour adresser la mémoire.
***s'arrêter une fois la ligne franchie
+
 
***le temps mis pour faire le tour donne le classement
+
* Test : implanter les 3 modules précédents
**mission 2B:
+
** compteur modulo 128 à 1Khz
***il faut faire 3 tours puis s'arrêter
+
** mémoire 128 mots de 10 bits adressée par le compteur
***le temps mis pour faire les 3 tours donne le classement
+
** module PWM dont le rapport cyclique ( sur 10 bits) est issu de la lecture de la mémoire
*Epreuve 3
+
 
**le robot doit suivre la ligne noire jusqu'à la fin de la ligne
+
{{Question|ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement}}
**le temps mis donnera le classement
+
 
*Épreuve 4
+
 
**le robot est placé le long du mur dans la zone de départ
+
=== Modification/Evolution sinusoïdale du rapport cyclique ===
**il doit avancer en longeant le mur sans se cogner contre celui-ci ni franchir le marquage jaune
+
 
**la ligne droite indique la ligne d'arrivée
+
* Préparation
**le robot doit s'arrêter dès que la ligne est franchie
+
** Exploiter un tableur (excel / Libreoffice ) pour calculer les valeurs de ( 1 + sin(x) ). Avec x prenant 128 valeurs régulièrement réparties dans les 360 degrés d'une période de sinus.
*Épreuve 5
+
** Compléter votre tableau par une colonne calculant la partie entière de 512 * ( 1+ sin(x) ).
**le robot est placé au début du circuit
+
** Vérifier que vos valeurs sont bien situées dans la plage [0;2]. Le cas échéant, biaiser la valeur 0 à 1 et la valeur 2 à 1,99 . Cette modification a pour but d'éviter de produire une PWM totalement à 0 ou totalement à 1.
**le robot doit :
+
 
***suivre les lignes noires
+
* Test : reprendre le test précédent avec la mémoire initialisée avec les valeurs de cette dernière colonne calculée dans votre tableur.
***dans les parties sans lignes, le robot doit se servir des "murs" pour avancer
+
 
**le parcours s'arrête lorsqu'il n'y a plus ni ligne ni mur
+
 
**le temps mis donnera le classement
+
{{Question|ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement}}
  
 
=Liens/Ressources=
 
=Liens/Ressources=
 +
*[[Media:DE10-Lite_User_Manual.pdf]]
 +
*[[Media:Vcnt2020.zip]]
 +
*[[Media:CarteFourcheOptique.zip]]
 +
*[[Media:CarteMos.zip]]
 +
*[[Media:ressource_lcd2x20.zip]]
 +
*[[Media:binbcd5.zip]]
 +
 +
 +
 +
=Exemples=
 +
 +
<source lang=vhdl>
 +
library IEEE;
 +
use IEEE.std_logic_1164.all;
 +
use IEEE.std_logic_unsigned.all;
 +
 +
entity tabSinus is
 +
port (clk :in  std_logic;
 +
      angle : in integer range 0 to 4;
 +
      sin : out integer range 0 to 7
 +
      );
 +
end tabSinus;
  
==Capteur de distance==
+
architecture Behavioral of tabSinus is
 +
type memory_type is array (0 to 4) of integer range 0 to 7;
  
*https://www.pololu.com/product/4064
+
signal tabsin : memory_type :=(0, 2, 4, 6, 7);
  
==Composants eagle==
+
begin
  
{| class="wikitable sortable"
+
process(clk)
|-
+
begin
! Nom !! Type !! Boîtier !! Librairie Eagle !! Référence eagle !! Documentation !! Fournisseur !! Référence
+
  --to check the rising edge of the clock signal
|-
+
if(rising_edge(clk)) then   
| CNY70 || capteur IR réflectif ||  || [[Media:Cny70.lbr|cny70.lbr]]||CNY70(Vishay) || [https://www.vishay.com/docs/83751/cny70.pdf CNY70 datasheet] || Farnell ||
+
sin <= tabsin(angle);
|-
+
end if;
| LM339D || 4-comparateurs || SOIC14 (CMS) || linear || LM339D ou TLC339D || [https://www.onsemi.com/pub/Collateral/LM339-D.PDF lm339 datasheet] ||  ||
+
end process;
|-
 
| LM311D || comparateur || SOIC8 (CMS) || linear || LM311D || [http://www.ti.com/lit/ds/symlink/lm211.pdf  lm311 datasheet] ||  ||
 
|-
 
| Led 3mm ||  ||  ||  ||  ||  ||  ||
 
|-
 
| Resistance ||  || CMS (1206) ||  ||  ||  ||  ||
 
|-
 
| Potentiomètre || 10k ||  || pot || TRIM_EU-PTSPIN ||  ||  ||
 
|-
 
| CARTE_CPLD || EPM3064ALC44-10N|| CARTE_CPLD || [[Media:RobotCPLD.lbr|robotCPLD.lbr]] ‎ ||  || [https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ds/m3000a.pdf datasheet MAX3000b] ||  ||
 
|-
 
| Quartz horloger || 32,768 kHz ||  || crystal || CRYSTALTC26V ||  ||  ||
 
|-
 
| 4060D || Diviseur de fréquence || CMS || 40XX || 4060D || [http://www.ti.com/lit/ds/symlink/cd4060b.pdf 4060 datasheet] ||  ||
 
|-
 
| AP131-33WG-7 || Régulateur 3,3V (SOT25) || CMS || v-reg || TS520533 || [https://www.diodes.com/assets/Datasheets/AP131.pdf AP131 datasheet] ||  ||
 
|-
 
| ML10 || Connecteur JTAG ||  || con-harting-ml || ML10 || [[#Programmation_du_CPLD|Doc ci-dessus]] ||  ||
 
|-
 
| SI 2336DS || Transistor NMOS ||  || transistor small signal || BSS123 || [https://www.vishay.com/docs/71978/si2336ds.pdf datasheet] ||  ||
 
|-
 
| CGRM4001-G || Diode de roue Libre ||  || diode || CGRM4001-G || [http://www.comchiptech.com/cms/UserFiles/CGRM4001-G%20Thru.%20CGRM4007-G%20RevD.pdf datasheet] ||  ||
 
|-
 
| XBee || || traversant || adafruit || XBEE ||[http://amtek.wordpress.com/2010/11/07/configuring-and-using-xbee-wireless-modules/ Xbee et atmega]
 
  ||  ||
 
|-
 
| DTS-6 || bouton traversant ||  || [[Media:Switch-tact.lbr|Switch-tact.lbr]]||  ||  ||  ||
 
|-
 
| DTSM-6 || bouton CMS ||  || [[Media:Switch-tact.lbr|Switch-tact.lbr]]||  ||  ||  ||
 
|-
 
| BP1 || bouton traversant 12*12mm ||  || [[Media:Bplib.lbr|Bplib.lbr]]||  ||  ||  ||
 
|-
 
| TWIG-4P-2.0-2.0 || connecteur Grove ||  || [[Media:Connector.lbr|Connector.lbr]]||  ||  ||  ||
 
|}
 
  
==Composants Kicad==
+
end Behavioral;
 +
</source>
  
*fichiers pour réaliser la carte de connexion : [[Media:CarteConnexionRobotCpldKicad.zip]]
+
=Historique=
 +
*[[Cours:SaeCpldHistorique]]

Version actuelle datée du 10 janvier 2024 à 11:08

Modalité d'évaluation

Organisation des travaux

  • Le travail sera mené par trinôme. Vous devrez organiser vos travaux de manière à ce que chacun soit actif pour faire avancer le projet
  • Il y aura une partie individuelle
  • puis 1 travail de regroupement du travail


Calendrier indicatif

Présentation du projet

Vous allez réaliser la commande d'un moteur brushless (moteur synchrone à aimant permanent)

SaeMoteurSynchroneSchemaFonctionnel.png

Tâches à réaliser

obtenir la position du rotor

interface utilisateur

On cherche à mettre en place une interface utilisateur pour faciliter le développement de l'application. Pour cela, on dispose sur la carte DE10-Lite :

  • des 6 afficheurs 7 segments et des 10 leds de la carte DE10 pour la visualisation
  • des 10 switch et des 2 boutons poussoirs pour positionner des entrées

Une autre approche possible est la mise en oeuvre d'un afficheur à cristaux liquides ( Liquid Crystal Display) 2 lignes de 20 caractères.

génération des PWMs

On utilisera dans un 1er temps la carte DE10-Lite exploitée lors des TPs XR3.16. Le pdf de la documentation de la carte est fournie en ressources ci-dessous pour disposer des brochages des différents matériels ( switch, boutons poussoir, leds, afficheurs 7 segments, connecteur IDE40, empreinte shield arduino ... )

module PWM

créer un module PWM qui aura :

  • en entrées:
    • clk : horloge à 50MHz
    • rcyclique : integer 0 à 1023
    • enable : bit
  • 2 sorties :
    • tH : bit qui pilotera le transistor du haut du 1/2 pont
    • tL : bit qui pilotera le transistor du bas du 1/2 pont
  • description du fonctionnement
    • les changements d'état des sorties se feront uniquement sur un front montant de l'horloge
    • un compteur modulo 1024 s'incrémente sur chaque front d'horloge
    • si enable=0 alors les sorties sont à 0
    • si enable=1 alors :
      • si compteur<rcylique tH=1 et tL=0
      • si compteur>rcyclique tH=0 et tL=1


Question.jpg vérifier le fonctionnement en utilisant des switch pour modifier le rapport cyclique

Incrémentation automatique du rapport cyclique

On ajoute un module qui incrémentera régulièrement la valeur du rapport cyclique.

créer un module :

  • avec 1 entrée d'horloge à 50MHz
  • 1 sortie de type entier entre 0 et 1023
  • incrémente le rapport cyclique tous les 50000 fronts d'horloge

Question.jpg ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement

Modification automatique du rapport cyclique : via valeurs lues en mémoire

On s'appuiera sur le CM et les TPs de XR3.16 pour mener à bien cette partie description/utilisation de mémoire.

  • Mémoire :
    • Créer un module mémoire ROM à 1 Port de 128 mots de 10 bits ( une LPM_ROM depuis l'ip_catalog ou un type array en VHDL )
    • Initialiser le contenu de la mémoire (fichier .mif ou initialisation du tableau en VHDL) avec des valeurs régulièrement croissantes puis décroissantes entre 0 et 1023, l'enchaînement de ces valeurs numériques décrivant ainsi l'équivalent d'un signal triangulaire.
  • Compteur : réaliser un compteur modulo 128 s'incrémentant de 1 tous les 50000 fronts d'horloge ( horloge à 50MHz) . On pourra éventuellement décomposer cela en 2 fonctions logiques
    • préparer un signal d'horloge à 1KHz ( 1 front montant tous les 50000 fronts d'horloge de l'entrée à 50MHz )
    • réaliser un compteur modulo 128 à cette fréquence de 1KHz dont on utilisera la valeur pour adresser la mémoire.
  • Test : implanter les 3 modules précédents
    • compteur modulo 128 à 1Khz
    • mémoire 128 mots de 10 bits adressée par le compteur
    • module PWM dont le rapport cyclique ( sur 10 bits) est issu de la lecture de la mémoire

Question.jpg ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement


Modification/Evolution sinusoïdale du rapport cyclique

  • Préparation
    • Exploiter un tableur (excel / Libreoffice ) pour calculer les valeurs de ( 1 + sin(x) ). Avec x prenant 128 valeurs régulièrement réparties dans les 360 degrés d'une période de sinus.
    • Compléter votre tableau par une colonne calculant la partie entière de 512 * ( 1+ sin(x) ).
    • Vérifier que vos valeurs sont bien situées dans la plage [0;2]. Le cas échéant, biaiser la valeur 0 à 1 et la valeur 2 à 1,99 . Cette modification a pour but d'éviter de produire une PWM totalement à 0 ou totalement à 1.
  • Test : reprendre le test précédent avec la mémoire initialisée avec les valeurs de cette dernière colonne calculée dans votre tableur.


Question.jpg ajouter un filtre passe bas sur votre/vos sorties et vérifier le bon fonctionnement

Liens/Ressources


Exemples

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity tabSinus is
port (clk :in  std_logic;
      angle : in integer range 0 to 4;
      sin : out integer range 0 to 7
      );
end tabSinus;

architecture Behavioral of tabSinus is
type memory_type is array (0 to 4) of integer range 0 to 7;

signal tabsin : memory_type :=(0, 2, 4, 6, 7);

begin

process(clk)
begin
  --to check the rising edge of the clock signal
if(rising_edge(clk)) then    
sin <= tabsin(angle);
end if;
end process;

end Behavioral;

Historique