Pages: [1]   Go Down
Author Topic: Temperatur des AtMega abfragen  (Read 1076 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
ich bin grade dabei ein Projekt zu schreiben wo ich
die Temperatur des Prozessors auslesen muss, da er rund um
die Uhr laufen soll. Ich habe irgendwo gelesen dass einige Prozessoren
einen solchen Sesor intigriert haben. Wo steht genau wo ich diesen
Wert abfragen kann.
Ich hab ein Board mit einem AtMega328.

Addi
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21487
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der ATmega hat einen Temperatursensor am Analogmultiplexer. Dieser ist nicht im der Arduino analogRead-Funktion abrufbar, sondern Du mußt dies "von Hand" machen:
http://arduino.cc/forum/index.php/topic,8140.0.html

Grüße Uwe
« Last Edit: October 23, 2012, 03:40:39 pm by uwefed » Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe es jetzt getestet, habe aber das Problem das
ich das ich als Tempratur 681°C agezeigt bekomme. Im Thread
steht ja es sollte mit einem 328 Chip gehen. Den hab ich auch auf dem
Board. Wo liegt der Fehler?   
« Last Edit: October 24, 2012, 04:37:48 am by Addi » Logged

  / \    _|  _| o
 /--\ (_| (_| |

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21487
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Welchen Sketch hast Du verwendet?
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Den Ersten, also denn hier:
Code:
void setup()
{
  Serial.begin(9600);
  ADMUX = 0xC8; // turn on internal reference, right-shift ADC buffer, ADC channel = internal temp sensor
  delay(10);  // wait a sec for the analog reference to stabilize
}

void loop()
{
  Serial.println(averageTemperature()); // so we can debug
  delay(500); // just to slow things down a bit
}

int readTemperature()
{
  ADCSRA |= _BV(ADSC); // start the conversion
  while (bit_is_set(ADCSRA, ADSC)); // ADSC is cleared when the conversion finishes
  return (ADCL | (ADCH << 8)) - 342; // combine bytes & correct for temp offset (approximate)}
}

float averageTemperature()
{
  readTemperature(); // discard first sample (never hurts to be safe)

  float averageTemp; // create a float to hold running average
  for (int i = 1; i < 1000; i++) // start at 1 so we dont divide by 0
    averageTemp += ((readTemperature() - averageTemp)/(float)i); // get next sample, calculate running average

  return averageTemp; // return average temperature reading
}
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21487
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was bekommst Du wenn Du nur 1 mal den wert liest und nicht den mittelwert von 999 messungen machst?
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ebefalls 681°C.
Hier die veränderte Funktion:
Code:
float averageTemperature()
{
  readTemperature(); // discard first sample (never hurts to be safe)

  float averageTemp = readTemperature(); // create a float to hold running average
  return averageTemp; // return average temperature reading
}
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Germany
Offline Offline
Edison Member
*
Karma: 47
Posts: 2315
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Im verlinkten Thread ist dieser Rückgabewert auch genannt, ein konkrete Lösung wurde nicht gefunden, einzig die Mutmaßung dass gar Temperatursensor vorhanden sei.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 149
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier hat wohl wer die Lösung gefunden:

http://arduino.cc/forum/index.php/topic,38043.0.html
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab den Wert jetzt in der Datei
wiring_analog.c geändert, habe aber immer noch das
gleiche Ergebniss.
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21487
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Immer das gleiche zu messen ist schon mal was Gutes.

Es gibt 2 Möglichkeiten der Temperaturmessung; ganzzaliges Ergebnis oder mit einer Dezimalstelle.

Wahrscheinlich ist der Wert den Du erhälst in Fahrenheit und mit einer Dezimalstelle also 68,1°F das wären dann 20,1°C

Im von mir verlinkten tread weiter unten war ein Beispiel mit  Fahrenheit und Celsius Ausgabe.

Grüße Uwe
« Last Edit: October 24, 2012, 06:59:20 am by uwefed » Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaube nicht, dass es in Fahrenheit angegeben wird,
denn genau angezeigt wird 681.00 . Und wenn ich die Funktion
mit Fahrenheit verwende, erhalte ich 1257.80 .
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Pages: [1]   Go Up
Jump to: