1 ère année - Enseignement

publicité
1ère année
Module INFORMATIQUE INDUSTRIELLE 2ème partie
Cours 2
2012-2013
Philippe Morenton
COURS 2 - PREPARATION AU TD2 ET AU TD3
1 DEPLACEMENT D'UN PETIT ROBOT DONT LE FONCTIONNEMENT EST SIMULE EN TD
Durant les TDs, on simule le fonctionnement
d'un petit robot dont la base est la suivante :
La carte Arduino ne peut pas fournir la puissance
nécessaire au fonctionnement des moteurs. On
intercale donc entre la carte Arduino et les moteurs une carte interface de puissance Ardumoto.
VIN
D5
D4
D3
D2
D1
D0
PWMB
DIRB
M
GND
A5
A4
A3
A2
A1
A0
GND
VIN
5V
Le schéma d'interconnexion des cartes et des Commande des moteurs simplifiée, en tout ou
moteurs est le suivant :
rien
Pour simplifier, les alimentations ne sont pas
représentées.
PWMn
DIRn
0 depuis
X
Moteur à l’arrêt
MOTA_1
D13
longtemps
D12
PWMA
M
D11
DIRA
1
0
Sens 1 de rotation.
D10
D9
MOTA_2
ARDUINO
Avance
D8
ARDUMOTO
D7
D6
MOTB_1
1
1
Sens 2 de rotation. Recul
MOTB_2
2 DETECTION ET EVITEMENT D'OBSTACLES
Pour détecter les obstacles, 3 capteurs sont montés à l'avant du robot. On retient 2 types de capteurs, mais il en existe d'autres.
Pour la détection d'obstacles par contact, on
utilise des interrupteurs avec de longues languettes.
Pour la détection par infrarouge, on utilise des
modules constitués d'un émetteur et d'un récepteur infrarouge. Un tel module délivre une tension qui dépend de la distance capteur/obstacle.
1
Le fonctionnement retenu pour le déplacement avec évitement d'obstacle est extrêmement simple:
 S'il n'y a pas d'obstacles détectés, le robot avance tout droit.
 S'il y a un obstacle détecté d'un côté, le robot recule en tournant plus du côté opposé à
l'obstacle pendant une certaine durée, puis il continue à avancer tout droit.
 Si l'obstacle est détecté au centre, le fonctionnement est le même que si la détection se fait
sur un des côtés choisi au hasard.
Avec des capteurs plus élaborés, on peut retenir des algorithmes qui permettent un meilleur déplacement au milieu d'obstacles. Voir par exemple
http://www.ensta-paristech.fr/~filliat/Courses/2011_projets_C102/BURLOT_FLORINS_PASCAL/evitement_obstacles.html
http://wwwdfr.ensta.fr/Cours/docs/C10-2/chapitre6.pdf
3 COMMANDE DES MOTEURS AVEC UNE VITESSE VARIABLE
Sous certaines conditions, un moteur à
courant continu peut être commandé avec
une tension rectangulaire ou « hachée ».
Ci-contre l’allure de la commande et de la
vitesse en fonction du temps.
On se place dans le cas où DIR = 0
Le moteur tourne pour que le robot
avance.
Période du signal de commande PWM = T.
Fréquence du signal de commande : F = 1/T
PWM
1
0
Vitesse de
rotation
TB TH T
T
t
Tracé
simplifié
Pour une fréquence suffisamment élevée t
de PWM, les ondulations sont négligeables
Si T (période du signal PWM) est suffisamment faible 
Ce n’est pas tout à fait le cas dans la figure ci-dessus.
T est suffisamment faible si << constante de temps principale du moteur + charge entrainée ()
 est lié à l’inertie. Lors d’un changement de commande pour la vitesse, celle-ci se stabilise après
quelques .
Ordre de grandeur de  pour le moteur d'un petit robot : 0,1s  il faut T < 1ms soit F > 1 KHz.
T est constante. TH (= largeur d’impulsion ou durée à l’état haut) change.
2
La commande est de type
On peut utiliser une fonction pour commander le rapport cyclique de PWM. Voir TD2.
4 FONCTIONNEMENT DE LA COMPILATION AVEC LA BIBLIOTHEQUE ARDUINO
Le fonctionnement simplifié de la compilation est le suivant :
Le fichier objet contient la traduction des instructions en langage machine. Un appel de fonction est
traduit par un saut à un sous-programme. Le code de la fonction n'est pas dans le fichier objet. Ce
code est extrait de la bibliothèque précompilée et placé dans le fichier pour la programmation.
Le compilateur et l'éditeur de liens font partie d'AVR-GCC.
5 PROGRAMMATION SANS LA BIBLIOTHEQUE ARDUINO
Si on n'utilise pas la bibliothèque Arduino, il faut se contenter des fonctions fournies avec AVR-GCC.
Celles-ci sont peu nombreuses en ce qui concerne les spécificités du µC : gestion des E/S, des périphériques intégrés, etc.
Sans la bibliothèque Arduino, il faut connaitre la structure interne du µC pour pouvoir écrire le
programme.
6 LES ENTREES / SORTIES DU µC ATMEGA328P
Comme chacune des entrées ou des sorties du µC correspond à une variable logique (ou binaire ou
booléenne) qui a pour valeur uniquement 0 ou 1, on appelle fréquemment une connexion un bit =
binary digit (chiffre binaire). On parle de bit d’entrée ou de bit de sortie.
3
Les entrées et sorties du µC sont regroupées
par paquets. Chaque paquet peut être manipulé directement par le programme et s’appelle
un port. En général les ports sont constitués de
8 connexions ou 8 bits.
Le µC utilisé a les ports suivants :
 PORTB de 8 bits. Sur la carte Arduino, 6
