PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD-Wandler wandelt nicht wie er soll



Tonspion
28.08.2006, 17:19
Hallo Leute!

Ich versuche einen Max127 am I²C zu betreiben. Ansteuern tue ich ihn von einem Seriell-I2C-Adapter für den PC.
Funktioniert auch alles wunderbar, bis auf dass die Kennline stark nichtlinear ist. Egal ob 5V oder 10V-Spannungsbereich.
Bis 25% von der Maximalspannung steigt das halbwegs linear an,
geht dann bei etwa 50 bis 60% in die Sättigung und wieder etwas nach unten und steigt dann wieder an. Ab 85 % schmeißt der nur noch FFF raus!
In jedem Spannungsbereich der gleiche typische Verlauf. Ob unipolarer oder bipolarer Betrieb.

Habe das Ganze sehr sauber auf Lochraster aufgelötet, so wie es im Datenblatt, auf der ersten Seite, als "Typical Operation Circuit" angegeben ist. Habe auch schon einen anderen Kanal probiert und sogar einen anderen Baustein --> gleiches Problem!

Der gibt zwei Byte an Daten raus, wovon das unterste Nibble immer 0000 sein soll! Doch das ist nur der Fall, wenn ich den Eingang kurzschließe, bzw. da wirklich genau 0V dran liegen. Schon die Felder in der Luft reichen aus, dass das letzte Nibble 0xF ist. Bei jeder anderen Spannung sollte das auch dauerhaft 0x0 sein. Das ist schon sehr komisch!

Habe auch alle möglichen timings ausprobiert, bis in den Senkundenbereich, keine Änderung!

Muss das Ding zwingend auf eine Platine mit dicker Massefläche?
Weiß jemand Rat? Bin schon fast am Verzweifeln! ](*,)

shaun
29.08.2006, 08:01
Womit steuerst Du die Eingänge denn an? Der Eingangswiderstand von dem Ding ist reichlich niedrig!

Suggarman
29.08.2006, 08:28
Ich vermute, daß Deine Berechnung aus den Bytes fehlerhaft ist. Ich habe damit auch länger rumgemacht. Hier ein Auszug meines Programms (Basic++ für C-Control Unit 2.0):


'------------------------------ declare für Lagebestimmung --------------------------------------------------------
const max127adresse = 80 ' feste Adresse für Max127
const controlbytedruck = 10100000b ' Ch2, 0 bis 5V, normal Operation
const controlbytequer = 11100000b ' Ch6, 0 bis 5V, normal Operation
const controlbytehoehe = 11110000b ' Ch7, 0 bis 5V, normal Operation
const controlbyteakku = 1

'------------------------------ function max127auslesen --------------------------------------------------------
function Max127auslesen(chsetting as byte)
define ADwert as word
define highbyte as byte
define lowbyte as byte
IIC.init
IIC.stop
IIC.start
IIC.send max127adresse
IIC.send chsetting
IIC.stop
IIC.start
IIC.send (max127adresse + 1)
IIC.get highbyte
IIC.get lowbyte
lowbyte = lowbyte shr 4
IIC.stop
IIC.off
ADwert = ((highbyte*16) + lowbyte)
return ADwert
end function


Mein Max127 ist ganz normal eingelötet ohne Masseflächen oder so.
Vielleicht macht ja auch Dein I2C-Seriell-Umsetzter Probleme. Das müßte man über einen reinen I2C-Test herausbekommen können.

mfg

Stefan

Tonspion
29.08.2006, 10:17
Also ich steuere den Eingang über ein einstellbares Labornetzteil an und überprüfe die Spannung mit einem Digitalmultimeter.

Ich habe auch schon einen RC-Tiefpass (1kOhm,100nF) an den Eingang des Max127 angeschlossen, keine Wirkung.

Das Board ist dieses hier: http://www.i2cchip.com/i2c2pc.pdf

Ich schreibe von Realterm aus (ein Testprogramm dafür) S5088P. Und dann S5102P. Der möchte mit ASCII gefüttert werden. S ist die Startbedingung und P die Stoppbedingung.

Aber auch von anderen, selbstgemachten Programmen aus macht er das Gleiche.

Schicke ich also S5088P raus, also Start 01010000 10001000 Stop,
was soviel heißt wie Adresse 0101000, schreiben, Kanal 0, 0...10V und normale Operation, dann antwortet er mir mit 50K88K. Das bedeutet, dass die beiden Bytes ordnungsgemäß übertragen wurden.

Nun kann ich ihn auslesen mit S5102P, also Start, Adresse 0101000, lesen und zwar zwei Bytes, dann schickt er mir, liegen am Eingang 0V an, auch 51K0000 raus.
51 und das K bedeuten, dass 0x51 ordnungsgemäß übertragen wurden und das 0x0000 sind die zwei Byte an Daten, wovon das untere Nibble ja immer null sein soll. Das ist aber nur bei 0V der Fall.

