Forum: Mikrocontroller und Digitale Elektronik ADC im Messbereich kleiner 1V


von Ugene (Gast)


Lesenswert?

Hallo Forum,

ich habe vor, mit einem internen ADC des AT90USB eine Spannug von 
0..500mV zu messen. Eine Signalverstärkung würde ich wegen verfälschung 
nicht anstreben.

Ist es eurer Meinung/Erfahrung nach, möglich, problematisch oder geht 
klar??

von Falk (Gast)


Lesenswert?

@Ugene

>ich habe vor, mit einem internen ADC des AT90USB eine Spannug von
>0..500mV zu messen. Eine Signalverstärkung würde ich wegen verfälschung
>nicht anstreben.

Das ist Unsinn. Ob der Verstärker nun im ADC sitzt oder extern ist fast 
egal. Er muss "nur" ordentlich aufgebaut/dimensioniert sein.

>Ist es eurer Meinung/Erfahrung nach, möglich, problematisch oder geht
>klar??

Das geht klar, auch mit nem normalen Verstärker auf OPV-Basis.

MFG
Falk

von Zacc (Gast)


Lesenswert?

Nein, das geht in der Regel nicht ohne Bitverlust. Die internen ADC 
haben die Speisespannung als Referenz. Und wenn man nur einen Achttel 
davon am Eingang des ADC bringt, hat man 3 bit verloren. Ich wuerde eine 
Verstaerkung vorschalten. Je nach Budget gibt es da schoene 
Rail/Rail-Verstaerker. Ich zB messe Shunts mit einem MCP617 (offset 
150uV), oder LMC6462 (offset 250uV) bei Verstaerkungen von 40.

Z.

von johnny.m (Gast)


Lesenswert?

> Die internen ADC haben die Speisespannung als Referenz.
Wenn Du mit "Speisespannung" die Versorgungsspannung meinst, dann stimmt 
die Aussage im Prinzip nicht, außer, wenn die Versorgungsspannung intern 
als Referenzquelle ausgewählt ist. Bei allen aktuellen AVR-Controllern 
(und bei vielen anderen auch) ist die Referenzspannung für den ADC 
einstellbar zwischen VCC, einer internen oder externen Referenz. Die 
externe Referenz darf bei den AVRs aber afaik nicht unter 1 V liegen.

Ich würde auch einen OPV benutzen...

von Ugene (Gast)


Lesenswert?

> Die internen ADC haben die Speisespannung als Referenz.

Bei AT90USB kann Aref- Referenzspannung - auch extern sein, aber mind 
1V.
Aref für ADC würde ich mit 1,5V beschalten. Bei 10bit Auflösung und 
einer Genauigkeit von +-2LSB kommmt eine genauigkeit von ca. 4,4mV

Außerdem muss ich für ein rail to rail V- erzeugen. Das heißt weitere 
Bauteile...

@johnny.m: warum würdest du OPV nehmen? Wenn es so auch funktionieren 
könnte...

von Falk (Gast)


Lesenswert?

@Ugene

>Aref für ADC würde ich mit 1,5V beschalten. Bei 10bit Auflösung und
>einer Genauigkeit von +-2LSB kommmt eine genauigkeit von ca. 4,4mV

1.) Erst hast du Angst wegen "Verfälschungen" und dann benutzt du 1,5V 
als Referenzspannung. Hmm????

2.) Genauigkeit und Auflösung sind zwei vollkommen verschiedene 
Schuhe!!!

>Außerdem muss ich für ein rail to rail V- erzeugen. Das heißt weitere
>Bauteile...

Der Trick beim Rail-2-Rail OPV ist ja eben, dass er keine -V braucht.
Wenn dein uC mit 5V läuft und deine Messpannung Massebezug hat tut auch 
ein (pseudo) Rail-2-Rail ala LM358, der kann am Eingang bis 0V runter, 
nur der Ausgang schafft nur VCC-1,5. Allerdings hat der LM358 wohl 
zuviel Offset.

MFG
Falk

von Ugene (Gast)


Lesenswert?

> 1.) Erst hast du Angst wegen "Verfälschungen" und dann benutzt du 1,5V
> als Referenzspannung. Hmm????
Hab vergessen zu erwähnen, dass ich nur die relative Spannungsäderung 
messen will.
The ADC converts an analog input voltage to a 10-bit digital value 
through successive approximation.
The minimum value represents GND and the maximum value represents the 
voltage on Aref-1LSB.

D.h wenn ich 500mV am ADC0 anlege bekomme ich VADCx/1,5*1023 =

