Oscilloscope numérique

Oscilloscope graphique sur afficheur alphanumérique.

L’idée qui consiste à imaginer qu’avec un afficheur alphanumérique qui ne peut visualiser que des lettres et des chiffres on puisse créer un oscilloscope qui par nature est graphique est pour le moins bien saugrenue. Et pourtant… à LCD vaillant rien d’impossible !

Non, ce n’est quand même pas un synchroscope tri courbes post synchronisé par satellite. En réalité il se résume à un enregistreur dont la cadence la plus rapide sera de 5000 échantillons par seconde et la définition de l’écran sera limitée à 16 x 16 « pixels » ce qui peut sembler dérisoire. C’est en dépit de ses faibles performances la cerise sur le gâteau, car il est totalement gratuit et ne vous coutera qu’environ 2748 octets dans la mémoire de programme qui ne sera au total exploitée qu’à 89%. Côté matériel il n’y a rien à ajouter. Par contre, s’il ne remplacera jamais un vrai oscilloscope. Il dispose d’une base de temps ajustable, d’une mémoire d’échantillonnage que l’on peut balayer en différé comme sur un « grand ». Ceux qui parmi vous n’ont jamais possédé d’oscilloscope pourront explorer les fondements de l’usage d’un tel instrument de mesure, observer les limites inhérentes à ce type d’appareil. Bref, tout un champ d’expérimentations totalement gratuit. YOUPpiiiiiii !

Pseudo écran graphique et faisabilité.

Quand l’annonce publicitaire précise que la finesse de l’écran n’est que de 16 x 16 pixels, nous sommes en droit de nous demander si avec si peu de points il est bien rationnel d’engager des heures de programmation pour un appareil qui sera totalement inutilisable. La question est d’autant plus justifiée que cette information tristounette est relative à la double définition. Quand on est en mode « affichage des paramètres numériques » la précision en « hauteur » ne fait plus que huit niveaux. La seule façon de pouvoir apporter une réponse, c’est… d’essayer !
Après quelques heures d’analyse et quelques « tracés » uniquement pour évaluer la faisabilité et la réelle possibilité de faire la différence entre une sinusoïde et un signal triangulaire, les premières tentatives ont été très encourageantes. Comme il n’y avait besoin d’aucun matériel autre que l’existant, on ne risquait pas la ruine, seulement pas mal de temps consacré à la programmation. Mais comme nous somme dans du loisir, aucune importance, d’autant plus que toute tentative quelle qu’en soit l’issue laisse toujours une expérience qui ne peut qu’être positive.

Pour pouvoir se faire une idée précise de ce que l’on peut visualiser avec une aussi faible définition, le programme étant au point, et disposant d’un générateur B.F. performant, plusieurs signaux de formes différentes ont été enregistrés par notre « trucscope ». La Fig.57 permet de se rendre compte que si ce n’est pas une panacée mirifique, il est toutefois parfaitement possible d’avoir une assez bonne approximation de la forme de l’onde enregistrée. En Fig.57 A nous avons un signal sinusoïdal. En B l’onde est triangulaire. La différence n’est pas très marquée, mais si l’on accélère la rapidité d’échantillonnage, la précision devient meilleure et la distinction incontestable. Avoir une période complète à l’écran permet de se faire une idée globale de la forme du signal. Augmenter la fréquence d’échantillonnage fourni plus de points. Il faut explorer la mémoire pour une cycle complet de l’onde enregistrée, avec pour avantage une définition bien meilleure. L’expérience permet de faire émerger une stratégie d’exploitation. En C l’écran LCD visualise le signal carré issu de la PWM. Les signaux du genre « tout ou rien » issus des sorties binaires d’Arduino sont plutôt bien visualisés. En D est tracée une dent de scie montante. Enfin en E, nous avons la réciproque, soit une dent de scie descendante.

Conception de l’écran « graphique ».

Suite à l’expérience acquise lors du développement du voltmètre analogique avec ruban horizontal, l’idée de base consiste à en reprendre le concept. Le problème dans notre cas, c’est que l’on désire représenter une variable à deux dimensions : La tension échantillonnée et le temps. Nous ne disposons en tout et pour tout que huit caractères personnalisables. Pour représenter l’évolution de cette variable, nous allons utiliser un graphe sur lequel, par habitudes, les électroniciens placent en vertical la valeur de la tension mesurée, et horizontalement, de la gauche vers la droite, le temps qui s’écoule. Il nous faut reprendre ce concept, mais l’adapter aux faibles caractéristiques graphiques de l’écran LCD utilisé. La Fig.58 clarifie la situation et permet de mettre en évidence les contraintes dans lesquelles sont confinés nos « pixels« .

Fig 58

Nous ne disposons que de huit caractères personnalisés. Comme la donnée fondamentale que l’on désire visualiser est la tension qui mobilise « verticalement » l’écran, c’est elle qui va utiliser les matrices [5 x 8]. En se servant des points lumineux du curseur, dans une matrice de caractère on peut donc distinguer géométriquement huit niveaux verticaux. Impossible de combiner à la fois le vertical et l’horizontal, car la combinatoire limitée à huit caractères personnalisés ne nous laisse qu’une seule possibilité : Chaque niveau occupera toute la largeur du caractère. C’est ainsi que l’on va télécharger dans la mémoire de l’afficheur les caractères personnalisée C1 à C8.

Sur l’écran représenté sur la Fig.58 la ligne du haut est coloriée en jaune, et celle du bas en rose. Les huit caractères personnalisés sont utilisable aussi bien sur la ligne jaune, (Représentés en bleu clair.) que sur la ligne rose. (Représentés en bleu foncé.) Naturellement, le dessin ne fait que présenter géométriquement l’écran, mais la tension représentée à un instant ne pourra pas avoir deux valeurs différentes. Concrètement ce sera soit le pavé jaune qui utilisera un caractère graphique, soit le pavé rose et sur une colonne l’autre position sera entièrement éteinte. Notons au passage que C8 utilise les cinq points du haut de la matrice [5 x 8], alors que C1 allume ceux du curseur.
L’éclairage de C1 sur la ligne jaune et de C8 sur celle du bas engendre deux pixels qui se touchent.
La géométrie de l’afficheur LCD autorise donc un tracé vertical continu et sans « trou ». Ce n’est pas le cas en largeur puisque nous savons que les matrices de caractères sont séparées par « un point » qui n’est pas disponible électroniquement. C’est du reste la différence fondamentale entre un afficheur LCD alphanumérique et sa variante dite graphique.
Pour la variable temps qui sera représentée horizontalement nous ne disposons que de seize positions repérées P1 à P16 sur le dessin. On va donc diviser l’intervalle de temps affiché à l’écran en seize « graduations« , une par caractère sur la ligne du LCD. Il reste maintenant à exploiter un écran qui graphiquement se résume à 16 x 16 PIXELs ÉCRAN. D’un point de vue pragmatique, exploiter l’écran disponible consiste à faire l’inventaire de ce que l’on désire y afficher, et la façon dont on visualisera les données. L’expérience de l’utilisation des oscilloscopes du commerce nous place dans une contradiction résultant de l’exigüité du visuel. Les photographies de la Fig.57 sont suffisantes pour nous permettre d’évaluer la « forme » de l’onde analysée. Pour les tensions extrêmes, par nature le CAN de l’ATmega328 utilisera une plage comprise entre 0 et +5Vcc. (On verra plus avant comment visualiser des signaux alternatifs.) Bien que déjà très utile il manque à cette information graphique une donnée essentielle pour l’opérateur : La valeur de la BASE de TEMPS.

Notion de BASE de TEMPS.

Gravitant autour d’un tube cathodique servant d’écran graphique, les oscilloscopes de technologie analogique étaient basés sur la présence d’un spot lumineux qui se déplaçait de la gauche vers la droite à une vitesse ajustable pour représenter l’écoulement du temps. En fonction de la tension appliquée en entrée de l’appareil, ce spot était dévié verticalement. Les luminophores allumaient une trace représentative de l’évolution de la tension en fonction du temps. Le balayage

Fig 59

était continu, le spot étant rapidement ramené à gauche pour un nouveau passage. Pour obtenir un tracé exploitable et non un « fouillis » de lignes mélangées, il était impératif de procéder à une synchronisation, c’est à dire un déclenchement précis du balayage pour que les tracés se superposent. Heureusement pour nous l’échantillonnage mémorisé nous épargne cette facette particulièrement délicate qui exigeait sur les « ancêtres » une foule de boutons et d’ajustements judicieux. Le balayage horizontal devait avoir une rapidité directement liée à la fréquence de l’onde visualisée. Cette donnée de rapidité de balayage est nommée LA BASE de TEMPS. Elle est toujours d’actualité, mais sous une autre forme. (Maintenant la BASE de TEMPS fait référence à la fréquence d’échantillonnage.)

 Échantillonnage numérique mémorisé. (Remis en cause plus avant …)

Vive l’échantillonnage numérique qui permet de mémoriser les valeurs des tensions mesurées, puis de les tracer sur l’écran en différé. Cette technique représentée sur la Fig.60 évite d’avoir à synchroniser. S’il est indispensable de pouvoir ajuster finement le seuil de déclenchement d’un échantillonnage sur un oscilloscope professionnel, on peut s’en passer royalement pour une application ludique telle que celle envisagée ici. Le principe de base est enfantin : À intervalles de temps réguliers et calibrés ΔT on lit la valeur du convertisseur CAN comprise entre 0 et 1023. Puis cette valeur est rapidement translatée en une variation « au plus proche » comprise entre 1 et 16.
Bien que la translation pour n’avoir que seize niveaux prenne du temps, elle reste avantageuse car la donnée à mémoriser ne fait plus qu’un octet et prend à la fois moins de place en mémoire dynamique et moins de temps pour réaliser un échantillon. Les seize échantillons sont lus à la cadence ΔT et mémorisés en cascade. Ils seront ensuite traités en différé pour visualiser graphiquement le signal analysé.

Fig 60

Fig 61

Dans un tel processus c’est l’intervalle de temps entre la saisie de deux valeurs ΔT qui constitue la BASE de TEMPS. Sur la Fig.60 cette base de temps a été ajustée à la valeur de la Période du signal divisée par seize. Le groupe d’échantillons s’étale sur une alternance unique et complète. On comprend que plus l’échantillonnage est rapide, plus on peut saisir de valeurs durant une période du signal. La définition du graphe sera proportionnelle à cette rapidité… encore faut-il pouvoir visualiser plus de 16 pavés.
C’est pour résoudre ce petit problème que l’on va introduire la notion de fenêtre d’écran et de taille de mémoire d’échantillonnage caractéristique importante pour ce type d’appareil. Toutefois, avant de changer de chapitre, il me semble important de détailler le vocable variation « au plus proche ».

Fig 62

Considérons la Fig.61 qui représente un pavé de type matrice [5 x 8]. Le trait vert figure la trace que laisserait la représentation de la tension en fonction du temps qui s’écoule, si l’écran était en haute définition. Le médaillon rouge agrandit le dessin dans la zone critique. Le sommet inférieur du triangle jaune représente la valeur de numérisation du CAN, par exemple 729. Si l’on transpose la plage [0 – 1023] en une variation entière [0 – 8] on observe que c’est le centre du carré colorié en bleu foncé et en vert clair qui est le plus proche du sommet du triangle jaune. La transposition en valeurs entières va donc « allumer » dans le pavé le niveau colorié en bleu foncé. Il résultera de ce traitement « arrondi » en valeurs entière des phénomènes d’escaliers d’autant plus marqués que deux valeurs successives produisent un arrondi vers le bas pour l’une, vers le haut pour l’autre. Le phénomène est bien visible sur la Fig.62 et repéré avec les flèches jaunes. Pourtant l’écran est utilisé au maximum de la plage verticale et utilise en hauteur les seize niveaux possibles.

Représentation graphique et fenêtre d’écran.

Vive l’échantillonnage qui nous évite d’avoir à agencer un quelconque dispositif pour la synchronisation. Dans la mesure ou nous disposerions d’une taille mémoire dynamique suffisante, pourquoi ne pas mémoriser un plus grand nombre d’échantillons, par exemple 64 ou 128 ?
Nous allons voir par la suite que l’exploitation de cette possibilité conduit à choisir comme taille de mémoire d’échantillonnage un multiple de huit. Compte tenu de l’étendue encore disponible dans la RAM dynamique nous pourrions facilement étendre la taille de mémorisation à 256 octets, mais l’expérience montre que 128 est suffisant car se pose ensuite le problème de visualisation d’une telle « étendue » d’informations. Du reste si vous le désirez, il suffira de porter à 256 la valeur de la constante #define NB_Echantillons 128. La Fig.63 résume assez bien le propos qui concerne ce chapitre. Informatiquement la mémoire d’échantillonnage sera déclarée sous la forme d’un tableau de byte réservant 128 emplacements indicés de 0 à 127. Une séquence d’échantillonnage consiste à effectuer 128 fois la mesure sur l’entrée de l’oscilloscope, à transposer la valeur numérisée entre 1 et 16

Fig 63

Fig 64

et à la stocker successivement du premier emplacement 0 jusqu’au dernier le n°127. Sur la Fig.63 ce tableau est symbolisé par le rectangle compartimenté colorié en vert pastel. Entre chaque saisie de la valeur et de sa mémorisation dans le tableau le programme effectue une temporisation pour respecter la base de temps ΔT qui a été consignée. Dès qu’une séquence d’échantillonnage a été déclenchée, elle se réalise puis passe à la visualisation des valeurs mémorisées. La mémoire contient 128 valeurs ; hors l’écran LCD ne peut en visualiser que 16 simultanément. On ne peut donc regarder qu’un huitième de la « largeur totale » du tableau. (128 / 16 = 8) Pour pouvoir observer ces données, le logiciel va donc émuler une sorte de fenêtre telle que celle représentée par le rectangle rouge sur le dessin donné ci-dessus. Les valeurs qui sont « dans cette fenêtre » seront « pixellisées » sur l’écran LCD, un peu comme si ce derniers (Voir la Fig.64) était une loupe graphique placée devant la mémoire d’échantillonnage. Par un protocole qui reste encore à définir, l’opérateur peut déplacer cette loupe vers la gauche ou vers la droite (Avec un système de butée aux extrémités.) pour observer la zone d’échantillonnage qui l’intéresse.

Simple ou double définition graphique.

Bien qu’issue d’une notion finalement élémentaire, le fenêtrage sur les deux lignes de l’afficheur engendre une petite difficulté. Il ne faut pas confondre la valeur numérisée dans chaque emplacement de la mémoire, valeur qui varie entre 1 et 16, avec la méthode qui consiste à utiliser des caractères graphiques personnalisés dont la combinatoire s’étend de 1 à 8. Si la visualisation graphique n’était réalisée que sur une ligne de l’afficheur, ce serait relativement simple, car à chaque « pavé » correspondrait une valeur de tension dans la plage 1 à 16 qu’il suffirait de transposer entre 1 et 8. Mais si l’on adopte le mode « double définition », la programmation se complique un tantinet.
On doit procéder en deux « balayages ». Un pour la ligne du haut, l’autre pour la ligne du bas. Forcément pour une « colonne » l’un des deux pavés devra être entièrement éteint, ce que l’on obtient sans problème en affichant un « ESPACE » à l’emplacement ciblé. Pour le pavé affichant le pixel, il faut effectuer une division entière par deux de la valeur mémorisée et en utiliser soit le « poids fort » si le pixel est sur la ligne jaune du haut, soit le « poids faible » pour la ligne rose du bas. L’analyse du programme de démonstration et d’expérimentation P06_Oscillographe.ino détaillera cette partie un peu délicate du logiciel. La « simple définition » graphique s’impose pour visionner sommairement la trace du signal, tout en affichant sur la ligne du haut les données importantes pour l’opérateur. Comme pour pouvoir afficher la trace nous devons disposer des caractères personnalisés, pour tout le reste il faut se contenter des caractères standards. C’est ce que fait l’écran en mode mixte montré sur la Fig.65 sur lequel la ligne du bas visionne la partie d’une onde sinusoïdale. La ligne du haut

