Forum: Mikrocontroller und Digitale Elektronik ATMega328P Temperatur Sensor es kommt nur an.


von Jan H. (jan_h865)


Lesenswert?

Hallo Leute,
Ich habe zurzeit ein kleines Problem. Und zwar wollte ich gerne mit dem 
Internalen Temperatur Sensor des ATMega328P die Temperatur auf mein LCD 
anzeigen lassen. Aber es kommt auf mein LCD nur:

CPU Infos:
CPU Time: 0:0:10 //Uptime
CPU Temp: ? -C //Temperatur

Im Datenblatt steht man soll die Interne 1.1 Volt Referenz Spannung 
auswählen und Channel 8 mit MUX3 Selektieren. Dieses habe ich gemacht. 
Nur es kommt halt nur das Fragezeichen zurück. Was mache ich falsch? Aso 
ein 100 NF Kondensator ist zwischen AREF und AGND geschaltet.

Hier mein Code:
1
double getTemp(void) {
2
  unsigned int rawADC;
3
  double returnedTemp;
4
5
  ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX3); //Mit REFS1 und REFS0 die Interne Referzen Spannung wählen(1.1V). Mit MUX3 die Kanal 8 auswählen
6
  ADCSRA |= (1<<ADEN); //Denn ADC Aktivieren
7
8
  _delay_ms(20); //Kurz Warten
9
10
  ADCSRA |= (1<<ADSC); //Erste Konversation starten
11
12
  while(ADCSRA & (1<<ADSC)) {} //Warten auf Abfluss der ersten Konversation
13
14
  rawADC = ADCW; //Denn Int rawADC mit ADCL und ADCH füllen 
15
  returnedTemp = (rawADC - 324.31) / 1.22; //Runde
16
17
  return (returnedTemp); //Zurückgeben
18
}

Und um es an das LCD zu senden:
1
char temperatur[100];
2
3
4
sprintf(temperatur, "CPU Temp: %0.2f", getTemp());
5
lcd_clear();
6
lcd_setCursor(0, 3); // 20x4 LCD
7
lcd_string(temperatur);

Mfg Jan Hampel

von holger (Gast)


Lesenswert?

>CPU Temp: ? -C //Temperatur
>sprintf(temperatur, "CPU Temp: %0.2f", getTemp());

Dein sprintf() kann keine float Variablen ausgeben.

von Karl M. (Gast)


Lesenswert?

Hallo,

frage dich bitte was hier berechnet wird.
1
returnedTemp = (rawADC - 324.31) / 1.22; //Runde

Bei AVR GCC ist double = float, also Achtung man hat nur 6-7 
signifikante Stellen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Wahrscheinlich musst du dem Compiler irgendwo sagen, dass du float für 
(s)printf() benutzen willst.

von Wolfgang (Gast)


Lesenswert?

Jan H. schrieb:
> double getTemp(void) {
>   unsigned int rawADC;
>   double returnedTemp;

Und dein Compiler kann kein double - der tut nur so.

von Jan H. (jan_h865)


Lesenswert?

Wolfgang schrieb:
> Und dein Compiler kann kein double - der tut nur so.

Okay, ich habe es auf Float geändert. Und im C Linker das bei sprintf 
aktiviert. Nur irgendwie buggt das nun steht dort:

CPU Temp: 572.70 °C. Haliulia für 500 ist er aber noch sehr kühl :D

Aber um denn Temperatur Sensor zu aktivieren ist es doch so richtig 
oder?

von M. K. (sylaina)


Lesenswert?

Jan H. schrieb:
> sprintf(temperatur, "CPU Temp: %0.2f", getTemp());

Dein sprintf kann anscheinend kein Float/Double, darauf deutet das ? bei 
der Ausgabe hin. Du musst also entweder deinem sprintf Floats/Doubles 
beibringen oder du benutzt die dtostrf()-Funktion aus der stdlib.h. Ich 
benutze immer letzteres.

von Jan H. (jan_h865)


Lesenswert?

M. K. schrieb:
> Dein sprintf kann anscheinend kein Float/Double, darauf deutet das ? bei
> der Ausgabe hin. Du musst also entweder deinem sprintf Floats/Doubles
> beibringen oder du benutzt die dtostrf()-Funktion aus der stdlib.h. Ich
> benutze immer letzteres.

Ich habe ihn dieses mit
AVR/GNU Linker -> Libraries
-> libprintf_flt.a
-> libm.a

AVR/GNU Linker -> Miscellaneous
-> Flags: -Wl,-u,vfprintf

denke ich mal beigebracht. So habe ich das bei einer anderen Projekt mal 
gemacht.

von Michael U. (amiga)


Lesenswert?

Hallo,

Jan H. schrieb:
> returnedTemp = (rawADC - 324.31) / 1.22; //Runde

wo kommt diese Korrektur her? Bei einem Sensor mit ca. 1mV/Grad C und 
der verfügbaren Auflösung des ADC von rund 1mV/Bit braucht man wohl kaum 
2 Stellen hinter dem Komma.

Ich habe das mal bei einem Tiny45 benutzt, 300 abgezogen und ich war bei 
der aktuellen Zimmertemperatur. Einen 2-Punkt-Abgleich habe ich nie 
gemacht um noch einen Korrekturfaktor zu bekommen.
Allerdings war es mir auch recht egal, die angezeigten -22...-16 Grad im 
Gefrierfach waren mir genau genug damals, war nur Spielerei...

Gruß aus Berlin
Michael

von Karl M. (Gast)


Lesenswert?

Jan, Du kannst Dich gerne noch länger im Kreis drehen !

Aber beantworte Bitte meine Frage aus meinem ersten Beitrag, dann wirst 
Du auch den Fehler finden.

von Wolfgang (Gast)


Lesenswert?

Was soll überhaupt die Float-Rechnerei. Der Dynamikbereich der 
Temperatur ist doch nun wirklich überschaubar, da der Sensor weder im 
mK- noch im MK-Bereich arbeitet. Der ATmega wird wohl kaum jemals in die 
Verlegenheit kommen, nennenswert außerhalb seines spezifizierten 
Temperaturbereichs seine Temperatur zu bestimmen.

Da reicht folglich ganz prima Festkommaarithmetik.

Falls das Ganze eine ansonsten sinnfreie Fingerübung sein soll, 
empfiehlt sich die Lektüre der

FAQ
3. Aktivieren der Floating Point Version von sprintf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.