ADC auslesen, immer nur halbe Spannung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

Hallo zusammen,

ich weiß jetzt nicht mehr weiter und baue auf eure Hilfe.
Ich möchte ganz simpel mit einem ADS1115 eine DC Spannung messen.
Der ADS1115 ist über I2C an einem RaspberryPi angeschlossen.

Hier mal mein Code

Code: Alles auswählen

import time
from ADS1x15 import ADS1115

# Create an ADS1115 ADC (16-bit) instance.
adc = ADS1115()

# Choose a gain of 1 for reading voltages from 0 to 4.09V.
# Or pick a different gain to change the range of voltages that are read:
#  - 2/3 = +/-6.144V
#  -   1 = +/-4.096V
#  -   2 = +/-2.048V
#  -   4 = +/-1.024V
#  -   8 = +/-0.512V
#  -  16 = +/-0.256V
# See table 3 in the ADS1015/ADS1115 datasheet for more info on gain.
GAIN = 1

def remap_range(value, adc_orgi_min, adc_orgi_max, adc_neu_min, adc_neu_max):
    adc_orgi_span = adc_orgi_max - adc_orgi_min 
    adc_neu_span = adc_neu_max - adc_neu_min 
    valueScaled = (value - adc_orgi_min) / (adc_orgi_span)
    return float(adc_neu_min + (valueScaled * adc_neu_span)) #Gibt angepassten Wert zurück

while (1):
    value = adc.read_adc(0, gain=GAIN, data_rate=None)
    spannung = remap_range(value, 0, 65536, 0, 4.096)
    print (spannung, value)
Wenn ich jetzt eine Spannung von 3.3V an Kanal 0 anlege zeigt er mir eine gemessene Spannung von 1.663V an.
Warum nicht die 3.3V? Was mache ich falsch? Es ist ja genau die hälfte, aber keine ahnung wieso :o
An meiner Funktion remap_range() sollte es normalerweise nicht liegen. Die habe ich getestet, indem ich in Value einfach 65536 übergeben habe, da kam dann als Return die 4.096V zurück

Und wieso wird der direkt vom ADC ausgelesene wert (value) -1, wenn ich den Eingang auf GND lege?
Nur um das ganze richtig zu verstehen, wenn ich den GAIN auf 1 stelle müsste ich doch bei einer angelegten Spannung von 4.096V vom ADC direkt 65536 auslesen, oder?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Datenblatt Weiß Rat:

The ADS1113/4/5 provide 16 bits of data in binary twos complement format. The positive full-scale input produces an output code of 7FFFh and the negative full-scale input produces an output code of 8000h. The output clips at these codes for signals that exceed full-scale. Table 4 summarizes the ideal output codes for different input signals. Figure 27 shows code transitions versus input voltage.

Der Wert ist Vorzeichenbehaftet. Und geht damit nur bis 2**15-1.
basti2s
User
Beiträge: 29
Registriert: Samstag 14. November 2020, 08:36

ok, mein fehler.
Danke dir :)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du die vollen 16 Bit willst, musst du zwei Kanäle differentiell benutzen. Mag aber auch egal sein für deine Anwendung.
Antworten