Krumeltee

-> Elektronik, Mikrocontroller und Retro-Computing <-

MAX127 I²C-AD-Wandler am AVR

Posted by krumeltee - 27. Juli 2011

Ich bin vor kurzem durch Zufall an zwei MAX127 im DIP-Gehäuse gekommen, sehr praktische ADCs.

Hier ein kurzer Überblick:

  • I²C Interface
  • 8 Channels
  • 12Bit Auflösung
  • einzelne 5V Versorgungsspannung, ausreichend genaue Referenz mit 2 Kondesatoren möglich
  • 0-5V, 0-10V, -5V – +5V, -10V – +10V Input Range
  • -16,5V – +16,5V Überspannungsschutz auf den Eingängen
  • Bis zu 9 Chips am Bus verwendbar (72 Analoge Eingänge max.)

Durch die sehr starke Input Protection von +-16,5V ist dieser ADC nahezu Idioten- und Steckbrettsicher. Die Kommunikation ist extrem einfach gehalten, auch die Einstellmöglichkeiten sind nicht allzu aufgebläht, sodass man das Datenblatt in 10 Minuten auswendig kann.

Die Auflösung von 12Bit ist auch sehr gut, das reicht für Basteleien, Roboter, Akkuladegeräte, als Eingangs-ADC für analog gesteuerte Lichttechnik, …, … dicke aus.

Die Kommunikation benötigt für eine AD-Wandlung 4 Byte, also lasst uns mal rechnen:

100kHz Bus: 1/(32bit/100.000bit pro sekunde) = 3125 Messungen pro Sekunde

400kHz Bus: 1/(32bit/400.000bt pro sekunde)=12500 Messungen pro Sekunde

Soviel zur Theorie, die Start- und Stopbits, der Protokolloverhead, noch nicht mitgerechnet. Dies macht allerdings nicht allzuviel aus. Das Datenblatt gibt 8000 Samples Per Second an, das entspricht 125µS pro Messung. Um nun alle 8 Channels einmal abzufragen benötigt man also eine Millisekunde.

Nun genug der Rechnerei, hier zur Hardware, welche SEHR SEHR einfach ist.

Bei mir hing der ADC zum Testen an einem atmega32, sollte aber mit jedem AVR mit I²C funktionieren, wahrscheinlich schon auf einem attiny2313 oder ähnliche mit 2kb Flash.

Die Adresse des Chips lässt sich über die Pins A0, A1, A2 einstellen. Sind alle drei Pins auf GND, so ist die Adresse 0x50. Will man eine andere Adresse, sollte man sich das Datenblatt durchlesen.

Die Software ist ebenso einfach wie die Hardware. Mein Beispielcode für den ADC baut auf der Fleury I²C-Library auf. Die Display-Ausgaben in den weiteren Beispielen bauen auf der Fleury LCD-Library für ein HD44780 Display auf.

Hier erstmal der Quellcode:

/* get_max127()
*
* address - I2C Bus Addresse des Chips
* channel - Der Kanal, von 0 bis 7
* mode - 0 = 0-5V messung, 1 = 0-10V messung
* 2 = +-5V messung, 3 = +-10V messung
*
*/ 
unsigned short get_max127(unsigned char address, unsigned char channel,unsigned char mode) {
    unsigned char high, low, ret, config_byte;
    unsigned short value;
    if(channel > 7) return 0;

     ret = i2c_start(address);                                      // start communication
    if(ret == 0) {                                                // chip found
        if(mode == 3) config_byte = (0x8c | (channel<<4));        // configuration byte, for information see datasheet
        else if(mode == 2) config_byte = (0x84 | (channel<<4));
        else if(mode == 1) config_byte = (0x88 | (channel<<4)); 
        else config_byte = (0x80 | (channel<<4));
         i2c_write(config_byte);
        i2c_stop();

        i2c_start(address+1);
        high = i2c_readAck();
        low = i2c_readNak();
        i2c_stop();
        value = ((high<<8)|low);
        value >>= 4;
    } else {
        return 0;
    }
    return value;
}

Hier dann noch ein paar Beispiele zum verwenden der Funktion:

/* Channel 0, Wert in Hex, Dezimal, Volt von 0-5V Messung per RS232 rausschicken */
char buffer[64];
unsigned short ad_value = get_max127(0x50, 0, 0);
sprintf(buffer, "hex:%03x dez:%d volt:%1.4fV", ad_value, ad_value, ((5.0/0xfff)*ad_value));
uart_puts(buffer);

/* Channel 3, Wert in Volt auf HD44780 LCD mit Fleury LCD Lib ausgeben */
char buffer[17];    // buffer ist 17 bytes gross, fuer 16 zeichen LCD + ''
unsigned short ad_value = get_max127(0x50, 3, 1);
sprintf(buffer, "%1.4fV", ((10.0/0xfff)*ad_value));
rs232_send(buffer);

 

Sollten noch Fragen sein, könnt ihr mir schreiben oder aber auch das Datenblatt lesen. Zum Schluss natürlich noch ein Foto:

 

2 Antworten to “MAX127 I²C-AD-Wandler am AVR”

  1. ismail said

    hallo,
    ich habe das programm bei mir versucht , es hat aber nicht geklappt, ich benutze einen C151C mikrocontroller. und habe eine I²c display. das I²c.h habe ich.ich habe eine Schaltung gebaut wo ein max127 steht, aber ich komme nicht an, digitale werte auf dem display anzuzeigen. Können Sie mich weiter helfen

  2. Walter said

    Interessanter und guter Artikel.
    Die Seite 10 der Maxim Doku ist jedoch bei +- Inputs nicht eindeutig. Mir fehlt der Hardwareanschluss.
    Ich habe z.B. ein Poti an einer sym. Spanunng +5V und -5V angeschlossen. Wenn, nach richtiger Configuration des Max127, das Poti von +5V nach -5V durchgedreht wird, ergeben sich an beiden Endpunkten, also +5V und -5V, jeweils der ADC Wert 2047. Schließt man die Leitung nach Masse Kurz, ergibt sich ein ADC Wert von 4096. Auch der Verlauf der Spannung bei langsamen durchdrehen hat keinen linearen Verlauf. Maxim schreibt dazu nix. Weiß jemand näheres. Viele Grüße.

Hinterlasse einen Kommentar