jpparisy
Patibulaire mais presque
Un potentiomètre est un autre périphérique d'entrée utilisable par un MCU. Il se présente sous diverses formes, tailles et types. En voici quelques exemples :
C'est une résistance variable avec trois bornes, les deux bornes extérieures de la résistance sont reliées à une source de tension, la borne centrale est relié à un curseur, permettant de délivrer une tension variable en fonction de la position du bouton de commande.
Le type qui nous intéresse pour nos applications est le type linéaire, qui délivre sur le curseur une tension proportionnelle à la position angulaire. Nous utiliserons un modèle ayant une résistance comprise entre 5 et 50 kOhms.
La tension aux bornes peut ne pas être strictement proportionnelle, il s'agit, là encore, d'un dispositif électro-mécanique et il peut aussi y avoir, en plus, des variations d'un modèle à l'autre dans une même série.
Pour lire la tension présente sur le curseur, nous allons utiliser un convertisseur analogique vers numérique (ADC), présent dans la plupart des MCUs.
Nous allons brancher les bornes extérieures du potentiomètre entre le 0 V et le + V et le curseur sur une entrée analogique du MCU.
Le principe étant le même pour la plupart des MCUs, je vais utiliser le PIC 12F675 pour les explications. La précision maximum du convertisseur de ce circuit est de 10 bits, soit une valeur variant de 0 à 1023. Il dispose de quatre entrées analogiques, mais d'un seul circuit de conversion, ce qui oblige à lire les entrées les unes après les autres.
Dans l'exemple, je vais n'utiliser qu'une seule entrée, appelée AN0 qui se trouve sur la broche GP0.
Pour commencer, il faut initialiser le convertisseur :
C'est une résistance variable avec trois bornes, les deux bornes extérieures de la résistance sont reliées à une source de tension, la borne centrale est relié à un curseur, permettant de délivrer une tension variable en fonction de la position du bouton de commande.
Le type qui nous intéresse pour nos applications est le type linéaire, qui délivre sur le curseur une tension proportionnelle à la position angulaire. Nous utiliserons un modèle ayant une résistance comprise entre 5 et 50 kOhms.
La tension aux bornes peut ne pas être strictement proportionnelle, il s'agit, là encore, d'un dispositif électro-mécanique et il peut aussi y avoir, en plus, des variations d'un modèle à l'autre dans une même série.
Pour lire la tension présente sur le curseur, nous allons utiliser un convertisseur analogique vers numérique (ADC), présent dans la plupart des MCUs.
Nous allons brancher les bornes extérieures du potentiomètre entre le 0 V et le + V et le curseur sur une entrée analogique du MCU.
Le principe étant le même pour la plupart des MCUs, je vais utiliser le PIC 12F675 pour les explications. La précision maximum du convertisseur de ce circuit est de 10 bits, soit une valeur variant de 0 à 1023. Il dispose de quatre entrées analogiques, mais d'un seul circuit de conversion, ce qui oblige à lire les entrées les unes après les autres.
Dans l'exemple, je vais n'utiliser qu'une seule entrée, appelée AN0 qui se trouve sur la broche GP0.
Pour commencer, il faut initialiser le convertisseur :
Code:
TRISIO = 0b000001; // GP0 as input, all other as outputs
ANSELbits.ANS = 0b0001; // use AN0 (GP0) as analog input
ANSELbits.ADCS = 0b101; // duration of analog sampling time set to Fosc / 16 (4 usec)
VCFG = 0; // voltage reference for analog input is VDD
ADFM = 1; // conversion result right justified
- TRISIO est le registre qui indique les ports (analogiques ou numériques) utilisés en entrée ou en sortie.
- ANSELbits.ANS permet de définir de 1 à 4 entrées analogiques utilisées.
- ANSELbits.ADCS définit le temps que va durer la conversion, plus ce temps sera élevé, plus la conversion sera précise.
- VCFG indique la tension de référence à utiliser. J'utilise ici VDD (+ V). Quand cette tension sera présente sur la broche d'entrée, la valeur de la conversion sera au maximum (1023), quand il y aura 0 V sur la borne d'entrée, la valeur sera 0.
- ADFM indique comment le résultat est rangé en mémoire. La valeur convertie est rangée dans deux octets, si je veux utiliser les dix bits, je dois ranger le résultat à droite (deux bits dans le premier octet, les huit bits suivants dans le deuxième octet), par contre, si un résultat sur huit bits (de 0 à 255) est suffisant, je range le résultat à gauche et je n'utilise que le premier octet.
Code:
unsigned int get_ADvalue (unsigned char ADch)
{
unsigned int value;
ADCON0bits.CHS = ADch; // set analog channel
ADON = 1; // AD converter on
GO_nDONE = 1; // start of conversion
while (GO_nDONE); // wait for end of conversion
value = ADRESH << 8 | ADRESL; // get value on 10 bits
ADON = 0; // AD converter off
return value;
}
- ADCON0bits.CHS indique la broche à utiliser comme entrée.
- ADON met en route ou arrête le convertisseur.
- GO_nDONE démarre la lecture de la broche. Il repasse automatiquement à zéro lorsqu'elle est terminée.
Plutôt qu'attendre que la conversion soit terminée en utilisant une boucle, comme dans cet exemple, il est possible d'activer une interruption (ADIE) qui positionnera le bit ADIF lorsque GO_nDONE passera à zéro et activera le sous-programme d'interruption. - ADRESH et ADRESL sont les deux octets dans lesquels le résultat est rangé. Dans ce MCU, ils ne sont pas consécutifs en mémoire, ce qui oblige à utiliser cette expression barbare. Avec d'autres MCUs, on peut lire directement le résultat dans le registre ADRES.