Charge ou décharge d'un condensateur C au travers d'une résistance R vers une tension Vc, tension de démarrage = V0
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)
|
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,
Charge IO=Vcc,
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
|
|
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.
|
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, |
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
|
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 :
|
|
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 |
|
|
|
|
|
|
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 :
|
|
|
|
|
Measure: |
CLRF measL |
; reset low |
||
CLRF measH |
; reset high |
|||
check_input: |
BTFSS GPIO,input |
; test IO input, skip if one |
|
|
..RETLW 0 |
; input has just passed threshold, return |
|||
input_is_one: |
INCF measL,F |
; increment low order measure byte |
|
|
BTFSS STATUS,Zero |
; overflow ?? |
|
| |
|
..INCFSZ measH,F |
; increment high order measure byte |
| |
|
GOTO check_input |
; goto next loop |
|
|
|
; traitement d'un overflow.... |
; overflow global |
||
|
|
|
|
|