mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC auslesen - Werte ab 2. Abfrage falsch - Python


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Chris M. (chris_appment)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich verzweifle hier an meinem ADC, den ich über Python an meinem Raspi 
einlesen will.
Der ADC spuckt mir bei der ersten Abfrage den richtigen Wert raus, ab 
der 2. Abfrage kommt jedoch nur Müll. Ich habe das Gefühl ich habe etwas 
in der Programmierung falsch gemacht, stehe aber auf dem Schlauch.
ADC ist der ADS1100
Mein Code:

*main.py*
#!/usr/bin/python

import time
import smbus

from adcConfig import ADC

i2c = smbus.SMBus(1)


adctest = ADC(i2c)
time.sleep(1)
while True:
 adctest.getValue()
 time.sleep(1)

*adcConfig.py*
class ADC:
    #DeviceI2CAddress
    ADCAddress = 0x49

    #DeviceI2CCommands
    ADCConfigMode =  0x8c

    #Additional Device Parameters
    amountADCReadingBytes = 2
    emptyPlaceholder = 0

    #Initialization
    def __init__(self,bus):
        ##Configuration
        self.bus = bus
        self.bus.write_byte(ADC.ADCAddress,ADC.ADCConfigMode)

    ##Function
    def getValue(self):
        rawOutput =      self.bus.read_i2c_block_data(ADC.ADCAddress,ADC.emptyPlaceholder,ADC.amountADCReadingBytes)
        #VoltageFunction: U = (Code * 5)/32768
        voltage = ((rawOutput[0]<<8)+rawOutput[1])*3.3/32768
        print(voltage)       


Bin noch relativ neu in Python und denke wohl, dass da irgendwo der 
Fehler liegt.
Jemand ne Idee? Danke

: Bearbeitet durch User
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris M. schrieb:
> ab der 2. Abfrage kommt jedoch nur Müll.
Immer der gleiche? Oder ändert der sich? Und: was passiert auf dem Bus? 
Kannst du das messen mit Oszi oder LA und mit dem Datenblatt 
vergleichen? Denn so lässt sich ein serieller Bus am einfachsten 
debuggen...

Autor: absd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris M. schrieb:
> Jemand ne Idee? Danke

Ich würde dir erstmal empfehlen, deine mathematische Berechnung 
aufzubrechen. Nur um hier bezüglich der Shift-Operartionen und 
Operatorenaffinität auzuschließen.

Danach mal Vmax an den ADC anlegen, und den RAW-Wert durch die Formel 
verfolgen. Da dürftest du schnell sehen, ob oben Müll reinkommt oder du 
unten falsch rechnest.

Autor: Chris M. (chris_appment)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Chris M. schrieb:
>> ab der 2. Abfrage kommt jedoch nur Müll.
> Immer der gleiche? Oder ändert der sich? Und: was passiert auf dem Bus?
> Kannst du das messen mit Oszi oder LA und mit dem Datenblatt
> vergleichen? Denn so lässt sich ein serieller Bus am einfachsten
> debuggen...

Immer der gleiche Müll ab 2. Abfrage. Habe den LA mal drangehangen, 
komme aber erst heute Abend / morgen zur Auswertung
1. Frame ist der Writebefehl zum Konfigurieren des ADC's
2. Frame ist der erste Readbefehl, der noch die richtigen Werte 
ausspuckt
3. Frame ist der zweite Readbefehl, der dann die falschen Werte 
ausspuckt

Sorry fürs verpfuschte Ausschneiden :)
Edit: Ich habe vom letzten SPI messen die MISO und MOSI's nicht aus der 
Beschreibung rausgenommen, also nicht wundern.

Würde ich jetzt so weiter messen würden, wie gesagt, die falschen Werte 
immer die gleichen falschen bleiben. An dem Wert ändert sich nichts.

Schau dann später mal, ob ich was finde.

absd schrieb:
> Chris M. schrieb:
>> Jemand ne Idee? Danke
>
> Ich würde dir erstmal empfehlen, deine mathematische Berechnung
> aufzubrechen. Nur um hier bezüglich der Shift-Operartionen und
> Operatorenaffinität auzuschließen.
>
> Danach mal Vmax an den ADC anlegen, und den RAW-Wert durch die Formel
> verfolgen. Da dürftest du schnell sehen, ob oben Müll reinkommt oder du
> unten falsch rechnest.

Das stimmt alles. Wie gesagt die erste Abfrage spuckt exakt das aus, was 
sie soll. Die Formel ist sogar im Datenblatt hinterlegt, sollte also 
erst recht nicht falsch sein.

Gruß

: Bearbeitet durch User
Autor: Chris M. (chris_appment)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe eben mal ein wenig geschaut.
Der erste Frame der ADC-Config ist komplett richtig und wird auch 
richtig übertragen.
Beim 2. Frame (Read) müsste dort nicht der 8.Bit auf 1 sein, da es ein 
Read-Befehl ist?
Und was ich mich auch frage, was ist dieser komische Sprung bei SCL 
links von der Mitte?

Autor: Chris M. (chris_appment)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal die Konsolenausgabe im Binärformat...
Habe eben auch nochmal einen Beispielcode aus GitHub ausprobiert mit 
exakt dem gleichen Fehler.
Werde es morgen mal am neuen 4er Pi testen.
Kann es sein, dass mein Kommentar zum "komischen SCL-Bit" vom 
fehlerhaften Clock-Stretching des 3er Pi's kommen kann?
Der wurde ja, wie ich gehört habe, im 4er Raspi behoben.
Naja morgen bin ich schlauer

Autor: my2ct (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris M. schrieb:
> Sorry fürs verpfuschte Ausschneiden :)

Viel störender ist der nicht aktivierte I2C-Decoder.

Autor: Chris M. (chris_appment)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC läuft jetzt.

Der Fehler liegt im Read-Befehl. SMBus haut vor dem Readbefehl doch 
wirklich noch ein Write raus. Da dadurch jedesmal meine Konfiguration 
überschrieben wurde, ist es klar, dass nichts mehr sinnvolles rauskommt

Für alle die damit auch mal zu kämpfen haben sollten, hier die Änderung 
die zum Erfolg geführt hat.

Meine Platzhaltervariable wurde durch die Konfigurationsvariable 
ersetzt.

Vorher:
rawOutput=self.bus.read_i2c_block_data(ADC.ADCAddress,ADC.emptyPlaceholder,ADC.amountADCReadingBytes)

Nachher:
rawOutput=self.bus.read_i2c_block_data(ADC.ADCAddress,ADC.ConfigMode,ADC.amountADCReadingBytes)

Somit kann man sich sogar den Writebefehl in der _init_ sparen.

Danke nochmal an die Idee mit dem LA. Das hat es echt um einiges 
einfacher gemacht.

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.