Fig 65

présente les données « vitales ». La première information précise la valeur de la BASE de TEMPS que nous imposons au logiciel. Quand en utilisant les B.P. on changera de rapidité d’échantillonnage, c’est dans ce mode qu’il faudra le faire pour voir en temps réel ce que nous consignons. Le reste de l’affichage est relatif à l’exploitation de la fenêtre d’écran. Quand nous utiliserons FC- court on provoquera un décalage latéral de la « loupe ». Le sens sera mémorisé en préalable. Le sens consigné est indiqué par le symbole > ou < tout à droite de l’écran. Il sera souvent bien utile d’avoir une estimation de la position de la « loupe » par rapport à l’étendue totale de la mémoire d’échantillonnage.

C’est le rôle de la symbolique située au centre de la ligne du haut qui par huit « points » divise l’étendue en huit « écrans complets », avec affichage du curseur qui montre en relatif où se trouve actuellement la fenêtre de visualisation graphique. Pour rudimentaire qu’il soit, ce petit oscilloscope présente toutefois les fonctions de base de ses grands frères professionnels et permet de se faire une idée très précise de leur utilisation. Avant d’aborder les protocoles d’exploitation, il nous reste à préciser un détail relatif à des choix effectués pour concrétiser la représentation graphique.

Trait continu, pixels pointillés… ou les deux ?

Répondre à cette question n’était pas du tout évident, seule l’expérimentation de plusieurs options a permis de dégager un compromis qui soit favorable à la fois à l’esthétique de la visualisation et qui facilite le plus possible l’interprétation du semi graphique mis en œuvre dans cette application. Comme chaque matrice (Ou pavé d’affichage.) représente un niveau mesuré pour toute la largeur de la colonne concernée, initialement, comme montré sur la Fig.66 A il semblait évident que le pixel serait matérialisé par un trait constitué des cinq points de la matrice. Mais divers autres essais

Fig 66

ont été réalisés pour déterminer si d’autres options ne seraient pas plus avantageuses. Par exemple celui de la Fig.66 B aurait remporté notre faveur pour des raisons esthétiques. Constitué de trois points au lieu d’un trait, le pixel produit une courbe plus homogène sur le plan visuel. Il y a un peu « tromperie », car on pourrait penser que chaque point correspond à une valeur affichée, alors que dans la réalité la finesse est cinq fois moins bonne. Peu importe, c’est l’effet visuel qui aurait emporté notre suffrage. Les manipulations nombreuses, tant pour faire émerger des options que pour développer le programme ont assez rapidement démontré que les deux options A et B engendraient une difficulté d’interprétation. Il restait délicat de savoir si l’on avait correctement dosé le niveau d’entrée du signal pour bénéficier des huit ou des seize niveaux. Déjà que la définition est faible, si l’on en exploite pas toute la plage le résultat devient bien tristounet. Autre difficulté :

En « double définition » il était tout aussi difficile de situer la mi-hauteur du graphe, alors que sur les graduations des oscilloscopes performants cette entité est toujours largement mise en évidence.

C’est la raison pour laquelle la solution définitive opte pour un compromis qui va employer les deux modes de représentation. Les pointillés pour les niveaux intermédiaires, et les traits pleins pour les extrêmes. Vous pouvez constater sur la Fig.65 que la zone graphique est exploitée sur toute sa hauteur. (Pixels continus en haut et en bas.) Par exemple sur la Fig57 B seule l’alternance négative va à pleine échelle, pas celle du haut. Bénéfice « colatéral » : Au centre les pixels continus permettent de bien mettre en évidence la moyenne du signal visualisé. Adoptée la « mixture » !

Fonctionnalités à assurer et stratégie d’utilisation des deux B.P.

Arriver à dégager une procédure d’utilisation qui soit simple, facile à mémoriser, et qui couvre toutes les options avec seulement deux boutons n’a pas été une sinécure. Bien des essais infructueux ont été mis en oeuvre pour arriver à trouver des protocoles acceptables. C’est un peu comme le cuisinier qui doit rédiger sa carte des menus, avec une ligne réservée pour chaque plat, un grand nombre de spécialités et… seulement deux lignes de disponibles sur l’ardoise. Pour comprendre l’approche qui a été retenue, suite à de nombreuses manipulations, nous allons commencer par établir la liste des options, sachant qu’en standard on ne dispose que de trois lignes pour notre « menu à la carte ». Par ailleurs, simplicité et convivialité d’utilisation restent au sommet de la hiérarchie.

x * Sortie de la fonction bouclée. (Impératif de base !)

x * Augmenter la valeur de la base de temps.

x * Diminuer la valeur de la base de temps.

x * Passer en simple ou double définition sur l’écran LCD.

x * Déplacer la fenêtre d’écran dans la mémoire d’échantillonnage.

x * Inverser le sens de déplacement de la fenêtre d’écran dans la mémoire d’échantillonnage.

x * Déclencher une nouvelle numérisation de 128 mesures en entrée E.

Soit minimum sept fonctions pour trois options possibles : Trouvez l’erreur !

Premier artifice pour « économiser » la touche FC+ long : Utiliser l’entrée A2 pour provoquer la sortie de l’OSCILLOSCOPE numérique. Quand on voudra quitter la fonction bouclée, il suffira de réunir un court instant l’entrée 100Ω à 150kΩ à la masse, l’entrée A2 étant surveillée en permanence. La quadrature du MENU revient maintenant à gérer six fonctions avec seulement deux boutons poussoir. Le deuxième artifice consiste à pouvoir alterner entre deux modes de fonctionnement par le truchement d’un clic long sur FC+ :

* Mode Gestion base de temps et choix entre simple et double définition.

* EXPLOITATION permet de déclencher des séquences de numérisation.

Le tableau donné ci-dessous résume la combinatoire des touches.

L’expérience montre qu’il s’avère vraiment utile de pouvoir disposer d’une grande variété de valeurs pour l’ajustement de la base de temps ce qui permet à loisir de visualiser une période complète du signal sur une fenêtre d’écran. Les valeurs possibles sont :

Visant à pouvoir sélectionner rapidement la valeur désirée, des clics courts sont choisis avec recirculation entre les extrémités des plages de valeurs possibles. (Cadre orange dans le tableau.) Pour rendre l’exploitation commode, une fois que la base de temps est ajustée, un clic court sur FC+ déclenche une séquence de numérisation avec passage automatique à la visualisation sous la forme qui a été imposée par FC- long en mode Gestion. En mode Exploitation la touche FC- long alterne le sens de déplacement de la fenêtre de visualisation dans la mémoire d’échantillonnage. Il reste encore à déterminer l’amplitude des déplacements de la fenêtre d’écran dans l’espace de stockage des valeurs mesurées. Pour pouvoir interpréter ce que montre l’écran LCD

Fig 67

 il importe d’effectuer des sauts avec recoupement, pour assurer une « continuité » dans les observations.

Par ailleurs, un déplacement « octet par octet » serait certainement progressif, mais d’une lenteur désespérante. Suite à divers essais, déplacer de huit octets à chaque saut semble correspondre au meilleur compromis. À chaque décalage d’un « demi écran », la moitié du graphe précédent restera à gauche ou à droite et permet de faciliter l’interprétation du tracé présent à l’affichage. (Voir la Fig.67 ci-dessus) En quinze clics sur FC- court on balaye l’intégralité d’un groupe de mesures, un nombre de « manipulations » parfaitement acceptable.

Synchronious or not synchronious : That is question.

L’absence de synchronisation lors du déclenchement des échantillonnage engendre une difficulté d’interprétation des images assez intolérable. Sur un oscilloscope « cathodique », le but de la synchronisation consistait à obtenir une image stable sur les luminophores. En numérique, pas de problème, la stabilité est absolue et l’on pourrait penser que synchroniser n’est plus vraiment d’actualité. Force est de constater qu’il n’en est rien : En général, l’oscilloscope est mis en batterie pour aider à la mise au point d’un montage électronique sur lequel on procède à des ajustements.

Chaque manipulation est suivie d’une observation pour en déduire les effets. Comment interpréter deux images totalement différentes, même quand le signal n’a strictement pas changé ?

Fig 68

Par exemple sur la fig.68 il n’est pas évident du tout qu’il s’agit en A et en B strictement du même signal échantillonné à deux instants différents de la période. Et encore, manifestement une sinusoïde pure émerge de cette « pixellisation ». Si nous avions un signal « rectangulaire » codé de type Baudot ou un signal série ASCII, retrouver le bit de start ou le bit de stop deviendrait mission impossible. On ne peut comparer que ce qui est comparable.

Pour pouvoir interpréter aisément les écrans de l’oscilloscope, il faut impérativement déclencher les mesures à un instant précis de la période, et ce sur chaque groupe de numérisation lors de saisies successives. C’est précisément le rôle de la SYNCHRONISATION sur un appareil d’enregistrement numérique.

SYNCHRONISER suppose que l’on doit définir au préalable le seuil de la tension en entrée E qui déclenchera la numérisation. L’amplitude du signal injecté pourra varier dans des proportions importantes. Si « l’onde » présente ne franchit pas le seuil de comparaison, l’écran LCD restera figé donnant l’impression d’un appareil en panne. Notez que si une telle situation se présente, on en sort facilement en validant sur E la tension continue variable et en balayant toute la plage de 0 à 5Vcc disponible avec le potentiomètre. On franchira forcément le seuil puisque le signal en entrée est en principe compris dans cette plage de valeurs. (Notez au passage qu’il faudra peut être faire varier la tension continue dans les deux sens possibles vu que le déclenchement ne se fait pas sur un seuil, mais sur une transition que l’on doit prédéfinir.)

 Synchroniser, une question de seuil et de sens de franchissement.

Passer une frontière correspond à un franchissement, de même que transiter par la porte d’une prison. Il semble assez évident que le sens dans lequel on traverse ce seuil n’aura vraiment pas des conséquences analogues. C’est exactement pareil quand on désire synchroniser. Par exemple, sur la Fig.68 B le seuil de déclenchement est repéré par les pixels jaunes. On constate immédiatement que si l’on numérise à partir de la transition descendante X (La numérisation est symbolisée par la flèche verte et jaune.) le graphe à l’écran sera totalement différent de celui d’un échantillonnage en débutant à la transition montante Y. L’option d’ajustement des préférences de SYNCHRONISATION devra permettre de définir divers seuils et le sens de transition. Comme toutes les possibilités d’usage commode des deux boutons poussoir ont été exploitées jusqu’à la trame, il faut trouver un autre artifice pour concrétiser cette option qui n’est pas spécialement anodine puisqu’elle va engloutir environ 798 octets de programme et 65 octets dans la mémoire dynamique soit 3% de cette dernière.

On arrive à un taux d’occupation de 89% pour le programme. Pour les données dynamiques, 77% sont atteints ce qui provoque un message d’alerte par le compilateur. Nous voulions « rentabiliser » notre ATmega328, c’est largement le cas.

Fig 69

Passons en revue les pistes qui ont conduit à ajouter la possibilité de synchroniser sans pour autant remettre totalement en cause les options du tableau donné dans ce qui précède. Notons au passage que pouvoir déclencher sans synchronisation est une option indispensable. Quelle que soit l’amplitude (Ou l’absence pure et simple du signal.) de l’onde en entrée E le déclenchement manuel engendrera une trace sur l’écran LCD. Il sera ainsi facile d’estimer la valeur du seuil qu’il faudra consigner en synchronisation pour avoir une quasi certitude d’échantillonnage sans avoir à utiliser l’artifice de superposition d’une tension continue en E pour provoquer la fuite d’une situation sans issue.

Synchronisation ajoutée aux options de l’oscilloscope.

Vouloir conserver intégralement les options précisées dans le tableau précédent était possible et a été testé avec le programme P06_Oscillographe.ino par l’approche décrite sur l’organigramme Fig.69 qui montre que l’appel à la fonction oscilloscope se faisait en deux étapes.

Quand dans le MENU de base on validait la fonction oscilloscope, une séquence initiale permettait de sélectionner les critères de synchronisation. Puis, en sortant de cette phase préliminaire on passait dans la fonction bouclée proprement dite. C’était simple sur le plan informatique, mais pas du tout acceptable sur le plan opérationnel. En effet, dès que le signal en entrée E change d’amplitude, il convient de revoir les consignes de synchronisation. Cette manipulation n’était possible qu’en quittant la fonction bouclée ce qui ramenait à la racine du MENU de base. Puis en circulant dans ce dernier, il fallait revenir à l’item OSCILLOSCOPE et le valider : INVIVABLE ! Le logiciel a été entièrement « remanié » pour aboutir à la structure montrée sur la Fig.70 qui à l’usage s’avère très conviviale.
Un clic long sur FC+ fait passer au deux menus de configuration qui s’enchaînent. Pour des raisons d’homogénéité et de facilité de mémorisation, la sortie de ces sous-menus se fait par FC+ long. Les trois autres possibilités dans la combinatoire d’usage des boutons poussoir servent à gérer le mode nommé EXPLOITATION et précisé dans le tableau des fonctions. Dans le menu de configuration l’option relative à la BASE de TEMPS reprend les commandes qui étaient affectées au mode GESTION.

Le tableau donné ci-dessous résume les diverses options pour les deux modes qui s’enchaînent, suite à une action sur FC+ long. 

Fig 71

Choix des Seuils de Synchronisation.

Tout un éventail de valeurs sont possibles, sachant que la tension qui est traitée à partir de l’entrée E ne peut varier qu’entre 0 et +5Vcc et que sa transposition par le CAN couvre la plage [0 à 1023]. Il faut trouver un compromis entre un nombre pas trop important d’options et des valeurs de Seuil suffisamment réparties pour couvrir globalement les besoins. Il est inutile d’exagérer dans la finesse, car à la valeur du seuil sera affectée deux écarts en plus et en moins pour surveiller la transition consignée, tout en laissant une marge pour diminuer l’influence « du bruit ». Par ailleurs, on peut estimer qu’un signal appliqué devra présenter une amplitude suffisante pour conduire à un graphe différent d’une vulgaire trace horizontale. La Fig.71 donnée ci-contre va nous servir de support pour détailler les choix effectués ainsi que le principe de fonctionnement de la synchronisation.

Coté colorié en rouge sont portées les valeurs des tensions qui seront « hors débordement » comprises entre 0 et +5Vcc. Coté teinté en violet les valeurs qui résultent de la numérisation de l’entrée E. Cinq valeurs de seuil sont sélectionnables. Envisageons la plus faible par exemple correspondant à +0,5V. Sa numérisation correspondra à valeur entière de 102. À ± 50 on situe les deux critères de décision pour détecteur la transition souhaitée. Supposons que c’est la transition descendante qui est consignée. Le logiciel attend la présence d’un état « 1 » caractérisé par E > 102 + 50. Dès qu’une numérisation donne plus de 152 le programme va attendre un état « 0 » qui sera détecté quand E devient < 10250. Dès qu’une numérisation donne moins de 52 la comparaison déduit qu’une transition descendante vient de se produire et déclenche la séquence d’échantillonnage. Notez que la marge de ± 50 pour parer les parasites correspond à un signal qui présentera une amplitude d’à peine deux pixels.

Quelques aspects logiciels.

Sans spécialement chercher à « botter en touche », analyser dans les plus menus détails le programme qui émule ce petit oscilloscope, serait inopportun et ce pour plusieurs raisons. En premier, le listage du source ne fait appel qu’à des instructions déjà largement rencontrées et explicitées. On peut affirmer qu’il s’agit de programmation basique. Par ailleurs, le listage est abondamment commenté et les divers modules sont « empaquetés » dans des procédures dont l’identificateur est explicite. Il vous suffira de comparer le listage de P06_Oscillographe.ino avec l’organigramme de la Fig.70 pour établir aisément les liens entre la structure logicielle et les instructions traduites en langage C. Par contre, il nous semble pertinent de justifier la valeur de la plus faible base de temps de 200μS (0,2mS.) qui limite la fréquence de saisie des valeurs à 5000 Échantillons par seconde. Vous vous doutez que cette limite est incontournable… il reste à la justifier.

Échantillonner consiste à parcourir une boucle le plus rapidement possible qui, comme montré sur la Fig.72 est précédée de certaines initialisations. Les préalables (1) et (2) n’ont rien d’urgent, on peut y consommer du temps. Mais une fois avoir détecté le franchissement du front désiré en (3) il faut procéder immédiatement à la saisie en « rafale » des échantillons si l’on veut que

Fig 72

le premier pixel corresponde bien au signal qui suit la transition. C’est la raison pour laquelle les initialisations (1) et (2) sont placées avant (3).

Le calcul de la valeur de TBT en (2) pourrait se faire dans la boucle, mais comme cette donnée sera identique pour toutes les saisies, autant l’évaluer hors « circuit » pour en minimiser le temps.

La boucle au code optimisé commence par tester si la mémoire d’échantillons est pleine. Si ce n’est pas le cas, l’entrée E est mesurée avec le CAN. En (4) nous effectuons la transposition des valeurs issues de la saisie numérique en proportion allant de 1 à 16 pour la plage de « pixellisation ». Il est assez évident que ce calcul pourrait être effectué plus tard, juste au moment de visualiser. Le placer dans la boucle que l’on cherche à minimiser ne semble pas judicieux… et pourtant c’est pertinent. Le test avec périodemètre a été réalisé avec les deux approches. C’est la transposition « dans la boucle » qui conduit à la meilleure optimisation. Pourquoi donc cette apparente contradiction ? (Voir plus avant)
Certes, effectuer la transposition prend du temps. Mais les valeurs à stocker seront des bytes. Si on ne transpose pas, on gagne le temps du calcul. Par contre, la mémoire d’échantillonnage prendra deux fois plus de place dans la RAM dynamique, car les valeurs seront des entiers. Stocker un entier prend deux fois plus de temps. Incrémenter le pointeur aussi. Au final, le gain de temps ne permet pas de diminuer la BASE de TEMPS à 100μS et gaspille de la RAM dynamique. Ce qui semblait une mauvaise piste s’avère finalement la meilleure solution. Pour mesurer objectivement le Temps de SAISIE, la technique courante est détaillée plus avant. (Les mesures ont été faites avec un appareil de mesure de laboratoire dont la précision garantie est d’une μS.) Conclusion : Optimiser une séquence de programme revient à chercher la meilleure solution pour chacune de ses étapes en envisageant si possible l’éventail le plus large des pistes à expérimenter. En particulier, optimiser la taille des données est la première étape à traiter.
C’est en définitive dans les étapes (5) et (6) que le temps consommé dans le calcul (4) est largement compensé. Il est également légitime de se demander pourquoi on perd « bêtement » du temps processeur par le délai TBT en (7) alors que l’on cherche désespérément à minimiser le temps passé dans la boucle. La réponse réside dans l’agrément d’utilisation de notre oscilloscope. Si l’on veut pouvoir interpréter facilement la durée de chaque pixel, il faut impérativement que cette dernière (En fait la BASE de TEMPS) soit constituée d’un intervalle de temps « entier ».

Mesurer avec précision la grandeur du Temps de SAISIE conduit à une valeur de 169μS par échantillon mesuré. La plus petite BASE de TEMPS pour sélectionner une valeur « ronde » sera donc de 200μS. L’ajustement à effectuer avec TBT sera de 200 – 169 = 31μS. Nous pourrons par conséquent utiliser delayMicroseconds(TBT); qui respectera les critères de précision précisés dans la documentation. Il ne faut en effet pas oublier que le paramètre pour cette instruction spécifique doit rester supérieur à 3 et inférieur à 16383. Pour minimiser la valeur de Temps de SAISIE il faut impérativement s’imposer en (7) une instruction unique. La plus grande BASE de TEMPS possible avec delayMicroseconds(TBT); sera théoriquement de 16,383μS. C’est la raison pour laquelle on limite à 15mS la plus grande lenteur d’échantillonnage. Avec ce paramètre la fréquence de saisie d’échantillons est de 66,7Hz. Pour remplir la mémoire à cette cadence il faut 128 * 15 = 1920mS soit pratiquement deux secondes. Si pour une quelconque raison une application imposait que vous fassiez de l’échantillonnage très lent, par exemple un par seconde, par heure, par jour etc., il suffirait de remplacer delayMicroseconds(TBT); par delay(Forte valeur); et le mini laboratoire remplirait à nouveau sa « mission universelle ».

Dans cette équation l’identificateur Temps_par_Ech représente la valeur actuelle de la BASE de TEMPS exprimé en mS. On le multiplie par 1000 pour passer en μS, les unités manipulées par l’instruction delayMicroseconds. Notez que pour nous assurer que ce calcul retournera un entier, on force le format du résultat avec la directive int(…).

« BANDE PASSANTE » et maitrise de l’oscilloscope.