Liegt eine Spannung an, dann schmeißt er beispielsweise bei 2,00 V die 3FFF raus. Bei jeglicher Spannung ist das unterste Nibble immer F (1111), auch wenn sie noch so klein ist. Ich werte nur die Obersten drei Nibble aus, also die 3FF. Selbst wenn ich das letzte F noch auswerten würde, dann wär das bloß der Faktor 16 dezimal.

Jedenfalls ist der gewandelte (dezimale) Zahlenverlauf stark nichtlinear, von der angelegten Spannung, fällt sogar ab und steigt dann wieder an.

Ich weiß mir keinen Rat, habe alles zick mal kontrolliert.

Sogar die Eingangsspannung habe ich mit einem LC-TP gefiltert, weil die auch mit über ein 15 cm langes Flachbandkabel übertragen wird, so wie der GND und SCL und SDA.

Der Stecker an dem I2C-Board ist 6-pol Micromatch und an meiner Platine ein 6pol Pfostenstecker.

Tonspion
29.08.2006, 10:27
Die Formel ADwert = (highbyte*16)+lowbyte würde da nicht viel bringen.

Spannung ADW Dezimal

0,0 V 0000 0
1,0 V 1F7F 503
2,0 V 3F3F 1011
3,0 V 7FFF 2047
4,0 V 7FFF 2047
5,0 V FF7F 4087
6,0 V FF1F 4081
7,0 V FFFF 4095
8,0 V FF7F 4087
9,0 V FF7F 4087
10,0 V FFFF 4095

Sobald eine Spannung anliegt, ist das untere Nibble, das stets 0000 sein soll, 1111. Das habe ich also auch gar nicht ausgewertet.

Suggarman
29.08.2006, 10:37
Fehler:

Anstatt 0100100 probiere mal 1100100. Das erste bit sollte 1 sein. Deine Einstellung heißt ch4 (!) und 0 bis 10V.

mfg

Stefan

Tonspion
29.08.2006, 11:52
Ich hatte mich hier nur verschrieben! 0x88 ist 10001000b

Ich schicke S5088P und dann S5102P in ASCII-Zeichen an die Kiste.

Start 01010000 10001000 Stop

Adresse: 0101000 Schreiben: 0 Start: 1 Ch: 000 Rng: 10 Op: 00 Stop

Und zum auslesen dann:

S5102P

Der Controller braucht die 02, damit er weiß, dass er zwei Byte auslesen soll. Sagt mal, ist das bei Euch auch so, dass ihr vor jeder neuen Spannungs-Abfrage erst ein Controlbyte rüberschicken müsst? Sonst bekomme ich nur FFFF zurück, wenn ich das nicht mache.

Suggarman
29.08.2006, 12:11
Start 01010000 10001000 Stop


Das ist die Adresse 80 und dann "1" "000" = CH0, "10" = 0-10V , "00" = normal Operation

Kann es sein, daß Du immer einen unbeschalteten Port mißt, der dann zufällige Werte angenommen hat? Lege doch mal die ungenutzen Ports auf Masse oder 5V.



Sagt mal, ist das bei Euch auch so, dass ihr vor jeder neuen Spannungs-Abfrage erst ein Controlbyte rüberschicken müsst?


Ich habe es noch nie ohne Controlbyte versucht. Ich schicke jedes mal obigen Ablauf und das in einer Schleife um dann den Mittelwert zu bilden.

mfg

Stefan

Tonspion
29.08.2006, 12:33
Habe ich auf +5V gelegt --> keine Veränderung! Das Einzige was wirklich sein kann ist, dass Maxim mir drei defekte IC's geschickt hat! Waren aus dem Restbestand aus Asien. War noch Blei drin!

Suggarman
29.08.2006, 12:40
S5102P

Der Controller braucht die 02, damit er weiß, dass er zwei Byte auslesen soll.


Und die 02 wird nicht an den Max127 geschickt? Ich vermute daß entweder hier oder in der Umsetzung I2C/seriell der Fehler liegt.



Das Einzige was wirklich sein kann ist, dass Maxim mir drei defekte IC's geschickt hat!


Das glaube ich nicht.

mfg

Stefan

Tonspion
29.08.2006, 12:49
Dass Maxim drei defekte IC's schickt, glaube ich eigentlich auch nicht!
Die 02 geht nur an den Controller! Vom 127 wird beim Senden
die 50 und die 88 ackknowledged, sowie beim lesen nur die 51 für die Adresse und die Datenrichtung.

Tonspion
29.08.2006, 12:56
Auf dem I2C-Controller ist ein BL233B (RS232-I2C) drauf.
Mit diesem kommuniziert das Board über die USB-Schnittstelle, mittels virtuellem COM-Port. Das macht das ganze einfach! RS232 ist auch noch dran, weil USB sehr hohe Latenzzeiten hat, was das ganze langsamer machen kann, als über USB. Habe ich schon tetestet, RS232 ist etwa viermal so schnell, wie USB. Schon erstaunlich. Also bei Applikationen, die viele Befehle rausschicken und auf Antworten warten.

www.i2cchip.com/pdfs/i2c2pc_all_docs.zip

Ob nun RS232 oder USB+virt. COM-Port --> keine Änderung


Matze

Suggarman
29.08.2006, 13:24
Nur nochmal zur Sicherheit: Du hast den Max127 mit 3 Kondensatoren und einem 1k in der SDA-Leitung beschaltet? A0,A1,A2 liegen auf Masse?
Hast vielleicht ein I2C Testprogramm um nach der Adresse zu suchen?

mfg

Stefan

Tonspion
29.08.2006, 13:47
Ja sicher! Alle drei A's auf Masse und habe jetzt sogar den 0,1 Mikrofarat an der Versorgung gegen 100n und einen Elko von 10µF ausgetauscht, in Reihe mit einer Spule von 100 Mikrohenry ausgetauscht. Zusätzlich einen RC-Tiefpass von 100n und 1k an den Eingang gelegt. Nützt alles nichts! Entweder sind die Bausteine im Arsch oder der Controller ist irgendwie inkompatibel.

Würde ich die falsche Adresse ansprechen, dann würde ich kein Ackknowledge zurückbekommen!

Aber echt zum Mäuse melken! Ich mach hier noch den Frecker! :-({|=

Suggarman
30.08.2006, 08:38
Was mich immer noch stutzig macht, ist die Tatsache, daß 0V und 10V korrekt ankommen. Kannst Du die Testspannung mal aus der Versorgungsspannung des MAX127 nehmen(dann halt nur 0 bis 5V) ? Vielleicht ist Dein Netzteil nicht "sauber" genug.



Die Formel ADwert = (highbyte*16)+lowbyte würde da nicht viel bringen.


Da fehlt auch noch

lowbyte = lowbyte shr 4


mfg

Stefan

Tonspion
30.08.2006, 09:49
Ich kann ja ja auch Batterien anschließen, das geht trotzdem nicht!
Der bleibt auch ziemlich lange auf 3FF, nicht nur bei genau 1,0V, sondern in einem Bereich darum. Änderungen von ein paar 10 mV erkennt der überhaupt gar nicht! Entweder sind wirklich alle drei Bausteine kaputt, weil sie aus einem verbleiten Restbestand (von 10 Stück) aus Asien kommen, was ich allerdings nicht glauben kann, oder dieser Controller arbeitet nicht richtig! Da ist son BL233 drauf. Aber bei dieser Testsoftware Realterm ist sogar ein Eintrag von dem Max127 mit seiner Adresse drin, was eigentlich vermuten lässt, dass den auch schon andere vor mir mal da drangeklemmt haben. Der schickt aber Ackknowledge und alles ganz akkurat zurück. Und er meckert nicht mal bei dem Max! Das ist es ja!

Brauche den I2C-Adapter, weil ich drei FM-Tuner daran betreiben möchte, die alle eine feste Chip-Adresse haben. Also drei I2C-Busse! Der AD-Wandler soll die Senderfeldstärke wandeln. Oder ich muss mal einen anderen probieren. Im Prinzip würde es da auch ein 8-Bitter tun. Kennt ihr einen 8-Bit-ADW via I2C? Habe nur den genommen, weil ich die anderen beiden auch nochmal für andere Messaufgaben nutzen wollte.

Oder ich baue mal Euren I2C-RS232 Adapter nach und hänge den 127 mal da dran!

Danke übrigens für die vielen Überlegungen zu meinem Problem!

Gruß
Matze

Tonspion
31.08.2006, 14:03
Ich glaube langsam fast doch, dass Maxim mir Sch**** geliefert hat!
Habe mir jetzt sonen günstigen Philips PFC8591 von Conrad mitgebracht.
Eingebaut, paar Bauteile rum und lief innerhalb einer halben Stunde auf meinem Board und der Software zusammen (plus löten). Einziger Nachteil, der Kollege hat nur 8 bit Auflösung. Aber das lässt sich auch zur Not noch verschmerzen.

Nach der vielen Aufregung noch ein Witz: Was haben ein Condom und ein Sarg gemeinsam? In beiden liegen Steife drin!

Und was ist der Unterschied? Der eine kommt - der andere geht! \:D/

ppms
18.10.2008, 21:06
ich hatte das selbe problem. ich benutze allerdings einen JAVA-Controllter JControl-Stamp.
alle fehler sind identisch zu diesen, nur ungenaue ergebnisse, die hälfte des werteberichs funktioniert nicht etc...
nach einer woche habe ich den fehler gefunden, die I2C komunikation ist das problem. da ich die genaue funktionsweise der java-i2c-klasse nicht kannte habe ich falschen oder fehlerhafte methoden benutzt.
(eine methode die das commandbyte schreibt und direckt die gelesenen bytes zurück gibt. mit einezelnen methoden für schreiben und lesen hatte ich endlich exakte-ad-werte)
daher gehe ich davon aus das auch hier die i2c schnittstelle die fehlerquelle ist. der seriell-i2c-adapter wird nicht geignet sein.

vieleicht hilft das, gruß.

BASTIUniversal
19.10.2008, 09:42
Hi!
@ppms: Ist zwar nett, dass du Helfen möchtest...aber der Thread ist über 2 Jahre alt! Schau nächstes mal bitte vor dem Posten auf das Datum.

MfG
Basti