Mesure de tension continue

Otus

Member
Bonsoir à tous

Je suis nouveau et je découvre les Picaxes...

Je voudrais pouvoir mesurer une tension évoluant de 0 à 50VDC.
Après adaptation par un pond diviseur, bien sur.

Mais je n'arrive pas à faire le programme.
Si quelqu'un pouvais m'aider se serait super.
Merci
 

BESQUEUT

Senior Member
Bonsoir à tous

Je suis nouveau et je découvre les Picaxes...

Je voudrais pouvoir mesurer une tension évoluant de 0 à 50VDC.
Après adaptation par un pond diviseur, bien sur.

Mais je n'arrive pas à faire le programme.
Si quelqu'un pouvais m'aider se serait super.
Merci
Programme minimaliste (mais votre CDC l'est aussi : que doit-on faire de la tension mesurée ?)
Code:
do
	readadc C.1,b0
	sertxd (#b0,13,10)
loop
 

Otus

Member
Bonjour
je voudrais afficher la tension de sortie d'une alim. sur un afficheur LCD.
Je sais faire ceci:
Code:
'Affichage de U de 0 à 50V

;tension var sur C.7
symbol U=w0						'Variable de la tension

'===== Directives de compilation ==========================
#picaxe 20x2						'Microcontrôleur utilisé : PICAXE-20X2
#no_data						'Pas de données en EEPROM
#terminal off						'Pas de terminal sur PC
   
; Initialisation LCD *********
serout C.0, N2400, (254,1)				'Effacement de l'afficheur LCD
serout C.0, N2400,("     ")				'Effacement du nombre
pause 50
U=0
;  Affichage texte ***********************     	       
serout C.0, N2400, (254,128)   				'Positionnement Ligne 0, Colonne 0
serout C.0, N2400,("Tension stabilisée")		'Affichage du texte   
do   
pause 50
; Affichage variable actualisée **********
readadc10 C.7,U
U= U*50/102*5   		  			;mise é l'échelle avec approximation    
bintoascii U,b7,b6,b6,b5,b4    				;2 chiffres avant la virgule et 2 aprés
serout C.0, N2400, (254,192)				'Positionnement Ligne 1, Colonne 0 
serout C.0, N2400,(b7,b6,",",b5,b4,"      Volts")	'Affichage de la tension
loop
[code]
Mais le résultat n'est pas bon.
J'ai fait un diviseur de tension par 5 en amont de mon entrée ADC.
Sur mon afficheur je lis bien la tension présente en C7 (broche 3 du 20x2), mais arrivé à 9.99 cela repasse à 0. Le chiffre des dizaines ne s'affiche jamais.
Mon afficheur est un "Axe133"

Merci de votre réponse
 

dje8269

Senior Member
Bonjour,

Faire un pont diviseur par 5 avec une tension max de 50V est une mauvaise idée , car vous aurez 10Volts sur le broche readadc ! . Le µC ne va certainement pas aimé ;
De plus il faudrait voir pour utilisé une tension de référence externe !
Car si vous utilisez le 5V d'alim du Picaxe comme référence, avec un pont diviseur par 5 vos valeurs seront forcement fausse . au minimum un pont diviseur par 10 je pense .

Mais attendez l'avis d'un expert.
 

BESQUEUT

Senior Member
Faire un pont diviseur par 5 avec une tension max de 50V est une mauvaise idée , car vous aurez 10Volts sur le broche readadc ! . Le µC ne va certainement pas aimer ; ... au minimum un pont diviseur par 10 je pense
Même avis !
En outre :
bintoascii U,b7,b6,b6,b5,b4
Pourquoi avoir répété b6 ?
Ne serait-ce pas plutôt :
bintoascii U,b8,b7,b6,b5,b4

U= U*50/102*5
est équivalent à
U=U*2500/1024
Pour 50V, vous aurez 5V en entrée du Picaxe, soit un readadc à 1023 et une lecture de 25V
Votre mise à l'échelle est également à revoir.

Merci d'encadrer votre code de balises [ CODE] et [/CODE] (Vous avez oublié le / dans la deuxième balise)
 
Last edited:

Otus

Member
Oui j'ai utilisé un multimètre, c'était bon.
Excusez moi pour la balise, je ne suis pas habitué
 

BESQUEUT

Senior Member
Oui j'ai utilisé un multimètre, c'était bon.
Excusez moi pour la balise, je ne suis pas habitué
Toutes mes excuses également :
dans ma précipitation à donner une réponse, j'ai oublié de vous souhaiter la bienvenue !

Pour la suite, ce n'est pas nécessaire d'échanger des excuses : vous avez clairement indiqué être débutant, donc c'est normal de ne pas tout savoir...
Quid du diviseur, du bintoascii et de la mise à l'échelle ?

Effectivement, il n'y a aucun "miracle" :
avec un diviseur par 5, quand vous atteignez 25V, il y a 5V en entrée du PICAXE et le readADC va indiquer 1023.
Votre formule donne effectivement 2500 dans ce cas.
Le miracle, c'est juste que le PICAXE ait résisté si vous êtes allé au delà...
 

Otus

Member
En fait pour l'instant mon entrée ADC est un potar qui envoie une tension max de 5 volts sur l'entrée.
En vrais effectivement je ferais un diviseur par 10.
Je voulais simuler une tension de 25 volts, pour voir si ma multiplication par 5 fonctionnais
Mais arrivé à 9.99 volts je retourne à 0.01 ect...
J'ai mis 2 fois "b6" parceque en mettant b7,b6,","b5,b4 le logiciel me dis qu'il y a une erreur avec b7.
 

BESQUEUT

Senior Member
En fait pour l'instant mon entrée ADC est un potar qui envoie une tension max de 5 volts sur l'entrée.
Ca a sauvé votre PICAXE ! N'oubliez pas de diviser par 10 et non par 5 !
J'ai mis 2 fois "b6" parceque en mettant b7,b6,","b5,b4 le logiciel me dis qu'il y a une erreur avec b7.
Vous ne pouvez mettre que des variables après bintoascii. Par exemple :
bintoascii U,b8,b7,b6,b5,b4

(En outre, même si bintoascii acceptait une constante, la formule serait
bintoascii b7,b6,",",b5,b4)
 

Otus

Member
Pour la mise à l’échelle, j'ai calculé comme ceci:
10 bits = 1024
Donc pour 5 volts je divise par 1023, cela donne 0.004887 que j'arrondis à 0.049 * soit 49 après je divise par 102
 

BESQUEUT

Senior Member
j'ai mis ceci:
[ CODE]
bintoascii U,b7,b6,b6,b5,b4
[/CODE]
Merci d'enlever l'espace dans la première balise (je l'ai mis juste pour que la balise ne soit pas interprétée, mais il n'en faut pas !)
Avez-vous essayé avec :
bintoascii U,b8,b7,b6,b5,b4
 
Last edited:

Otus

Member
Oui je viens de le faire est cela fonctionne.
Merci beaucoup
Je poste mon nouveau code
Code:
;tension var sur C.7
symbol U=w0						'Variable de la tension

'===== Directives de compilation ==========================
#picaxe 20x2						'Microcontrôleur utilisé : PICAXE-20X2
#no_data							'Pas de données en EEPROM
#terminal off						'Pas de terminal sur PC
   
; Initialisation LCD *********
serout C.0, N2400, (254,1)				'Effacement de l'afficheur LCD
serout C.0, N2400,("     ")				'Effacement du nombre
pause 50
U=0
;  Affichage texte ***********************     	       
serout C.0, N2400, (254,128)   			'Positionnement Ligne 0, Colonne 0
serout C.0, N2400,("Tension stabilisée")		'Affichage du texte   
do   
pause 50
; Affichage variable actualisée **********
readadc10 C.7,U		
U= U*50/102*5   		  				;mise à l'échelle avec 

approximation    
bintoascii U,b8,b7,b6,b5,b4    			;2 chiffres avant la virgule et 2 aprés
serout C.0, N2400, (254,192)				'Positionnement Ligne 1, Colonne 0 
serout C.0, N2400,(b7,b6,",",b5,b4,"      Volts")	'Affichage de la tension
loop
 

Otus

Member
J'ai fait ce programme, mais c'est un peut par hasard car je ne comprend pas tout.
En tout cas merci beaucoup.
 

BESQUEUT

Senior Member
J'ai fait ce programme, mais c'est un peut par hasard car je ne comprend pas tout.
Bintoascii décompose un nombre vers chacun des chiffres qui le compose.
La valeur maximale est 65535 ce qui explique la présence de 5 variables destinées à recevoir les codes ASCII des 5 chiffres.
Mais dans votre cas, les tensions sont exprimées en centièmes de volts et la valeur maximale est 5000.
Donc la variable b8 contiendra toujours zéro et peut être ignorée.
Mais la syntaxe de bintoascii nécessite de fournir quand même 5 variables.
Si autre chose vous pose problème, n'hésitez pas à poser une nouvelle question.
 

Otus

Member
Merci de vos explications. Je commence à mieux appréhender la démarche de .... raisonnement...
Je fais un schéma de mon montage définitif et je le posterai sur le forum (enfin si j'y arrive!!!) pour que l'on me le valide par rapport à mon prog. définitif.
Merci encore de votre amabilité.
 

BESQUEUT

Senior Member
J'ai fait ce programme, mais c'est un peut par hasard car je ne comprend pas tout.
Remarque plus générale (et donc un peu hors sujet...)
Même s'il existe des générateurs aléatoires de programme (pour des usages bien précis...)
ce n'est en général pas une bonne idée de s'en remettre au hasard pour écrire un programme...
A contrario
appréhender la démarche de .... raisonnement...
et donc raisonner avant de programmer
est effectivement la voie à suivre.
 

Otus

Member
Test affichage U 07 08M2.jpg
Voila mon schéma
Et la mon programme:
Code:
;tension var sur C.4
;Résonnateur piezo sur C.2
symbol U=w0						'Variable de la tension

'===== Directives de compilation ==========================
#picaxe 08m2						'Microcontrôleur utilisé : PICAXE-08M2
#no_data						'Pas de données en EEPROM
#terminal off	
					                'Pas de terminal sur PC
sound C.2,(100,100)					'Sonorité aigue de 200 mS.

; Initialisation LCD *********
serout C.1, N2400, (254,1)				'Effacement de l'afficheur LCD
serout C.1, N2400,("     ")				'Effacement du nombre
pause 50
U=0
;  Affichage texte ***********************     	       
serout C.1, N2400, (254,128)   				'Positionnement Ligne 0, Colonne 0
serout C.1, N2400,("Tension stabilisée")		'Affichage du texte   
do   
pause 50
; Affichage variable actualisée **********
readadc10 C.4,U		
U= U*50/102*10  		  			;mise à l'échelle avec approximation    
bintoascii U,b8,b7,b6,b5,b4    				;2 chiffres avant la virgule et 2 aprés
serout C.1, N2400, (254,192)				'Positionnement Ligne 1, Colonne 0 
serout C.1, N2400,(b7,b6,",",b5,b4,"      Volts")	'Affichage de la tension
loop
 

BESQUEUT

Senior Member
Sur le schéma, il manque un pont de diodes sur l'alim.
Ce sera bien d'avoir une diode de protection contre les inversions de polarité sur l'entrée ana.
Pour le programme :
U= U*50/102*10
Si U=1023 alors U*50 =51150
U*50/102*10=5010 et vous affichez 50,10 V

1023 5010
1022 5000
1021 5000
1020 5000
1019 4990
1018 4990
1017 4980
1016 4980


Je propose :
U=U*50+16/32*40+16/32*10+2/4
qui devrait donner (sauf erreur de ma part) :
1023 4995
1022 4990
1021 4985
1020 4983
1019 4975
1018 4973
1017 4965
1016 4963

Ça me semble mieux, mais il doit exister plus simple en réfléchissant un peu plus...
 
Last edited:

BESQUEUT

Senior Member
U=U**64000*10+1/2
donne :
1018 4970
1019 4975
1020 4980
1021 4985
1022 4990
1023 4995

Nettement plus simple et plus conforme à la résolution attendue.
 

Otus

Member
Avec "U=U**64000*10+1/2", cela donne pour 50V en entrée une tension affichée de 49.95V, effectivement c'est mieux.
Mais pourquoi 2 * après le "U"?
 

dje8269

Senior Member
Je suis pas un expert met la diode de sécu me parait mal placée ?

De plus la zener de 4.7V n'empeche-t-elle pas la tension de dépasser 4.7V sur la patte analogique ? , ce qui fausse la mesure ? en fin de course ?.

Mais je dis peut être des bêtises ?
 

Otus

Member
La diode Zener est uniquement là si par un fabuleux hasard la tension mesurée dépassais 42Vots. 42 volts étant la tension max., pouvant normalement se retrouver à l'entrée ADC du µC.
En cas d'inversion de polarité sur l'entrée ADC la diode rapide BAT85 court-circuitera cette tension (Enfin j'espère), je rajoute une diode 1N4148 entre le l'entrée ADC et le +, anode vers l'entrée.
 

BESQUEUT

Senior Member
Avec "U=U**64000*10+1/2", cela donne pour 50V en entrée une tension affichée de 49.95V, effectivement c'est mieux.
Mais pourquoi 2 * après le "U"?
Non seulement c'est plus conforme, mais surtout la résolution est deux fois meilleure.
Pour l'opérateur **, voir la notice...
En gros, le résultat obtenu est 65536 fois plus petit que la multiplication.
Le facteur multiplicatif est donc 640000/2/65536 = 4.8828
Ce qui est bien équivalent à 5000/1024
Le +1 sert a arrondir à l'entier le plus proche.
 

BESQUEUT

Senior Member
La mise à l'échelle n'est pas seulement une "règle de trois" (=proportionnalité)
Selon la notice du PIC12F1840 (base du 08M2), figure 16.5 page 125, la résolution est la tension de référence divisée par 1024, soit donc 5000 mV /1024 = 4.8828 mV (soit 48.828 mV avec le facteur 10)
On voit également que la transition entre la valeur zéro et la valeur un de l'ADC se fait lorsque la tension atteint 0,5 LSB (Least Significant Bit)
0 correspond donc à toute tension entre -24 mV et +24 mV
1 entre 25 et 72 mV
...
1023 entre 49927 et 49975 mV et plus...
Pour pouvoir couvrir Vref, la dernière marche fait donc 1,5 LSB ce qui est très artificiel...
En clair, si on veut avoir 0=>0 alors 1023 ne peut donner exactement 5V, mais seulement 4,995 V

Notez que ma formule donne la valeur moyenne de chaque marche du graphique (entre deux transitions donc) soit 49950 pour 1023.

On peut ajouter artificiellement 50 mV, mais d'une part on commet une imprécision et d'autre part, dans ce cas , 0=> 0,05V
Beaucoup, dont à ma connaissance tous les participants du forum anglais, utilisent en fait 1023 comme diviseur,
ce qui donne un incrément de 50000/1023=48.876 mV
C'est un peu faux, mais dans ce cas on a bien :
0==> 0V et 1023 ==> 5V ce qui à l’œil est plus satisfaisant...
 
Last edited:

BESQUEUT

Senior Member
Rien à ajouter si ce n'est que R1 n'est pas normalisé. Si vous avez la place, le plus simple est de prendre 9 résistances type R2 qui seront donc probablement identiques si prises dans la même bande, et ceci même si le code couleur indique une précision médiocre.
Vous pouvez aussi trier 10 résistances avec un ohmmètre de précision et prendre pour R2 celle qui a la valeur la plus proche de la moyenne des 9 autres.
Sinon, mettre 6.8 et 2.2 en série, mais la précision des résistances, et spécialement de R2, doit être en rapport avec la précision souhaitée.
En l’occurrence, il faudrait 1/1000 soit 0,1 % (code couleur violet)
Super cher et pas facile à trouver !
Voir #30 pour d'autres considérations sur la précision de la mesure.
Voir également #4 : la référence de tension est évidement primordiale pour la précision. Mais le Picaxe offre plusieurs possibilités dans ce domaine.
D2 assurant une bonne protection, Z1 est un peu superflu, mais ne nuit pas.
 
Last edited:

dje8269

Senior Member
Désolé d'insister car je ne comprends pas trop le principe de protection d'inversion de polarité sur ce schéma ?

Pour moi en l'état le courant passe par les résistances les diodes sont bloquées .

En cas d’inversion de polarité le courant passe par les diodes et courtcircuite l'alim ? non ? Il ne faudrait pas mettre la diode en série entre le moins de l'alim et R2 ( cathode vers le moins ) ? Attentio nca creer une chute de tension de la Vf de la diode pour la mesure ( a mesuré) !
 

BESQUEUT

Senior Member
Désolé d'insister car je ne comprends pas trop le principe de protection d'inversion de polarité sur ce schéma ?

Pour moi en l'état le courant passe par les résistances les diodes sont bloquées .

En cas d’inversion de polarité le courant passe par les diodes et courtcircuite l'alim ? non ? Il ne faudrait pas mettre la diode en série entre le moins de l'alim et R2 ( cathode vers le moins ) ? Attentio nca creer une chute de tension de la Vf de la diode pour la mesure ( a mesuré) !
Votre raisonnement est exact. C'est le même coté V+. C'est juste une protection et on mise sur le fait que la source va s'effondrer (ou cramer...)
En toute logique, il faudrait mettre une petite résistance en série, laquelle ne devrait pas influer sur la mesure, mais protège la source en cas d'inversion de polarité.

Ces deux diodes sont probablement déjà présentes dans le PIC. Mais leur puissance est très limitée et il est très courant d'en mettre deux rapides et de bonne taille en externe.
Voir par exemple le paragraphe 3 de la notice de chez Texas
The resistance acts as a current limiting device if the input voltage goes beyond allowed input range
 
Last edited:

Otus

Member
Pour ce qui est des R. de 9K, j'en ai récupéré d'ancien stock de composant militaire et il m'en reste quelque une des 1K pareil...

Effectivement s'il y a inversion de polarité sur l'entrée la source de courant en amont va déguster. Mais c'est un montage qui va s'intégrer dans une alim. de labo d'une façon définitive. Il n'y aura plus aucune manipulation par la suite.
De plus la sortie de l'alimentation qui va être mesurée est équipée de toutes sortes de protections, dont la surcharge...
 

Otus

Member
The last schéma (Pour ceux qui n'ont pas de R de 9K)
L'impédance du pond diviseur est inférieur à 1K.

Test affichage U 07 08M2-2.jpg
 
Last edited:

BESQUEUT

Senior Member
Pour ce qui est des R. de 9K, j'en ai récupéré d'ancien stock de composant militaire et il m'en reste quelque une des 1K pareil...
Heureux homme...
Mais sur le schéma, je vois apparaître un multitours de 10k qui pourrait directement constituer le diviseur sans influence sur la précision de l'étalonnage (R2 inutile dans ce cas)
Ou alors, pour un étalonnage plus fin, il faudrait ajouter des résistances de butée, par exemple 8200 ohms associé avec un multi-tours de 1K
ou bien tout multiplier par 5 ou 10 si seul un multitours de 10k est disponible.

Voir également #4 : la référence de tension est évidement primordiale pour la précision. Mais le Picaxe offre plusieurs possibilités dans ce domaine.
 

Otus

Member
Effectivement vous avez raison une R de 8K2 en série avec un multitours de 2K est mieux qu'un seul de 10K.
Je corrige encore une fois....
Je ne réfléchit pas AC
 
Top