Mein Problem ist das ich deine Voraussetzungen nicht kenne, also die vorhandene Schaltung, und dir daher auch nichts sagen kann.
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
Mein Problem ist das ich deine Voraussetzungen nicht kenne, also die vorhandene Schaltung, und dir daher auch nichts sagen kann.
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.
Super Anwort von wkrug!
Dieser Hubert.G möchte einen Record aufstellen, hat doch schon
über 3200 Beiträge. =D>
Gruss
Amin
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?
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:
Code:// 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;
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
Zuerst mal... stimmen die Werte ?ca. 10Grad warmes Wasser gebe zeigt er mir 990 an wenn ich ihn in 90 Grad warmes Wasser gebe 995
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.
Lesezeichen