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.