341 (bei 500mV)
272 (bei 400mV)
68  (bei 100mV)
.
0   (beo 0mV)

> 2.) Genauigkeit und Auflösung sind zwei vollkommen verschiedene
> Schuhe!!!
stimmt

von Branko Golubovic (Gast)


Lesenswert?

@Ugene

Hast du die letzte Posting nicht gelesen.
Beitrag "Re: ADC am AT90USB127 (ähnlich mega128)"

Ich habe dir ein Vorschlag gegeben, aber du hast nicht reagiert
und wieder dasselbe Frage gestellt.
Antwort ist noch einmall:
In AT90USB schon vorhandenen Verstärker(wie in ATmega128) verwenden,
Gain auf 10 eintellen(MUX=0x09), ADC0 auf  gnd und
ADC1 als Eingang benutzen und Problem ist gelöst.
Damit hast du ein Spannungsbereich von genau 0 bis 500mV
wenn Aref 5V ist.

Branko

von Ugene (Gast)


Lesenswert?

@Branko
Danke für dein Vorschlag. Natürlich habe ich es im letzten posting 
gelesen. Dein vorschlag kann ich aber nicht realisieren, da ich drei 
Leitungen habe, an denen ich 0,5V messen (realtiv zu einander) sollte. 
Und laut Datenblatt habe ich nur zwei ADCpins mit Verstärkung, wobei 
hier die max. Auflösung bei 8bit bzw 7bit leigt.

Außerdem warst du der einzigste, der geantwortet hatte. Deshalb habe ich 
die Frage umformuliert und sie allgemeiner gestellt.

@all:
Danke für eure Beiträge.
Nun hat mir jeder geraten ein OPV zu nehmen. Ich denke ich werde es mal 
genauer anschauen, ob ich doch noch ein OPV dazwischen schalte. Pegel 
auf 5V anhebe und Aref=VCC=5V schalte.

von Branko Golubovic (Gast)


Angehängte Dateien:

Lesenswert?

>Da ich drei
>Leitungen habe, an denen ich 0,5V messen (realtiv zu einander) sollte.

Was  bedeutet genau "relativ zu einander"?
Kannst du villeicht ein Schaltplan posten und damit alle
Unklarheiten beseitigen?
Auserdem bei Verstärkung ist die Atmel nicht sooo schlecht.
Anbei Messergebnis bei Single-ended, 1,10 und 200fache Verstärkung.

von Ugene (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe drei Siganale a, b, c, jeder von denen kann 0...500mV sein. Ich 
muss sie alle "nacheinander" abfragen/AD-wandeln. Deshalb kann ich keine 
differenziellen Eingäge und damit die Verstärkung des ADC nicht 
benutzen.

von Ugene (Gast)


Lesenswert?

Ich denke ich werde alternativ einen OPV einsetzen (Platz auf LP 
vorsehen). Was anderes ist aufwendiger, oder wird womöglich nicht 
funktionieren und Zeit für Experimente habe ich nicht.

von Ugene (Gast)


Lesenswert?

Was hält ihr von opa4348? Damit könnte ich alle drei Eingänge mit einem 
Baustein verstärken. Er ist günstig und Icc ist sehr niedrig.
Eure Meinung Branko, Falk?

von Brako Golubovic (Gast)


Lesenswert?

Ich glaube  Problem mit drei 500mV Eingänge ist möglich noch immer
ohne externen OPA zu lösen. Nimm einfach ein 
Analogmultiplexer(74HC4051,HC4052)
und verwende wie ich schon erwent INTEGRIERTEN OPA. Mit dem Multiplexer
kannst du ein Eingang mit 10-fache Werstärkung nach wünsch erweitern.
Auserdem ist diese Lösung sicher billiger.
Ich verwende seit jahren ein ATmega32 mit 200-fache Verstärkung für
Temperaturmessung mit einem K-Type Thermoelement(NiCr-Ni 41µV/°C).
Mit Aufsumierung von 16 Messergebnisen bekomme ich absolut stabile
Temperaturanzeige auf einem LCD Display. Auflösung beträgt übrigens 1°C.
Integrierte OP ist überhaupt nicht zu unterschetzen.
Wenn du nocht Messwerte-streung Messen willst würde dir villeicht
dass helfen:
Beitrag "ATmega ADC Test"
Also dein Problem lass sich auch mit einfachen Mitteln lösen.


von Stefan Salewski (Gast)


Lesenswert?

>Auflösung beträgt übrigens 1°C

Und die Genauigkeit?

von Ugene (Gast)


Lesenswert?

> Nimm einfach ein Analogmultiplexer(74HC4051,HC4052)

Ich habe insgesamt 36 Signale zu messen, da habe ich schon bereits einen 
MUX (CD74HC4067) integriert und die Signalzahl auf 3 reduziert.
Das System sieht so aus, das ich 15 Sensorboards habe und ein Mainboard. 
Ein weitere MUX auf SensorLP (x15) macht nicht so viel Sinn.

Deshalb denke ich an die OPV Lösung auf jedem Sensorboard. Somit werden 
die Signale auch gegen die Störungen resistenter.

Aber danke für die Beiträge, ich bin immer offen für alle Vorschläge und 
finde die Deskussion sehr hilfreich.

von Branko Golubovic (Gast)


Angehängte Dateien:

Lesenswert?

>>Auflösung beträgt übrigens 1°C

>Und die Genauigkeit?

Hängt von Thermoelement-Genauigkeit ab, Auswertungselektronik hat 
zusätzlich eine Messfehler von +-1°C(ohne Linearisierung).
Als externe Beschaltung verwende ich nur ein Widerstand(2K7 1%).
Mit gleichem Schaltung kann ich auch ohne
Linearisierung Temperatur mit KTY81 messen.

Temperaturmessung mit KTY81
ADC0, Single ended, Aref=0,79*AVCC,Auflosung 0,5°C
Messbereich -30 bis 110°C
ADC0, Single ended, Aref=0,395*AVCC,Auflosung 0,25°C
Messbereich -30 bis 100°C
AVCC----|-----------|
        |           _
        _           5
        2           K
        K           p -----|-----Aref
        7           o      _
        _           t      1
ADC0----|           i      0
                         n
        K           |      _
        T           |      |
        Y           |      |
AGND----|-----------|------|


Temperaturmessung mit K-Type Thermoelement
ADC0-ADC1, Gain=200, Aref=0,79*AVCC,Auflösung 1°C
Messbereich -50 bis 500°C

AVCC---------|-----------|
      .K-Type|           _
     / \     _           5
    /   \    2           K
   /     \   K           p -----|-----Aref
   |     |   7           o      _
   |     |   _           t      1
 ADC1  ADC0--|           i      0
                              n
             K           |      _
             T           |      |
             Y           |      |
AGND---------|-----------|------|

Anbei ist Excel-Tabelle wo zu sehen ist dass eine Linearisierung
(Weder uber Hardware noch uber Software) nicht notwendig ist.
Ganz in Gegenteil. 2K7 Widerstand linearisiert Temperatur-Spannung
Verlauf von KTY81 in einem Temperatubereich von -20 bis +100°C
auserdem ist Temperaurmessung unabhängig von AVCC Schwankungen
weil sich Aref auch Ändert.
Bei zweitem Schalung verwende ich KTY81 Umgebungstemperatur zu
Ermitteln und damit Kompensiere ich(uber Software)die Thermospannung.

Branko

von Jörn P. (jonnyp)


Lesenswert?

Übrignx beträgt die Minimum Referenzspannung 2 Volt.

von Ugene (Gast)


Lesenswert?

> Übrignx beträgt die Minimum Referenzspannung 2 Volt.

Falsch.
siehe Datenblatt, Seite 407, vierte Zeile von unten:
VREF Reference Voltage   min   max
Single Ended Conversion  1.0   AVCC V
Differential Conversion  1.0   AVCC - 0.5 V

von Ugene (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die hilfreiche Diskussion.
Ich habe mich nur doch für ein OPV entschieden. OPA4348 mit 10-fachen 
Verstärkung.

von Peppe (Gast)


Lesenswert?

Hallo,
ich habe gerade eure Beiträge gelesen.
@ Branko
Ich habe ein ähnliches Problem.
Ich muß 4 Thermoelemente vom Typ-K auswerten.
Ich habe mir bei Maxim 4 Max6675 bestellt und die an meinen Atmega 
angeschlossen , leider spinnen die rum und liefern nicht die Gewünschten 
ergebnisse.
Du schreibst, dass du ein Thermoelement auswertest und brauchbare 
Ergebnisse erziehlst. Ich wollte mal fragen , wie du das genau 
angestellt hast.Ich brauche stabile Werte im Bereich zwischen 450 und 
800 Grad C.
Das soll eine Abgasstemperatur messung werden, bei dem alle vier 
Abgasswerte gemessen werden.

Viele Grüße
Peppe

von rene (Gast)


Lesenswert?

Thermoelemente benoetigen Zerodriftverstaerker, die man mit hoher 
Verstaerkung laufen laesst. Dabei muss man beachten, dass der Eingang im 
Gleichtaktbereich sein sollte.

von Branko Golubovic (Gast)


Lesenswert?

>Ich habe mir bei Maxim 4 Max6675 bestellt und die an meinen Atmega
>angeschlossen , leider spinnen die rum und liefern nicht die Gewünschten
>ergebnisse.

Was bedeutet diesen Satz in Klartext?

1. Gibst Schwankungen von Messergebnissen  aber Mittelwert ist richtig?
 Lösung: Softwareseitig: Mittelung von messwerten,
 Hardwareseitig: Synchronisierung mit der Netzfrequenz, Saubere Layout 
mit  Getränte Analog und Digital GND Fläche, Abkoppelungs-Kondensatoren 
gleich neben Versorgungspins.

2. Messergebnis entspricht tatsächliche Temperatur nicht?


Branko

von Peppe (Gast)


Lesenswert?

So Abgasstemperaturmessung funktionert jetzt.
Ich verwende dazu Die MAx6675 nud einen Atmega8

Peppe

von Axel R. (Gast)


Lesenswert?

Peppe wrote:
> So Abgasstemperaturmessung funktionert jetzt.
> Ich verwende dazu Die MAx6675 nud einen Atmega8
>
> Peppe

Schön!

Wo lag der Fehler?

AxelR.

von Bastian N. (slime2k)


Lesenswert?

Hi,

gibt es zu oben gezeigter Schaltung auch ein codebeispiel?
Ich hab das ganze wie beschrieben aufgebaut, benutze einen ATMega16 mit 
internen 8Mhz und ein leicht angepasstes "Beispiel" aus einem anderen 
Thread hier.
1
ACSR = _BV(ACD);
2
ADCSRA = _BV(ADEN) | _BV(ADIF) | _BV(ADPS2) | _BV(ADPS1);
3
ADMUX = _BV(MUX3) | _BV(MUX1) | _BV(MUX0);
4
5
void ADC_conversion(void)  // Spannung über pt100 messen (32 Messswerte-Mittelwert)
6
{
7
    int ADC_temp;
8
    int ADCresult = 0;
9
    unsigned char i;
10
11
    for(i=0;i<32;i++)           // 32 Messungen für bessere Genauigkeit 
12
    {
13
        ADCSRA |= (1<<ADSC);   // 'single conversion' einleiten
14
        while(!(ADCSRA & 0x10));  // auf ende der Wandlung warten, ADIF flag '1'
15
        ADC_temp = ADCL;   // ADCL Register lesen
16
        ADC_temp += (ADCH << 8); // ADCH Register lesen      
17
        ADCresult += ADC_temp;   // Ergebnisse der 32 Messungen addieren
18
    }
19
    ADCresult = ADCresult >> 5;     // Addierte Ergebnisse durch 32 teilen
20
    ADCresult_average = ADCresult;   // Mittelwert der 32 Messungen der globalen Variable zuweisen
21
22
    return;
23
}

Irgendwie bekomm ich aber nur stark schwankende Werte bei der Messung.
Ausserdem bin ich mir nicht sicher wierum das Thermoelement 
angeschlossen werden muss. :/
Könnt ihr mir hier bitte etwas auf die Sprünge helfen? Analogtechnik is 
nich wirklich so mein Gebiet. :)

slime

von Bastian N. (slime2k)


Lesenswert?

Hallo nochmal,

bin ein ganzes Stück weiter gekommen. Als erstes musste ich feststellen 
das der KTY den ich hier verwendet hab ein 81-210 Type ist (2000Ohm @ 
25°C) und nicht wie angegeben der 81-110 (1000Ohm @ 25°C). Hab den KTY 
jetzt testweise durch einen 1k Widerstand ersetzt. Jetzt passt zumindest 
schonmal der wert der an ADC0 gemessen wird.
Mit der differentialmessund ADC0 - ADC1 des Thermoelements gibt es aber 
noch Probleme. Vernünftige und stabile Werte bekomm ich irgendwie erst 
ab Temperaturen über ca 30-40°C. Ist die Temperatur niedriger springt 
der Wert der Messung eigentlich zwischen dem gesammten Messbereich 
wahllos hin und her. Wie ist dies zu erklären? Gibt es irgendwelche 
schaltungstechnischen Maßnahmen die man dagegen unternehmen kann?

slime

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.