CPU-Temperatur des Panda bestimmen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • hi @all
      ich kann mich Lodins Ausführungen nicht ganz anschließen. Also so Register von einer CPU stehen (mindestens lesend) jedem Programm zur Verfügung. Man muss halt die Adresse des Registers wissen und dieses dann in das Programm einlesen. Klar man muß gewisse Privilegien haben aber einem gehört ja der Rechner also sollte man sich dort alles beschaffen können (Admin Rechte etc.).

      siehe alten Artikel hier:
      -----------------------------------------------------------------
      Für Core2-CPUs:
      Die CPU-Temperatur kannst du aus einem MSR (machine specific register) auslesen. Nummer muß in der CPU-Doku stehen. Wenn das unter Windows passieren soll, mußt du nen kleinen Treiber schreiben, da rdmsr ein privilegierter Befehl ist, den nur der Kernel ausführen darf. ECX bekommt die MSR-Nummer, das Ergebnis (64 bit) landet in EDX:EAX. Etwa so:

      #include <ntddk.h>
      NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
      ULONG ulECX = 0x000????; // ???? ist die Registernummer
      ULONG ulEAX = 0;
      ULONG ulEDX = 0;
      _asm{
      mov ecx,ulECX
      rdmsr
      mov ulEAX,eax
      mov ulEDX,edx
      }
      // irgendwas damit tun
      return 0xFFFFFFFF;
      }

      Sollte so funktionieren. Mußt nur noch die MSR-Nummer aussuchen und die Werte irgendwie verarbeiten. Ka, ob das dann schon Grad Celsius sind ... vermutlich nicht. Gibt außerdem 2 Werte in den Core2Duo-CPUs ... Tcase(CPU-Gehäuse) und Tjunction (CPU-Kern) ... google fragen.
      -----------------------------------------------------------------

      Eventuell nutzt es auch was sich mal hier umzusehen:
      openhardwaremonitor.org/
      ist open Source also kann man da auch mal reingucken und zwar hier:
      github.com/openhardwaremonitor/openhardwaremonitor

      so long
      hape

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von hape ()

    • Mecki schrieb:

      @pmaler

      und wo? Luft?

      Die idealste Möglichkeit wäre wohl unterm Blech direkt beim Prozessor, und obendrauf nen schöner Kühlkörper... oder?

      Mich würde ja mal interessieren, ob man die Bleche ohne verbeulen abziehen kann??? GRundsätzlich sind sie ja anscheinend nur in so Miniklammern eingesteckt. (Mit Lupe betrachtet)
      Also ich belasse den LP als solches.
      Dann gibts Kühlkörper drauf und daneben (oder mit Loch im Kühlkörper) kommt der kleine NTC dazu.
      Der misst eine Temperatur X . Abhängig davon soll der Lüfter anlaufen.
      Man muss das ganze dann sozusagen "Eichen", indem man mit dem Tool sich die Innen-Temperatur anzeigen lässt.

      Ich muss also gar nicht wissen, wie heiß es, auf das Grad genau, an der Oberfläche sein muss um den Lüfter laufen zu lassen.
      Ein kleines Poti soll die Sprungtemperatur einstellen lassen.

      Wenn man es linear laufen lassen will, dann genügt ein Transistor und ein Widerstand, meine ich (ohne es explizit getestet zu haben)
      Lg Peter
    • hape schrieb:

      Also so Register von einer CPU stehen (mindestens lesend) jedem Programm zur Verfügung. Man muss halt die Adresse des Registers wissen und dieses dann in das Programm einlesen. Klar man muß gewisse Privilegien haben aber einem gehört ja der Rechner also sollte man sich dort alles beschaffen können (Admin Rechte etc.).
      Das ist gut zu wissen.
      Bis jetzt dachte ich unter Windows müsste man über signierte Ring0 (Kernel) Treiber auf die Register zugreifen.
      Dann muss ich mich da mal genauer einlesen :)
    • hi Basti

      das ist ja klar weil die die CPU nicht implementiert haben. Man muss das von Lodin:
      intel.com/content/www/us/en/pr…8000-datasheet-vol-1.html Seite 90 ff.

      intel.com/content/dam/www/publ…ramming-manual-325384.pdf Kapitel 14.7.5 ff. (Achtung ! 10MB-pdf !)

      und die Aufbereitung im Source, welche ich beschrieben habe, zusammen bringen. Der OpenHardwareMonitor zeigt nur wie es geht aber damit gehts halt noch nicht.

      hape
    • Also die schönste Lösung wäre wohl, wenn es der OpenHardwareMonitor könnte und man einfach per WMI die Daten ausliest. Der kann es leider noch nicht. Ich habe mich aber mal in den Code gewühlt und eine Lösung gefunden, die aber auch alles andere als schön ist. Die Messwerte stimmen überein mit Core Temp 1.0 RC9. Diese schwanken bei mir auf dem LP aber enorm (mal 40°C, dann plötzlich 48°C und wenig später wieder 40°C...).

      Wie also macht OpenHardwareMonitor das: Ausgelesen wird der Befehl Rdmsr, der das MSR (Model Specific Register) liest (Read MSR). Das ist ein 64-Bit-Register, aus dem man bei Intel-Prozessoren unter anderem an den Bits 16 bis 22 die Temperatur bekommt. Um genau zu sein ist dort der Abstand zur Tj_max, also der Temperatur, bei der gedrosselt wird (beim LP 90°C). Man muss den Wert den man bekommt von 90 abziehen und schon hat man die Temperatur. Und man muss den Befehl einfach für jeden Kern ausführen... soweit zur Theorie.

      Praktisch ist es sehr schwierig, diesen Befehl einfach auszuführen. OpenHardwareMonitor installiert dazu temporär einen Treiber. Ich habe mal ein neues C#-Projekt angelegt und versucht, möglichst wenig nötiges zu benutzen. Ich benutze von OpenHardwareMonitor:
      • den Treiber WinRing0x64.sys
      • die Datei ThreadAffinity.cs (Thread-Umschaltung, um jeden Kern abfragen zu können)
      • die Datei KernelDriver.cs (Lädt den Treiber ins System)
      Dazu habe ich die Datei Ring0.cs vom OHM stark reduziert und zusammengestrichen, sodass sie einfach die .sys-Datei aus dem exe-Pfad lädt. Dazu kommt ein kleines Hauptfenster, das die Temperaturen jede Sekunde einmal ermittelt und anzeigt.
      Das ganze funktioniert auch nur, wenn man die Datei als Administrator ausführt. Also alles in allem ist mir das zu umständlich. Ich werde wohl darauf verzichten, das in meinen Programmen zu ermitteln...
      Dateien
      • Temp2.zip

        (72,97 kB, 93 mal heruntergeladen, zuletzt: )
    • Hallo c_t,

      das Programm lief toll... bis ich das Auto-Start-BIOS aufgespielt habe.

      Jetzt werden nur noch 4x 90 angezeigt.
      Vielleicht mache ich auch nur was falsch... aber ich hab im Moment keine Zeit da weiter zu graben.
      Ich wollte nur Bescheid geben, falls anderen das auch passiert.


      VG,
      Lodin


      Nachtrag :
      (Natürlich) Mein Fehler... nach dem BIOS-Update hatte ich noch einen User ohne Adminrechte eingerichtet und... :whistling:
      "Temp2" läuft also wieder :thumbsup:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lodin_Erikson ()

    • c_t schrieb:

      Die Messwerte stimmen überein mit Core Temp 1.0 RC9. Diese schwanken bei mir auf dem LP aber enorm (mal 40°C, dann plötzlich 48°C und wenig später wieder 40°C...).
      Schwanken die Messwerte oder hast du Spikes? Hast du schon versucht alle 100ms Werte zu messen?DA müsstest du das besser erkennen können. Wenn es nur Ausreißer sind, würde ich mehrere Messwerte mitteln oder zu starke Ausreißer verwerfen...
    • Hallo Zusammen,
      eine relativ einfache Möglichkeit die Temperatur auszulesen bietet "CoreTemp" mit dem Plugin "Core Temp Remote Server". Im Anhang findet ihr eine kleine Consolen-Anwendung die ich zum testen geschrieben habe. Meine Anwendung geht über den Localhost (127.0.0.1) und den Port 5200.

      Gruß
      Homer J. S.

      Edit: Habe heute (23.06.2016) nochmals mein Testprogramm optimiert. Ist jetzt dynamisch (CPU Anzahl) und man kann es über eine "config.ini" einstellen (IP, PORT & REFRESH).
      Dateien
      • tempcon.zip

        (458,45 kB, 88 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Homer J. S. ()

    • Sorry dass ich diesen alten Thread aufwärme.

      Habe leider mit der Arduino-Programmierung keine Erfahrung.

      Ich habe mir einen 2-Pin Lüfter gekauft, sprich PWM geht dort nicht. Daher kann ich Bastis Lösung auch nicht nutzen.

      Mir würde jetzt vorschweben, die beiden Kabel an einen der 4-Pin PWM Anschlüsse (z.B: A0 wenn ich die LP-Schematik richtig interpretiere) anschließen.
      Hier eben an die + und - Anschlüsse. Sprich von den 4 Pins nutze ich im Endeffekt nur 2.
      Diverse Möglichkeiten, wie man dei Temperatur ausliest gibt es ja hier im Thread.
      Da es bei dem 2-Pin Anschluss naürlich keine elegante Möglichkeit der Steuerung gibt müsste ich hier über die Volt-Zahl arbeiten.

      Sprich meine Idee wäre:
      Temperatur < 50 °C -> 0V auf den Lüfter-Pin aus
      Temperatur >= 50 && < 60°C -> 3V auf den Pin Lüfter (bzw. testen wie viel Volt ich brauche, damit der Lüfter anspringt)
      Temperatur >= 60 °C -> 5V auf den Pin

      Die Frage hier ist jetzt:
      Wie kann ich die einzelnen Pins ansprechen? Also wie sind die Pins nummeriert?
      Auf lattepanda.com/docs/ finde ich z.B. ein Beispiel, dass dort A0 angesprochen wird. A0 hat aber 4 Pinne. Wie finde ich die beiden, die ich brauche?
      Gibt es irgendwo eine Übersicht?

      Die Default Firmata sollte, wenn ich das richtig sehe, erlauben, auf alle Pins zuzugreifen. D.h. einen extra Sketch für den Arduino bräuchte ich hier nicht, oder?
      Leg dich nie mit einem BAOD an, oder du bist selber dran.

      Das Leben ist grausam.
      Wenn es mal nicht grausam ist, ist es grausamer.

      [IMG:http://www.digioso.org/gfx/banner_low.jpg]
    • Hallo Digioso !

      1. Die Arduino-Steckverbinder sind 3polig ! "GND" - "+5V" - "Arduino-Pin". Die Belegung siehst Du auf den Grafiken auf der Docs-Seite.
      2. Der Arduino-Pin liefert maximal 40mA. Wieviel Strom zieht denn Dein Lüfter ?
      3. Der Pin "A0" ist ein Arduino-Pin der sowohl als Digital-Ein/Ausgang als auch als Analog-Eingang benutzt werden kann.
      4. Der Arduino hat meines Wissens keinen Pin für einen Analog-Ausgang.


      VG,
      Lodin
    • Verstehe ich das richtig? Du hast unter Win 10 ein Programm, das die Temperatur ausliest und willst dann über USB-Schnittstelle über den Arduino ansprechen um den Lüfter zu steuern?

      Wenn ja, dann sollte auf dem Arduino ein Default Firmata reichen, ich habe aber die serielle Verbindung aus C# nie hinbekommen, aber sollte gehen.

      Wie kommst Du drauf, dass A0 4 PINs hat? Kannst ein Bild hochladen, wo Du das zeigen kannst? Bei den weißen Steckern hat es doch nur 3? Eigentlich ist der A0 genau 1 Pin, bei den weißen Steckern haben's nur freundlicherweise GND und 5 Volt dazugelegt.

      Prinzipiell würde ich versuchen vom 2 Pin Lüfter - auf GND zu legen und + auf A0 und dann mal Spannung anlegen :) Aber schau bitte vorher, wie viel Strom durch den A0 gezogen werden darf und wie viel der Lüfter zieht, nicht dass Dir da was durchbrennt.

      Habe mich vom analogWrite() verwirren lassen, aber aus dem Tutorial:
      analogWrite() Writes an analog value (PWM wave) to a pin.

      Da war jetzt wer schneller :)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von EGA ()

    • Oh, sorry, ja ihr habt recht. Das sind 3-Pins.

      Also der Lüfter zieht (zumindest laut der Produktseite) max. 50mA. Ggf. könnte ich ihn natürlich trotzdem mal testen und schauen, was er mit 40mA macht.
      Platt gesagt: Man hört den Lüfter halt. Ggf. dreht er ja auch automatisch langsamer (und ist damit leiser) wenn er max nur 40mA bekommt.

      Hmm... dann müsste ich den A0 wahrscheinlich als Plus-Pol nutzen und den GND als als Minuspol für den Lüfter, richtig?
      Da mein Lüfter nur 2 Drähte hat bringt mir der +5V ja nichts.

      @AGE: Das PWM Tutorial klingt prinzipiell nicht schlecht. Ich denke, da werde ich mal einen Blick drauf werfen.

      Falls es nur 0V oder 5V gibt... immer noch besser als gar nichts. :)

      Momentan habe ich den Lüfter an 2 der mit CN2 markierten PINs gelötet. Werde es am WE mal mit dem A0 testen.
      Leg dich nie mit einem BAOD an, oder du bist selber dran.

      Das Leben ist grausam.
      Wenn es mal nicht grausam ist, ist es grausamer.

      [IMG:http://www.digioso.org/gfx/banner_low.jpg]
    • Wenn der Ausgang nun mit 40mA belastet werden darf, Du aber mit 50mA belasten willst, ist das 25% Überlastung.
      Ich würds nicht ausprobieren, dabei kann ja nur rauskommen das der Prozi das nicht abkonnte und hops geht.

      Was Du aber machen kannst ist ausprobieren ab welcher Spannung läuft der Lüfter sicher an? Sicher heißt nicht ab und zu mal. Dann könntest Du die Spannung reduzieren. Simpel mit Vorwiederstand, oder auch anders.
      Bedenken mußt Du außerdem noch, das der Lüfter einen höheren Anlaufstrom hat, in wie weit die Elektronik auf dem Board das abkann, kann ich Dir nicht sagen.

      Mit anderen Worten egal ob geregelt oder nicht, das Ideal ist, die eigentliche Stromversorgung extern zu bewerkstelligen. Also direkt vom Netzteil, so wie Du es jetzt gerade hast, oder anderweitig.

      Zum Verständnis, der Wiederstand Deines Lüfters bleibt gleich. Die Spannung vom Board normalerweise auch. Somit ergibt sich dann ein Strom.
      Würde der Strom kleiner werden, bei gleich bleibenden Wiederstand, würde das bedeuten, das die Spannung kleiner werden müßte...

      Wenn Du aber den Gesamtwiederstand erhöhst, also mit Vorwiederstand, dann reduziert sich der Strom bei gleicher Spannung. Dein Lüfter läuft langsamer, wird leiser, schafft aber natürlich auch wengier Luft ran... reicht aber vielleicht?
    • Hmm... das scheint dann tatsächlich doch etwas komplizierter zu werden.
      Ein paar Widerstände habe ich noch rumfliegen. Müsste mal schauen, was es für welche sind und den Anlaufstrom vom Lüfter kenne ich leider auch nicht. Müsste ich also experimentieren.

      Externe Stromversorgung hilft mir aktuell ja nur bedingt. Außer ich programmiere über den Arduino einen Schalter, der die externe Stromversorgung An- & Ausschaltet.
      Damit hätte ich allerdings nur zwei Zustände. An oder aus.

      Sprich meine Optionen sind: Entweder der Schalter basteln oder den Lüfter allgemein leiser machen.

      Danke auf jeden Fall. :)
      Leg dich nie mit einem BAOD an, oder du bist selber dran.

      Das Leben ist grausam.
      Wenn es mal nicht grausam ist, ist es grausamer.

      [IMG:http://www.digioso.org/gfx/banner_low.jpg]
    • Naja so kompliziert ist das alles garnicht.
      Anlaufstrom, mach Dir keinen Gedanken dazu weiter, das messen kannst Du nicht so einfach. Idealer Weise wäre mindestens ein Speicher Oszilloskop, oder Messgeräte die einen Spitzenstrom messen und speichern können, aber so ganz einfach ist das alles nicht wenn man es ganz genau nehmen wollte, da es ja auch kein reiner Ohmscher Wiederstand ist, usw...
      Ich wollte nur darauf Hinweisen das es auch das noch gibt und man auch das im Hinterkopf behalten muß.
      Ist z.B. bei einem NEtzteil im PC das gleiche. Wenn das ganze System startet und Du hast viele sehr schnell laufende Festplatten darin, dann kann es passieren daß das Netzteil in die Knie geht, Rechner macht murx...
      Aus diesem Grunde gibt es zum Beispiel in manchen Bios verzögertes nach einander starten von Festplatten, bzw. das Netzteil sollte entsprechend etwas Luft haben. Aber heut zu Tage gehts eher alles zu SSD hin, und ansonsten laufen die Festplatten eher langsamer als schneller, ziehen somit auch nicht die großen Ströme.

      Wenn Du einen Lüfter mit PWM hättest, könntest Du mit dem Arduino, vorrausgesetzt das ganze klappt mit programieren, den Lüfter ansteuern, aber den Strom woanders herziehen. Im PC macht man das auch. Ein Steuerausgang mehrere Lüfter, aber Strom ziehen die sich z.T. direkt vom Netzteil. Braucht man entsprechend geschaltete Kabel für ist aber kein Hexen Werk. Ich hab so. Z.B. drei 140er Lüfter am CPU Lüfterausgang. Zwei für Kühlkörper und einer der beiden oben drüber in der Abluft. Alles zusammen wäre wohl auch etwas zu viel für den einen Ausgang.

      Da Du keine PWM hast, bleibt eigentlich nur entweder feste Lüfterdrehzahl einstellen, die einfachste Möglichkeit, ein Dreh Poti. Oder mit einem passenden Temperatur empfindlichen Widerstand, NTC, den Lüfter regeln. Sprich Kalt: Wiederstand hoch, Lüfter dreht langsam oder schlimmsten Falls garnicht. Lüfterstillstand würde ich hierbei aber vermeiden. Wird der Wiederstand warm, wird er um so leitender, Lüfter läuft schneller.


      Ich nehme an der Lüfter wird bei 2,5 V nicht mehr laufen? Hast Du irgenwie ein Teil womit Du das ausmessen, Testen kannst? Ich hab eine Lüftersteuerung, die mir anzeigen kann welche Drehzahl und welche Spannung. Aber ein regelbares Netzteil, oder auch nur Poti und Spannungsmesser tuts ebenso.

      Lüfter 5V : 0,04A = 125 Ohm
      Edit: Hab mich vertan, Dein Lüfter zieht ja 50mA. Also 5V : 0,05A = 100Ohm

      Würdest Du jetzt einen Wiederstand mit ebenfalls 125 100Ohm davor hängen würdest Du die Spannung aufteilen, somit hätte der Wiederstand und der Lüfter jeweils 2,5V. Der Strom halbiert sich damit, da der Gesamtwiederstand ja nun doppelt so hoch ist.
      Dementsprechen würde ich ein Poti auswählen, ob ich mehr oder weniger Spannung maximal "abgreifen" wollte.

      Wenn Du raus hast bei welchen Werten Dein Lüfter überhaupt läuft, bzw. Zukünftig laufen soll, könntest Du Dir einen passenden NTC aussuchen und damit den Lüfter dann steuern lassen.
      Vielleicht bei Conrad dann beraten lassen bei der Auswahl. Den Temperatur Fühler, was anderes ist das nämlich nicht, mußt Du dann nur irgendwie so nah wie möglich an die CPU bekommen, wenn von der die abgegebene Wärme geregelt werden soll.


      Hoffe das Hilft Dir ein wenig,
      Viele Grüße

      Mecki
    • Danke. :)

      Nope, hab leider aktuell nichts zum Messen davon hier. Bzw. leider auch kein regelbares Netzteil.

      EIn Poti ist aber in der Tat eine gute Idee. Damit könnte ich auch testen. Bei Conrad gibts z.B. 100 Ohm Potis.
      Wenn ichs richtig sehe hätte mein 50mA Lüfter 0,3 Watt Leistung. Die Potis bei Conrad gibts die Potis hier mit 0,25 Watt und dann wieder mit 1 Watt Belastbarkeit.
      D.h. wenn ich sicher gehen möchte sollte ich besser einen den 1 Watt Poti nehmen, schätze ich.
      Leg dich nie mit einem BAOD an, oder du bist selber dran.

      Das Leben ist grausam.
      Wenn es mal nicht grausam ist, ist es grausamer.

      [IMG:http://www.digioso.org/gfx/banner_low.jpg]
    • OK, also Du weist was ein geregeltes Netzteil bzw Oszi ist.
      Du hast ein paar Widerstände zu Hause rumliegen.
      Und Du weist das Du besser das 1W Poti nimmst...
      Widerstände und Poti sind ohne löten schlecht zu verkabeln, also scheinst Du auch die Grundbegriffe vom Löten zu kennen.

      Eigentlich genug Wissen um sich mal an einer 1-Transistor-Schalt-Schaltung zu versuchen, oder ?
    • @Digioso

      Sorry hab mich oben vertan gehabt... (hab es schon korrigiert) Ich hatte mit 40mA gerechnet, Dein Lüfter hat aber ja 50mA als Angabe.

      Übrigens ist es ganz gut wenn Du einen Wiederstand mit hörem Leistungs Wert nimmst, denn der Leistungswert ist auf die gesamte Schleiferbahn gerechnet, also den gesamten Wiederstand. Wenn Du den aber runter drehst und nur noch ein ganz kleines Teilstück nutzt und dann Kleiner Wiederstand = großer Strom fließt, wirds irgendwann zu viel und das kleine Stück Kohlebahn auf welcher der Schleifer läuft brennt schlimmstenfalls weg => Poti im Eimer. ;)
    • Mecki schrieb:

      @Lodin_Erikson

      Hi Lodin,

      worauf willst Du mit der Transistorschaltung hinaus?

      Indirekt ein Quasi PWM machen? Indem der Lüfter angesteuert vom Arduino Ausgang, über den Transistor mit unterschiedlich vielen ein / aus schalten, schneller oder langsamer läuft?

      Viele Grüße

      Mecki
      => einplatinencomputer.net/Lattep…obleme?postID=315#post315

      ... und dann ein PWM-Signal auf D9.

      Ach ja, die Frequenz des PWMs sollte über 20kHz liegen damit man es nicht hört.
      Die minimal Pulsbreite bei der der Motor sicher anläuft muss man ausprobieren da vom Motor abhängig.

      Die gleiche Schaltung noch Mal mit Oszi und Frequenzgenerator :



      Türkis ist das PWM-Signal von D9. Rot das Signal am Transistor
      Bitte beachtet die Invertierung, d.h. 10% PWM macht 90% Motor an !


      VG,
      Lodin

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Lodin_Erikson ()