Hallo
Ich bin immernoch mit der Temperaturmessung beschäftigt. Ich habe das ganze nun zwar so hinbekommen dass die angezeigte Temperatur bei 0°C und bei ~Zimmertemperatur stimmt. \
/ \
/
Aber ich habe leider immer noch nicht so ganz verstanden wie die Werte si_multiplyer und si_const zusammenhängen.
Tut mir Leid dass ich da so begriffstutzig bin aber könnte mir das noch einmal jemand erklären? Ich hab das jetzt halt so gemacht dass ich so lange an den Werten herumgespielt habe bis es gepasst hat. Aber die muss man doch auch irgendwie berechnen können...
Außerdem könnte mir vielleicht noch jemand sagen wie ich aus der LCD Lib von Peter Fleury das "°" Zeichen auslese. Das steht ja im LCD Memory drin wenn ich mich nicht täusche. Auch das hab ich schon probiert, aber leider nicht hin bekommen.
Ach ja, nebenbei ist mir noch etwas anderes aufgefallen: Wenn ich nun die Spannung mit dem Multimeter messe die am AD-Wandler anliegt habe ich 0,901V. Wenn ich das durch 0,0025 (2,56/1024) teile müsste ich doch auf den AD-Wert kommen. Das gibt bei mir ~360. Ich lasse mir in dem Display ja auch den ADWert direkt anzeigen, da werden mir aber 341 angezeigt. Woher kann das kommen?
Hab ich an dieser Stelle doch noch ein Fehler in meinem Code?
Vielen Dank im Voraus!!
Grüße!!
Bean
Code:
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <lcd.h>
#define F_CPU = 4000000UL
#define ad_nullwert 311
#define si_multiplyer 60
#define si_const 12
uint16_t readADC(uint8_t); //Prototyp von readADC
void display_temp(uint16_t result); //Prototyp von display
char buffer[8]; //Array für itoa anlegen
int si_temp; //Hilfvariable für Temperaturberechnung anlegen
int si_ones;
int si_komma;
int main(void)
{
DDRB = 0xff; //PORT B als Ausgang
//Auslesen der analogen Spannungen an Pin 0, also ADC0. In result steht das Ergebnis.
uint16_t result = readADC(0);
display_temp(result); //Umrechnung und Ausgabe der Temperatur auf Display und LED`s
return 0;
}
void display_temp(uint16_t result)
{
lcd_init(LCD_DISP_ON); //LCD initialisieren
lcd_gotoxy(0,0); //Cursor an erste Stelle setzen
lcd_puts("Temp.:"); //"Temperatur" ausgeben
lcd_gotoxy(0,1); // Cursor in die zweite Zeile setzen
itoa(result,buffer,10); //AD-Wert umrechnen
lcd_puts(buffer); //AD-Wert in der zweiten Zeile ausgeben
lcd_gotoxy(9,0); // Cursor hinter "Temperatur:" setzen
//Berechnung der Temperatur
si_temp=((result-ad_nullwert)*si_multiplyer)/si_const;
// Die Ganzen Grade Berechnen
si_ones=si_temp/10;
//Die eine Nachkommastelle Berechnen
si_komma=si_temp%10;
// Die Zehnerstellen ans Display ausgeben
itoa(si_ones,buffer,10);
lcd_puts(buffer);
lcd_putc(',');
itoa(si_komma,buffer,10);
lcd_puts(buffer);
lcd_putc("°");;
lcd_putc('C');
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;
}
Lesezeichen