Hallo
Also ich habe nun den Kondensator eingebaut und mir auch noch einen anderen Spannungsteiler mit einem neuen KTY 84 130 und 2K2 Widersand gemacht. Dann hab ich ein paar Messungen gemacht:
22°C (gemessen mit Multimeter) und 1K Widerstand : 0,326 V am ADW
3°C (gemessen mit Multimeter) und 1K Widerstand : 0,285V am ADW
22°C (gemessen mit Multimeter) und 2K2 Widerstand : 1,12 V am ADW
3°C (gemessen mit Multimeter) und 2K2 Widerstand : 0,998V am ADW
Jetzt bin ich leider so schlau wie vorher, welche Variante ist jetzt besser? Die Spannungsdifferenz ist ja bei der 2K2 Variante größer. Im Datenblatt des KTY steht aber dass man für Temperaturen über ~200° einen Strom >2mA einstellen soll (und in diesem Bereich will ich ja später messen). Und das käme wiederum der 1K Variante zu gute...
So langsam weiß ich nichtmehr was ich machen soll... Und die Anzeige stimmt leider auch noch nicht. Habe noch ein paar Kleinigkeiten am Programm verändert (ADCW >> ADC). Das hat aber auch keine Besserung gebracht. Dann hab ich mal noch versucht die Kommastelle zu verschieben, das ist aber auch nicht der richtige Weg. Könnt ihr mir noch irgendwie auf die Sprünge helfe? Wäre klasse... Würde gerne mal meine Zimmertemperatur messen und anzeigen...

Hier mal noch mein jetziger Code:
Code:
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <lcd.h>
#define F_CPU = 4000000UL;
uint16_t readADC(uint8_t); //Prototyp von readADC
void display(uint16_t result); //Prototyp von display
int main(void)
{
DDRD = 0xff; //PORT D als Ausgang definieren (Hier sind 8 LED`s angeschlossen
DDRB = 0xff; //PORT B als Ausgang
uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
display(result); //Umrechnung und Ausgabe der Temperatur auf Display und LED`s
return 0;
}
void display(uint16_t result)
{
lcd_init(LCD_DISP_ON_CURSOR); //LCD initialisieren
lcd_gotoxy(0,0); //Cursor an erste Stelle setzen
lcd_puts("Temperatur:"); //"Temperatur" ausgeben
lcd_gotoxy(11,0); // Cursor hinter "Temperatur:" setzen
char buffer[8]; //Array für itoa anlegen
float f=((float)result*5)/1024; //
if(f<0)f=0;
itoa((int)f,buffer,10);
lcd_puts(buffer);
f=(f-(int)f)*1000;
if(f<100)lcd_putc('0');
if(f<10)lcd_putc('0');
itoa((int)f,buffer,10);
lcd_putc(',');
lcd_puts(buffer);
PORTD = result; //Den Digitalen Wert mit Hilfe der LED`s anzeigen
return;
}
uint16_t readADC(uint8_t channel)
{
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 32 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADPS2);
// Kanal des Multiplexers waehlen (ADC 0)
ADMUX = (!(1<<MUX0)) | (!(1<<MUX1)) | (!(1<<MUX2));
// interne Referenzspannung verwenden (also 2,56 V)
ADMUX |= (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADC;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
Grüße!!
Bean
Lesezeichen