J'ai codé en Python une fonction pour trouver les couplages de résistances permettant d'avoir une adaptation de tension avec les entrées RPi .
Le code source : A mettre dans un fichier (Le mien s'appelle Pont_R.py)
Code final (sauf bugs éventuels) .
Version avec valeurs prédéfinis et modifiables si besoin .
Merci à Bud pour ces conseils .
Code : Tout sélectionner
#!/usr/bin/python3
def VinVout ( Vin=5, Vout=3.3, Vout_plage=-.1, E=24, M=2 ):
"""
Convertisseur de tension - MSG - V01 (c) 2020-02
Liste de ponts diviseurs à résistances fixe standard dans
les séries 'E' et multiples 'M' .
Usage initial : Adapter une tension de signal TTL 5V vers 3.3V GPIO_in
Vin : tension d'entrée (V) et (<= 25V)
Vout : Tension de sortie (V) et (< Vin)
plage : Vout + ou - valeur décimale (Vout_mini >= 0 et Vout_maxi < Vin)
E : Résistances série E = 12, 24, 48 ou 96
M : Muktiplicateur -2 (R * 1e-2) à 7 (R * 1e+7)
Pensez à toujours contrôler les tensions avant de brancher !
"""
if Vout > Vin : # Vout ne peut en aucun cas être suppérieur
print ("Tu te fous de moi ?")
return
if Vin > 25 : # à vos risques et périls !
print ("Hors limite Vin= %s > 25V " % str( Vin ))
return
Vout_mini = Vout
Vout_maxi = Vout + Vout_plage
if Vout_mini > Vout_maxi : # permute les valeurs
Vout_mini, Vout_maxi = Vout_maxi, Vout_mini
if Vout_mini < 0 : # on va finir par trouver du pétrôle
print ("Erreur Plage Vout_mini : %f" % Vout_mini)
return
if Vout_maxi >= Vin : # y en a qu'on essayé , ils ont eu des problèmes ...
print ("Erreur Plage Vout_maxi : %f" % Vout_maxi)
return
if E != 12 and\
E != 24 and\
E != 28 and\
E != 96 : # des E à la douzaine
print ("E = 12, 24, 48 ou 96")
return
if (M < -2) or (M > 7): # code couleur multiplicateur
print ("M = -2 à 7")
return
# Résistances Serie E
E12 = (100,120,150,180,220,270,330,390,470,560,680,820)
E24 = (100,110,120,130,150,160,180,200,\
220,240,270,300,330,360,390,430,\
470,510,560,620,680,750,820,910)
E48 = (100,105,110,115,121,127,133,140,\
147,154,162,169,178,187,196,205,\
215,226,237,249,261,274,287,301,\
316,332,348,365,383,402,422,442,\
464,487,511,536,562,590,619,649,\
681,715,750,787,825,866,909,953)
E96 = (100,102,105,107,110,113,115,118,\
121,124,127,130,133,137,140,143,\
147,150,154,158,162,165,169,174,\
178,182,187,191,196,200,205,210,\
215,221,226,232,237,243,249,255,\
261,267,274,280,287,294,301,309,\
316,324,332,340,348,357,365,374,\
383,392,402,412,422,432,442,453,\
464,475,487,499,511,523,536,549,\
562,576,590,604,619,634,649,665,\
681,698,715,732,750,768,787,806,\
825,845,866,887,909,931,953,976)
# E prend la valeur de la série choisie
if E == 12 : E = E12
if E == 24 : E = E24
if E == 48 : E = E48
if E == 96 : E = E96
# convertiseur d'unité
Unite = lambda n : \
n//1e6 and str( n/1e6) [:5].rjust(5," ") + " M" or\
n//1e3 and str( n/1e3) [:5].rjust(5," ") + " K" or\
n//1e0 and str( n/1e0) [:5].ljust(5,"0") + " " or\
n//1e-3 and str( n/1e-3) [:5].ljust(5,"0") + " m" or\
n//1e-6 and str( n/1e-6) [:5].ljust(5,"0") + " µ" or\
n//1e-9 and str( n/1e-9) [:5].ljust(5,"0") + " n" or\
n//1e-12 and str( n/1e-12) [:5].ljust(5,"0") + " p"
# code couleur multiplicateur 'M'
Multiplicateur = ('Noir',\
'Marron',\
'Rouge',\
'Orange',\
'Jaune',\
'Vert',\
'Bleu',\
'Violet',\
'Gris',\
'Blanc',\
'Argent',\
'Or')
# Multiple couleur à appliquer à chaque résitance
Mc2d = 10** M # pour valeur E à 2 digits (y en pas)
Mc3d = Mc2d / 10 # pour valeur E à 3 digits
# affichage des paramètres
print ("")
print ("Vin= %0.1f V" % Vin)
print ("Vout= %0.1f V" % Vout)
print ("plage= %0.1f " % Vout_plage)
print ("Vout de %0.1f V à %0.1f V" % (Vout_mini, Vout_maxi))
print ("E=%i Serie E (12/24/48/96)" %len(E))
print ("\nRésistances :")
print ("M=%i Multiplicateur : %.1g , %s\n" %(M , Mc2d, Multiplicateur[M] ))
# Un dessin c'est parfois plus simple qu'un long discours
# Symboles : Ω┌─┐┤│├└─┘┬
print (\
" P1 (W) P2 (W) \n"+\
" ┌────────┐ ┌────────┐ │ \n"+\
"Vin ──────┤ R1 (Ω) ├────┬────┤ R2 (Ω) ├───>───┤ Masse\n"+\
" └────────┘ │ └────────┘ I (A) │ \n"+\
" U1 (V) │ U2 (V) │ \n"+\
" │<────── Vout ────────│ \n")
for R1 in E:
R1 = R1 * Mc3d
for R2 in E:
R2 = R2 * Mc3d
'''
# # calcul méthode traditionnelle (calculatrice)
# I = Vin / (R1 + R2)
# U1 = R1 * I
# U2 = R2 * I
# P1 = U1 * I
# P2 = U2 * I
'''
# pourquoi faire simple quand on peut faire compliqué ;)
# le rapport des tensions = rapport des résistances (règle de 3)
# (Entrée / Sortie) => Vin / Vout = (R1 + R2) / R2
# (Sortie / Entrée) => Vout / Vin = R2 / (R1 + R2)
# soit U2 / Vin = R2 / (R1 + R2) et donc ...
U2 = Vin * R2 / (R1 + R2)
# simplement : U1 = Vin - U2
U1 = Vin * R1 / (R1 + R2) # on reste compliqué !
P1 = U1 * U1 / R1 # P = U² / R
P2 = U2 * U2 / R2
I = P2 / U2 # I = P / U
# Comprenne qui voudra !
# affiche que les valeur comprises dans la plage
if (U2 >= Vout_mini) and (U2 <= Vout_maxi) :
aff = ("R1= %sΩ , " % Unite( R1 ))
aff += ("R2= %sΩ , " % Unite( R2 ))
aff += ("U1= %sV , " % Unite( U1 ))
aff += ("U2= %sV , " % Unite( U2 ))
aff += ( "I= %sA , " % Unite( I ))
aff += ("P1= %sW , " % Unite( P1 ))
aff += ("P2= %sW" % Unite( P2 ))
print (aff)
elif U2 > Vout_maxi :
break # sortie de boucle R2 , passe à la R1 suivante
return
#-------------
#
# Main
#
#-----------
# Exemple d'appel fonction VinVout
VinVout () # basic avec les valeurs par défaut 5V , 3.3V ...etc
# Autres ...
# VinVout (12, 3.3) # seul Vin et Vout sont renseignés
# VinVout (Vout=3.3, Vin=12) # ordre de renseignement inversé
# VinVout (E=12) # changer la série E
# Vinvout (5, 3.3, -0.2, 48) # Vout_plage modifiée et serie E aussi
# Vinvout (5, 3.3, M=1) # Multiplicateur modifié
# VinVout (Vout=3.2, Vout_plage=0.2) # Recherche valeurs sur plage 3,2V à 3,4V
Ancienne version :
-----------------------------
Code : Tout sélectionner
#!/usr/bin/python3
def VinVout (Vin, Vout, marge=.2 , E=24 , M=3):
if Vout > Vin :
print ("Tu te fous de moi ?")
return
E12 = (100,120,150,180,220,270,330,390,470,560,680,820)
E24 = (100,110,120,130,150,160,180,200,\
220,240,270,300,330,360,390,430,\
470,510,560,620,680,750,820,910)
E48 = (100,105,110,115,121,127,133,140,\
147,154,162,169,178,187,196,205,\
215,226,237,249,261,274,287,301,\
316,332,348,365,383,402,422,442,\
464,487,511,536,562,590,619,649,\
681,715,750,787,825,866,909,953)
E96 = (100,102,105,107,110,113,115,118,\
121,124,127,130,133,137,140,143,\
147,150,154,158,162,165,169,174,\
178,182,187,191,196,200,205,210,\
215,221,226,232,237,243,249,255,\
261,267,274,280,287,294,301,309,\
316,324,332,340,348,357,365,374,\
383,392,402,412,422,432,442,453,\
464,475,487,499,511,523,536,549,\
562,576,590,604,619,634,649,665,\
681,698,715,732,750,768,787,806,\
825,845,866,887,909,931,953,976)
if E == 12 : E = E12
if E == 24 : E = E24
if E == 48 : E = E48
if E == 96 : E = E96
Er = list(E)
Er.reverse() # Serie E inversée
tuple(Er)
# n = nombre entier ou décimal
Unite = lambda n : \
(int (n/10**6) >0 ) and str( n/10**6) [:5] + " M" or\
(int (n/10**3) >0 ) and str( n/10**3) [:5] + " K" or\
(int (n/10**0) >0 ) and str( n/10**0) [:5] + " " or\
(int (n/10**-3) >0 ) and str( n/10**-3) [:5] + " m" or\
(int (n/10**-6) >0 ) and str( n/10**-6) [:5] + " µ" or\
(int (n/10**-9) >0 ) and str( n/10**-9) [:5] + " n" or\
(int (n/10**-12) >0 ) and str( n/10**-12) [:5] + " p"
Multiplicateur = ('Noir',\
'Marron',\
'Rouge',\
'Orange',\
'Jaune',\
'Vert',\
'Bleu',\
'Violet',\
'Gris',\
'Blanc')
Mc = 10**M
print ("\nVin= %0.1f V\
\nVout= %0.1f V\
\nmarge= %0.1f de %0.1f V à %0.1f V\
\nE=%i Serie E (12/24/48/96)\
\nRésistances :\
\nM=%i Multiplicateur : %i , %s\n"\
%(Vin, Vout, marge, Vout-marge, Vout, len(E), M, Mc, Multiplicateur[M]))
# Symboles : Ω┌─┐┤│├└─┘┬
print (10*" "+ "┌────────┐"+ 9*" "+ "┌────────┐"+ 6*" "+ "│\n"+\
"Vin "+ 6*"─"+ "┤ R1 ├"+ 4*"─"+ "┬"+ 4*"─"+ "┤ R2 ├───>──┤ Masse\n"+\
10*" "+ "└────────┘"+ 4*" "+ "│"+ 4*" "+ "└────────┘ I │\n"+\
14*" "+ "U1"+ 8*" "+ "│"+ 8*" "+ "U2"+ 10*" "+ "│\n"+\
24*" "+ "│<────── Vout ───────│\n")
for R2 in Er:
R2 = R2 * Mc / 100
for R1 in E:
R1 = R1 * Mc / 100
U2 = Vin * R2 / (R1 + R2)
if (U2 >= (Vout - marge)) and (U2 <= Vout):
print ("R1= %sΩ , R2= %sΩ , U1= %sV , U2= %sV , I= %sA"\
%(Unite(R1), Unite(R2), Unite(Vin-U2), Unite(U2), Unite(U2/R2) ))
break
#-------------
#
# Main
#
#-----------
VinVout (5, 3.3)
#VinVout (5, 3.3, E=12)
Il est possible de paramétrer la tension entrée , sortir , marge (plutôt la plage) , le série E des résistances et le coef multiplicateur .
Attention , contrôlez au multimètre pour éviter toute erreur .
L'usage fait avec une tension d'entrée Vin supérieure à 25V courant continue est à vos risques et périls .
N'est pas prévu , en l'état , pour convertir des tensions alternatives .
Ci-joint une version du convertisseur d'unité qui formate l'affichage à 4 digits significatifs pour des valeurs inférieures à 1Giga et Supérieures ou égales à 1pico .
Les valeur hors cadre restent non formatés .
Code : Tout sélectionner
# formaté
Unite = lambda n : \
n >1e9 and str( n ) or\
n//1e6 and str( n/1e6) [:5].rjust( 5, " " ) + " M" or\
n//1e3 and str( n/1e3) [:5].rjust( 5, " " ) + " K" or\
n//1e0 and str( n/1e0) [:5].rjust( 5, " " ) + " " or\
n//1e-3 and str( n*1e3) [:5].rjust( 5, " " ) + " m" or\
n//1e-6 and str( n*1e6) [:5].rjust( 5, " " ) + " µ" or\
n//1e-9 and str( n*1e9) [:5].rjust( 5, " " ) + " n" or\
n//1e-12 and str( n*1e12) [:5].rjust( 5, " " ) + " p" or\
n <1e-12 and str( n )
Ancienne version :
-----------------------------
Code : Tout sélectionner
#!/usr/bin/python3
def VinVout (Vin, Vout, marge=.2 , E=24 , M=3):
if Vout > Vin :
print ("Tu te fous de moi ?")
return
E12 = (100,120,150,180,220,270,330,390,470,560,680,820)
E24 = (100,110,120,130,150,160,180,200,\
220,240,270,300,330,360,390,430,\
470,510,560,620,680,750,820,910)
E48 = (100,105,110,115,121,127,133,140,\
147,154,162,169,178,187,196,205,\
215,226,237,249,261,274,287,301,\
316,332,348,365,383,402,422,442,\
464,487,511,536,562,590,619,649,\
681,715,750,787,825,866,909,953)
E96 = (100,102,105,107,110,113,115,118,\
121,124,127,130,133,137,140,143,\
147,150,154,158,162,165,169,174,\
178,182,187,191,196,200,205,210,\
215,221,226,232,237,243,249,255,\
261,267,274,280,287,294,301,309,\
316,324,332,340,348,357,365,374,\
383,392,402,412,422,432,442,453,\
464,475,487,499,511,523,536,549,\
562,576,590,604,619,634,649,665,\
681,698,715,732,750,768,787,806,\
825,845,866,887,909,931,953,976)
if E == 12 : E = E12
if E == 24 : E = E24
if E == 48 : E = E48
if E == 96 : E = E96
Er = list(E)
Er.reverse()
tuple(Er)
Unite = {'M':10**6,\
'K':10**3,\
'':10**0,\
'm':10**-3,\
'µ':10**-6,\
'n':10**-9,\
'p':10**-12}
Multiplicateur = ('Noir',\
'Marron',\
'Rouge',\
'Orange',\
'Jaune',\
'Vert',\
'Bleu',\
'Violet',\
'Gris',\
'Blanc')
Mc = 10**M
print ("\nVin= %0.1f V\
\nVout= %0.1f V\
\nmarge= %0.1f de %0.1f V à %0.1f V\
\nE=%i Serie E (12/24/48/96)\
\nRésistances :\
\nM=%i Multiplicateur : %i , %s\n"\
%(Vin, Vout, marge, Vout-marge, Vout, len(E), M, Mc, Multiplicateur[M]))
# Symboles : Ω┌─┐┤│├└─┘┬
print (10*" "+ "┌────────┐"+ 9*" "+ "┌────────┐"+ 6*" "+ "│\n"+\
"Vin "+ 6*"─"+ "┤ R1 ├"+ 4*"─"+ "┬"+ 4*"─"+ "┤ R2 ├───>──┤ Masse\n"+\
10*" "+ "└────────┘"+ 4*" "+ "│"+ 4*" "+ "└────────┘ I │\n"+\
14*" "+ "U1"+ 8*" "+ "│"+ 8*" "+ "U2"+ 10*" "+ "│\n"+\
24*" "+ "│<────── Vout ───────│\n")
for R2 in Er:
R2 *= 10**-2
for R1 in E:
R1 *= 10**-2
U2 = Vin * R2*Mc / (R1*Mc + R2*Mc)
if (U2 >= (Vout - marge)) and (U2 <= Vout):
print ("R1= %0.2f Ω , R2= %0.2f Ω , U1= %0.3f V , U2= %0.3f V , I= %0.6f mA"\
%(R1*Mc, R2*Mc, Vin-U2, U2, U2/(R2*Mc* Unite ['m'])))
break
Le résultat de l'appel fonction depuis la console :
Code : Tout sélectionner
[manu@localhost Prog_python]$ python3
Python 3.5.7 (default, Apr 4 2019, 11:58:21)
[GCC 5.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from Pont_R import VinVout
>>> VinVout (5,3.3)
Vin= 5.0 V
Vout= 3.3 V
marge= 0.2 de 3.1 V à 3.3 V
E=24 Serie E (12/24/48/96)
Résistances :
M=3 Multiplicateur : 1000 , Orange
┌────────┐ ┌────────┐ │
Vin ──────┤ R1 ├────┬────┤ R2 ├───>──┤ Masse
└────────┘ │ └────────┘ I │
U1 │ U2 │
│<────── Vout ───────│
R1= 4700.00 Ω , R2= 9100.00 Ω , U1= 1.703 V , U2= 3.297 V , I= 0.362319 mA
R1= 4300.00 Ω , R2= 8200.00 Ω , U1= 1.720 V , U2= 3.280 V , I= 0.400000 mA
R1= 3900.00 Ω , R2= 7500.00 Ω , U1= 1.711 V , U2= 3.289 V , I= 0.438596 mA
R1= 3600.00 Ω , R2= 6800.00 Ω , U1= 1.731 V , U2= 3.269 V , I= 0.480769 mA
R1= 3300.00 Ω , R2= 6200.00 Ω , U1= 1.737 V , U2= 3.263 V , I= 0.526316 mA
R1= 3000.00 Ω , R2= 5600.00 Ω , U1= 1.744 V , U2= 3.256 V , I= 0.581395 mA
R1= 2700.00 Ω , R2= 5100.00 Ω , U1= 1.731 V , U2= 3.269 V , I= 0.641026 mA
R1= 2700.00 Ω , R2= 4700.00 Ω , U1= 1.824 V , U2= 3.176 V , I= 0.675676 mA
R1= 2400.00 Ω , R2= 4300.00 Ω , U1= 1.791 V , U2= 3.209 V , I= 0.746269 mA
R1= 2200.00 Ω , R2= 3900.00 Ω , U1= 1.803 V , U2= 3.197 V , I= 0.819672 mA
R1= 2000.00 Ω , R2= 3600.00 Ω , U1= 1.786 V , U2= 3.214 V , I= 0.892857 mA
R1= 1800.00 Ω , R2= 3300.00 Ω , U1= 1.765 V , U2= 3.235 V , I= 0.980392 mA
R1= 1600.00 Ω , R2= 3000.00 Ω , U1= 1.739 V , U2= 3.261 V , I= 1.086957 mA
R1= 1500.00 Ω , R2= 2700.00 Ω , U1= 1.786 V , U2= 3.214 V , I= 1.190476 mA
R1= 1300.00 Ω , R2= 2400.00 Ω , U1= 1.757 V , U2= 3.243 V , I= 1.351351 mA
R1= 1200.00 Ω , R2= 2200.00 Ω , U1= 1.765 V , U2= 3.235 V , I= 1.470588 mA
R1= 1100.00 Ω , R2= 2000.00 Ω , U1= 1.774 V , U2= 3.226 V , I= 1.612903 mA
R1= 1000.00 Ω , R2= 1800.00 Ω , U1= 1.786 V , U2= 3.214 V , I= 1.785714 mA
>>> VinVout (5 , 10.3)
Tu te fous de moi ?
>>>
Attention , contrôlez au multimètre pour éviter toute erreur .
L'usage fait avec une tension d'entrée Vin supérieure à 25V courant continue est à vos risques et périls .
N'est pas prévu , en l'état , pour convertir des tensions alternatives .