
Raspberry ADC -5V...+5V
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Ein
Voltmeter für den Raspberry lässt sich mit zwei Portleitungen aufbauen.
Obwohl ein Port nur zwischen zwei Zuständen, 1 und 0, unterscheiden
kann, braucht man nur zwei Widerstände und einen Kondensator, um
eine Spannung zu messen. GPIO 11 ist ein hochohmiger Eingangsport, an
dem ein Ladekondensator von 10 nF liegt, der über den Ausgang GPIO
9 und einen Widerstand von 330 kΩ geladen und entladen wird. Das
Messprogramm muss dann den Ausgang so steuern, dass die Spannung am
Ladekondensator immer nahe an der Eingangsschwelle von GPIO 11 liegt.
Immer wenn der Eingang einen Nullzustand erkennt wird der Ausgang
hochgeschaltet und umgekehrt. Am Ausgang entsteht dann ein PWM-Signal,
das gemittelt etwa 1,2 V ergibt. Legt man eine Messspannung an den
Eingangswiderstand von 1 MΩ, muss der PWM-Ausgang nachsteuern, damit
die mittlere Spannung am Ladekondensator erhalten bleibt. Aus dem
Pulsverhältnis des Ausgangs lässt sich daher die Eingangsspannung
berechnen.
Die
entscheidende Messchleife wird 300.000-mal durchlaufen und liest den
Zustand von GPIO 11. Wenn er high ist, wird der Ausgang heruntergesetzt
und u1 um eins erhöht. Im anderen Fall wird der Ausgang hochgesetzt und
u2 erhöht. Wichtig ist, dass in beiden Fällen die gleiche Rechenzeit
verbraucht wird, denn u1 und u2 messen die Zeiten für beide Zustände.
Aus der Differenz u1-u2 ergibt sich dann die gemessene Spannung, die
nach einer passenden Umrechnung und Kalibrierung in Millivolt angezeigt
wird. Dazu legt man den Eingang abwechselnd an GND und +3,3 V und passt
das Programm entsprechend an.
#Tk_GPIO9ADC11.py GPIO11/9 ADC -5V...+5V
from Tkinter import *
from time import sleep
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.OUT)
GPIO.setup(11, GPIO.IN)
def run_adc(lb):
GPIO.output(9, 0)
sleep(0.05)
u1=0
u2=0
while not GPIO.input(11):
GPIO.output(9, 1)
u1=u1+1
if u1>1000:
break
u1=0
for i in range(300000):
if GPIO.input(11):
GPIO.output(9, 0)
u1=u1+1
else:
GPIO.output(9, 1)
u2=u2+1
u=u1-u2
u=u*982 #Endwert kalibireren
u=u/60000
u=u+80 #Nullpukt kalibrieren
lb.config(text="U = " + str(u) + " mV")
lb.after(100, run_adc, lb)
root = Tk()
root.font=('Helvetica', 30, 'normal')
root.title("ADC GPIO9/11")
Label(root, text="---------------------", font = root.font).pack()
lb = Label(root)
lb.config(text="U = 0 mV", font = root.font)
lb.pack()
Label(root, text="---------------------", font = root.font).pack()
Label(root, text="-5000 mV ... +5000 mV").pack()
run_adc(lb)
mainloop()
Transistorprüfer
Die
Schaltung zur Messung des Stromverstärkungsfaktors verwendet eine
Gegenkopplung, bei der der Basiswiderstand nicht zur Betriebsspannung
sondern zum Kollektor führt. Eine hohe Verstärkung führt zu einem
großen Kollektorstrom und damit zu einem großen Spannungsabfall am
Kollektorwiderstand. Damit sinkt die Kollektorspannung und zugleich die
Spannung am Basiswiderstand. Die Gegenkopplung bewirkt also, dass der
Basisstrom geringer wird, wenn die Stromverstärkung größer ausfällt.
In
dieser Schaltung reicht es, die Kollektorspannung zu messen. Daraus
kann dann der Kollektorstrom, der Basisstrom und der
Stromverstärkungsfaktor berechnet werden. Im Programm steht die
Betriebsspannung von 3300 mV als Konstante, mit der der Kollektorstrom
Ic berechnet wird. Außerdem muss die Basisspannung mit 600 mV
vorgegeben werden, um den Basisstrom Ib zu berechnen. Die
ausgegeben Werte zeigen nur geringe Streuungen und stimmen gut mit
Messungen anderer Transistorprüfer überein.
# GPIO9_11ADC3.py Stromverstaerkungsfaktor V
import RPi.GPIO as GPIO #Bibliothek laden
from time import sleep
GPIO.setmode(GPIO.BCM) #Broadcom-Modus
GPIO.setwarnings(False) #Warnungen abschalten
GPIO.setup(9, GPIO.OUT)
GPIO.setup(11, GPIO.IN)
while(1):
GPIO.output(9, 0)
sleep(0.05)
u1=0
u2=0
while not GPIO.input(11):
GPIO.output(9, 1)
u1=u1+1
if u1>1000:
break
u1=0
for i in range(300000):
if GPIO.input(11):
GPIO.output(9, 0)
u1=u1+1
else:
GPIO.output(9, 1)
u2=u2+1
u=u1-u2
u=u*999 #Endwert kalibireren
u=u/60000
u=u+8 #Nullpukt kalibrieren
Ic = (3300-u)/1.0 #Ic in uA
Ib = (u-600)/330.0 #Ib in uA
V = int (Ic/Ib)
print 'V =', V
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry