Forum: Mikrocontroller und Digitale Elektronik Komische Werte aus AD7767/AD7766


von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe einen AD7767 über SPI angeschlossen und bekomme dort 
reproduzierbar 'komische' Werte. Der Wertebereich scheint nicht linear. 
Besonders bei kleinem Wertebereich fällt dies auf. Ein Bild von einem 
gesampelten Sinus schicke Ich mit.

Rückwirkungen aus meiner Hardware schliesse Ich eigentlich aus. Dazu ist 
das Ganze zu gut reproduzierbar.

Die 4 verschiedenen SPI-Möglichkeiten habe Ich ausprobiert, ohne Erfolg.

Die Dateiübertragung über SPI scheint mir richtig. Der AD7767 sendet MSB 
first 24 Bit. Ich warte auf ein low auf /DRDY, dann hole Ich die neuen 
Daten in 3*8Bit ab, da das SPI des Sam7x nur maximal 16Bit kann. 
Zwischen den 3 Bytes ist jeweils eine kurze Pause die aber bei SPI keine 
Auswirkung haben sollte. Meine Übertragung ist abgeschlossen bevor der 
AD7767 mit einem high-Pegel auf /DRDY den nächsten fertigen Wert 
anzeigt. Das sieht auf dem Ossi gut aus.
Einen mathematischen Fehler, der mir so eine komische Werte-Verbiegung 
produziert kann Ich mir (noch) nicht vorstellen. Eigentlich bin Ich mit 
meinen Werten nicht so weit vom Ziel entfernt. Bei grossen 
Wertebereichen sieht man nur kleine Dellen.

Vielleicht ist im Code noch etwas was Ich nicht sehe.

mReceivedValues ist mein uint32_t Speicher für die Werte. Dieser ist vor 
dem Empfang auf 0 gesetzt worden.

--so werden die SPI-Daten gespeichert
uint8_t *rxp = ((uint8_t*)&mReceivedValues[aktSpeicherIndex])+1;
--an dieser Stelle werden die eintrudelnden Bytes aufsteigend gesichert

-- hier die Umrechnung der SPI-Daten auf int32
uint32_t value = mReceivedValues[aktSpeicherIndex];  // bisher bestehen 
die empfangenen Daten aus [leer, MSB, MidByte, LSB]
value = ByteSwap(value);    // dreht alle 4 Bytes
if(value&0x00800000){
  value |= 0xff000000;    // negativ, mit 0xff auffuellen
}
mReceivedValues[aktSpeicherIndex] = value;  // jetzt haben wir [LSB, 
MidByte, MSB, leer]

Diese Werte werden dann als int32 interpretiert und z.B in dem 
mitgeschickten Diagram angezeigt.

Ich bin etwas ratlos....
Hat jemand so etwas schon mal beobachtet? Irgendeine Idee wie Ich da 
weiter kommen könnte?

Vielen Dank schon mal
Gruß Klaus

von Paulchen Panther (Gast)


Lesenswert?

Hi!

Könntest du in dem Diagramm noch die Y-Achse beschriften? Und die 
X-Achse mit den Zeitpunkten. Wie of samplest du?
Das sieht ein bißchen nach der Netzfrequenz von 50 Hz bzw. Störungen von 
100 Hz aus...

Gruß
PP

von digitaler fritz (Gast)


Lesenswert?

Komik ist etwas anderes.
Es handelt sich um das Resultat deines Meisterwerkes ;-)

von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hier noch das Bild mit Y-Achsen Beschriftung. Das hatte Ich dummerweise 
abgeschnitten. Der Wertebereich ist aber relativ unwichtig. Das 
Verhalten lässt sich auch in anderen Wertebereichen reproduzieren.

Ich habe den AD7767-2, der samplet mit 32kSPS.

Gruß Klaus

von Paulchen Panther (Gast)


Lesenswert?

Hi,

kannst du den Schaltplan posten?
Kannst du ein Bild vom Aufbau posten?
Kannst du ein Oszibild des Signals posten?
Welche Massen sind miteinander verbunden?
Wie hoch ist die Spannung an V_Ref?
Wie hoch ist die Spannung an AV_DD?
Wie hoch ist die Spannung an DV_DD?
Wie hoch ist die maximale Spannung von V_in+?
Wie hoch ist die minimale Spannung von V_in+?
Wie hoch ist die maximale Spannung von V_in-?
Wie hoch ist die minimale Spannung von V_in-?
Wie hoch ist die Signalfrequenz?

von Paulchen Panther (Gast)


Lesenswert?

Hmmm....

Musst du eigentlich nicht zuerst auf <0 prüfen und dann die Bytes 
swappen?
1
if(value&0x00800000){
2
  value |= 0xff000000;    // negativ, mit 0xff auffuellen
3
}
4
value = ByteSwap(value);    // dreht alle 4 Bytes

Wie sieht es mit Little und Big Endian aus?

Gruß
PP

von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hallo PP

Nach dem Empfang über SPI liegen die 24 Bit so aufsteigend im Speicher;
[0x00, MSB, MidByte, LSB]

Der Ethernut verwendet meinen SAM7x als LittleEndian. Deshalb erst 
drehen, dann pruefen ob das 24te Bit (das Vorzeichen) gesetzt ist und 
das MSB evtl. verändern. Sollte stimmen.
Testweise habe Ich auch die Reihenfolge geändert, das führt zu Unfug.
Das Setzen des Vorzeichens kommt bei meinen aktuellen Werten kaum vor. 
Meine aktuellen Probleme pruefe Ich im rein positiven Bereich.

Ich bin dabei nochmal alles zu prüfen und Bilder von den einzelnen 
Stufen zu machen.
Hier schon mal der Schaltplan und Aufbau. J1 und J2 sind geschlossen.
Der AD-Wandler ist schon 2 mal getauscht. Das 'komische' Verhalten ist 
vom Bauteil unabhängig.

Was mir jetzt schon aufgefallen ist: Bei ganz kleinen AC-Signalen (bis 
20uV am AD7767) ist alles ok. Bei einer weiteren Erhöhung sehe ich das 
die Messwerte auf der negativen Seite schlechter werden und in ein 
Rauschen übergehen. Der DC-Anteil hat daran einen Einfluss. Dieses 
Verhalten kann Ich bei DC=2,5V und DC=0,9V (allerdings invertiert, der 
positive Teil der Sinus-Welle wird schlecht) sehen. Zwischen diesen 
DC-Spannungen kann Ich alle Formen der Signal-Verstümmelung in den 
Messwerten sehen.

Schon mal vielen Dank für die Gedanken.

Gruß Klaus

von Klaus K. (klkl)



Lesenswert?

Hallo

Hier die zwei auffällige Punkte:
DC = 2,5V, AC = 20mVss (nicht uV wie im vorherigen Beitrag falsch 
beschrieben) ergibt bei den Messwerten einen richtigen Sinus.

DC = 2,5V, AC = 40mVss ergibt den abgeschnittenen Sinus.

Bei der Spannung am AD-Wandler kann Ich keine Unterschiede erkennen. Auf 
dem mitgeschickten Ossi-Bild sind gelb In+, blau ist In- und Rot ist die 
errechnete Differenz. Die AC-Messungen (20/40mV) sind auf der 
Eingangsseite des AD8220 gemacht.

V_Ref = 5V, AV_DD = 2,5V DV_DD = 2,5V. Digitale und analoge Masse sind 
getrennt zu einem ca 5cm entfernten Punkt gezogen und dort mit allen 
Massen verbunden. Die Frequenz ist ca 160Hz. Das Problem tritt genauso 
bei anderen Frequenzen auf.

Gruß Klaus

von Stefan Z. (wooschder)


Lesenswert?

Hmmm...

Bin mir nicht sicher, ob ich die Schaltung richtig verstanden habe. Was 
machen die zwei AD8220?
Wie hoch ist denn die DC Spannung an VIN- und VIN+ des AD7767? Stellt 
sich da nicht VRef vom AD7767 ein?

von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hallo

Die Schaltung mit den beiden AD8220 kommt aus dem Datenblatt zum AD8222. 
Die entsprechende Seite schicke Ich mit. Die Schaltung erzeugt auf einem 
Pegel von VREF/2 ein symetrisches gegenphasiges Signal.

VIN+ und VIN- sind auf dem Ossi-Bild sichtbar und etwa 3,8V und 1,2V, 
also 1,3V um die Mitte (2,5V) entfernt.
Bei 0V am Eingang des A7 ergibt sich VIN+ und VIN- zu 2,5V (also 
VRef/2). Das kann Ich auch messen.

Gruß Klaus

von Franz (Gast)


Lesenswert?

Servus Klaus,

bist Du dem Problem schon auf die Schliche gekommen? Ich kämpfe auch mit 
einem AD7767...

Grüße
Franz

von Klaus Kloos (Gast)


Lesenswert?

ja, meiner macht jetzt das was er soll.

Bei mir waren falsch bestückte Vorwiderstände an IN+,IN- 15k statt 15R 
das Problem.

Gruß Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.