« Very High Speed Integrated Circuit Hardware Description Language/Commande de robot mobile et périphériques associés » : différence entre les versions
Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-(<|</)source([ \t>]) +\1syntaxhighlight\2) |
|||
Ligne 90 :
=== Les modules de commande de moteur : pmodHB5 ===
Nous avons décidé d’utiliser le module HB5RefComp fourni par Digilent dont voici l'entité en VHDL :
<
entity HB5RefComp is
Port ( ck : in STD_LOGIC; -- system clock (25MHz)
Ligne 98 :
bitDirOut : out STD_LOGIC:= '1'); -- Dir pin for Pmod HB5
end HB5RefComp;
</syntaxhighlight>
Ce module s'occupe de générer "bitEnOut" et "bitDirout" nécessaires à la commande de l'électronique de puissance à partir d'une horloge (à {{Unité|25|{{Abréviation|MHz|mégahertz}}}} pour nous) d'un bit de direction "bitDirIn" et d'un rapport cyclique "vecDfIn" sur 8 bits.
{{remarque|contenu=
Ligne 106 :
Comme nous avons changé quelques options par rapport au fichier original téléchargé, nous donnons sa version intégrale maintenant.
{{Boîte déroulante|titre=Module HB5RefComp en VHDL|contenu=
<
----------------------------------------------------------------------------------
-- Company: Digilent RO
Ligne 271 :
end Behavioral;
</syntaxhighlight>
}}
Comme nous avons deux moteurs à commander, il nous faudra utiliser ce module en double. Nous avons décidé d’utiliser PORTB pour le rapport cyclique du moteur gauche et PORTC pour celui du moteur droit. Les deux bits de direction seront ramenés sur DDRB :
Ligne 299 :
Et voici donc le fichier io.vhd comme promis :
{{Boîte déroulante|titre=Module d'interface des pmodHB5 à l'ATMega16|contenu=
<
-------------------------------------------------------------------------------
--
Ligne 581 :
end Behavioral;
</syntaxhighlight>
}}
=== Programmation des pmodHB5 avec l'ATMega16 ===
Voici un exemple de programme qui utilise cette interface.
<
int main(int argc, char * argv[])
{
Ligne 626 :
return 0;
}
</syntaxhighlight>
Que fait ce programme ?
Ligne 662 :
=== Présentation du module de mesure de vitesse de Digilent ===
Mesurer la vitesse à l'aide des modules PModHB5 est une opération qui est proposée par [[w:Digilent|Digilent]] à l'aide d'un module [[w:VHDL|VHDL]] appelé "HallTradSpeedDecoder" dont voici l'entité :
<
entity HallTradSpeedDecoder is
Port ( ck : in STD_LOGIC;
Ligne 669 :
SpeedOut : out STD_LOGIC_VECTOR (12 downto 0)); -- output for speed and direction
end HallTradSpeedDecoder;
</syntaxhighlight>
On voit apparaître une horloge "ck" qui est supposée être à 100 MHz (puisque ce module est destiné à la Nexys3), deux entrées "pinSA" et "pinSB" supposées être en provenance du codeur incrémental et une vitesse de sortie sur 12 bits. La vitesse est directement exprimée en tours par minute et codée en BCD.
{{Remarque|contenu=
Ligne 692 :
==== Utiliser le timer de l'AVR embarqué comme base de temps ====
La base de temps du module original est réalisée par :
<
--.................. code supprimé pour simplification
Ligne 716 :
--.................. code supprimé pour simplification
</syntaxhighlight>
Nous allons supprimer ce timer pour le remplacer par celui de l'AVR [[../Améliorer l'ATMega8 avec l'ATMega16 et l'ATMega32#Un pseudo-timer pour réaliser une interruption|décrit dans un chapitre précédent]]. L'intérêt est que celui de l'AVR est capable de déclencher une interruption. Ainsi à chaque interruption les deux compteurs du côté droit et du côté gauche seront sauvés en mémoire par l'AVR.
Ligne 725 :
Voici donc ce code modifié pour nos besoins :
{{Boîte déroulante|titre=Notre décodeur en quadrature|contenu=
<
-- Ken Chapman - Xilinx Ltd - November 2005
-- Revised 20th February 2006
Ligne 886 :
--
--------------------------------------------------------------------------
</syntaxhighlight>
}}
Ce code fonctionne correctement à priori même sans gestion des rebonds. C'est une particularité des signaux incrémentaux de ne pas nécessiter toujours d'une gestion d'anti-rebonds. Cela reste vrai pour un affichage (qui est une fonction lente) mais si l’on échantillonne le compteur pendant des rebonds, il y aura une erreur qui finira par s'accumuler. Tout ceci nécessite donc une vérification minutieuse.
Ligne 903 :
Pour tester ce module sur une seule roue, nous avons réalisé le programme suivant :
{{Boîte déroulante|titre=Notre programme de test|contenu=
<
#include <avr/io.h>
#include <avr/interrupt.h>
Ligne 943 :
return 0;
}
</syntaxhighlight>
}}
La compréhension de ce code nécessite de lire la [[../Commande de robot mobile et périphériques associés#Contr.C3.B4le du robot par une manette Nunchuk|section sur la manette Nunchuk]] un peu plus loin.
Ligne 957 :
Avant de se lancer dans une programmation compliquée, revenons sur terre pour examiner le PmodLS1. Ce module est branché directement sur le connecteur JA de la Basys2. Mais il demande à être calibré à l'aide d'un réglage de potentiomètre.
Le réglage peut se faire facilement à l'aide d'un programme tout simple :
<
int main(int argc, char * argv[])
{
Ligne 965 :
return 0;
}
</syntaxhighlight>
si l’on a pris soin de sortir le PORTD sur les LEDs (ceci se fait dans l'ucf) et de mettre les entrées du connecteur JA sur PINB. Voici l'extrait de l'ucf correspondant :
<pre>
Ligne 1 026 :
Voici le code source correspondant :
<
//******************************************************************************************************************************
// function readFIFOandAskForNextData()
Ligne 1 044 :
TWCR &= ~(1<<TWEN);// arret pour attendre la prochaine fois : voir machine d'états pour comprendre
}
</syntaxhighlight>
==== Attente d'un départ ====
Ligne 1 050 :
Voici comment on peut bloquer tout en attendant un appui sur le bouton Z :
<
//******************************************************************************************************************************
// function waitStart()
Ligne 1 066 :
_delay_ms(10); // car data_present mal géré et on ne prend pas de risque
}
</syntaxhighlight>
On rappelle pour comprendre le code, que les deux boutons sont peésents dans le 6° octet retourné par la Nunchuk (donc la case 5 de notre tableau) que les deux boutons sont les deux poids faibles et qu’ils sont à 1 lorsqu’ils ne sont pas appuyés.
Ligne 1 078 :
* repos 0x80
{{Boîte déroulante|titre=Une correction de l’utilisation de la Nunchuk pour guider le robot|contenu=
<
//****************** Version à partir de la version étudiant (testee OK) ***************
//****************** Mars 2014
Ligne 1 217 :
PORTC = droite;
}
</syntaxhighlight>
}}
Ligne 1 230 :
* ajouter la gestion des afficheurs sept segments (les 4) pour faciliter les tests.
Un programme d'affichage automatique des valeurs de position gauche et droite sera alors, par exemple :
<
#include <avr/io.h>
#include <avr/interrupt.h>
Ligne 1 298 :
return 0;
}
</syntaxhighlight>
Les sous-programmes manquants ont déjà été publiés dans cette page.
|