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