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.
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.
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