- Conversion analogique numérique avec un microcontrolleur


Rappel sur les réseaux RC

Charge ou décharge d'un condensateur C au travers d'une résistance R vers une tension Vc, tension de démarrage = V0

V = Vc + (V0-Vc) Exp(-t/RC) ; si t=0, V = V0 ; si t=infini, V= Vc

Cas particuliers :

Charge en partant de V0=0 ; V = Vcc (1 - Exp(-t / RC) )

Décharge en partant de V0 vers la masse ; V = V0 . Exp(-t / RC)


Mesures de tensions

Application avec un PIC par exemple, qui dispose d'une entrée Trigger Schmitt (appelée ici In ST) dont on sert comme entrée de mesure.

La charge et la décharge se passe sur Req = Rref * Rx / ( Rref + Rx )

 

Décharge IO=0,

Asymptote V0=Vx*Req/Rx, et il faut que V0 soit inférieur à Vth0
Vth0-V0 = (Vth1-V0) Exp(-td/ReqC)

Charge IO=Vcc,

Asymptote V1 =V0+Vcc* Req/Rref, et il faut que V1 soit suférieur à Vth1
Rref - V1 = (Vth0-V1) Exp(-tc/ReqC)

Ces 2 contraintes sont identiques et imposent Rx > 5.7 Rref avec Vth1 =0.85 Vcc et Vth0 = 0.15 Vcc avec un PIC

 

Le rapport des 2 temps tc /td est variable avec Vx, alors que la fréquence de fonctionnement est à peu près constante.

Néanmoins, cette solution élégante n'offre pas d'indépendance suffisante avec Vcc et les seuils Vth

 

Mesures de tensions

Application avec un PIC par exemple, qui dispose d'une entrée Trigger Schmitt (appelée ici In ST) dont on sert comme entrée de mesure.

Une sortie du microcontrolleur est utilisée pour pouvoir déconnecter l'entrée.

 


Mesure grossière de résistances

La broche est mise à 1, la capacité se charge à VDD, une tempo est enclenchée pour s'assurer que le niveau est atteint.

Puis un compteur est remis à zéro et la broche est mise en entrée. On boucle sur elle tant que le compteur est non nul, ou que la broche passe au niveau 0 (en dessous de Vil).

Vil/Vdd = exp(-t/RC), avec un seuil à 15% (PIC), on a la relation T = RC * 1.89

 

R min : 5 k pour ne pas avoir trop de courant qui passer lorsque la broche est à 1
R max : <200 x Rmin pour bénéficier de la gamme offerte par un compteur sur 8 bits
R max est aussi conditionné par le courant de fuite de l'entrée ; la spec est de +/- 1µA sur un PIC
RC min : doit être égale à 2 ou 3 fois la durée de la boucle minimale

 

Si la durée de boucle de scrutation est de 5µs,
on prendra C = 1nF, Rmin=5k et Rmax = 1M variable

 

CLRF RCcount; count = 0

RCloop ; la durée de la boucle est de 5µs

DECFSZ RCcount,1 ; count --

BTFSS IO_RC; si count >0, est-ce IO_RC est à 0 (< Vil)?

GOTO RCout ; IO_RC vient de passer le seuil, ou count=0 time out

GOTO RCloop ; IO_RC=1 on continue à boucler

RCout

; ici si count=0, on est en time out, la broche est coincée à 1,

; ou la résistance de décharge est trop grande

MOVLW 0xFF ; RCcount = -RCcount

XORWF RCcount,1

INCF RCcount,1

 


Comparaison de résistances

Application avec un PIC par exemple, qui dispose d'une entrée Trigger Schmitt (appelée ici IO 3) dont on sert comme entrée de mesure, mais aussi comme sortie pour charger rapidement la capacité à l'aide d'une résistance R0 faible (1 à 10 k) et fixe.

La résistance à mesurer est Rx

La résistance de référence est Rref 

 

L'algorythme est simple et direct :

V = Vcc . Exp(-t / RC)
Tref = Rref . C . Ln(Vcc/Vth0)
Tx = Rx . C . Ln(Vcc/Vth0)

  1. Charge de C, en mettant les IO à Vcc simultanément

  2. IO1=in, IO2=1, IO3=in

  3. IO2=0, décharge de C au travers de Rref

  4. Mesure du temps Tref nécessaire pour arriver à IO3=0

  5. Charge de C, en mettant les IO à Vcc simultanément

  6. IO1=1, IO2=in, IO3=in

  7. IO1=0, décharge de C au travers de Rx

  8. Mesure du temps Tx nécessaire pour arriver à IO3=0

 

A la fin de ce processus on dispose de 2 temps Tref et Tx dont les rapports sont indépendants de C et des tensions. Rx = Rref . Tx / Tref

Avec un PIC12C50x, Vth0 est spécifié à 15% de Vdd, donc le facteur Ln(Vcc/Vth0) vaut 1.9

Dans ces conditions, et avec un condensateur de 100 nF, la durée Tref ou Tx peut valoir :

 

Résistance

10

100

1k

10k

100k

1M

Temps @100 nF

1.9 µs

19 µs

190 µs

1.9 ms

19 ms

190 ms

Temps @10 nF

0.19 µs

1.9 µs

19 µs

190 µs

1.9 ms

19 ms

 

Les points importants sont :