Raspberry PI RC-ADC - Home of Manuel Magninch

Direkt zum Seiteninhalt

Hauptmenü:

Raspberry PI RC-ADC

Controller
Der Raspberry PI hat keine analog Eingänge, da ist alles voll Digital . . .
Aber möchte man mal eine Eingabe per Potentiometer oder einen Strom messen, muss ein ADC (analog Digital Converter) her. Aber es geht auch einfach mit einer "Quick and Ditry" Lösung. Die Idee, einen Kondensator mit einer festen und bekannten Kapazität mit einem zu messenden Widerstand laden und die Ladezeit messen. Damit müsste sich der Widerstandswert berechnen lassen. Rechnerisch ist Tau = R *C , bei Tau ist 63% der Ladung erreicht. Der Raspberry hat am Eingang einen Schmitttrigger und wird ein logisches 1 ca. bei 63% der Betriebsspannung von 3.3V erkennen.




Die Schaltung: Potentiometer 10k Ohm (0-10kR) + Vorwiderstand 1k Ohm mit einem Kondensator 100nF  T1 = R * C =  1'000 * 0.000'000'1 = 0.0001 = 0.1mSek.,  T2 = R * C =  11'000 * 0.000'000'1 = 0.0011 = 1.1mSek. , D.h. die Ladezeit des Kondensators kann ich mit dem Potentiometer von 0.1mSek bis 1.1mSek einstellen. 



Die Schaltung: Optokoppler analog Eingang 1.5-10.0V + Vorwiderstand 10k Ohm I1=1.0V/10kR=0.1mA, I2=9.0V/10k=0.9mA. Optokoppler mit CTR=100%) gibt R13.6kR, R2=25kR und 
mit einem Kondensator 100nF  T1 = R * C =  13'600 * 0.000'000'1 = 0.00036 = 0.36mSek. , T2 = R * C =  3'600 * 0.000'000'1 = 0.0025 = 2.5mSek. D.h. die Ladezeit des Kondensators kann ich mit der Spannung am Optokoppler von 0.36mSek bis 2.5mSek einstellen. 
Python Code:
RCMessLoad = 6                                    # GPIO Laden
RCMessIn = 12                                      # GPIO Messen
GPIO.setup(RCMessLoad, GPIO.OUT)       # Set RMessLoaf2Out
GPIO.setup(RCMessIn, GPIO.OUT            # Set RMess2Out

def RCMessZero():                                # Cap Un-Load
    GPIO.setup(RCMessLoad, GPIO.OUT)   # Set Cap Load2Out
    GPIO.setup(RCMessIn, GPIO.OUT)       # Set RMess2Out
    GPIO.output(RCMessLoad, False)         # Cap Un-Load1
    GPIO.output(RCMessIn, False)             # Cap Un-Load2
    time.sleep(0.006)                               # Wait 2xTau

def RCMess(RMessMax):                         # Widerstand Messen
    Value = 0
    GPIO.setup(RCMessIn, GPIO.IN)            # ADC-IN Einsch.
    GPIO.setup(RCMessLoad, GPIO.OUT)     # Set RMessLoaf2Out
    GPIO.output(RCMessLoad, True)           # laden via RMess
    for I in range(0,RMessMax):                 # Maximalwert
        if (not GPIO.input(RCMessIn)):          # Count until C Hi
            Value = Value + 1                       # ADC Wert
        #DelayMicroSec(1)                          # NoDelay
    RCMessZero()                                     # Cap Un-Load
return Value

ADC=RCMess(9999)                                 # RC-ADC lesen max 9999
ADC= 1/ADC*1200 + 2.2 - ((1/ADC*200)*(1/ADC*200)) 
Print("ADC=" + str(ADC) + " Volt"  )

 
Werte gemessen zu Spannung am ADC
1.0V      ****
2.0V      4669
3.0V      1298
4.0V        619
5.0V        398
6.0V        274
7.0V        213
8.0V        170
9.0V        126
10.0V      106
 
Zurück zum Seiteninhalt | Zurück zum Hauptmenü