Arduino 4-Pin Lüfter PWM

Gast #1431233
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
Gast #1431338
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.
Gast #1431799
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.
Gast #1432479
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.
(Firma: OpenKNX) #1440985
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..
Gast #1441075
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.
(Firma: OpenKNX) #1441238
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren