Messung der Boardtemperatur

Die Kenntnis der Temperatur des Banana Pi Boards kann helfen, eine Überhitzung zu erkennen und Folgeschäden abzuwenden.

Ab Raspbian 3.1 steht die Boardtemperatur im File /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input und kann bspw. mit dem folgenden Python-Script ausgelesen werden (http://forum.lemaker.org/viewthread.php?tid=429&page=2&authorid=1602):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import time
while True:
   cmd = """cat /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input |awk '{printf ("%0.1f",$1/1000); }'"""
   temp_c = os.popen(cmd).readline().strip()
   temp_f = float(temp_c) * 9.0 / 5.0 + 32.0
   print "CPU Temp = ", temp_c, "ºC /", temp_f, "ºF "
   time.sleep(5)

Ein anderer Weg geht über das direkte Auslesen des im PMU (Power Management Unit) AXP202 befindlichen Temperatursensors.

AXP202 ist eine hochintegrierte PMU, die für das Power Management moderner Mikroprozessoren entwickelt wurde.

Neben einem USB-kompatiblen PWM Charger, 2 DC-DC Convertern, 5 LDOs weist der AXP202 mehrere 12-Bit ADCs zur Spannungs-, Strom- und Temperaturmessung sowie 4 GPIOs auf.

Um Sicherheit und Stabilität der Spannungsversorgung zu garantieren weist der AXP202 verschiedene Schutzschaltungen (Over voltage Protection(OVP)/Under voltage Protection(UVP),Over temperature protection(OTP)& Over current protection(OCP)) auf.

Die PMU AXP202 ist von der CPU über den I2C-Bus erreichbar (i2c0, 0x34).

Die folgenden Tabellenausschnitte stellen die erforderlichen Informationen zum Zugriff auf den Temperaturmesswert zur Verfügung:

Die interne Temperatur wird mit einer Auflösung von 12 Bit erfasst und erstreckt sich über einen Bereich von -144.7°C (0x000) bis zu 264.8°C (0xFFF) bei 0.1 grd Auflösung.

Channel 000H STEP FFFH
Internal temperature -144.7℃ 0.1℃ 264.8℃

Abgespeichert ist der Messwert in den Zellen mit den Adressen 0x5E (Hi-Byte) und 0x5F (Lo-Byte).

Address Register Description
5E[7:0] AXP202 internal temperature monitoring ADC data high 8 bits
5F[3:0] AXP202 internal temperature monitoring ADC data low 4 bits

Damit kann der aktuelle Temperaturmesswert nach folgender Beziehung berechnet werden: r = (reg - 1447)/10 (r = Resultat, reg = Registerinhalt)

Für den I2C-Zugriff installieren wir das Paket i2c-tools und fügen den User pi der Gruppe i2c zu, damit für den Zugriff auf die i2c-tools keine Root-Rechte erforderlich sind.

$ sudo apt-get install i2c-tools
$ sudo adduser pi i2c

Mit den installierten i2c-tools kann nun der betreffende I2C-Bus (hier i2c-0) gescannt und auf gefundene I2C-Devices zugegriffen werden.

$ i2cdetect - y 0
$ i2cget -f -y 0 0x34 0x5e w
0x0e71

Der ausgelesene Registerinhalt entspricht gemäss der zweiten Tabelle dem Wert 0x71E, was einem Temperaturmesswert von 37.5°C entspricht.

Mit folgendem Shell-Script erfolgt der Zugriff auf das betreffende Register des PMU AXP202 über den I2C-Bus und die Berechnung des Temperaturmesswertes. Da die gelesene Speicherzelle Banana Pi spezifisch ist, wird zuerst auf das Vorliegen des Banana Pi getestet und anderenfalls abgebrochen. Da die Zahlenbasis für die Eingabe auf hex (ibase=16) gestellt wurde, musste die gesamte Berechnung des Temperaturmesswertes in hex Form erfolgen.
Dank geht an meinen Kollegen Daniel Zwirner für die Unterstützung beim Shell-Scripting.
Die eigentliche Berechnung erfolgt mit bc. Gegebenenfalls muss der Calculator noch installiert werden.

$ sudo apt-get install bc
#!/bin/bash

set -e

board=$(uname -a | cut -c7-14)
if [ $board == "bananapi" ]
then
   echo "Banana Pi detected"  
else
   echo "No Banana Pi detected -> Exit"
   exit
fi

# read temperature from PMU AXP202
reg=$(i2cget -f -y 0 0x34 0x5E w)

# sed clears 0x before number (0x700a => 700a)
# tr changes all to upper case ((700a => 700A)) 
# awk prints one string for bc
#
# bc calculates
# hi  = value / 0x100
# low = value % 0x10
# r   = low*0x10 + hi
#
# ibase=16 - input for bc is hex
# obase=10 - output of bc is decimal
# scale=1  - output with one digit after the decimal point

echo -n "PMU Temperature = "
echo "$reg"  | sed s/0x// | tr '[:lower:]' '[:upper:]' |  awk  '{print "obase=10;ibase=16; value=" $reg "; hi=value/100; low=(value%100); scale=1; r=((low*10+hi) -5A7)/A; print r" }' | bc
echo " °C"

Eine abschliessende Bemerkung zur Genauigkeit der Temperaturmessung:

Der Temperatursensor ist Bestandteil der PMU AXP202 und nicht der CPU, wodurch man allenfalls von der Messung der Boardtemperatur sprechen kann.

 
messung_der_boardtemperatur.txt · Zuletzt geändert: 2014/09/04 07:16 von Claus Kühnel
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki