PWM für Ruck Lüfter

Hola liebes Forum,

ich habe einen Ruck Etamaster Lüfter mit EC Motor und Eingang für PWM+GND, wahrscheinlich den gleichen den dieser Herr hier hat: EC PWM Steuerung

Ich will auch eine PWM für diesen Motor erzeugen, allerdings mit einem MEGA2560, und der Möglichkeit später noch z.b. Feuchtigkeitssensoren abzufragen um den Lüfter situationsbedingt besser ansteuern zu können.

Frage: Brauche ich, wie in diesem Bild: EC PWM Steuerung - #31 by Falke07 den NPN Transistor und die Einspeisung in die PWM Leitung oder kann ich PWM von einem MEGA output und GND direkt zum Motor geben?
Wenn ich richtig verstehe braucht der TO des verlinkten Threads den Trans. nur wegen der 3m Kabellänge - welche limitierung habe ich ohne Trans.?

Wenn ich in die PWM einspeisen muss und nicht mit den 5V des MEGA auskomme, habe ich ein Problem.

Ich habe 5V(zu wenig für MEGA) und 12V(zu viel für Motor?) Meanwell Schaltnetzteile hier...
Was wäre hier die bessere Wahl? 12V + stepdown oder 5V mit stepup (eins von beiden modulen hätte ich glaube ich hier) oder direkt ein 10V Netzteil bestellen?

Hier nochmal das Anschlussbild des Motors

Vielen Dank schonmal

Wenn das Netzteil wirklich 5V ausgibt kannst auf 5V Pin drauf gehen, aber Achtung bei USB Versorgung immer abklemmen, oder dein USB Kabel so präparieren das du die 5V durchtrennst, sonst kann passieren das man den USB Port am PC defekt macht wegen Stromausgleich.
Im dem gezeigtem Link hat der Jenninger ein ESP der hat an den Pins nur 3,3V.

1 Like

Danke <3
und wie lang darf das kabel zum Motor maximal sein?

aber der MEGA braucht doch 7V oder nicht?

achso jetzt hab ich verstanden.
man kann die MeanWell netzteile "finetunen" - lieber 5,1 oder 4,9V ?

und den NPN Transistor brauche ich nicht ja?

4,9V ist optimal.

Testen :wink: kenne dein Lüfter nicht, normal sollte ohne Transistor funktionieren, was sagt Datenblatt ?

1 Like

Du kannst den Mega mit Deinem Netzteil über den 5V Pin bestromen. Da für die PWM Spannung 5-10 V angegeben sind, könnte es ohne Transistor funktionieren. Ist halt die untere Grenze. Musst Du ausprobieren.

Außerdem ist zu überlegen, wie Du die PWM erzeugen willst. Mit Hilfe von analogWrite (ohne auf die entsprechenden Register zuzugreifen) ist 980Hz an den Pins 4 und 13 das Maximum. Halt nicht ganz 1kHz.

1 Like

Danke. Sobald der Motor da ist werde ich das ausprobieren.

Was bedeutet das mit den 98Hz genau für mich? Wird das merkliche auswirkungen haben? Sollte ich eine andere Art der PWM Erzeugung wählen?

welche 98 Hz?

Wie willst Du denn das PWM-Signal erzeugen? Mit analogWrite ist, wie gesagt, bei 980 Hz an den genannten Pins Schluss. Um irgendwas zwischen 1kHz und 5kHz zu erzeugen (wird laut Datenblatt für Deinen Lüfter benötigt), wirst du auf bestimmte Register eine Timers zugreifen müssen. Wie das geht, ist im Datenblatt zum ATMega2560 beschrieben….

1 Like
const int pwmPin = 9; // Das Pin für die PWM-Ausgabe
const int potPin = A0; // Das Pin für den Potentiometer-Anschluss
int potValue = 0; // Variable zur Speicherung des Potentiometer-Werts
int pwmValue = 0; // Variable zur Speicherung des PWM-Werts

void setup() {
  // Setze das PWM-Pin als Ausgang
  pinMode(pwmPin, OUTPUT);

  // Konfiguriere Timer 1 für die PWM
  TCCR1A = _BV(COM1A1) | _BV(WGM11); // Non-inverting PWM, Mode 14 (Fast PWM)
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); // Mode 14, Prescaler 8
}

