- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: Suche preiswerten AD-Wandler mit min. 12 Bit

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.03.2006
    Beiträge
    42

    Suche preiswerten AD-Wandler mit min. 12 Bit

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi
    Kennt jemand einen preiswerten AD-Wandler mit minimum 12 Bit Auflösung? Muss nicht sonderlich schnell sein, allerdings I2C oder SPI Schnittstelle wäre schon fein.
    Und es sollte eine deutsche Bezugsquelle geben. Habt ihr Tipp?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich experimentiere zur Zeit mit dem AD7795 von Analog Devices rum.
    Der hat 16Bit Auflösung, 6 differenzielle Kanäle, interne 1,17V Referenz, SPI Schnittstelle und auch sonst noch ein paar super Features.
    Er kann bis 420 Wandlungen pro Sekunde schaffen.
    Super günstig ist der nicht gerade, kostet so um die 10,-€.
    Der Wandler ist bei Farnell zu beziehen (und bei Digikey - aber Ausländer wolltest Du ja nicht).

    Leider spezifizierst Du deine gewünschten Features nicht genauer.
    Auch bei Conrad und Reichelt gibt es einige 12 Bit A/D Wandler.
    Nutz halt mal die Such Funktion.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.03.2006
    Beiträge
    42
    Nun ich brauche diesen zum sehr genauen messen von Gleichspannung zwischen 3 und 17 Volt!

    Der AD7795 sieht auch nicht schlecht aus, nur halt etwas teuer. Hast du schon ein C oder Bascom Programm dazu parat? Etwas Code wäre mir nur recht.

    Ansonsten habe ich noch von diesen gehört:

    ADS7823 (12-Bit, 1-Kanal, I2C)
    ADS7828 (12-Bit, 8-Kanal, I2C)
    AD7998 (12-Bit, 8-Kanal, I2C)
    AD7998
    AD7799
    LTC2440
    MCP2550
    MCP3551
    MCP3553

    Leider sind alle nicht über Conrad oder Reichelt erhältlich

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Vielleicht hilft Dir ja dieser funktionsfähige C- Codeschnipsel was.
    Den BIAS Voltage Generator hab ich wieder abgeschaltet und durch eine LED mit Vorwiderstand ersetzt.
    Anfangs hatte ich die Ausleseroutine so gestaltet, das der Controller auf das Ende der Wandlung wartet, dabei hat sich das Ding dann bisweilen aufgehängt. Darum sind jetzt da die komischen Zeitschleifen drin.
    Wenn mehr als 2 Fehler auftreten lass ich im Hauptprogramm einen Reset und eine Neuinitialisierung des AD 7795 laufen (uc_aderror).
    Eventuell strick ich an der Routine noch mal etwas um - die Schaltung ist erst in der Entwicklungsphase.

    Code:
    /* Einen Clockimpuls für den AD7795 generieren */
    void clock_ad7795 (void)
    {
    #asm("nop");
    ad7795_clock=0;
    #asm("nop");
    ad7795_clock=1;
    #asm("nop");
    }
    
    /* 8Bit in den AD7795 schreiben */
    void write_ad7795 (unsigned char uc_byte)
    {
    unsigned char i=0;
    for(i=0;i<8;i++)
    {
        if((uc_byte&(1<<7))==(1<<7))
        {
            ad7795_din=1;
        }
        else
        {
            ad7795_din=0;
        }
        clock_ad7795();
        uc_byte=uc_byte<<1;
    }
    ad7795_din=1;
    }
    
    /* AD Wandlerwert holen AD7795 */
    unsigned int read_ad7795 (unsigned char uc_channel)
    {
        unsigned char uc_sendbyte,uc_i;
        unsigned int ad_value=0;
        
        uc_channel=uc_channel&0b00000111; /* Höherwertige Bits abtrennen */
        
        // Init Configutation Register for Channel X
        ad7795_din=1;
        ad7795_cs=0;
        write_ad7795(0b00010000);   /* Write to Configutation Register */
        write_ad7795(0b00011000);   /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
        write_ad7795((0b10010000|uc_channel));   /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=X */
        ad7795_cs=1;
        #asm("nop");
        
        // Init Mode Register = Read selected AD Channel
        ad7795_cs=0;
        write_ad7795(0b00001000);   /* Write to Mode Register */
        write_ad7795(0b00100000);   /* Write value to Mode Register high = Single Conversation=On, AMP_CM=OFF*/
        write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
        
        delay_ms(60);               /* Auf A/D Wandler warten */
        if (ad7795_dout==1)
        {
            delay_ms(100);          /* Nochmal warten */
        }
        if (ad7795_dout==1)
        {
            ad_value=0;             /* Fehlerzähler hochzählen */
            uc_aderror++;
        }
        else                        /* A/D Wandler auslesen */
        {
            write_ad7795(0b01011000);  /* Readout Dataregister Command */
            for (uc_i=0;uc_i<16;uc_i++)
            {
                if (ad7795_dout==1)
                {
                    ad_value=ad_value|0x0001;
                };
            ad_value=(ad_value<<1);
            clock_ad7795();
            }
        };
        
        ad7795_cs=1;
        #asm("nop");
        
        return (ad_value);
    }
    
    /* Reset für den AD7795 */
    void reset_ad7795 (void)
    {
        unsigned char uc_i;
        ad7795_cs=0;
        #asm("nop");
        ad7795_din=1;
        for(uc_i=0;uc_i<32;uc_i++)
        {          
            clock_ad7795();
        }
        ad7795_cs=1;
        #asm("nop");
    }
    
    /* Initialisieren des AD7795 */
    void init_ad7795 (void)
    {
        volatile unsigned char uc_i;
        for(uc_i=0;uc_i<4;uc_i++)
        {
            // Init Configutation Register Ch X
            ad7795_cs=0;
            write_ad7795(0b00010000);   /* Write to Configutation Register */
            write_ad7795(0b00011000);   /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
            write_ad7795(0b10010000|uc_i);   /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=AIN X */
            ad7795_cs=1;
            #asm("nop");
        
            // Init Mode Register = Init Zero Calibration Ch X
            ad7795_cs=0;
            write_ad7795(0b00001000);   /* Write to Mode Register */
            write_ad7795(0b10000000);   /* Write value to Mode Register high = Zero Calibration=On, AMP_CM=OFF*/
            write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate= 62Hz */
            delay_ms(50);
            if (ad7795_dout==1)
            {
                delay_ms(100);
                uc_aderror++;
            }
            ad7795_cs=1;
            #asm("nop");
            
            // Init Mode Register = Init Full Scale Calibration Ch X
            ad7795_cs=0;
            write_ad7795(0b00001000);   /* Write to Mode Register */
            write_ad7795(0b10100000);   /* Write value to Mode Register high = Full Scale Calibration=On, AMP_CM=OFF*/
            write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
            delay_ms(50);
            if (ad7795_dout==1)
            {
                delay_ms(100);
                uc_aderror++;
            }
            
            ad7795_cs=1;
            #asm("nop");
        }
    };
    
    /* 6 A/D Werte aus dem AD7795 auslesen und abspeichern */
    void read6_ad7795 (void)
    {
        unsigned char uc_i;
        for (uc_i=0;uc_i<6;uc_i++)
        {
            ui_old7795[uc_i]=ui_7795[uc_i];
            ui_7795[uc_i]=read_ad7795(uc_i);
        }
    
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Bei Reichelt hab ich noch den ADS 7822 UB für 3,45€ gefunden.
    Ist ein "seriell" Wandler.
    Schau mal ob der für deine Applikation taugt.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    17.03.2006
    Beiträge
    42
    Oh fein, der ADS 7822 UB sieht garnicht schlecht aus, kann der auch mit 5V betrieben werden so ganz schlau werde ich aus dem Datenblatt nicht.
    Hat dazu auch schon jemand ein paar AVR-Codezeilen zur seriellen Übertragung?

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Der Chip sollte sich mit 5V betreiben lassen, wobei die Referenzspannung niedriger sein sollte (2,5...3V).
    Das absolute Limit sind 6V.

    Zu programmieren gibts an dem Chip anscheinend nichts.

    Man muß das /CS auf L ziehen und warten bis der Dout Ausgang L wird (Pull Up Widerstand).
    Dann legt man einen Takt an und liest die Wandlerwerte aus.

    Das geht fortlaufend so, bis /CS wieder nach H geschaltet wird.

    So hab ich das Datenblatt interpretiert.
    Kannst ja mal bei Burr Brown nachschauen ob's da irgendwelche Application Notes oder sogar Codeschnipsel gibt.

Berechtigungen

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

LiFePO4 Speicher Test