Chapitre II (Microcontrolleurs)
Chapitre II (Microcontrolleurs)
Chapitre II (Microcontrolleurs)
II.1 Microcontrôleurs
De nos jours, les microcontrôleurs sont si bon marché et faciles à obtenir qu'il est courant de les utiliser à
la place de circuits logiques simples comme des compteurs pour la seule raison de gagner en flexibilité de
conception et de réduire l'espace. Certaines machines et robots s'appuieront même sur un grand nombre
de microcontrôleurs, chacun enthousiaste à une tâche confiante. La plupart des nouveaux
microcontrôleurs sont "programmables dans le système", ce qui signifie qu’in peut ajuster le programme
en cours d'exécution, sans retirer le microcontrôleur de sa position. Dans cette partie, nous discutons
brièvement les différents microcontrôleurs AVR, ARM, 8051 et PIC.
Définition :
Un microcontrôleur peut être comparable à un petit ordinateur autonome ; c'est un appareil extrêmement
puissant, capable d'exécuter une série de tâches préprogrammées et d'interagir avec des périphériques
matériels supplémentaires. Étant emballé dans un minuscule circuit intégré (CI) dont la taille et le poids
sont régulièrement négligeables, il devient le contrôleur parfait pour les robots ou toutes les machines
nécessitant un certain type d'automatisation intelligente. Il a été conçu pour la première fois par Michael
Cochran et Gary Boone.
Un seul microcontrôleur peut suffire à gérer un petit robot mobile, une machine à laver automatique ou
un système de sécurité. Plusieurs microcontrôleurs contiennent une mémoire pour stocker le programme
à exécuter, et de nombreuses lignes d'entrée/sortie qui peuvent être utilisées pour agir conjointement avec
d'autres dispositifs, comme la lecture de l'état d'un capteur ou la commande d'un moteur.
Les langages C et d'assemblage sont utilisés pour programmer un microcontrôleur, mais le fichier HEX est
en langage machine qui est en fait téléchargé dans les microcontrôleurs.
La figure ci-dessous montre quelques-uns des microcontrôleurs les plus couramment utilisés.
L'architecture RISC est considérée comme l'architecture de microcontrôleurs la plus avancée à ce jour et
elle est livrée avec quelques composants standard, dont nous discuterons ici.
Un jeu d’instructions réduit ou RISC (Reduced instruction set computer) permet d’accélérer la vitesse
d’exécution des programmes. Les instructions pour commander le microcontrôleur sont alors peu
nombreuses (33 ou 35 instructions différentes) mais aussi plus simples et donc plus rapides à exécuter.
Chaque mot de la mémoire programme (de 12 ou 14 ou 16 bits) contient une
instruction et toutes les instructions (sauf les sauts) sont exécutées en un seul cycle machine.
1
Chapitre II : Microcontrôleurs
Une architecture de type HARVARD : Il existe deux types classiques d’architecture interne de
microcontrôleur :
Architecture de HARVARD qui est celle des PIC. Avec ce type d’architecture, les instructions et
les données transitent sur des bus bien différents. Il en résulte un gain de temps, puisque pour
exécuter une instruction on peut simultanément accéder à l’instruction et à la donnée associée à
cette instruction.
Architecture VON NEUMANN qui possède un bus unique de données pour faire transiter les
instructions et les données
Donc les éléments qu’on peut trouver, généralement dans un microcontrôleur, sont cités ci-dessous :
Un processeur : sa capacité peut aller de 4 à 64 bits, selon le modèle choisis. Il effectue principalement
le traitement des informations et de données au rythme définie par la fréquence d’horloge interne.
Une mémoire volatile : dite RAM, est une mémoire à accès aléatoire en lecture et écriture. Elle permet
de stocker temporairement les données et variables utilisées au cours d’exécution.
Une mémoire morte : dite ROM c’est une mémoire, qui contient le programme de démarrage qui
permet de charger l’application depuis la mémoire flash. Il existe plusieurs types de ROM : EPROM,
EEPROM…
Un oscillateur interne : qui permet de cadencer le rythme d’exécutions des instructions du processeur.
Les entrées sorties : ce sont des périphériques d’entrées-sorties, qui offrent la possibilité au processeur de
communiquer avec d’autre périphériques externes.
Un watchdog ou chien de garde : qui va s’assurer que le système ne reste pas bloquer à une étape
particulière
Autres modules : dont l’ADC, DAC, Timers, Contrôleurs IRQ…
2
Chapitre II : Microcontrôleurs
3
Chapitre II : Microcontrôleurs
Nous savons que le microcontrôleur est une puce intégrée composée de RAM, ROM, CPU, TIMER et
COUNTERS. Le PIC est un microcontrôleur qui se compose également de RAM, ROM, CPU, minuterie,
compteur, ADC (convertisseurs analogique-numérique), DAC (convertisseur numérique-analogique). Le
microcontrôleur PIC prend également en charge les protocoles tels que CAN, SPI, UART pour une interface
avec des périphériques supplémentaires. PIC principalement utilisé pour modifier l'architecture Harvard
et prend également en charge RISC (Reduced Instruction Set Computer) par l'exigence ci-dessus RISC et
Harvard, nous pouvons simplement que PIC est plus rapide que les contrôleurs basés sur 8051 qui sont
préparés sur l'architecture Von-Newman.
Le PIC 16F84 est un microcontrôleur 8 bits. Il dispose donc d'un bus de données de huit bits. Puisqu’il
traite des données de huit bits, il dispose d’une mémoire de donnée dans laquelle chaque emplacement
(défini par une adresse) possède huit cases pouvant contenir chacune un bit. L’organisation générale du
PIC 16F84 est composée par 4 blocs principaux comme la montre la figure suivante :
Mémoire de programme
Mémoire de données
Processeur
Ressources auxiliaires (périphériques)
4
Chapitre II : Microcontrôleurs
Un microcontrôleur exécute des instructions. On définit «le cycle instruction » comme le temps nécessaire
à l’exécution d’une instruction. Attention de ne pas confondre cette notion avec le cycle d’horloge qui
correspond au temps nécessaire à l’exécution d’une opération élémentaire (soit un coup d'horloge).
Une instruction est exécutée en deux phases : la phase de recherche du code binaire de l’instruction stocké
dans la mémoire de programme la phase d’exécution ou le code de l’instruction est interprété par le
processeur et exécuté. En effet, comme les instructions issues de la mémoire de programme circulent
sur un bus différent de celui sur lequel circulent les données, ainsi le processeur peut
effectuer la phase de recherche d’une instruction pendant qu’il exécute l’instruction
précédente comme montre la figure ci-dessous.
Chaine de compilation
IL existe plusieurs compilateurs à savoir MicroC et MicroPascal utilisés pour la compilation des
programmes. Il existe ainsi des IDEs comme le Mplab qui peut utiliser pour programmer les PICs.
5
Chapitre II : Microcontrôleurs
Le compilateur génère aussi un fichier listing (en assembleur), représentant le code et les emplacements mémoire qui
seront utilisés
6
Chapitre II : Microcontrôleurs
Le microcontrôleur AVR a été développé en 1996 par Atmel Corporation. La conception structurelle de
l'AVR a été développée par Alf-Egil Bogen et Vegard Wollan. AVR tire son nom de ses développeurs et
signifie microcontrôleur Alf-Egil Bogen Vegard Wollan RISC, également connu sous le nom de Advanced
Virtual RISC. L'AT90S8515 était le premier microcontrôleur basé sur l'architecture AVR, bien que le
premier microcontrôleur à arriver sur le marché commercial ait été l'AT90S1200 en 1997.
TinyAVR : Moins de mémoire, petite taille, approprié uniquement pour des applications plus simples
MegaAVR : Ce sont les plus populaires ayant une bonne quantité de mémoire (jusqu'à 256 Ko), un plus
grand nombre de périphériques intégrés et appropriés pour les applications modestes à complexes.
XmegaAVR : Utilisé dans le commerce pour des applications complexes, qui nécessitent une mémoire de
programme importante et une vitesse élevée.
Un processeur ARM fait également partie d'une famille de processeurs basés sur l'architecture RISC
(ordinateur à jeu d'instructions réduit) développée par Advanced RISC Machines (ARM). Un ARM
fabrique des processeurs multicœurs RISC 32 bits et 64 bits. Les processeurs RISC sont conçus pour
exécuter un plus petit nombre de types d'instructions informatiques afin qu'ils puissent fonctionner à une
vitesse plus élevée, exécutant des millions d'instructions supplémentaires par seconde (MIPS). En
supprimant les instructions inutiles et en optimisant les voies, les processeurs RISC offrent des
performances exceptionnelles à une partie de la demande de puissance de la procédure CISC (complex
instruction set computing).
Les processeurs ARM sont largement utilisés dans les appareils électroniques des clients tels que les
téléphones intelligents, les tablettes, les lecteurs multimédias et autres appareils mobiles, tels que les
appareils portables. En raison de leur jeu d'instructions réduit, ils ont besoin de moins de transistors, ce
qui permet une taille de matrice plus petite du circuit intégré (CI). Les processeurs ARM, une taille réduite,
une difficulté réduite et une consommation d'énergie réduite les rendent adaptés à des appareils de plus
en plus miniaturisés.
7
Chapitre II : Microcontrôleurs
Le processeur d'architecture ARM est une machine avancée de calcul à jeu d'instructions réduit [RISC] et
c'est un microcontrôleur à jeu d'instructions réduit (RISC) 32 bits. Il a été introduit par l'organisation
informatique Acron en 1987. Cet ARM est une famille de microcontrôleurs développés par des fabricants
comme ST Microelectronics, Motorola, etc. L'architecture ARM est livrée avec des versions totalement
différentes comme ARMv1, ARMv2, etc., et chacune a ses propres avantages et inconvénients.
Le cortex ARM est un microcontrôleur complexe de la famille ARM qui a une conception ARMv7. Il existe
3 sous-familles au sein de la famille des cortex ARM :
Série ARM Cortex Ax(Application): Cette gamme est principalement destinée aux
applications qui nécessitent d’effectuer des calculs complexes.
Série ARM-Cortex Rx(Real-time) : Cette gamme est destinée aux systèmes temps réel, ses
processeurs sont caractérisés par leurs hautes performances.
Série ARM-Cortex Mx(eMbedded) : Les processeurs de cette gamme sont développés pour
des microcontrôleurs avec une consommation d’énergie et un cout réduit.
Le cortex-MO/MO+/M1 : Ils permettent de traiter des données générales et des taches d’entrée-
sortie standards.
Le cortex-M3 : Il permet de traiter des données avancées, et s’occupe de la manipulation des
champs de bits.
Le cortex-M4 : C’est un M3 mais avec une extension d’un module DSP (Digital Signal Processor),
pour faire du traitement de signal.
Le cortex-M4F : C’est un M4 avec une FPU (Floatting Point Unit/ Unité à virgule
flottante) en plus.
Le Cortex-M7 : C’est le plus récent, son niveau de performance est supérieur
8
Chapitre II : Microcontrôleurs
II.1.4.2 STM32
La carte STM32F446RE NUCLEO est développée autour du microcontrôleur ARM Cortex-M4F 32Bits,
qui a une architecture RISC. Elle s’appuie sur les deux écosystèmes Mbed et Arduino ce qu’il lui permet
une compatibilité avec les Shields Arduino. Elle utilise également un pipeline 3 étages (chargement,
décodage, exécution), ce qui permet l’exécution de plusieurs instructions en un cycle CPU.
Le kit de découverte STM32F4 est fournis avec une bibliothèque logicielle complète (firmware) qui est
STM32Cube, la plateforme matérielle du kit permet ainsi d’accéder aux fonctionnalités du
microcontrôleur, et de développer de nombreuses applications facilement, en exploitant ses capacités.
Les caractéristiques de la carte STM32F446RE NUCLEO sont les suivantes :
9
Chapitre II : Microcontrôleurs
Un ST-LINK/V2 intégré.
Alimentation de la carte : Par bus USB et par alimentation externe : 3 V ou 5 V
Interface USB OTG avec connecteur micro-AB.
Oscillateur à Cristal de 4 à 26 MHZ.
Oscillateur 32 kHz pour RTC avec étalonnage
Deux types d’extension : En-têtes de broches d’extension pour les E/S (appelé ST
Morpho headers) pour une connexion rapide à la carte, Connecteurs ARDUINO UNO V3
Logiciel de développement :
10
Chapitre II : Microcontrôleurs
1) Caractéristiques générales
Nombre de broches : 28 (sur le modèle utilisé en TP)
Mémoire Flash : 32 ko (programmable par interface série)
Mémoire Données EEPROM : 1 ko
Mémoire RAM : 2 ko
32 registres de travail d'accès rapide pour l'ALU
Ports parallèles : 3, avec 23 broches E/S
Fréquence d'horloge : 16 Mhz (maxi tolérée = 20 Mhz)
o donc : 16 cycles d'horloge par micro-seconde
Périphériques internes
o 6 convertisseur Analogique/Numérique 10 bits, comparateur analogique
o 1 timer 16 bits (T1), 2 timers 8 bits(T0,T2)
o 6 canaux PWM, 1 chien de garde (watchdog)
o SPI, USART, TWI (=I2C)
26 interruptions
5 modes d'économie d'énergie
11
Chapitre II : Microcontrôleurs
12
Chapitre II : Microcontrôleurs
13
Chapitre II : Microcontrôleurs
b) Organisation de la mémoire¶
14
Chapitre II : Microcontrôleurs
La pile est une portion de la SRAM, localisée par un registre de pointeur de pile
Elle est manipulable via les instructions PUSH et POP
Elle sert en particulier à sauvegarder le compteur ordinal PC (Program Counter), qui désigne
l'adresse de l'instruction à exécuter
o lors d'un appel de sous-programme
o ou lors d'une interruption
Sa position en mémoire est définie par le registre « pointeur de pile » :
C) Interruptions de l'ATmega328¶
15
Chapitre II : Microcontrôleurs
26 sources d'interruptions
leurs vecteurs sont constitués de 2 mots d'instructions
ils sont ordonnés par priorité décroissante
o vecteur 0 = *reset : le plus prioritaire
16
Chapitre II : Microcontrôleurs
le port C peut aussi être utilisé comme « port d'entrée analogique » (CAN)
Leurs lignes peuvent être configurées/utilisées individuellement
17
Chapitre II : Microcontrôleurs
Il existe de nombreux modèles de cartes Arduino, la plus populaire étant probablement la Uno. Le
document ci-dessous vous donne un aperçu de l'organisation de la carte (dimensions : 65 x 52 mm) dans
sa version Uno.
II.2.2.1 Le microcontrôleur▲
Le cœur de la carte Arduino Uno est un microcontrôleur de la famille AVR, un Atmel Atmega 328P. Ce
microcontrôleur renferme dans un seul composant :
18
Chapitre II : Microcontrôleurs
Un processeur à 16 MHz et 32 Ko de mémoire Flash pour stocker vos programmes, ces chiffres peuvent
prêter à sourire en comparaison des GHz et des Go de votre ordinateur personnel. Mais avec son format
carte de crédit et une consommation inférieure au Watt, la carte Arduino satisfera pourtant vos premières
exigences en termes d'embarqué.
II.2.2.2 Alimentation
Elle a lieu sous une tension de 5 Volts. Elle peut provenir soit de la prise USB lorsque la carte est reliée à
l'ordinateur, soit d'un bloc secteur externe (tension entre 7 et 12 Volts, 1 Ampère) via la prise jack standard.
Comme la carte consomme très peu (0,5 W), elle peut également être alimentée par une simple pile 9 V.
Les régulateurs montés sur la carte permettent de fournir des tensions stabilisées à 3,3 ou 5 Volts pour
alimenter des périphériques (capteurs, shields…).
19
Chapitre II : Microcontrôleurs
Ce sont les deux rangées de connecteurs de part et d'autre de la carte qui permettent sa connexion au
monde extérieur.
Chacun des connecteurs D0 à D13 peut être configuré dynamiquement par programmation en entrée ou
en sortie. Les signaux véhiculés par ces connecteurs sont des signaux logiques compatibles TTL, c'est-à-
dire qu'ils ne peuvent prendre que deux états HAUT (5 Volts) ou BAS (0 Volt). En pratique, les connecteurs
D0 et D1 réservés pour la liaison série asynchrone (port COM virtuel via le câble USB) ne sont pas exploités
pour d'autres utilisations. À noter que chacun des connecteurs ne peut fournir ou absorber un courant
supérieur à 40 mA environ (200 mA pour l'ensemble des connecteurs).
Certains connecteurs peuvent être spécialisés comme sorties PWM (repérées par un ~) mais nous sortons
ici du cadre de ce tutoriel.
Entrées analogiques A0 à A5
Par défaut et contrairement aux entrées/sorties numériques qui ne peuvent prendre que deux états HAUT
et BAS, ces six entrées peuvent admettre toute tension analogique comprise entre 0 et 5 Volts. Pour pouvoir
être traitées par le microcontrôleur, ces entrées analogiques sont prises en charge par un CAN
(Convertisseur Analogique Numérique ou ADC pour Analog Digital Converter) dont le rôle est de convertir
l'échantillon de tension VE en une grandeur numérique binaire sur n bits.
Le principe de la conversion Analogique-Numérique est représenté ci-dessous (avec n=3 bits et la tension
de référence Vref=5 Volts) :
20
Chapitre II : Microcontrôleurs
Le convertisseur de la carte Arduino Uno possède une résolution de 10 bits, soit 2 10 = 1024 possibilités de
0 à 1023. Ainsi, pour n=10 bits et la tension de référence par défaut Vref=5 Volts, si la tension analogique
d'entrée échantillonnée est VE=3,8 Volts , la grandeur numérique N (ici en entier décimal) en sortie du
convertisseur peut être calculée grâce aux relations :
Il y aurait encore bien des choses à dire pour avoir une description plus complète de la carte et nous
sommes resté sur l'essentiel.
21
Chapitre II : Microcontrôleurs
a) Installation
Pour l'installation (Windows, Mac OS X et Linux), on fait références aux indications pas à pas du site
officiel d’arduino.
Voici à quoi ressemble l'IDE (Windows), ici avec le programme de démonstration Blink :
Ce premier programme se contentera de faire clignoter la LED jaune témoin qui se trouve près du
connecteur D13 de la carte Arduino Uno. Avant de télécharger le programme dans la carte, il faut relier
l'ordinateur et la carte via le câble USB :
22
Chapitre II : Microcontrôleurs
Une fois le port activé et reconnu sur l'ordinateur, il faut éventuellement désigner le bon dans l'interface :
Finalement, le processus de rédaction du programme jusqu'à son téléchargement dans la carte peut être
résumé grâce au schéma suivant :
Sous Windows par exemple, lorsque on lance la compilation dans l'IDE, ce sont les outils de la
suite WinAVR avec son compilateur GCC qui prennent le relais.
En fait, on programme dans un langage propre à Arduino dont la structure s'apparente aux langages
C/C++. Mais lorsque on évoque une fonction Arduino, non standard C/C++, et pourtant reconnue et
coloriée comme un mot-clé dans l'éditeur, vous faites appel en toute transparence à une ou plusieurs
bibliothèques rédigées en C ou C++ qui seront incluses à la compilation.
23
Chapitre II : Microcontrôleurs
En enveloppant le langage C/C++ de cette manière, les concepteurs de l'IDE ont pu simplifier sa syntaxe
et l'adapter aux possibilités de la carte. De nombreuses fonctionnalités de haut niveau sont ainsi proposées
à l'utilisateur novice qui n'a plus à se soucier de la logique interne du microcontrôleur.
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
La structure d'un programme Arduino, rédigé dans l'éditeur, ressemble à ceci et doit toujours comporter
les fonctions setup() et loop() :
24
Chapitre II : Microcontrôleurs
void setup() {
// initialisation des ressources de la carte,
// configuration des entrées/sorties,
// définition de la vitesse de fonctionnement du port série, etc.
// setup() n'est exécuté qu'une seule fois.
}
void loop() {
// les instructions contenues ici sont exécutées indéfiniment en boucle
// Seule une coupure de l'alimentation de la carte ou un appui sur le bouton Reset
// permet de quitter le programme.
}
Nous n'allons pas ici décrire toutes les instructions du langage Arduino, vous trouverez les références et la
syntaxe sur le site officiel :
Language Reference
Nous insistons tout de même sur les fonctions implantées pour la gestion des entrées/sorties de la carte :
Pour une broche numérique configurée en sortie, cette instruction permet de mettre
digitalWrite()
son niveau logique à HAUT ou BAS.
Lecture de la valeur de la tension présente sur une entrée analogique (A0 à A5 sur la
analogRead() Uno). La fonction retourne la valeur issue de la Conversion Analogique Numérique,
soit une valeur comprise entre 0 et 1023 (convertisseur 10 bits).
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
25
Chapitre II : Microcontrôleurs
La broche n° 13, reliée à la LED intégrée à la carte, passe alternativement du niveau logique HAUT (HIGH)
au niveau logique BAS (LOW) après un délai d'une seconde, ce qui la fait clignoter.
Comme on le voit à travers cet exemple, les concepteurs du langage ont prévu d'interfacer facilement vos
programmes avec le monde extérieur.
Une carte Arduino seule, même si on dispose de quelques LED, résistances, boutons poussoir, etc. n'est
pas d'une grande utilité et reste dans ce cas limitée à des fins d'apprentissage. Si on veut aller plus loin et
piloter les moteurs de votre robot, on doit passer par une interface dédiée (des composants sur une carte
électronique).
Une fois de plus, sous la poussée de la communauté Arduino, de nombreux fabricants proposent une
pléthore de cartes d'interface capables de couvrir la majorité des besoins (capteurs, relais de puissance,
commande de moteurs, Internet, affichage sur matrice LED ou écran LCD, communication Wifi…).
Un shield est une carte d'interface spécialement dédiée à l'Arduino. Ces cartes ont des dimensions
sensiblement voisines de la carte Arduino et peuvent s'enficher directement sur les connecteurs de celle-
ci.
Il est bien sûr impossible de recenser entièrement ici les centaines de shields existant sur le marché (dont
quelques-uns référencés sur le site officiel). On trouvere une liste de fabricants et/ou distributeurs
de shields pour Arduino dans la sitographie en fin de tutoriel.
a) Pour le prototypage
Sparkfun ProtoShield
Une fois enfichée sur la carte Arduino, ce shield reprend tels quels les connecteurs de part et d'autre de la
carte. On peut alors coller une plaque de câblage rapide (breadboard en anglais) dans la partie centrale
(en plastique vert moulé sur la photo). Cette plaque permet de câbler de nombreux composants sans faire
de soudure et garder le montage entièrement démontable.
Le montage sur plaque d'essai ci-dessous, dessiné avec le logiciel gratuit Fritzing, montre une LED
branchée sur la broche D10 de l'Arduino avec sa résistance en série.
26
Chapitre II : Microcontrôleurs
int led=10;
Parce que on ne pourra pas toujours faire des affichages à coup de Serial.print sur l’écran de votre PC dans
vos applications censées être embarquées, un affichage sur un petit écran LCD de 2-3 lignes de 16 ou 20
caractères enfiché sur votre Arduino peut s’avérer bien utile. Ce genre de composants nécessitent de
recourir à un contrôleur spécifique et de jouer du fer à souder… sauf si vous disposez d’un shield LCD.
Le LCD Keypad Shield de DFRobot par exemple (monochrome, 2 lignes de 16 caractères, affichage en
négatif avec rétroéclairage) fonctionne avec un contrôleur classique compatible Hitachi (broches rs, w,
enable et quatre broches supplémentaires en mode 4 bits). On n’aura alors aucun mal à piloter
votre shield avec la bibliothèque LiquidCrystal proposée en standard dans l’environnement Arduino.
27
Chapitre II : Microcontrôleurs
Code c++ :
1 #include <LiquidCrystal.h>
2
3 LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
4
void setup()
5 {
6 lcd.begin(16,2);
7 lcd.print("Hello, world!");
8 }
9
10 void loop() {}
11
Ce shield dispose en plus de boutons poussoirs qui nous permettront, par exemple, de faire de la navigation
et de la sélection dans des systèmes de menus. Et si on trouve que le nombre de broches monopolisées est
trop important pour notre application, on tourne vers un équivalent, mais muni cette fois d’un contrôleur
I2C ou SPI.
28