ATMega328P Temperatur Sensor es kommt nur an.

OP #4591112
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
OP #4591181
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.
#4591266
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
Gast #4591330
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren