vendredi 4 juillet 2014

LPC810, partie 9, comparateur analogique

Dans cet article je discute du comparateur analogique. Celui-ci possède une référence de voltage programmable sur 32 niveaux. Dans le démo j'utilise cette référence programmable pour créer un convertisseur analogique/numérique avec un résolution de 5 bits. Un potentiomètre est lu et sert à contrôler l'intensité d'une LED par PWM.

Le LPC810 possède 2 entrées analogiques, ACMP0_1 et ACMP0_2. L'entrée ACMP0_1 peut-être reliée à la broche 8 et l'entrée ACMP0_2 peut-être reliée à la broche 5. Cette liaison se fait par le registre LPC_SWM->PINENABLE0. Chacune de ces 2 entrées peut-être connectée soit à l'entrée positive, soit la négative du comparateur. C'est le registre LPC_CMP->CTRL qui sert à effectuer les branchements sur les entrées du comparateur. Dans le démo ci-bas, l'entrée ACMP0_1 est branchée sur l'entrée positive du comparateur. L'entrée négative du comparateur est reliée à la sortie de la référence de voltage programmable (Voltage ladder).

Un comparateur analogique fonctionne de la façon suivante, Il y a 2 entrées, une positive et l'autre négative. Lorsque le voltage sur l'entrée positive est plus élevé que celui sur l'entrée négative la sortie du comparateur est à 1 sinon elle est à 0. Le symbole d'un comparateur est le suivant:

Mais si les 2 voltages sont égaux? Les entrées des comparateurs sont conçues pour avoir ce qu'on appelle de l’hystérésis. L'idée est la suivante, supposons que l'entrée négative est branchée sur une référence de voltage fixe et que la positive est branchée sur un signal variable. Sitôt que l'entrée positive dépasse l'entrée négative la sortie du comparateur passe à 1. Mais à cause du bruit s'il n'y avait pas d'hystérésis la sortie pourrait commuter rapidement entre 0 et 1. Mais l'hystéris fait que l'entrée positive doit redescendre d'une certaine valeur avant que la sortie ne repasse à zéro. Le comparateur du LPC810 a une hystérésis programmable avec 4 valeurs possibles, 0mV, 5mV, 10mV et 20mV. Ces valeurs représentent la variation minimale de voltage entre les 2 entrées pour que la sortie commute à nouveau. Donc si on programme 20mV et que le voltage sur l'entrée positive monte jusqu'à ce que la sortie passe à 1. Ce voltage doit redescendre d'au moins 20mV avant que la sortie ne repasse à zéro.

Si le signal d'entrée est bruyant on utilise une hystérésis forte, s'il est propre on utilise une hystérésis faible. Dans le démo j'ai programmé l'hystérésis à 20mV. Mon calcul est le suivant, le potentiomètre est alimenté à 3 volts, 3/32 donne 94mV donc on peut utiliser l'hystérésis maximale sans perdre de résolution sur le potentiomètre tout en maximisant l'immunité aux interférences.

Un convertisseur A/N improvisé

Le LPC810 n'a pas de convertisseur A/N mais on peut en improviser un en utilisant le comparateur et la référence de voltage programmable. Ce convertisseur n'a qu'un résolution de 5 bits étant limité par la résolution du voltage ladder.

Voici comment fonctionne le convertisseur à 5 bits. On commence par programmer le voltage ladder à sa valeur médiane. Si la sortie du comparateur est à 1 c'est que le voltage sur l'entrée positive est supérieur à 1,5volt, sinon il est inférieur à cette valeur. On change la valeur de référence en fonction de l'état de sortie du comparateur. Si la sortie est à 1, on programme le voltage ladder à la position médiane entre 1,5 volts et 3 volts. Si la sortie du comparateur est à 0 on programme le voltage ladder à la position médiane entre 0 volt et 1,5 volts. On vérifie encore la sortie du comparateur et chaque fois que c'est à 1 on augmente le voltage du voltage ladder de la moitié de l'intervalle restant. Par cette division binaire de l'intervalle restant on obtient un résultat avec 5 comparaisons. Cette technique de conversion A/N s'appelle convertisseur à approximations successives. C'est le type de convertisseur le plus souvent utilisé sur les MCU. Le nombre de comparaisons nécessaires est le nombre de bits de résolution du convertisseur, 8,10 ou 12. Ce type de conversion est plus rapide que le sigma-delta ou les convertisseurs à pente.

Schématique du montage

Code source du démo

utilisation des resssources

  • La LED est branchée sur PIO0_2 (broche 4).
  • Le bras mobile du potentiomètre est branché sur PIO0_0 (broche 8) qui est utilisé en mode analogique.
  • Le canal 1 du MRT (Multi Rate Timer) est utilisé pour générer une interruption 50 fois par seconde.
  • Le module SCT est utilisé pour générer un signal PWM dont le rapport cyclique est contrôlé par le potentiomètre. La sortie COUT0 du SCT est reliée à PIO0_2 et contrôle l'intensité de la LED.
  • Le comparateur analogique avec la référence programmable est utilisé comme convertisseur A/N à 5 bits pour lire le potentiomètre.

C'est la fonction read_pot() qui implémente le convertisseur A/N. La fonction main() ne fait qu'initialiser les périphériques.

Une fois que le module SCT est configuré pour généner un signal PWM à une fréquence 200 hertz le MCU est mis en mode sleep. En mode sleep le PWM continu à fonctionner mais le core M0+ est arrêté. Le module MRT est utilisé pour générer une interruption 50 fois par seconde. Le gestionnaire d'interruption MRT_IRQHandler() fait une lecture du potientiomètre et ajuste le rapport cyclique du PWM en fonction de cette lecture. A la sortie du gestionnaire d'interruption le MCU retourne en mode sleep. l'instruction __WFI() est une macro pour l'instruction en assembleur wfi Wait For Interrupt. Cette instruction suspend le core jusqu'à ce qu'il y est une interruption.


Liens vers les articles précédents:

  1. Introduction au LPC810 (ARM M0+)
  2. LPC810, partie 2, anatomie
  3. LPC810, création d'un projet
  4. LPC810, partie 4, programmation
  5. LPC810, partie 5, module SCT et PWM
  6. LPC810, partie 8, pong