PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperatursenor abfragen atmega16 avrstudio



fridolin12
09.05.2009, 13:20
Habe eine Steuerung mit einem atmega 16 microcontroller und habe 2 temperaturfühler will nun über die analogen eingange meiner steurung abfragen welche temperatur die temperatur fühler haben. Wie kann ich das mit dem programm avr studio machen?
Wäre um Hilfe sehr dankbar

mfg fridolin

Hubert.G
09.05.2009, 16:55
Der Mega16 hat ADC Eingänge. Für diese schreibst du im AVR-Studio in Assembler oder C ein Programm mit dem du diese Abfragst.
Beispiel: www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

fridolin12
10.05.2009, 09:34
Danke für die Antwort komme aber auch mit der beschreibung nicht zurecht wie kan ich den analogen eingang eine spannung anlegen habe ja keine - pol?
ich bekomme keine spannung hinein??
könnte das mir bitte wer erklären ?

Hubert.G
10.05.2009, 10:31
Dein Temperaturfühler wird doch eine Stromversorgung haben und daher auch einen GND. Das ist dein -pol.
Die Spannung am ADC-Eingang darf nicht größer sein als VCC.

McJenso
10.05.2009, 11:48
Hallo,

was hast du für Temperaturfühler, PT100? Weißt du wie ein Spannungsteiler aus Widerständen funktioniert? Hast du den Controller auf einem fertigen Board? Gib uns ein paar mehr Infos.

Gruß

Jens

fridolin12
11.05.2009, 13:19
meine temperaturfühler ist ein lm235z ja ist alles auf einem board biite um hilfe

Hubert.G
11.05.2009, 13:59
Wie wäre es wenn du mal die Schaltung deines Board posten würdest, dann könnte man dir eher helfen.

McJenso
11.05.2009, 14:20
Hallo,

... und eine kurze Info zu deinen Kenntnissen in C und ob du das aktuelle Datenblatt zum atmega16 hast.


Gruß

Jens

fridolin12
11.05.2009, 14:32
in c kenn ich mich eigentlich aus und das datenblatt habe ich auch

Hubert.G
11.05.2009, 16:32
Wo sind dann deine Probleme. Vielleicht kannst du sie etwas konkreter darstellen.
Wie sieht dein Board aus, wie ist der LM235 angeschalten.
Bis jetzt weiss ich noch nicht wie ich dir helfen kann.

fridolin12
12.05.2009, 12:23
Mein großes Problem ist wie ich das Programm mäßig machen soll und wie ich den temperturfühler an meinen analogen eingang anschliessen soll

Hubert.G
12.05.2009, 12:34
Mein Problem ist das ich deine Voraussetzungen nicht kenne, also die vorhandene Schaltung, und dir daher auch nichts sagen kann.

wkrug
12.05.2009, 19:50
Also...
dein LM235 ist ein Temperatursensor der für die normale Funktion einen Strom von etwa 1mA erhalten soll.

Er erhöht die Spannung um 10mV für jedes Grad Temperaturerhöhung.
Am Sensor fällt bei 25°C eine Spannung von 2,982V ab.
Wenn Du den Sensor an einer Spannung von +5V betreiben willst, solltest Du also einen Vorwiderstand von ca. 2,2kOhm einbauen.
Das sollte dann bis zu Temperaturen von ca. 100°C reichen.
Die Toleranzen und sonstigen Beschaltungsmöglichkeiten findest Du im Datenblatt.
Durch den doch relativ kleinen Vorwiderstand wegen der geringen Spannung schwankt der Strom allerdings ziemlich stark. Was zu Messfehlern führt.
Eine Konstantstromquelle wäre da besser.

Dein ATMEL Controller:

Dein A/D Wandler kann mit der 5V Betriebsspannung als Referenz arbeiten. Mit der internen Referenz, oftmals 2,56V. Oder er funktioniert mit einer extern zugeführten Referenzspannung.
Die Taktrate für den A/D Wandler stell ich, bei 10Bit Auflösung, immer so auf 120kHz ein.
Achte darauf die AVCC Spannung über eine 10µH Drossel und einen 100nF Kondensator von der Spannungsversorgung zu entkoppeln ( Steht auch so im ATMEL Datenblatt ).
Ich würde empfehlen die interne Referenzspannung von 2,56V zu verwenden, allerdings muß dann die Ausgangsspannung des Temperatursensors über einen Spannungsteiler geführt und der AREF Pin des Controllers mit einem 100nF Kondensator beschaltet werden.
1:1 bis 1:1,5 sollte dafür gut passen ( 10kOhm / 12kOhm ).
Direkt an den A/D Wandler Eingang würde ich mir noch einen 10nF Kondensator gönnen.

Den Nullabgleich und die Steilheitskalibrierung kannst Du in Software machen, da würd ich mir zusätzliche Hardware sparen.

Softwaretechnisch wird der A/D Wandler initialisiert und dann eine A/D Wandlung angestoßen.
Man wartet darauf, das die Wandlung beendet ist und liest die Werteregister des A/D Wandlers aus.

Nun werden die A/D Werte mit den Korrektur- und Umrechnungsfaktoren verrechnet, damit da eine Temperatur dabei rauskommt.

Was möchtest Du noch wissen ? - Fertigen Quellcode in Assembler hab ich nicht !
Hubert.G hat schon recht.
Du solltest deine Anfragen schon etwas gezielter stellen, sonst tut man sich schwer mit antworten.

Fornaufsicht
14.05.2009, 14:51
Super Anwort von wkrug!
Dieser Hubert.G möchte einen Record aufstellen, hat doch schon
über 3200 Beiträge. =D>

Gruss

Amin

fridolin12
14.05.2009, 21:31
Habe jetzt alles so gemacht und der Temperaturfühler gibt mir eine Spannung von ca. 2 V aber es stehen im ADCH und ADCL register immer lauter einser er messt gar nicht könnt ihr mir bitte nochmals helfen?

wkrug
14.05.2009, 23:07
Hast Du auch gewartet, bis die Wandlung fertig war?
Bit 4 im ADCSRA Register muß 1 sein.

Lauter 1er sind an und für sich schon ein Fehler, da der Controller ja nur 10Bit Auflösung hat.
Also dürften im H-Register eigentlich nur die letzten Beiden Bits gesetzt sein.

Welche Spannung misst Du am AREF Pin ? und welche am AVCC ?

In CodeVision sieht so eine Routine so aus:


// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

......

/* Temperaturen berechnen */
li_temp1=read_adc(2);
if(li_temp1==1023) /* Offenen Eingänge abfangen */
{
li_temp1=0;
}
else
{
#asm ("CLI");
li_temp1=((li_temp1-si_tempzero[0])*290)/si_tempfakt[0];
#asm ("SEI");
};

li_temp2=read_adc(3);
if(li_temp2==1023) /* Offenen Eingänge abfangen */
{
li_temp2=0;
}
else
{
#asm ("CLI");
li_temp2=((li_temp2-si_tempzero[1])*290)/si_tempfakt[1];
#asm ("SEI");
}
...........

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: internal 2,56V
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;

fridolin12
15.05.2009, 21:27
Erst mal Danke für die Antworten

Habe es jetzt hin bekommen wenn ich den Temperaturfühler in ca. 10Grad warmes Wasser gebe zeigt er mir 990 an wenn ich ihn in 90 Grad warmes Wasser gebe 995 was kann ich da machen damit er mir bei 10 Grad 100 anzeigt und bei 90 z.b 1000 habe einen 1k Widerstand an den Tempfühler angelötet.
Arbeite mit eine 2,56 V internen Referenzspannung
Bitte um rasche Hilfe

wkrug
16.05.2009, 08:56
ca. 10Grad warmes Wasser gebe zeigt er mir 990 an wenn ich ihn in 90 Grad warmes Wasser gebe 995
Zuerst mal... stimmen die Werte ?
Bei einem Spannungsteiler 1:1 würden deine Werte einer Temperaturerhöhung von 2,5°C entsprechen.
990=2,475V.
995=2,4875V.
Unterschied 0,0125V * 2 = 0,025V bei 10mV/°K entspräche das 2,5°K.

Ansonsten ist dein Wandlerergebnis in ein Formel zu packen.

Temperatur = ((A/D Wandlerwert - Wandlerwert bei 0°C) * Korrekturfaktor)/100

Durch die anschließende Teilung durch 100 kannst Du mit int Variablen, also Ganzzahlen rechnen.

Rein Rechnerisch sollte bei 0°C ein Wandlerwert von 547 ausgegeben werden.
Bei 100°C wären es 747.
Setzt man das in der Formel um, würde sie lauten:

Temperatur = ((A/D Wandlerwert - 547)*500)/100

Das Ergebnis wären dann 1/10 °C.
Allerdings ist die Auflösung dabei nur 0,5°C.
Das ist aber durch die Auflösung (10 Bit ) des A/D Wandlers bedingt.
( Setz in die Formel mal eine beliebigen A/D Wandlerwert ein und berechne dann noch mal für den vorherigen Wandlerwert + 1 )

Wär trotzdem mal schön, wenn Du einen Schaltplan und Voltmeter! Messwerte posten könntest, sonst ist das hier ein übles Fischen im trüben.