ATMega328P Temperatur Sensor es kommt nur an.

OP #4591112
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
Gast #4591130
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.
OP #4591166
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?
#4591169
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.
OP #4591181
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.
#4591266
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
Gast #4591315
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.
Gast #4591330
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.