3.1 -PWM ohne Pfeifen
Wenn man einen 3 Pin Lüfter per PWM mit dem Arduino drosselt, dann kann man oft ein störendes Pfeifen oder Rattern vom Lüfter hören. Das liegt daran, dass die PWM Ausgänge bei Arduino standardmäßig mit 490Hz oder 980Hz laufen.
Diese Frequenz liegt im für Menschen hörbaren Bereich , daher auch die Geräusche (ganz vereinfacht gesagt ). Um diesem Problem Herr zu werden, muss man dem Arduino sagen, er soll die PWM Ausgänge mit höherer Frequenz (über 20kHz) betreiben. Das wiederum bringt weitere Stolpersteine mit sich.
Um das Problem mit den pfeifenden/ratternden Lüftern zu lösen, muss man die Voreinstellungen der Timer im Arduino ändern um so die PWM Frequenz zu erhöhen.
Jetzt fragt ihr euch sicherlich, was redet er jetzt von Timern
Als Timer bezeichnet man beim Arduino/ Mikrocontrollern einen auf dem Chip integriertes Funktionsmodul, welcher beim Zählen von Ereignissen, Messen von Zeitabständen und periodischen Ausführen von Programmteilen eine wichtige Hilfe darstellt. Mit einem Timer sind immer mehrere PWM Ausgänge verbunden. Das ganze sieht wie folgt aus.
Arduino Uno und Andere
Der Arduino Uno hat 3 Timer und 6 PWM Ausgänge. Sie hängen wie folgt zusammen
Diese Belegung müsste mit den meisten anderen kleinen Arduinos übereinstimmen. Ich kann dafür aber nicht die Hand ins Feuer legen.
Arduino Mega 2560
Der Arduino Mega 2560 hat 6 Timer und 15 PWM Ausgänge. Sie hängen wie folgt zusammen
Ergänzend hier noch die
Intel Spezifikation für PWM Lüfter .
Jetzt, da wir wissen welcher Timer welche Pins steuert, kommen wir zu dem Stolperstein von dem ich vorher gesprochen habe.
Timer0 steuert nicht nur zwei PWM Pins, sondern auch die Funktionen
delay(),
millis() und
micros().
Wenn man jetzt die Frequenz dieses Timers verändert, ändern sich auch die Funktionen, wie oben in der Tabelle zu sehen ist. Zum beispiel, wenn wir die Frequenz auf 62500 Hz stellen, muss man die Funktion
delay(1000) in
delay(62500) ändern um 1 Sekunde zu warten.
Wenn ihr es etwas genauer nachlesen wollt,
Arduino Playground .
Der beste Weg dieses Problem zu umgehen, ist die Pins von Timer0 einfach nicht zu benutzen, da ihr sonst im Code schnell einen Timingfehler machen könnt. Wenn es nicht anders geht, dann achtet bitte sorgfältig darauf, die betroffenen Zeitfunktionen richtig zu programmieren.
Das Umstellen der Frequenz ist ganz einfach. Es bedarf nur einer einzigen Zeile Code die unter
void setup() eingefügt werden muss.
TCCR
nB = TCCR
nB & 0b11111000 |
Befehl;
Bei diesem Befehl müsst ihr nur das
n durch die Nummer des Timers und
Befehl durch den Hex Code aus der Tabelle oben ersetzen. Für Timer1 und 31300Hz sähe es dann so aus.
TCCR1B = TCCR1B & 0b11111000 | 0x01;
Code
|
Quellcode
|
1
2
3
4
5
6
7
8
9
|
void setup()
{
TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
}
void loop()
{
// put your main code here, to run repeatedly:
}
|
Wenn ihr diese Zeile in euren Code einbaut, sollte es kein pfeifen oder rattern mehr geben. Ihr könnt jetzt ganz normal mit der
analogWrite(0 - 255) Funktion euren Lüfter ansteuern.
Das war es auch schon
.