Forum: Mikrocontroller und Digitale Elektronik 4 * 4-Pin PWM PC Lüfter ansteuern mit ATmega168PA


von Rene Meier (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Rene Meier (Gast)


Lesenswert?

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

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Rene Meier (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

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

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Axel S. (a-za-z0-9)


Lesenswert?

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
von Rene Meier (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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?

von Rene Meier (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.