Forum: Mikrocontroller und Digitale Elektronik Arduino 4-Pin Lüfter PWM


von Chris (Gast)


Lesenswert?

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

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Wieso 32kHz? Der Lüfter benötigt 25kHz!
Die Drehzahl wird über die Pulsweite (Tastverhältnis) eingestellt.

von Chris (Gast)


Lesenswert?

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.

von Tobias P. (plaputta)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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.

von Ich (Gast)


Lesenswert?

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.

von ext4 (Gast)


Lesenswert?

das was du da gelesen hast wird für lüfter gewesen sein die keinen pwm 
integriert haben ...

von Tugrul Ö. (doenerman)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

hm, und nu?
irgendwie komm ich nich weiter.

von Ich (Gast)


Lesenswert?

Nicht die PWM ist integriert, nur der PWM-Amplifer.

von Ich (Gast)


Lesenswert?

>irgendwie komm ich nich weiter.


Habe ich doch weiter oben geschrieben, wie der Lüfter angesteuert werden 
muss.

von Chris (Gast)


Lesenswert?

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?

von Ich (Gast)


Lesenswert?

Probier es doch einfach aus.

von Chris (Gast)


Lesenswert?

aber wenn der prescaler eine 2er Potenz ist kann ich doch nicht auf 
25khz kommen?

von STK500-Besitzer (Gast)


Lesenswert?

>aber wenn der prescaler eine 2er Potenz ist kann ich doch nicht auf
>25khz kommen?

CTC-Modus?

von Ich (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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!

von Daniel (Gast)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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?

von Daniel (Gast)


Lesenswert?

Hallo Chris,

wie ist dein Quellcode.

von Chris (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Was ist, wenn du den Duty Cycle mal nicht sprunghaft von fast aus auf 
ganz schnell setzt, sondern über ein paar Zwischenstufen hochfährst.

von Chris (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Mal die Frequenz überprüft?

Wie is dein Code zur Zeit? Häng mal an.

von Chris (Gast)


Lesenswert?

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.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

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
}

von Jörg G. (joergderxte)


Lesenswert?

Lass doch den Compiler die Registerzugriffe machen:
1
ICR1  = 640;
2
  
3
  OCR1A = level1;
4
  OCR1B = level2;

rtfm, Jörg

von Horst (Gast)


Lesenswert?

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.

von #3 (Gast)


Lesenswert?

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