bits sont disponibles sur connecteur : PB0
à PB5
 PORTC de 7 bits. Sur la carte Arduino, 6
bits sont disponibles sur connecteur : PC0
à PC5.
 PORTD de 8 bits. Sur la carte Arduino, les
8 bits sont disponibles sur connecteur :
PD0 à PD7.
PORTB
PORTC
ARDUINO
VIN
Le schéma ci-contre monte la relation entre
les ports et les repères des broches des connecteurs Arduino.
5V
PORTD
µC PB5
PORTC
PC5
PC4
PC3
PC2
PC1
PC0
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
PORTB
PORTD
GND
A5
A4
A3
A2
A1
A0
PB4
PB3
PB2
PB1
PB0
PD7
PD6
PD5
PD4
PD3
PD2
PD1
PD0
Sur le µC ATmega328p, 3 registres sont associés à chaque port, dont :
Sur une entrée d’un port, il faut qu’un circuit extérieur puisse appliquer une tension  0V ou  5V.
Sur une sortie d’un port, c’est le µC qui impose une tension  0V ou  5V
Les repères des bits d’un port utilisent le rang car on peut associer une valeur numérique au mot
binaire disponible sur un port.
Exemple :
Mot binaire appliqué en
entrée du port D
Repères des bits du port
Poids des bits du port
1
0
1
1
0
0
1
0
PD7
27
PD6
26
PD5
25
PD4
24
PD3
23
PD2
22
PD1
21
PD0
20
4
La valeur numérique en base 10 est :
Pour la plus grande souplesse possible, chaque broche de chaque port peut être utilisée en sortie ou
en entrée. Dans ce dernier cas, on peut ajouter une résistance de rappel interne.
Exemple : DDRD= 0b00001111; // les bits 7 à 4 sont en entrées, les autres en sortie
Le registre DDR permet de réaliser un aiguillage.
Data Direction Register =
Registre sens de transfert
x est le repère du port (B, C, D)
y est le rang de l’E/S (0..7)
DDRx0
DDRxy = 1
DDRx1
…
DDRx7
Registre de données sortantes
ou d’option
PORTx0
PORTx1
Broches
du µC
PINxy
Px0
Px1
La valeur de
PORTxy sort en PxY
…
Registre de
données entrantes
Bus de
données
PORTx7
Pxy
PORTxy
DDRxy = 0
Px7
PORTxy = 0
PINx0
PINxy
PINx0
…
DDRxy = 0 +5V
PINx0
R de rappel
rajoutée
PORTxy = 1
PINxy
lorsque la broche est configurée en entrée.
Voir la synthèse de la documentation constructeur traduite en français.
Un dessin qui résume le fonctionnement 
extrait de :
http://www.cours.polymtl.ca/inf1995/logiciel/progAvr/inf1995_comp
lement.pdf
5
7 STRUCTURE D'UN PROGRAMME SANS LA BIBLIOTHEQUE ARDUINO
La structure du programme le plus simple possible est la suivante :
Inclusion de fichiers. Ici le
fichier io.h permet
d’inclure d’autres fichiers,
dont le fichier de définition des registres (DDRD,
PORTD, …)
Fonction principale. Elle
ne retourne pas de valeur. Cependant si on met
void, il y a une erreur à la
compilation.
Les noms des registres
apparaissent dans le
programme
#include <avr\io.h>
int main(void)
{
DDRB=0b00001111;
DDRD =0;
PORTD=0b11111111;
while(1)
{
PORTE=PIND;
}
}
L'utilisation de la bibliothèque Arduino permettait de masquer des éléments de la structure
précédente.
La structure d'un programme Arduino est la suivante :
L'utilisateur n'a qu'à définir setup() et loop(). Le
code de main() est inséré lors de l'édition de
liens.
main est constitué de 2
parties :
Une partie initialisation et
configuration
Une boucle sans fin
réalisée avec
while (1) {…}
ou for( ;;) {…}
#include <Arduino.h>
int main(void) {
…
setup();
for (;;) {
loop();
…
}
return 0;
}
8 RAPPELS DE LOGIQUE
La plupart des entrées sorties (E/S) sont de type logique (0 ou 1). On utilise de façon similaire les
termes variable logique, binaire ou booléenne.
Dans le 3ème TD, on utilise les opérations logiques pour que le programme réagisse à une entrée isolée parmi plusieurs ou pour commander une seule sortie.
6
8.1 NOTIONS DE BASE
Tables de vérités
Le tableau ci-dessous correspond aux tables de vérités des fonctions de bases. Les symboles des opérateurs sont ceux les plus utilisés en électronique.
E1
E2
0
0
1
1
0
1
0
1
E1 ET E2
E1.E2
E1 OU E2
E1 + E2
E1 OU exclusif E2
E1  E2
NON
/E1
0x=
1x=
Identités remarquables
x est une variable binaire quelconque
0.x=
1.x=
0+x=
1+x=
Les opérateurs logiques du C
ET
OU
OU exclusif
Les opérateurs agissent bit à bit sur les opé&
|
^
randes
Remarque pour une variable de type booléenne, il faut utiliser ! pour l'opérateur NON.
NON
~
8.2 UTILISATION DES OPERATIONS LOGIQUES
Mise à 1 de bits en sortie
PORTB = PORTB | 0b01100011 ; 
valeur initiale b7 b6 b5 b4 b3 b2 b1 b0
|
0
1
1
0
0
0
1
1
ou PORTB |= 0b01100011 ;
Résultat
Remarque : si seul bit b5 à mettre à 1 : PORTB |= (1<<5); // 0000 0001  0010 0000 après 5 déc.
Identique à PORTB |= 0b00100000;
Mise à 0 de bits en sortie
PORTB = PORTB & 0b01100011 ; 
valeur initiale b7 b6 b5 b4 b3 b2 b1 b0
&
0
1
1
0
0
0
1
1
ou PORTB &= 0b01100011 ;
Résultat
Remarque : si seul bit b5 à mettre à 0 : PORTB &= ~(1<<5); // 0000 0001  0010 0000 après 5 déc.
// puis 1101 1111 après complémentation
Identique à PORTB &= 0b11011111 ;
Comlémentation de bit en sortie
PORTB = PORTB ^ 0b01100011 ; 
ou PORTB ^= 0b01100011 ;
valeur initiale
^
Résultat
b7
0
b6
1
b5
1
b4
0
b3
0
b2
0
b1
1
b0
1
7
Test de bits en entrée
if (PINA & 0b00000011 == 0b00000001)
valeur PINA
&
Résultat pris en compte pour le test
b7
0
b6
0
b5
0
b4
0
b3
0
b2
0
b1
1
b0
1
Les bits b7 .. b2 ne sont pris en compte pour le test.
9 FONCTIONNEMENT INTERNE SIMPLIFIE DU µC SUR UN EXEMPLE SIMPLE
9.1 EXEMPLE UTILISE
Programme source :
unsigned char var;
int main(void) {
DDRB = 0b00001111;
while(1) { // Infinite loop
var = PIND;
PORTB = var;
}
PIND est le registre d'entrée du var est rangée en emplacement
port D. Son adresse est 0x09 mémoire automatiquement
(ou $09)
attribué par le compilateur.
PORTB est le registre de sortie.
Son adresse est 0x04 (ou $04)
9.2 FONCTIONNEMENT INTERNE TRES SIMPLIFIE
On ne s'intéresse qu'à la boucle
sans fin. Pour introduire au fonctionnement, on peut représenter
de façon très simplifiée la structure
interne du µC et les échanges
d'informations.
Unité Centrale
de Traitement +
Mémoires
PIND
port D, vu comme un
ensemble de registres
port B, vu comme un
ensemble de registres
Le compilateur traduit le programme source comme ci-dessous.
La variable var est placée dans le
registre R24.
PORTB
8
Prog. source
Ad.
mém.
prog.
var = PIND;
004A
Contenu
mém.
prog.
B189
Etiquette
Mnémonique
Champ
opérande
Commentaire
l_004a
in
R24, $09
B985
out
$05, R24
CFFD
rjmp
l_004a
lire le registre d’adresse 10 (PIND) et
mettre le contenu dans le registre R24 de
la CPU
Mettre le contenu de R24 dans le registre
d’adresse 05 (PORTB)
saut (jump, jmp) à l’étiquette l_004a. Le
code du saut + le déplacement est dans
CFFD
PORTB=var;
004B
004C
Le contenu de la mémoire programme est le code machine ou code exécutable.
Les colonnes en grisé correspondent au langage d'assemblage. Le compilateur traduit d'abord le programme source en langage C en langage d'assemblage, puis ensuite en langage machine.
En langage d'assemblage, il y a 1 instruction élémentaire du µC par ligne. Chaque instruction est désignée par son mnémonique. Ex : jmp pour jump.
Le µC sait exécuter quelques dizaines d'instructions élémentaires : transferts entre registres, comme
ici, addition, soustraction, etc.
in R24, $09 est une instruction d'entrée. Elle est suivie de 2 opérandes: la destination et la source.
out $05, R24 est une instruction de sortie. Elle est suivie de 2 opérandes: la source et la destination.
rjmp est un saut (jmp = jump)
La simulation en
pas à pas dans
VMLAB permet
d'analyser le
fonctionnement
La fenêtre Ports permet d'observer les registres
des ports.
Port B
PORTB
DDRB
Voir TD3.
X : indéfini
(entrée non
connectée
PINB
I : Input
O: Output
P : Input + R
Pullup
9
9.3 FONCTIONNEMENT INTERNE SIMPLIFIE
9.3.1 STRUCTURE INTERNE SIMPLIFIEE
Le µC utilisé a une structure de type Harvard. Seuls les éléments utiles pour les explications qui suivent apparaissent :
Sélection du circuit qui a
accès au bus de données
Bus d’adresses
14 liaisons = 14 bits
instructions
Décodeur
d’adresses
Bus d’adresses Données
CPU = Unité Arithmétique et Logique +
Registres + Compteur programme + …
Mémoire
programme
(FLASH)
Bus d’instructions
Mémoire
Données
(RAM)
Interface
d’E/S (registres)
Bus de données
16 bits
8 bits
On ne représente que 2
Bus de contrôle ports d’E/S alors que le
(lect. / écr., etc)
µC en a plus
9.3.2 FONCTIONNEMENT PAR CYCLES
On suppose que le µC a déjà exécuté tout ce qui précède les lignes de l’exemple.
Recherche (Fetch) de l’instruction 1 (PIND  R24).
Décodeur
d’adresses
Adresse délivrée
par le
B189
B985
CFFD
Mémoire
Données
(RAM)
Vers le registre
B189
Bus de données
Code instruction + opérande (ad. reg. PIND)
10
Recherche de l’instruction 2 (R24  PORTB) et exécution de l’instruction 1 (PIND  R24).
Décodeur
d’adresses
Adresse délivrée à
partir du registre
instruction
B189
B985
CFFD
Vers le registre
Seul le registre PIND
d’adresse est
sélectionné et a
accès au bus de
données
Mémoire
Données
La valeur
provenant
(RAM) est
de l’extérieur
transférée sur le bus
de données
Registre
B983
Code instruction + opérande (ad. registre PORTB)
Recherche de l’instruction 3 (Saut) et exécution de l’instruction 2 (R24  PORTB)
Décodeur
d’adresses
Adresse délivrée à
partir du registre
instruction
B189
B985
CFFD
Du registre
Seul le registre
PORTE d’adresse
est sélectionné et a
accès au bus de
données
Mémoire
Registre
Données
(RAM)
La valeur
provenant
de R24 est transférée à l’extérieur
CFFD
Code instruction + opérande (valeur du saut)
Exécution de l’instruction 3 (Saut) = recherche de l’instruction à l’adresse 004A.
11
9.3.3 SIMULATION
VMLAB permet de visualiser les
registres de la CPU, avec la fenêtre Registers.
Le registre instruction n'est pas
visible.
Voir TD3.
Registres de la
CPU
R24
Compteur Programme (PC :
Program Counter)
Délivre l'adresse
de la mémoire
programme
10 DUREE D'EXECUTION D'UN PROGRAMME
Chaque instruction prend un ou deux cycles machine pour s'exécuter. La plupart des instructions
prennent 1 cycle machine. C'est l'avantage de la structure Harvard.
La durée d'un cycle machine dépend d'une horloge de séquencement : l'horloge système. Cette horloge système est elle-même issue de l'oscillateur à quartz.
Un système de division de fréquence permet d'obtenir la fréquence de l'horloge système.
Pour la simulation, la fréquence du quartz est de 16MHz.
Le µC est livré sortie d'usine avec une division en fréquence de 8. L'horloge système est de 2MHz,
soit une période de 0,5µs. C'est cette valeur qui est prise en compte par le simulateur.
Lors de la simulation,
on peut observer la
durée d'exécution des
instructions dans la
barre d'état.
Barre d'état de
VMLAB en bas à
droite
Pour, afficher le
temps en µs, il faut
utiliser le menu Options > Display Control
12
Téléchargement