Bonjour, notre monde est
analogique mais les microcontrôleurs sont purement digitaux, comme on l'a vu.
Il nous faut donc des convertisseurs et c'est ce qu'on va étudier aujourd'hui,
les convertisseurs analogiques/digitaux qui existent dans la
plupart des microcontrôleurs et qui sont faciles
à mettre en oeuvre. Les convertisseurs digitaux/analogiques
et, avec Arduino, le digitalWrite sèment un petit peu la confusion et
on aura encore un petit peu de temps pour parler de la mémoire eeprom qui
existe dans tous les microcontrôleurs. Alors comment fonctionne un
convertisseur? C'est un circuit assez complexe
qui va, par itération, lire le signal ici entre
0 et 5V, et puis calculer les bits
typiquement en disant : est-ce que c'est supérieur à la moitié de
la tension, supérieur au quart de la tension, ce qui reste et cetera.
L'ordre Arduino AnalogRead
permet d'obtenir une valeur 10 bits en faisant travailler ce convertisseur.
Et ça nous intéresse d'avoir plusieurs entrées de conversion
et c'est avec un multiplexeur qu'on va sélectionner une
entrée, donc on pourra faire une mesure à la
fois, en sélectionnant ici An0, An1, An2 et démarrer la
conversion, obtenir un flag disant que la conversion est terminée.
Alors, les convertisseurs usuels ont 10 bits.
La précision, 10 bits c'est 1 pour
1000, elle dépend du câblage, on a facilement des parasites euh, des
influences de l'horloge du processeur sur les entrées des signaux analogiques.
Sur Arduino, on a 6 pins qui peuvent lire les valeurs.
Et puis, la mise en oeuvre est très facile puisqu'on va définir une valeurLue, on va
définir une valeurUtile puisqu'en général, c'est pas le
domaine de 0 à 1024 qui nous intéresse.
Dans ces valeurs analogiques, il y a un domaine plus étroit.
La valeurLue et ben c'est
analogRead du canal An0. Il n'y a rien à initialiser.
Dans cette procédure analogRead, il
va déjà y avoir le setup pour modifier la pin d'entrée en entrée
analogique, il faut bouger des aiguillages à l'intérieur du processeur naturellement.
Donc on déclare
une valeurLue par le convertisseur, une valeurUtile
qui nécessitera en général une petite transformation.
La valeurLue, et bien, c'est la valeur analogique, 10
bits, et la valeurUtile, je peux l'obtenir avec cette
fameuse fonction map, que l'on avait vue, en disant
ben c'est la valeurLue mais transformée en disant l'espace
de minA à maxA, valeur analogique, et convertie dans une
fourchette minV à maxV, valeurUtile.
Il y a des choses un petit peu compliquées que l'on ignore en général.
Vous avez une tension de référence à
l'intérieur du convertisseur qui, en général, est l'alimentation
mais on peut modifier, par programmation, cette tension de référence
pour avoir une valeur interne ou pour avoir une valeur
externe sur une broche qui a été préparée par le microcontrôleur.
Dans les processeurs de très bas de gamme,
très bon marché, le convertisseur analogique-numérique prend trop
de place et on le remplace par par un comparateur.
Quand on a besoin de, d'évaluer des signaux digitaux, le comparateur, vous
pourrez le régler pour, par exemple, repérer un signal de supérieur à
2,3V et ça n'offre pas autant de possibilités
que le convertisseur analogique complet naturellement.
Dans l'autre sens,
si on veut aller du digital à l'analogique, vous avez la
solution Arduino, qui vous dit analogWrite,
numéro de pin, et puis la valeur du byte qui va être
convertie en valeur dite analogique. Ce n'est en
fait pas du tout un convertisseur digital-analogique qui est,
ça n'envoie pas une valeur analogique sur la pin.
Ça envoie les impulsions, on retrouvera
ce PWM. Mais si vous voulez avoir un signal
analogique qui est 80% de 5V, donc 4V, et bien,
vous envoyez des impulsions à une fréquence de 1kH par exemple, où vous
avez 80% l'état 1, 20% l'état 0
et il y a une moyenne de l'énergie transmise qui
correspond effectivement à une alimentation de 4V.
Donc, pour obtenir vraiment un signal analogique, et
bien ce signal PWM, on peut le filtrer en utilisant
une résistance, un condensateur, c'est quelque chose
qu'on ne vous a pas expliqué au
début du cours parce que je crois
que c'est plus clair maintenant de comprendre l'effet.
Chaque fois que vous avez du 5V ici et bien, vous allez charger
le condensateur, chaque fois que vous avez du 0V, vous allez
décharger le condensateur et vous allez obtenir
un moyennage grâce au condensateur qui va se faire autour de 4V.
Dans la montée, c'est avec 1V de différence
un peu près, que l'on charge le condensateur.
Ici, ça descend plus rapidement puisque c'est avec
4V de différence que l'on décharge le condensateur.
Alors, ce schéma a une certaine constante de temps,
si la résistance augmente, et bien, ça va mettre plus de temps pour charger
le condensateur, si le condensateur est plus
grand, ça va aussi mettre plus de temps.
Donc on a un, une constante de temps qui
est le produit de la résistance par la capacité.
Si on met 10 kohms et 100 microF et
bien ça veut dire que le condensateur va se charger
complètement à partir d'une impulsion positive dans environ une
seconde, je ne vous donne pas la formule exacte.
Alors, une seconde, ça veut dire que, effectivement, on va bien attenuer les
variations mais par contre, si tout à coup, vous avez un changement de PWM,
et bien, ça va mettre euh, une demi seconde pour descendre
au niveau de 2V, par exemple.
Alors, du point de vue de programmation, si vous voulez, ça peut être très
simple puisqu'on a beaucoup d'éléments qui intègrent, qui n'ont pas besoin
d'une tension continue, vous voulez allumer
une LED d'une façon proportionnelle, vous
voulez faire tourner un moteur, et bien vous voyez ces impulsions et c'est
l'inertie du moteur ou la persistance rétinienne qui va jouer
le rôle de ce filtre de la résistance et du condensateur.
Alors, si vous voulez faire varier une LED comme c'est un petit peu le gadget que
l'on voit sur beaucoup de de petites machines, la lampe ne
s'allume pas en tout ou rien mais elle augmente son intensité,
diminue son intensité, et bien, après avoir défini quelle LED vous
vouliez et d'avoir choisi une pin sur lequel vous avez ce PWM,
sur lequel vous avez cette instruction analogWrite qui peut agir, donc ce
sera, par exemple, sur la pin 3, que l'on a en sortie.
Maintenant ben, je peux écrire une petite boucle for
qui va augmenter la valeur du PWM
toutes les 10 ms, et bien, on augmente
de 1, donc en 2,5 secondes, on va passer de l'intensité
nulle à l'intensité maximum et ensuite on peut refaire la
même boucle en décrémantant pour éteindre la LED.
Donc vous voyez quels sont les paramètres que l'on peut modifier.
Le schéma interne d'un convertisseur
digital-analogique se fait avec des résistances, vous trouvez
les références sur internet naturellement. Ce schéma peut
nous intéresser dans des cas pour, par exemple,
brancher plusieurs interrupteurs sur une seule entrée plutôt
que d'avoir plusieurs interrupteurs qui utilisent plusieurs entrées.
Ces convertisseurs n'existent pas dans les microprocesseurs,
je n'en connais qu'un seul pour le moment.
peut-être que ça viendra à l’avenir, c’est un circuit moins utile,
du point de vue programmation puisqu’on a vu qu’avec le «
digital right » on peut programmer quelque chose qui est tout à fait satisfaisant.
Si vous avez vraiment besoin d’un convertisseur digital
analogue « converter », il existe des petits circuits qui
vous génèrent deux canaux, par exemple, un rentrant
l’information en série, on reparlera de cette norme SPI.
Bien disons encore deux mots de
la mémoire EEPROM que vous avez à l’intérieur de
tous les processeurs, même les processeurs assez petits ont une
mémoire EEPROM qui ressemble à la mémoire FLASH
dans laquelle se trouve votre programme, mais qui est un
peu plus fiable en durée et beaucoup plus lente à
l’écriture. Donc on trouve dans les processeurs
64 « bytes » voire 2 kilos « bytes » de cette mémoire
effaçable électriquement. La durée de mémorisation
de l’information est d’une dizaine d’année en tout cas.
Le cycle d’écriture est très lent, 3 à 10 millisecondes, hein, par rapport à
un cinquième de microseconde pour les, pour une écriture en mémoire vive.
Le nombre de cycles est limité, 100.000 à 1 million.
Vous direz mais c’est beaucoup.
Si vous faites une erreur de programmation, et puisque
vous vous trouvez dans un cycle et vous écrivez
toujours sur la même mémoire, parce que vous avez oublié d’incrémenter
un compteur, et bien, en quelques minutes, vous aurez
exécuté les 100.000 cycles qui font que votre position
mémoire aura perdu sa fiabilité. Alors la lecture est
normalement rapide. Le principe de fonctionnement
c’est un condensateur et ce condensateur est
isolé. On arrive avec des tensions supérieures
à faire migrer des électrons pour charger ce condensateur ou pour le
décharger, donc c’est pour ça que le processus est relativement lent.
Et puis le condensateur, ben, même s’il y a une résistance extrêmement
élevée, ici, qui le court-circuite, et bien il
va se décharger quand même en quelques dizaines d’années.
Alors c’est très facile d’utiliser cette mémoire morte, même du point de
vue interne du microprocesseur, il y a quelques instructions à respecter.
Mais avec « Arduino » par exemple, ben, vous
pouvez charger une librairie qui s’appelle EEPROM point h,
que vous trouverez sans devoir installer quoi
que ce soit. Et ensuite, vous pourrez écrire «
EEPROM.write » à une certaine adresse de l’EEPROM, vous mettez une certaine valeur.
Et puis vous pouvez relire le contenu de cette adresse
avec un « EEPROM.read ». Alors ces adresses,
c’est à vous de les gérer, vous savez que ça va de 0 à 1000, 2000 et vous devrez
gérer votre petit espace mémoire pour savoir où vous avez mis l’information.
Donc ce n’est pas comme avec les variables, où le compilateur se préoccupe
de gérer le plus efficacement possible
les variables locales et les variables globales.
Alors, il y a beaucoup d’applications pour ces EEPROM.
Ben, typiquement vous fait des mesures météo, vous allez stocker dans une mémoire
EEPROM et si vous devez faire des mesures toutes les heures, ben naturellement que
vous allez endormir votre processeur et le réveiller, donc quand il est endormi
il consomme extrêmement peu de courant, et
vous le réveillerez pour la mesure suivante.
Et ensuite quand vous passez dans le mode de lecture, ben vous
lirez toutes les données qui ont été accumulées pendant plusieurs semaines.
On l’utilise aussi, la mémoire EEPROM, pour mémoriser des paramètres
qui ont été modifiés pendant l’exécution du programme mais que vous voudriez
retrouver comme paramètres de démarrage quand vous
relancez le programme après une coupure de courant ou une interruption d’activité.
Donc on vient de voir
que les convertisseurs analogique-digitaux existent
dans les microcontrôleurs et sont faciles à mettre en œuvre.
Les convertisseurs digitaux-analogiques sont plus délicats et nécessitent de
bien comprendre ce que l’on fait, si on n’utilise pas
des circuits extérieurs qui vont générer un signal analogique
parfaitement stable. Et on a également vu que la mémoire
EEPROM, à l’intérieur des microcontrôleurs, est facile à utiliser
et très souvent utile dans des applications.