Hallo uC Experten, habe hier noch 4 ältere 4-Pin PC Lüfter (d.h. Drehzahl per PWM gesteuert) aus einem Server, ein ATmega168PA Testboard von Pollin (BestNr. 810366) und ein 12V/5V Kombi-Netzteil (war mal für eine externe HDD). Das ganze würde ich gerne HW seitig zusammenbauen, damit der ATmega die vier Lüfter per serieller Schnittstelle unabhängig voneinander regeln kann und die tatsächliche Drehzahl überwacht/ausgibt. HW seitig werde ich das schon hinbekommen, würde mich freuen wenn ihr mir aber ein paar Denkanstöße zur SW geben könntet. Da bin ich weniger bewandert... - die Lüfter benötigen ein 25kHz PWM Signal - duty cycle würde mir in 5% Schritten (also 20 Schritte/Stufen) ausreichen - die Drehzahl wird vom Lüfter als Rechtecksignal ausgegeben, d.h. ich muss eine steigende und die nächste fallende Flanke messen (1) Wie sollte die SW dazu ganz grob aussehen? Im DB steht zwar "sechs PWM channels", aber ich habe nur drei PWM Blöcke (2x8-Bit + 1x16Bit). Gibt es überhaupt sechs unabhängige PWMs hier? Sollte ich daher per Interrupt einen Timer von 1/(25kHz * 20 Schritte) = 1/500kHz generieren (das wären m.E. verdammt viele...) und damit die Pins rein per SW toggeln? Irgendwie verstehe ich nicht woher die sechs PWMs kommen sollen... (2) Und wie sollte man die Zeit zwischen einer steigenden und fallenden Flanke messen? Über die beiden external Interrupts? Also Interrupt auf steigende Flanke scharf schalten und warten bis getriggert, Timer starten, Interrupt auf fallende Flanke konfigurieren und warten bis Interrupt wieder ausgelöst hat, Timer stoppen und Wert lesen, oder geht das eleganter indem man den ext. Interrupt bei jeder Flanke auslösen lässt? Und der Timer dazu würde auch wieder einen PWM blockieren wenn ich das richtig verstanden habe, d.h. entweder PWM Ausgang, oder Zähler, oder? (3) Da der uC nur zwei externe Interrupteingänge hat, würde ich eh nur zwei Lüfter überwachen können, korrekt? Gruß, Rene
Hallo Rene Meier, dann lies bitte noch mal die gesamte Doku zu den 3 Timern und den PWM Möglichkeiten. Frage dich bitte, was die Kanäle A und B damit zu tun haben. Bei der Frequenzmessung muss man die jeweils gleichen Flanken, z.B. fallend auf fallend, dektieren und daraus die Frequenz berechnen. Frage Dich bitte, welche max. Frequenz jeweils vorkommen kann und wie Du diese 4 mal per Software messen möchtest. Also mit welchem Freuqnzmessverfahren?
Rene Meier schrieb: > aber ich habe nur drei PWM Blöcke (2x8-Bit + 1x16Bit) Nö, du hast 3 Timer und jeder hat zwei OCR Register (OCRA und OCRB). Die können zwar nur die gleiche Wiederholfrequenz ausgeben, aber unterschiedliche Tastgrade haben. Rene Meier schrieb: > Da der uC nur zwei externe Interrupteingänge hat, würde ich eh nur > zwei Lüfter überwachen können, korrekt? Auch nö. Der Mega 168 hat neben den beiden INT0 und INT1 Interupts auch Pinchange, die praktisch auf jedem Pin einen Interrupt auslösen. Allerdings gibt es pro 8-Bit Port nur eine PC Gruppe, so das die Interrupt Routine pro Gruppe den auslösenden Pin selber rausfinden muss.
Hallo, danke für die Tipps und Hinweise auf die Doku/Datenblätter. Muss ich mir noch mehr als einmal durchlesen und verstehen. Brauche immer die identische Frequenz (25kHz), aber einen individuellen duty cycle. Somit passt das also. Bin aber mittlerweile ernüchternd gescheitert, das blöde Board will nicht wie ich will. Danach habe ich dann hier einen Beitrag darüber gefunden: das Teil ist quasi Schrott und hat weder den 16MHz Quarz drauf, noch einen "nackten" Microchip/Atmel ==> geht zurück, auch wenn es nur 2,95€ sind. Aber das ärgert mich einfach @Karl M.: Bzgl. der Bestimmung der Drehzahl fand ich die Erklärungen hier ganz gut und wollte mich daran orientieren: http://scynd.de/tutorials/arduino-tutorials/4-luefterdrehzahl-auslesen/4-2-drehzahl-4-pin-l%C3%BCfter.html @all: wird also noch dauern bis es weitergeht, mal sehen ob es woanders ein ähnliches Board gibt Grüße, Rene
Rene Meier schrieb: > Bin aber mittlerweile ernüchternd gescheitert, das blöde Board will > nicht wie ich will. Danach habe ich dann hier einen Beitrag darüber > gefunden: das Teil ist quasi Schrott und hat weder den 16MHz Quarz > drauf, noch einen "nackten" Microchip/Atmel Das ist Blödsinn. Natürlich ist da ein ATMega168 drauf. Und ob das ein 16MHz Quarz oder Resonator ist, spielt für deine Anwendung doch nun wirklich keine Rolle. Für dein Lüftergedöhns würde sogar der interne 8MHz RC Oszillator genau genug sein (für die UART Kommunikation aber möglicherweise nicht). > Bzgl. der Bestimmung der Drehzahl fand ich die Erklärungen > hier ganz gut und wollte mich daran orientieren: > http://scynd.de/tutorials/arduino-tutorials/4-luefterdrehzahl-auslesen/4-2-drehzahl-4-pin-l%C3%BCfter.html Tja, so können Meinungen auseinander gehen. Ich finds grauslich. Vor allem, daß der Idiot da vorschlägt, man solle die Frequenz des Signals bestimmen, indem man die Pulsbreite mißt. Und er schlägt das nicht nur vor, sondern es ist seine bevorzugte Methode, weil schneller und genauer! > wird also noch dauern bis es weitergeht, mal sehen ob es woanders > ein ähnliches Board gibt So wie du dich anstellst, wird das in der Tat noch sehr lange dauern. Was willst du eigentlich mit einem Board? Nimm einfach einen ATMega im DIP Gehäuse und pack den auf ein Steckboard. Und wenn es dann mal läuft, ziehst du auf eine Lochrasterplatine um. Zum Thema Drehzahlmessung (Frequenzmessung) findest du hier im Forum jede Menge Beiträge.
Hallo Axel, hmmm, blöd nur wenn die Fuses auf externem Quarz stehen (statt Resonator)... Und ja, dann dauert es halt seeeeeehr lange. Stört das irgendwen? Ob ich das heute, morgen oder übermorgen fertig bekomme ist doch egal, baue kein Atomkraftwerk oder habe irgendein Termindruck. Rene
Für die 4 PWMs kann man die Pins OC0A, OC0B, OC2A, OC2B nehmen. Um bei 16MHz Quarz die 25kHz zu erreichen, muß man den Vorteiler der Timer auf 8 setzen und im Overflowinterrupt beide Timer auf 256-80 setzen. Es wird nur ein Overflowinterrupt benötigt. Zur Drehzahlmessung nimmt man die Input-Capture Funktion des T2. Die kann man über den ADC-Multiplexer auf bis zu 10 Eingänge umschalten.
Rene Meier schrieb: > blöd nur wenn die Fuses auf externem Quarz stehen (statt > Resonator)... Mir wäre nicht bekannt, dass man die Fuses auf "Resonator" stellen kann...
Rene Meier schrieb: > hmmm, blöd nur wenn die Fuses auf externem Quarz stehen (statt > Resonator)... Da gibt es keinen Unterschied. Bzw. der Unterschied, den man machen sollte, ist wie lange man dem Oszillator Zeit zum Anlaufen gibt (das sind die SUT Fuses). Ein Quarz braucht etwas länger als ein Resonator, wobei das bei 16MHz nur einige Milliskunden sind. Aber mit einem Resonator ist man auf jeden Fall auf der sicheren Seite. Nach wie vor bin ich nicht davon überzeugt, daß da ein Resonator verbaut ist. Es gibt auch Quarze in diesem Gehäuse, nur durch scharfes Hinsehen erkennt man den Unterschied nicht.
Axel S. schrieb: > Nach wie vor bin ich nicht davon überzeugt, daß da ein Resonator > verbaut ist. In der Produktbeschreibung steht '16MHz Präzisionsquarz' und es gibt keinen Grund, warum das nicht stimmen sollte. https://www.pollin.de/p/entwicklungsboard-atmel-atmega168pa-810366
:
Bearbeitet durch User
Matthias S. schrieb: > Axel S. schrieb: >> Nach wie vor bin ich nicht davon überzeugt, daß da ein Resonator >> verbaut ist. > > In der Produktbeschreibung steht '16MHz Präzisionsquarz' und es gibt > keinen Grund, warum das nicht stimmen sollte. Na ja. Wenn Pollin China-Kracher wie diesen verhökert, dann kann man durchaus mißtrauisch sein. Die Chinesen lügen das Blaue vom Himmer herunter, wenn sie dir was verkaufen wollen. Und Pollin wird wenig mehr tun, als deren Beschreibung in ihren Shop zu übernehmen. Wenn du hier im Forum mal nach "Pollin 810366" suchst, dann findest du die Threads, von denen der TO oben spricht. Diese Platine ist auf jeden Fall schon deswegen grenzwertig, weil sie den ATMega168PA mit 3.3V versorgt, aber gleichzeitig mit 16MHz laufen lassen will. Das ist außerhalb der Specs, auch wenn es typischerweise funktioniert. Andererseits kann man ja auch 5V hinter dem Spannungsregler einspeisen (V_in dann offen lassen). Dann läuft der ATMega mit 5V und alles ist gut.
:
Bearbeitet durch User
Hallo, bin dann zu blöde dafür... Habe ihn nach https://www.engbedded.com/fusecalc/ auf CKSEL 1110 SUT 00 gestellt (also lange Zeit zum Hochfahren gegeben), aber jetzt fährt er scheinbar gar nicht mehr hoch (festgestellt mit Demoprogramm = einfaches LED blinken). @ Peter D. Danke! So eine Antwort wie deine hatte ich mir von Anfang an erhofft, das hilft mir in die richtige Richtung zu gehen und dahingehend zu lesen und Beispiele anzusehen. Grüße, Rene
Rene Meier schrieb: > @ Peter D. Danke! So eine Antwort wie deine hatte ich mir von Anfang an > erhofft, das hilft mir in die richtige Richtung zu gehen und dahingehend > zu lesen und Beispiele anzusehen. Hallo Rene, schöne, wenn jetzt die Sache umsetzbar wäre. Aber was meinst Du mit "Beispiele anzusehen"? Im Datenblatt zum AVR µC stehen doch alle Hardwaremodule und deren zugehörige Beschreibung. Nun kann Mann oder Frau mit der Programmierung in seiner Zielsprache, z.B. AVR Forth, Pascal, LunaAVR oder C, C++, loslegen. Wie wirst Du starten?
Die ersten zwei Teile habe ich hinter mir: - serielle Schnittstelel mit 9600baud und eigenem Protokoll über USB Wandler in betrieb genommen, empfangem von Werten vom PC läuft schon, das Senden auch (aber liefer ich aktuell nur dummys zurück) empfangen: L[1...4]D[30...90] (L für Lüfter und D für duty cycle) Antwort 1sec später: L[1...4]U... (L für Lüfter und U für U/min, wobei U aktuell noch statisch ist) - Nutzung der beiden 8-Bit Timer um jeweils eine PWM mit einstellbarem duty cycle auszugeben To-Do: Messung der Drehzahl Geschrieben ist alles in C (++?), wobei das meiste c&p aus dem Internet ist mit Anpassungen (z.B. eine uart lib) für mich. Aber das sagte ich ja schon, zum "neu erfinden" reichen meine Kentnisse nicht, ich kann nur kopieren und anpassen. Rene
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.