-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: AD-Wandler wandelt nicht wie er soll

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2006
    Beiträge
    10

    AD-Wandler wandelt nicht wie er soll

    Anzeige

    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!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    17.04.2006
    Beiträge
    2.193
    Womit steuerst Du die Eingänge denn an? Der Eingangswiderstand von dem Ding ist reichlich niedrig!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.09.2004
    Beiträge
    264
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2006
    Beiträge
    10
    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.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2006
    Beiträge
    10
    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.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.09.2004
    Beiträge
    264
    Fehler:

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

    mfg

    Stefan

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2006
    Beiträge
    10
    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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.09.2004
    Beiträge
    264
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2006
    Beiträge
    10
    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!

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.09.2004
    Beiträge
    264
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •