mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe zu AD-Wandler


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an Alle,

ich benutze einen ATMEAG8535. Ich möchte einen Luftdrucksensor an einem
AD-Wandler Eingang anschließen. WIe muss ich den AD-Wandler per Software
initialisieren bzw. aktivieren? Kann mir jemand einen Beispielcode dazu
geben?

Gruß Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich das sehe sind da 8x 10 Ad-Wandler integriert.
Wie bekomme ich dann die Werte vernünftig angezeigt?
Ich kann auf mein Display keine 10Bit werte in eine Variable packen
oder?

Autor: Carsten Steiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst diese 10-Bit in ein BCD-Format wandeln.
10 Bit entsprechen einem Zahlenraum von 0 bis 1023, das wiederum
entspricht 16 Bit im BCD-Format, da jeweils 4 Bit einer Ziffer im
Zehnersystem entsprechen.
siehe: http://de.wikipedia.org/wiki/BCD

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> WIe muss ich den AD-Wandler per Software initialisieren bzw.
> aktivieren?

Welche Programmiersprache? Für C siehe:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Für ASM siehe AVR-Datenblatt (step by step so machen, wie's da steht)


> Wie bekomme ich dann die Werte vernünftig angezeigt?

Ich verstehe die Frage nicht. Werte so skalieren, wie es nötig ist und
mit dem "Printf" deiner Programmiersprache ausgeben?

> Ich kann auf mein Display keine 10Bit werte in eine Variable packen
> oder?

Warum nicht? Du willst auch eine 8 Bit Variable ohne Konversion nicht
aufs Display packen ;) Für ASM mal im Forum nach BCD suchen, damit die
AD Werte konvertieren und stellenweise ausgeben.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für Eure Unterstützung. Ich programmiere mit CodeVisionAVR in C.
Kann mir jemand zeigen wie ich meinen AD-Wandler Kanal 1 initialisieren
muss?

Der Code für die Initialisierung sieht bei mir so aus:
#define ADC_VREF_TYPE 0x00
// Read the ADC conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSR.6=1;
while (ADCSR.4==0);
ADCSR.4=1;
return ADCW;
}

Hauptprogramm:
while (1)
      {
        delay_ms (100);
        lcd_printfz(1,2,"Luftdruck %2i",read_adc(0));
      }

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo....

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir hier niemand dazu helfen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WIe kann ich beim ATMEGA8535 per Software mitteilen, dass ich die
interne Referenzspannung nutzen will?
Beim ATMEGA16 gibts es die BITS REFS0 und REFS1.Aber beim ATMEGA8535
finde ich diese nicht?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir außerdem noch bei mir auffällt ist, dass mein AD Wert schwankt.
AREF habe ich auch auf 5V gelegt.Wie kann ich verhindern dass mein AD
Wert so schwankt????

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn mir jemand dabei helfen könnte wäre ich sehr dankbar!

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>Was mir außerdem noch bei mir auffällt ist, dass mein AD Wert
>schwankt.
>AREF habe ich auch auf 5V gelegt.Wie kann ich verhindern dass mein AD
>Wert so schwankt????

1. Vernueftiges layout (AGND und DGND).
2. Als AREF eine Referenzspannungsquelle nehmen.
3. Eine Mittelwertbildung machen.
4. AVR GCC Tutorial
5. RTFM!!

Gruß,

Dirk

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

so ich habe jetzt mal das AVR GCC tutorial einwenig durchgelesen.
Ich kann ja die interne Refernezsspannung(BITS:REFS0 und REFS1 müssen
auf 1 liegen) nehmen.Das heisst an AREF mussen dann 2,56V zu messen
sein oder?

Dann sollte man zudem einen Kondensator zwischen AGND und AREF
legen.Welchen wert sollte der dann haben?

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

so ich habe jetzt die interne Referenzspannung benutzt.
Anschließend habe ich einen 100nF Kondensator zwischen PIN AREF und GND
eingelötet.
Der AD Wert schwankt bei mir noch als. Und zwar zwischen 600 und 700.
Wie kann ich dies noch unterdrücken, ohne viel Schaltungsaufwand?

Im Anhang hab ich mal mein C Programm angehängt.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt er denn, wenn Du die 1,22V Referenz misst? Wenn's dann immer
noch schwankt, ist was faul. Wenn nicht, schwankt das externe Signal.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ein misst mein Multimeter ist kaputt gegangen. Hmmm...
Auf jedenfall habe ich die BITS Refs0 und Refs1 auf 1
gesetzt(AVR:ATMEGA8535).

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mein Programm mal angeschaut. Ist die C Routine für den
AD-Wandler ok?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
....

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, der AT90 hat keine 1,22V-Referenz. Geht als nicht.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne ich verwende ja einen ATMEGA8535. Im Datenblatt steht da was von
2,56Volt. Kann leider den Wert nicht nachmessen,da mein Voltmeter
defekt ist.
Ich habe jetzt mal an AREF die +5V angeklemmt und zwischen AREF und
AGND einen 47uF Kondensator reingehängt.Jetzt schwankt der Wert
zwischen 270 und 310. Kann man eigentlich das noch besser hinbekommen?
Bringt es was wenn ich noch einen weiteren Kondensator verwende?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, also doch Mega. Dann stell doch mal den ADMUX auf die interne 1,22V
Referenz ein, bei Verwendung der internen Referenz. Müsste ungefähr
(Toleranzen!) 50% rauskommen, aber das ziemlich stabil.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich doch auch schon gemacht. Leider schwankt da der AD Wert
stärker.Hmmm...jetzt habe ich wie gesagt die AREF auf +5Volt gelegt und
einen 47uF Kondensator reingeklemmt.Wert schwankt nicht mehr so stark.

Was meinst du mit: "bei Verwendung der internen Referenz. Müsste
ungefähr (Toleranzen!) 50% rauskommen, aber das ziemlich stabil."
Verstehe ich nicht????

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast Du die zu messende Analogspannung angeschlossen?
Zeig mal einen Schaltplan, wenn nötig, mit Paint erstellt.
Wobei eine Differenz von 40 in einem Bereich von 0 bis 1023 gar nicht
so schlecht ist.
Um es für den Benutzer leserlicher zu machen muß man das per Software
glätten bzw. einen Mittelwert bilden.

MfG
Andi

Autor: A.K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Den Input vom Mux auf die 1,22V Bandgap Referenz einstellen (0x1E). Die
ADC-Referenz auf die interne 2,56V-Referenz einstellen. Wann das
Ergebnis instabil ist, dann stimmt m.E. entweder das Messverfahren
nicht (sieht aber ok aus), die Beschaltung ist falsch oder das IC
defekt.

Ok 50% ist daneben, sind nominell 46%. Was rauskommen müsste:
1,22V/2,56V * 1024 = 480. Plusminus erhebliche Toleranzen der
Referenzspannungen (siehe Datasheet). Das dann aber ziemlich zeit- und
temperaturstabil.

Ebenso mal den 0V-Mux ausprobieren (0x1F). Müsste ziemlich genau 0
rauskommen.

Beides funktioniert bei mir (Mega32). Mein WinAVR Code anbei
(auszugsweise).

Bietet der Compiler keine Möglichkeit, einen ATMega8535 einzustellen?
Das #include <90s8535.h> klingt ja mehr nach dem alten AT90S8535.

Den Pin AREF solltest Du nur dann extern auf 5V legen, wenn die
Ref-Bits aus 0 sind. Ergibt auch keinen Sinn, denn die Referenz kann
man ja auch intern auf AVCC umstellen (Ref=01). Und 47µF an AREF sind
zuviel, 100nF reicht aus.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider habe ich keinen Schaltplan in elektronischer Form.
WIe gesagt den PIN AREF habe ich mit einem 47uF Kondensator an AGND
angschlossen. Die Versorgungsspannung ist ja die 5Volt.
Da habe ich auch zwischen +5V und GND einen 100nF Kondensator und einen
47uF Kondensator reingelötet.


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=0x00|adc_input;
ADCSR.6=1;
delay_ms(200);
while (ADCSR.4==0);
ADCSR.4=1;
return ADCW;
}
void main(void)
{
// ADC initialization
// ADC Clock frequency: 62,500 kHz
ADCSR=0x86;
while (1)
      {
        delay_ms (50);
        long_luftdruck = 0.92215533 * read_adc(0) + 143.3427762;
      }
}

Wie müsste ich denn das bei mir mit dem Mittelwert realisieren?
Und noch was mein AD Wert schwankt zwischen 440 und 465.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Schaltungsbeispiel eines LDR an ADC:

                                VCC
                                 +
                                 |
                                 |
                                .-.
                                | |
                                | |10K
                                '-'
                                 |
                   ADC-Pin ------o
                                 |
                                .-.
                                | |
                                | |LDR
                                '-'
                                 |
                                 |
                                ===
                                GND

Ist es auf diese Art verschaltet?
Kenne natürlich Deinen Drucksensor nicht.

MfG
Andi

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Drucksensor hat drei Anschlüsse.
Pin 1 = GND
PIN 2 = AD-Wandler Eingang
PIN 3 = Vcc(+5V)

Sorry vorhin habe ich geschrieben, dass der PIN Aref bei mir nur mit
einem Kondensator auf AGND liegt. Dies stimmt nicht!.
Den PIN AREF habe ich bei mir auf +5V gelegt.
Und per Software habe ich die BITS REFS0 und REFS1 auf "0"
geschaltet.
Kann ich doch so machen oder?

Wie sieht dann die algemeine Gleichung für den AD Wert eigentlich aus?
Z.b:. so -> 5V/1024 * AD-WERT

Und wie mache ich den Mittelwert?

Und wie kommst du auf diese Gleichung: 1,22V/2,56V * 1024 = 480
Ich habe doch bei meinem ATMEGA8535 keine 1,2V oder doch?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist dass den für ein Eintrag???

Hallo A.K.? Kannst du mir auf den letzten Eintrag noch eine Antrwort
geben?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Drucksensor hat drei Anschlüsse.
Pin 1 = GND
PIN 2 = AD-Wandler Eingang
PIN 3 = Vcc(+5V)

Sorry vorhin habe ich geschrieben, dass der PIN Aref bei mir nur mit
einem Kondensator auf AGND liegt. Dies stimmt nicht!.
Den PIN AREF habe ich bei mir auf +5V gelegt.
Und per Software habe ich die BITS REFS0 und REFS1 auf "0"
geschaltet.
Kann ich doch so machen oder?

Wie sieht dann die algemeine Gleichung für den AD Wert eigentlich aus?
Z.b:. so -> 5V/1024 * AD-WERT

Und wie mache ich den Mittelwert?

Und wie kommst du auf diese Gleichung: 1,22V/2,56V * 1024 = 480
Ich habe doch bei meinem ATMEGA8535 keine 1,2V oder doch?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hej, ich bin nicht 24h live dabei. Also Geduld.

Zur 1,22V Bandgap: Drum war's ja wichtig, den exakten Typ
rauszukriegem und evtl. auch es dem Compiler zu sagen. Der AT90S8535
hat 3 Mux-Bits in ADCSR und keine 1,22V, der ATMega8535 hat 5 Mux-Bits
in ADCSRA und hat die 1,22V. Siehe Datasheet S.218.

"Kann ich doch so machen oder?"

Du kannst auch einen Kopfstand machen und dabei Lenin rezitieren. Ob's
aber Sinn ergibt? Eine 5V-Referenz kriegst Du leichter mit
REFS10,REFS0=1, muss also nicht extern verdrahtet werden. Aber VCC ist
üblicherweise eher ungenau, nicht zu empfehlen. Anderes Netzteil dran,
anderer Wert. Wenn externe Referenz dann eine echte, also mach lieber
100nF an GND und keine 5V dran. Ein Elko ist da auf Dauer etwa
ungünstig, kann je nach Laune die Messung verfälschen, also Kerko.

ADC/Spannung umrechnen: siehe Datasheet S.216.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi A.K,

sorry das ich so nerve, aber ich bin jetzt irgendwie verwirrt.
Also du meinst ich soll den PIN AREF nur mit einem 100nF Kondensator an
GND anschließen(keine Verbindung zu VCC oder irgend welche).
Dann REFS1=0 und REFS0=1 setzen oder?Ja wie groß ist dann meine AREF?
Wie muss ich das Register ADMUX initialisieren qwenn ich nur den AD
Kanal 0 verwende?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Also du meinst ich soll den PIN AREF nur mit einem 100nF Kondensator
an GND anschließen(keine Verbindung zu VCC oder irgend welche)."

Ja.

"Dann REFS1=0 und REFS0=1 setzen oder?"

Nur wenn Du eine 5V-Referenz willst. Was aber wie gesagt nicht
empfehlenswert ist.

"Ja wie groß ist dann meine AREF?"

Versorgungsspannung. Also 5V, wenn das 5V sind.

"Wie muss ich das Register ADMUX initialisieren qwenn ich nur den AD
Kanal 0 verwende?"

Die REFS Bits wie gehabt. Die Mux-Bits auf 0. Aber lass den Teil
einstellbar, damit Du eben auch die 1,22V ausprobieren kannst.

Du erinnerst mich irgendwie an Freak5. Der liest auch grundsätzlich nie
die Datesheets, jedenfalls nicht die vom verwendeten IC. Da steht alles
ziemlich haarklein drin.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich tue mir halt sehr schwer mit Datenblätter.Deshalb hole ich mir
hier in diesem Forum auch Rat.

Also ich setzte die Bits so: REFS1=0 und REFS0=1.
Dann lasse ich den PIN AREF offen.Nur ein Kondensator von 100nf ist mit
GND verbunden.Die Mux Bits habe ich auch auf Null gesetzt.
Und was meinst du mit "aber lass den Teil
einstellbar, damit Du eben auch die 1,22V ausprobieren kannst."
Welchen Spannungswert hat jetzt mein PIN AREF, damit ich diese Forum
verwenden kann:
     Vin * 1024
ADC=------------
       Vref
Wie groß ist mit diesen Einstellungen Vref?
Vin ist die Spannung gemeint die z.B. beim Spannungsteiler oder auch
beim Sensor abfällt oder?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Welchen Spannungswert hat jetzt mein PIN AREF"

VCC. Was das ist musst Du selber wissen.

Mir REFS1=REFS0=1 sind es nominell 2,56V. Der Wert ist zwar ziemlich
zeit- und temperaturstabil stabil aber im betrag nicht genau, worst
case 2,3V..2,7V.

"Vin ist..."

Vin ist die Spannung am ADC Eingang, bezogen auf AGND. Deine Schaltung
kenne ich nicht.

"Und was meinst du mit "aber lass den Teil
einstellbar, damit Du eben auch die 1,22V ausprobieren kannst."

Probier verschiedene Einstellungen des Multiplexers durch. Insbesodere
eben die Werte 0x1E und 0x1F statt ADC0=0. Da muss ca. 1,22V bzw. 0V
rauskommen. Wenn nicht, liegt das Problem nicht in den Einstellungen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke A.K. für die Unterstützung.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So es scheint so als ob mein AD-Wandler jetzt so richtig funktioniert
wie ich will.
Ich hab nur noch ein kleines Problem.
Und zwar mit einem temperatursensor KTY16-6.

Ich habe ja einen 10Bit AD-Wandler.
-->5V/1024*ADWERT

                               VCC
                                 +
                                 |
                                 |
                                .-.
                                | |
                                | |1962 Ohm
                                '-'
                                 |
                   ADC-Pin ------o
                                 |
                                .-.
                                | |Temperatursensor:
                                | |Rt1 = 1640 Ohm  (0 °C )
                                '-'Rt2 = 2131 Ohm  (35 °C )
                                 |
                                 |
                                ===
                                 GND

Den Sensor habe ich schon einmal an einem Siemans Controller 80C535
angeschlossen.Dieser hat allerdings nur einen 8 Bit Ad-Wandler.
Hat so auch super funktioniert. (Siehe Word Datei im Anhang)
Nur beim ATMEGA8535 tue ich mich noch einwenig schwer.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht da dann die Gleichung aus?

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht nach einem PTC aus.
Je wärmer die Temp. je größer der Widerstand je größer die
zurückbleibende Spannung am ADC-Pin.
Also je kleiner der ADC-Wert, desto kälter, je höher der ADC-Wert,
desto wärmer.
Die Spannungs- und ADC-Werte kann ich Dir jetzt auf die schnelle nicht
ausrechnen.

MfG
Andi

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andi,

die Gleichung habe ich: temperatur = 0.522625 * read_adc(1) - 243.874;
Leider zeigt mein Display um 2 bis 3 Grad höhren Wert an.
Wenn z.B 25 Grad(Termometer) dann zeigt mein Dsiplay 27 bis 28 Grad an.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
nur zur Info ein ADC (Analog Digital Converter) =Analog Digital
Umsetzer kann NIE Vref erreichen wie in deiner Tabelle beschrieben.

Dein KTY16-6 hat keinen linearen Verlauf der
Temperatur-Widerstandskennlinie. (siehe Datenblatt)

Wenn du in dem Doc-File (sensorgleichung) ebenfalls diesen Sensor
verwendet hast, ist deine Berechnung schlichtweg falsch und ich würde
mir keine Sorgen machen ob ich einen 8bit oder 10bit ADC verwende.

Und mit super meinst du nur dass du irgendwelche Werte rausbekommen
hast, oder?

Die Berechung kannst du jebenfalls dem Datenblatt (Seite 4) entnehmen.

Grüße,

Michael

Autor: der2te_Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
das Datenblatt ist vom 2ten Michael.

lg,

Michael

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eigentlich schon mal ausprobiert, den Controller während der
Messung in den ADC-Sleep-Modus zu schalten?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein den Controller habe ich bisher noch nicht in den Sleep Modus
versetzt.
Ich wüsste auch nicht wie es geht!

Hallo Michael2!

Danke für die Hilfe!
Hmmm...leider weiss ich nicht wie ich die Gleichung verwenden muss.
Bzw welche Gleichung?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> nein den Controller habe ich bisher noch nicht in den Sleep Modus
> versetzt.

Es gibt extra für die AD-Wandlung einen speziellen Sleepmodus, bei dem
alle Takte außer dem des Wandlers ausgeschaltet werden, weil diese die
Wandlung stören und das Ergebnis verfälschen.

Autor: dds5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die interne Verlustleistung des PTC trägt wahrscheinlich auch etwas zur
erhöhten Temperatur bei.

Dieter

Autor: Arno H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie genau ist das Referenzthermometer?
Arno

Autor: der2te_Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ad Berechnung:
Datenblatt Seite4 du verwendest die Formel mit T=... statt kt setzt du
ein kt=Rtemp/R25 (R25=1980-2020Ohm). Rtemp ist der berechnete
Widerstandswert vom ADC {Rtemp = k * (Rref / (1024 - k)}


So, nun sollte die Berechnung aber klappen.

Weiters solltest du nur einen sehr kleinen Strom durch den Sensor
treiben (~1mA) damit die Eigenerwärmung klein bleibt.

Grüße,

der2te Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hei danke für die Info.
Wie meinst du das hier R25=1980-2020Ohm?
Muss ich da die Differenz nehmen oder der Mittelwert von beiden
Werten?

Hallo Rolf,

weiss genau meinst du mit:
"Es gibt extra für die AD-Wandlung einen speziellen Sleepmodus, bei
dem
alle Takte außer dem des Wandlers ausgeschaltet werden, weil diese die
Wandlung stören und das Ergebnis verfälschen."

Wie muss ich dies Softwaretechnisch lösen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael2,

hei danke für die Info.
Wie meinst du das hier R25=1980-2020Ohm?
Muss ich da die Differenz nehmen oder der Mittelwert von beiden
Werten?
Und mit diesem Ausdruck komme ich nicht so klar.
ADC {Rtemp = k * (Rref / (1024 - k)}
Was setzt du für k und für Rref ein?

Hallo Rolf,

weiss genau meinst du mit:
"Es gibt extra für die AD-Wandlung einen speziellen Sleepmodus, bei
dem
alle Takte außer dem des Wandlers ausgeschaltet werden, weil diese die
Wandlung stören und das Ergebnis verfälschen."

Wie muss ich dies Softwaretechnisch lösen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ADC {Rtemp = k * (Rref / (1024 - k)}
Was bedeutet hier k und Rref? Welchen Wert muss ich da einsetzen.
Ich verstehe das nicht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst im MCUCR den passenden Sleepmodus setzen (SM2-0 = 001b - ADC noise
reduction) und SE (sleep enable) auf 1. Dann den sleep-Modus
aktivieren. Wie der Befehl dafür heißt, hängt wohl vom Compiler ab.
Die AD-Wandlung wird beim Aktivieren des Sleep-Modus automatisch
gestartert. Das mußt du also nicht mehr manuell machen. Beendet wird
der Sleep-Modus dann durch den ADC-Interrupt. Das heißt natürlich, daß
du den vorher aktivieren mußt.

Hier ein Beispiel, wie es bei mir in Assembler aussieht:
    ; enable ADC, interrupt and prescale 128
    ldi r16, (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) |
(1 << ADPS2)
    out ADCSRA, r16

    ; set ADC MUX channel to PB3
    ldi r16, (1 << MUX1) | (1 << MUX0)
    out ADMUX, r16

    in  r16, MCUCR
    ori r16, (1 << SM0)
    out MCUCR, r16     ; set sleep mode to ADC noise reduction

    sleep              ; auto-avtivates ADC. The ADC interrupt will
wake us up
 
    in  SERVO0_LO, ADCL
    in  SERVO0_HI, ADCH

Übrigens: Ist es so schwer, das in der Doku nachzulesen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rolf,

ja muss ich dies bei mir jetzt auch tun?

Ich habe da noch ein Problem mit dem hier
-->ADC {Rtemp = k * (Rref / (1024 - k)}
Was bedeutet hier k und Rref????

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

so ich hab es jetzt hinbekommen. Ich habe nochmals den Vorwiderstand
gemessen. Statt 1962Ohm sind es 1966Ohm. Jetzt müsste der Temp Wert
auch stimmen.Mein Quecksilber Termometer zeigt 28.5C an.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetzt habe ich noch einen Luftdrucksensor von Motorola drangehängt.

Meine Gleichung sieht dazu so aus:
long_luftdruck = (188.1049927 * (5.00/1024))*read_adc(0) +
143.3427762;

Auf dem Display erscheint ein zu niedrieger Luftdruck.
Aktueller Wert bei mir: 992hPa.
Es müsste doch so bei 1020 bis 1025 hPa liegen.Das verstehe ich nicht.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur mal so am Rande wegen den ADC-Werten wo es bereits eine Diskussion
gab.
0 ist und bleibt doch 0 Volt.
Dann bleiben doch eigentlich nur noch 1023 andere Werte übrig so das
die Rechnung eigentlich
long_luftdruck = (188.1049927 * (5.00/1023))*read_adc(0) +
143.3427762
sein müßte da es ja den Wert 1024 gar nicht geben kann.
Macht man nun 5 / 1024 * 1023 kommt 4,995 raus und niemals 5.

MfG
Andi

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ja muss ich dies bei mir jetzt auch tun?

Ich weiß nicht, wie groß die Störungen durch die anderen Takte sind,
aber da es extra deswegen einen Sleep-Modus für die AD-Wandlung gibt,
ist anzunehmen, daß der dadurch entstehende Fehler signifikant ist.
Also wenn du hohe Genauigkeit willst, ist die Antwort vermutlich:
"ja".

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin,

danke für den ASM Code.Leider verstehe ich da nicht was sleep und wake
up us bedeutet.WIe sind diese definiert?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'sleep' ist ein Assemblerbefehl, der den Prozessor in den sleep-Modus
schaltet. In C wird es eine entsprechende Funktion geben, aber deren
Namen kann ich dir nicht sagen.
'wake us up' ist der Rest des unglücklich ungebrochenen Kommentars
der Vorzeile und kein Befehl.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super ich verwende CodeVision AVR. Wie mach ich es da mit dem sleep
Befehl?

Heute Nacht habe ich in meinem C Programm festgestellt, dass ich eine
flasche Gleichung für den Temperaturmessung genommen habe.
Also bei mir ist es noch immer so dass ich einen um 3 bis 4 Grad höhren
Wert angezeigt bekomme.
Der Luftdruck stimmt wie gesagt auch nicht ganz. Ist um ca. 20hPa
niedriger.
Ich habe das Datenblatt x mal gewälzt, aber es bringt nix.
Ich habe auch verschiedene Einstellungen des AD Wandler ausprobiert.
Bei Aref messe ich 4,99V und die VCC hat bei mir genau 5,02V.
Wenn ich beide Werte in den Rechnungen berücksichtige dann ändert sich
auch nicht viel. Was kann ich denn noch machen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komme da nicht weiter.
Ich weiss jetzt nicht wie ich da weiter machen kann.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.....
Super ich verwende CodeVision AVR. Wie mach ich es da mit dem sleep
Befehl?

Heute Nacht habe ich in meinem C Programm festgestellt, dass ich eine
flasche Gleichung für den Temperaturmessung genommen habe.
Also bei mir ist es noch immer so dass ich einen um 3 bis 4 Grad
höhren
Wert angezeigt bekomme.
Der Luftdruck stimmt wie gesagt auch nicht ganz. Ist um ca. 20hPa
niedriger.
Ich habe das Datenblatt x mal gewälzt, aber es bringt nix.
Ich habe auch verschiedene Einstellungen des AD Wandler ausprobiert.
Bei Aref messe ich 4,99V und die VCC hat bei mir genau 5,02V.
Wenn ich beide Werte in den Rechnungen berücksichtige dann ändert sich
auch nicht viel. Was kann ich denn noch machen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jemand die Formel für die Temperaturberechnung genauer
erklären?

ad Berechnung:
Datenblatt Seite4 du verwendest die Formel mit T=... statt kt setzt du
ein kt=Rtemp/R25 (R25=1980-2020Ohm). Rtemp ist der berechnete
Widerstandswert vom ADC {Rtemp = k * (Rref / (1024 - k)}

Was bedeutet k? Welchen Wert muss ich für Rref geben?

Autor: tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rref dürfte der Widerstand bei Referenztemperatur (20 oder 25°C) sein,
also der Nennwiderstand. Oder die meinen damit den anderen Widerstand
(Vorwiderstand).
Nochwas zur Vdd als Uref.: da der Sensor auch von Vdd versorgt wird,
heben sich Abweichungen auf, Du willst ja keine absoluten Spannungen
messen, sondern ein Verhältnis. Da ist eine Bandgap-Referenz eher
schlechter.

Einfache Multimeter messen den Widerstand, indem sie den unbekannten
Widerstand an AD-in und den Referenz- = Vor-Widerstand an Vref-in
legen. Das geht aber nur, wenn zumindest der V-Ref Eingang floatend und
differenziell ist. Schau dir mal das Datenblatt und die ANs des
legendären ICL7106 / Max160?? an. Oder wars der MAX130?
Damit wird die Ohm-Anzeige linear und nicht 1/x.

Du solltest auch mal hier im Forum suchen, das wurde schon 100mal
durchgekaut.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Michael 2,

kannst du mir noch genauere erklären, wie ich diese Formel verwenden
muss?

ad Berechnung:
Datenblatt Seite4 du verwendest die Formel mit T=... statt kt setzt du
ein kt=Rtemp/R25 (R25=1980-2020Ohm). Rtemp ist der berechnete
Widerstandswert vom ADC {Rtemp = k * (Rref / (1024 - k)}

Was setzte ich für k und für Rref ein?
Du hast hast hier das geschrieben (R25=1980-2020Ohm).Muss ich da jetzt
die Differenz bilden oder den Mittelwert?

Autor: der2te_Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also k ist der Wert vom ADc 0-1024 und R25 ist der Wert deines PTC's
bei 25°C.

Rtemp ist dann der Widerstandswert bei einer bestimmten Temperatur.

grüße,

der2te_Michael

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe noch Probleme mit der Temperaturmessung mit dem PTC Typ KTY16
den ich an meinem 10Bit Ad-Wandler des ATMEGA8535 angeschlossen habe.
Im Datenblatt Seite 4 sind insgesamt drei Formeln aufgelistet.

Folgendes Verstehe ich da nicht:
deltaTa --> ?
R25     --> welchen Wert muss ich da nehmen? R25=1980-2020Ohm

Muss ich überhaupt diese drei Formeln verwenden? Ich hab da voll die
Verständnissprobleme.Wie setzte ich dies Formeln in mein C Programm
um?

Was soll da genau? Wie kommt man auf diese Formel:
ADC {Rtemp = k * (Rref / (1024 - k)}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.