You are not logged in.

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 915

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

1

Tuesday, May 10th 2016, 7:59am

Arduino Tutorial 3.1 - Lüfter/PWM ohne Pfeifen

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.

TCCRnB = TCCRnB & 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

Source code

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




.

This post has been edited 6 times, last edit by "Scynd" (Dec 2nd 2017, 11:04pm)


1 registered user thanked already.

Users who thanked for this post:

Spider (06.12.2017)

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 915

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

2

Saturday, December 2nd 2017, 11:05pm

Habe ein Video zum Tutorial hinzugefügt ^^