Womit steuerst Du die Eingänge denn an? Der Eingangswiderstand von dem Ding ist reichlich niedrig!
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!
Womit steuerst Du die Eingänge denn an? Der Eingangswiderstand von dem Ding ist reichlich niedrig!
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):
Code:'------------------------------ 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
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.
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.
Fehler:
Anstatt 0100100 probiere mal 1100100. Das erste bit sollte 1 sein. Deine Einstellung heißt ch4 (!) und 0 bis 10V.
mfg
Stefan
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.
Das ist die Adresse 80 und dann "1" "000" = CH0, "10" = 0-10V , "00" = normal OperationStart 01010000 10001000 Stop
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.
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.Sagt mal, ist das bei Euch auch so, dass ihr vor jeder neuen Spannungs-Abfrage erst ein Controlbyte rüberschicken müsst?
mfg
Stefan
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!
Und die 02 wird nicht an den Max127 geschickt? Ich vermute daß entweder hier oder in der Umsetzung I2C/seriell der Fehler liegt.S5102P
Der Controller braucht die 02, damit er weiß, dass er zwei Byte auslesen soll.
Das glaube ich nicht.Das Einzige was wirklich sein kann ist, dass Maxim mir drei defekte IC's geschickt hat!
mfg
Stefan
Lesezeichen