Chaque appareil de mesure impose des protocoles d’utilisation, c’est une évidence. Force est de constater que certains sont d’un usage élémentaire. Par exemple un voltmètre, pour peu que vous ayez choisi le bon calibre et connecté les pointes de touches aux bons endroits, en général vous obtenez une valeur fiable. On suppose ici que l’impédance d’entrée est élevée, qu’il n’y a pas de problème de parallaxe etc. En revanche, l’utilisation d’un oscilloscope est plus délicate et impose bien plus d’expérience. Surtout avec un enregistreur numérique, car plusieurs phénomènes peuvent amener à la visualisation d’une trace qui n’a rien à voir « géométriquement » avec la représentation exacte de l’onde désirée. La Fig.73 en est un exemple typique. En A la trace à l’écran ressemble à une sinusoïde amortie, comme elle serait produite par la fin d’une note sur un piano. En B au contraire la sinusoïde augmente progressivement d’amplitude, signal qui serait produit par le début d’une note sur une flûte traversière. En réalité, rien à voir. Il s’agit de la même sinusoïde d’amplitude constante issue de la tension alternative à la sortie d’un transformateur branché sur le secteur 50Hz.

Fig 73

B et C précisent les conditions de la saisie des échantillons. Les problèmes relatifs à l’utilisation des oscilloscopes numériques seront abordés dans le petit guide « Nos premiers pas avec le mini laboratoire« . Bien que ses caractéristiques soient modestes, ce petit oscilloscope nous a permis de défricher les notions d’échantillonnage, de fenêtre de visualisation et des problèmes de synchronisation. Il va également nous apprendre à bien gérer les paramètres pour la saisie des échantillons et à nous méfier du « numérique ». Un bilan qui n’a rien de tristounet, surtout si l’on prend en compte le fait qu’il ne nous coute que des octets dans une mémoire qui n’est pas encore saturée. Pas si mal que ça le petit « pixelliseur » à mémoire…

Mesurer avec précision la durée d’une séquence de programme.

Bien que traité dans ce chapitre relatif à la fonction oscilloscope, cette technique dont il a déjà été question lors de l’étude du périodemètre sera applicable d’une façon très générale, chaque fois qu’en programmation vous serez amenés à estimer le temps passé dans une boucle quelconque.

Évaluer le temps exigé pour échantillonner une valeur et la stocker en mémoire en est un exemple typique. C’était une nécessité pour choisir ensuite la plus petite BASE de TEMPS envisageable dans notre logiciel.  Dans ce qui précède nous avons trouvé l’affirmation péremptoire :

Étudions ici la technique utilisée qui sera toujours applicable avec votre Arduino, puisque maintenant vous possédez un Périodemètre ou un Fréquencemètre. L’idée de base consiste à ajouter deux instructions à la séquence bouclée. En début de cette structure on fait passer une sortie binaire quelconque à l’état logique « 1 ». Juste avant de boucler on force à « 0 » l’état de cette sortie. Le fréquencemètre ou le périodemètre branché sur la broche correspondante nous renseignera sur la durée critique. Cette procédure ajoute dans la boucle le temps processeur pour générer ces deux états. Il suffit de retrancher cette durée « parasite » pour avoir la valeur réelle. Pour évaluer cette durée « parasite », on ajoute quatre à cinq fois ces deux instructions dans la boucle et l’on réitère la mesure. Un simple calcul nous permet de déduire dans un premier temps la durée de boucle supplémentaire, puis par division, d’en calculer l’intervalle de temps unitaire.

Chaque fois que l’on consacrera un peu plus de temps à l’analyse, on aura une forte probabilité de trouver de meilleures solutions. C’est ce qui a été fait pour notre cas d’école. Au lieu de ralentir la boucle avec les instructions qui pilotent la sortie binaire, on s’est contenté de forcer à « 1 » l’état de la sortie en tout début des mesures, et de le faire redescendre à « 0 » à la fin des 128 échantillonnages. En divisant par 128 la durée complète, on obtient bien le temps passé pour chaque saisie et stockage, mais surtout on divise par 128 le temps de gestion de la sortie binaire. Du coup il n’est plus utile de chercher à en évaluer la grandeur pour la retrancher de la durée mesurée.
Dans notre cas l’impulsiomètre mis en œuvre indiquait 21615μS pour la mémorisation complète.
On en déduit facilement que T = 21615 / 128 = 168,87 arrondi à 169μS la valeur annoncée.

Observez que pour avoir le temps « brut », l’instruction de temporisation delayMicroseconds(TBT); a été enlevée de la boucle de saisie des valeurs numérisées.
CONCLUSION : Pour accélérer la procédure en éliminant l’instruction map(…); une tentative à consisté à passer les échantillons en type int au lieu de byte puisque le CAN délivre des valeurs supérieures à 255. On double de ce fait l’espace mémoire empiété dans la RAM des données dynamiques. On double également les temps pour stocker et pour incrémenter le compteur. La durée pour 128 échantillons diminue à 14351μS. 14351 / 128 = 112,12 soit 113μS par échantillon. Cette valeur étant plus grande que la durée « ronde » inférieure de 100μS comme BASE de TEMPS minimale et n’est donc pas utilisable. Cette technique ne permet pas de passer en dessous de 200μS et a été abandonnée au profit de l’adoption de map(…); qui permet de diviser par deux la taille de RAM dynamique réservée pour la mémoire d’échantillonnage. C’est toujours ça de gagné …

>>> Page suivante.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *