Hallo Zusammen, ich möchte mit einem Arduino (ATMEGA 328) einen 4 Pin PC-Lüfter steuern, dazu habe ich diesen Thread gefunden: Beitrag "Steuerung 4 Pin PC PWM Lüfter" Aber auf die Frage: 1. Wie funktioniert die Ansteuerung eines PWM-Lüfer eigentlich genau? Liegen am stromführenden Lüfterkabel z.B. permanent 12 V an und das PWM-Steuerkabel liefert dem Lüftermotor die entsprechenden Schaltimpulse. Also ein/aus. Dies aber mit einer gänzlich anderen Spannung. z.B. 5,25 V? wird keine Antwort gegeben. Aus dieser Spec entnehme ich das ich 25khz als pwm Frequenz brauche: http://www.formfactors.org/developer/specs/REV1_2_Public.pdf Also hab ich sie wie hier beschrieben auf 32khz angepasst: http://softsolder.wordpress.com/2009/02/21/changing-the-arduino-pwm-frequency/ Eine LED habe ich zum Test angeschlossen, die blinkt genau wie erwartet, nur der Lüfter verändert nichts an seiner Drehzahl. Osziloskop zum Kontrollieren habe ich nicht. Wo kann der Fehler liegen? Gruß Marc
Wieso 32kHz? Der Lüfter benötigt 25kHz! Die Drehzahl wird über die Pulsweite (Tastverhältnis) eingestellt.
32 khz weil ich nich weiß ich auf 25khz komme ;) es sollte aber auch mit 32khz gehen, da die Frequenz nur so hoch sein muss, dass sie nicht vom Menschen hörbar ist.
Ich lese im Datenblatt > PWM Frequency: Target frequency 25 kHz > acceptable operational range 21 kHz to 28 kHz Also muss 32kHz meiner Meinung nach nicht zwingend funktionieren...
naja, das Problem ist, das ist kein Datenblatt sondern eine Spezifikation (ich glaube von Intel) wie es die Mainboard Hersteller zu implimentieren haben. Ein echtes Datenblatt zu dem Lüfter finde ich nicht (es handelt sich um diesen hier: http://www.arctic-cooling.com/catalog/images/spec_sheet_ARCTIC_F_PWM.pdf) Das es mit 32khz auch Funktionieren soll, hab ich in irgendeinem Forum gelesen, mit der Begründung das der Lüfter die PWM Frequenz in hörbare Töne umsetzt, und daher 25khz+ verwendet werden, das sie vom Menschen nicht wahrnehmbar sind.
12V liegen immer an, die PWM geht von 20-100% über einen Transistor, der einen PullUp-Widerstand von den 5V schaltet. Am Kollektor/Drain kommt der PWM Anschluss des Lüfters. Das ganze mit ca. 25 KHz.
das was du da gelesen hast wird für lüfter gewesen sein die keinen pwm integriert haben ...
ext4 schrieb: > das was du da gelesen hast wird für lüfter gewesen sein die keinen pwm > integriert haben ... Würd ich auf den ersten Blick auch so sehen.
>irgendwie komm ich nich weiter.
Habe ich doch weiter oben geschrieben, wie der Lüfter angesteuert werden
muss.
aber wie komm ich auf die 25khz, laut http://softsolder.wordpress.com/2009/02/21/changing-the-arduino-pwm-frequency/ gehen nur 32khz. geht das überhaupt irgendwie?
aber wenn der prescaler eine 2er Potenz ist kann ich doch nicht auf 25khz kommen?
>aber wenn der prescaler eine 2er Potenz ist kann ich doch nicht auf >25khz kommen? CTC-Modus?
Du sollst es mit 32 kHz ausprobieren. Der Lüfter überprüft nicht die PWM-Frequenz. Wenn es geht - gut ist, wenn nicht - Lösung überlegen.
Chris schrieb: > aber wie komm ich auf die 25khz, laut > http://softsolder.wordpress.com/2009/02/21/changing-the-arduino-pwm-frequency/ > gehen nur 32khz. geht das überhaupt irgendwie? Türlich geht das. Ein Register stellt den TOP Wert der PWM dar und eins den Dutycycle. Datenblatt lesen!
Hi Chris, ich kann's dir anhand meines ATmega88 beschreiben. Dies gilt auch für die anderen µC mit kleinen Änderungen. Du brauchst 25kHz zum regeln, duty-cycle sollte zwischen 20 und 100% sein. Habe ne kleine Rechnung, zu den folgenden Angaben: CPU=10MHz CKDIV8 ist ausgeschaltet Fast-PWM Mode mit TCCR1A und TCCR1B einstellen Non-inverting Mode mit COM1A1 und COM1A0 einstellen 16-bit Timer/Counter Prescaler N = 1 mit TCCR1B einstellen
= 399 Also ist der ICR1 = 399 als dein TOP definiert, ist Modus 14. Den duty-cycle stellst du mit OCR1A ein: für 100% ist der Wert 399 für 20% ist der Wert 79,8 also 79 Und nimm dir nen N-FET selbstsperrend mit Logic-level BUZ11 wird passen. Kannst direkt an µC Pin anschliessen.
so ein update: also es scheint zu Funktionieren, ich kann die Geschwindigkeit des Lüfters verändern, allerdings nicht im gesamten Rahmen, sondern nur Geschätzt von 40-50%. Woran kann das liegen?
Ich Programmiere mit der Arduino IDE. Ausgehend von http://softsolder.wordpress.com/2009/02/21/changing-the-arduino-pwm-frequency/ diesem Tip hab ich in der Wiring.c TCCR1B = 0x01; gesetzt. Ansonsten ist mein code
1 | analogWrite(pwmPin, 40); |
2 | Serial.write(" LOW \n"); |
3 | delay(3000); |
4 | analogWrite(pwmPin, 254); |
5 | Serial.write(" HIGH \n"); |
6 | delay(3000); |
Ich setze die PWM also erst auf 40 dann auf 254, bei 40 dreht er auch leiser wie bei 254 aber der Lüfter geht lange nicht an seine max. Drezahl ran. Für Tips bin ich dankbar.
Was ist, wenn du den Duty Cycle mal nicht sprunghaft von fast aus auf ganz schnell setzt, sondern über ein paar Zwischenstufen hochfährst.
jetzt stell ich den duty in einer for-schleife um 10 nach oben mit 300ms delay, bringt leider auch nix. er regelt von ganz langsam nach langsam.
Hi, die Frequenz kann ich nich überprüfen da ich kein Oszi hab. Code steht weiter oben. Könnte sich eventuell mal jemand Opfern der einen PWM PC-Lüfter hat und es ausprobieren. Ansonsten bin ich weiterhin für Vorschläge offen.
Hi, ich mach das gleiche, dass du gerad machen willst. Ich regle mit nem Mega32 3 PWM-Lüfter. Die PWM Signale erzeuge ich über den 16Bit-Timer im Fast-PWM-Modus und ich meine CTC (OC1A/B PINS kontaktiert..). Über ein Reg stellt man dann die Obergrenze für den Timer ein (entspricht f des PWM) und über ein anderes das Tastverhältnis (liegt natürlich zwischen 0 und dem erstgenannten Register). Bei mir funktioniert das wunderbar, ich hab die PWM-Leitung des Lüfters direkt an den Portpin gehängt - an einen anderen sogar 2. In Ermangelung eines Oszi hab ich mir den PWM aber nie angesehen. Da die Lüfter aber brav langsamer und schneller werden, ist das für mich i.O. Einzige Nebenwirkung: Tachosignal ist dann irgendwie verkrüppelt.. Drehzahlberechnung haut nimmer hin. Ich kann heute Nachmittag mal den Code für das Einstellen des PWM posten..
>Bei mir funktioniert das wunderbar, ich hab die PWM-Leitung des Lüfters >direkt an den Portpin gehängt - an einen anderen sogar 2. Gut dann werde ich das nochmals so probieren. >Einzige Nebenwirkung: >Tachosignal ist dann irgendwie verkrüppelt.. Drehzahlberechnung haut >nimmer hin. Das hab ich auch schon gelesen, scheint das man damit leben muss.
1 | void SetFans(uint16_t _level1, uint16_t _level2) |
2 | {
|
3 | level1 = _level1; |
4 | level2 = _level2; |
5 | |
6 | DDRD |= (1<<DDD5); // Set Pin19 (PortD5, OC1A) as output |
7 | DDRD |= (1<<DDD4); // Set Pin18 (PortD4, OC1B) as output |
8 | |
9 | TCCR1B = 0x00; // Stop the Timer |
10 | |
11 | ICR1H = 640 / 0x0100; |
12 | ICR1L = 640 % 0x0100; // 640 * 25.000 = 16.000.000 |
13 | |
14 | |
15 | OCR1AH = level1 / 0x0100; |
16 | OCR1AL = level1 % 0x0100; |
17 | OCR1BH = level2 / 0x0100; |
18 | OCR1BL = level2 % 0x0100; |
19 | |
20 | |
21 | // Set OC1A/B on compare match
|
22 | // Timer Mode: Fast PWM, TOP ICR1
|
23 | // No prescaling (use full IO-Clock)
|
24 | |
25 | TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11); |
26 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); |
27 | }
|
Lass doch den Compiler die Registerzugriffe machen:
1 | ICR1 = 640; |
2 | |
3 | OCR1A = level1; |
4 | OCR1B = level2; |
rtfm, Jörg
Hat jemand ne Info darüber wieviel Strom der Open Collector (oder Open Drain) Ausgang des Tachosignals abführen kann? Dazu finde ich in der Spec keine Info.
Kann mir jemand einen Programmcode für eienen PWM Lüfter geben? Ich will 2 Taster verwenden. Einer für niedrige Geschwindigkeit ud einen für hohe Geschwindigkeit. Vielen Dank für eure Hilfe! #3
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.