PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche preiswerten AD-Wandler mit min. 12 Bit



Gast23
18.09.2007, 23:45
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?

wkrug
19.09.2007, 12:32
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.

Gast23
19.09.2007, 14:03
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

wkrug
19.09.2007, 17:44
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.


/* 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);
}

}

wkrug
19.09.2007, 17:57
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.

Gast23
20.09.2007, 09:50
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?

wkrug
21.09.2007, 20:32
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.