void loop() {
  // Lese den Wert des Potentiometers
  potValue = analogRead(potPin);
  
  // Konvertiere den Potentiometer-Wert in einen PWM-Wert
  // Der Potentiometer-Wert liegt zwischen 0 und 1023, der PWM-Wert sollte zwischen 0 und 65535 liegen
  pwmValue = map(potValue, 0, 1023, 0, 65535);
  
  // Setze den PWM-Wert
  OCR1A = pwmValue;
  
  // Warte eine kurze Zeit, um Schwankungen zu vermeiden
  delay(10);
}

so?

oder brauche ich eine invertierte PWM?:

TCCR1A = _BV(WGM11) | _BV(COM1A0); // Inverting PWM, Mode 14 (Fast PWM)
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); // Mode 14, Prescaler 8

Nein. Brauchst du nicht.

1 Like

hey, also es lüppt jetzt mit diesem code:

const uint8_t   pinPWM5 = 5; // PWM output pin
const uint8_t   potPin = A0; // Potentiometer input pin

void setup() 
{
    //timer 3 is connected to pin 5 as OC3A
    pinMode( pinPWM5, OUTPUT );     //OC3A
    //output compare clear on bottom, set on compare
    //WGM = 7 (10-bit fast PWM)
    //prescaler /8 (gives PWM frequency of ~1953Hz
    TCCR3A = (1<<COM3A1) | (1<<WGM31) | (1<<WGM30);
    TCCR3B = (1<<WGM32) | (1<<CS31);
    OCR3A = 0;
}

void loop() 
{
    // Read potentiometer value
    int potValue = analogRead(potPin);
    
    // Map potentiometer value to PWM duty cycle (0 to 1023 -> 0 to 1023)
    int pwmValue = map(potValue, 0, 1023, 0, 1023);

    // Update PWM duty cycle for pin 5
    OCR3A = pwmValue;

    delay(100);  
}

leider gibt der lüfter ein schrilles gleichmäßiges geräusch/fiepen von sich, und ich habe das gefühl dass er unregelmäßig läuft als würde sich die geschwindigkeit alle 1-2sekunden "normalisieren" (ist das normal?)

Naja .. die map Anweisung ist ziemlich sinnbefreit, weil da gar nicht gemappt wird (identischer Wertebereich). Außerdem ist OCR3A ein 16Bit wert der zwei Schreibzyklen braucht um beschrieben zu werden. Darum sollte man vor dem Beschreiben die Interrupts ausschalten.

Ich habe leider keinen ATMega2560. So wie es aussieht, sind die Registerbelegungen aber wie beim Timer1 vom Atmega328. Darum habe ich mal das hier zusammen gebaut:

#include <util/atomic.h>

constexpr uint8_t PWM_OUT {5};
constexpr uint8_t ANALOG_IN {A0};

constexpr uint16_t HERTZ {2000};
constexpr uint16_t PRESCALER {8};
constexpr uint16_t ICR3_TOP {(F_CPU / (2UL * PRESCALER * HERTZ)) - 1};

void setup() {
  pinMode(PWM_OUT, OUTPUT);
  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
    TCCR3B = 0;   // Stop Timer first, for safety
    TCCR3A = 0;
    TCCR3B = _BV(WGM13) | _BV(CS11);     // Prescaler 8
    TCCR3A = _BV(COM3A1) | _BV(WGM11);   // phase correct, clear ocr3a on compare match
    ICR3 = ICR3_TOP;                     // TOP Value for selected frequency
    OCR3A = (ICR3_TOP / 2) + 1;          // 50% Duty Cycle
  }
}

void loop() {
  static int16_t prevResult {1025};
  int16_t result = analogRead(A0);
  if (abs(result - prevResult) > 4) {
    prevResult = result;
    uint16_t duty = map(result, 0, 1023, 0, ICR3_TOP);
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { OCR3A = duty; }
  }
  delay(200);
}

Das sollte ein phasenkorrektes 2kHz PWM Signal erzeugen.

1 Like

vielen dank, ich werds gleich testen :heart:

läuft, danke! das induktionsfiepen ist aber immernoch da :frowning:

Da kann ich nichts zu sagen. Fiept es auch, wenn der auf 100% läuft? Dann ist das PWM Signal ja nur noch eine Gleichspannung.

auf 100% ist das luftgeräusch so laut das ich das fiepen nicht mehr höre :smiley:

achja, reicht es in deinem script die HERTZ variable zu ändern? passt das noch mit dem prescaler bei 1000-5000 Hz ? würde mich gerne durchprobieren und schauen wie sich das fiepen verhält...

Ja, kannst du ändern.

1 Like