Go Down

Topic: Temperatur des AtMega abfragen (Read 1 time) previous topic - next topic

Addi

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
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

#1
Oct 23, 2012, 10:30 pm Last Edit: Oct 23, 2012, 10:40 pm by uwefed Reason: 1
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

Addi

#2
Oct 24, 2012, 11:34 am Last Edit: Oct 24, 2012, 11:37 am by Addi Reason: 1
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? 
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

Welchen Sketch hast Du verwendet?
Grüße Uwe

Addi

Den Ersten, also denn hier:
Code: [Select]

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
}
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

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

Addi

Ebefalls 681°C.
Hier die veränderte Funktion:
Code: [Select]

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
}
/ \    _|  _| o
 /--\ (_| (_| |

sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

JuergenR

Hier hat wohl wer die Lösung gefunden:

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

Addi

Ich hab den Wert jetzt in der Datei
wiring_analog.c geändert, habe aber immer noch das
gleiche Ergebniss.
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

#10
Oct 24, 2012, 01:57 pm Last Edit: Oct 24, 2012, 01:59 pm by uwefed Reason: 1
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

Addi

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 .
/ \    _|  _| o
 /--\ (_| (_| |

Go Up