PWM Lüftersteuerung - Induktionsgeräusch unterdrücken

Hallo zusammen,

ich will ja mein 1999´er Wohnmobil digitalisieren.. wie damals schon schrieb (mein erster post) wirds lange dauern, aber nun, mach vielen übungen und einigen eigenen kleinen projekten, traue ich mich nun einen arduino autark ins womo zu packen.

für den anfang möchte ich auf eine H-brücke verzichten, da ich diese selbst löten wollte, 2,53mm lochraster... ging 2 mal schief, warum auch immer (ich vermute kriechströme, wegen zu kleinem abstand)..

...darum habe ich als "motortreiber" eine diode an motor. (wenn ich es richtig erstanden hab, damit kein rückstrom fließt, richtig?)

als "schalter" habe ich einen IRF540N, den ich von pin, über 1K ohm, zur basis vom transistor, was mit einem 10K ohm mit ground verbunden ist. (sollte auch richtig sein, oder?)

ich habe noch einen DHT22, ein 7segment-LED_-_Shiftregister - Modul und ein 20x4 Standart LCD. bis jetzt funktioniert alles gut, bis auf, dass der motor vom lüfter, einen unangenehmen, hellen ton von sich gibt.

ich habe herausgefunden, dass es am PWM-Signal liegt, das 1 zu 1 an den motor weiter gegeben wird, aber wie kann ich das (!)SINNVOLL(!) verhindern???

eine lösung die ich gefnden habe: ---> das PWM-Signal verlängern. also alles ein schritt: "motor AN für 50millisek , motor AUS für 5millisek."

da muss es doch eine elegantere lösung geben, oder?

Grüßle

Oder einfach einen keinen 100nf abblock-kondensator parallel vor den Motor, der genau das verhindert...

[quote author=Marcus W link=topic=198494.msg1464546#msg1464546 date=1384215818]
Oder einfach einen keinen 100nf abblock-kondensator parallel vor den Motor, der genau das verhindert...
[/quote]Der wäre eher hinderlich...

Das mit der PWM, die man hört ist ein grundsätzliches Problem.
Du schaltest mit PWM einfach die Spannung am Motor so schnell ein und aus, dass sich der Motor gleichmäßig auf einer niedrigeren Stufe dreht. dummerweise wirken dabei die Wicklungen des Motors wie ein Lautsprecher.
Wenn du den Motor also mit 490Hz PWM bestromst, dann hörst du auch 490Hz.

Dein Weg ist prinzipiell der richtige: Die Ansteuerfrequenz aus dem hörbaren Bereich rausbringen.
Man kann nach unten gehen, wenn der Motor träge genug ist, man kann aber auch nach oben gehen: ab 15kHz hören die meisten nix mehr.
Wie du die PWM-frequenz ändern kannst ist hier beschrieben:
http://arduino.cc/forum/index.php/topic,72092.0.html

Aber Achtung: wenn du mit der Schaltfrequnz höher gehst, dann steigen auch die Anforderungen an die Ansteuerung des FETs, weil mit zu langsamen Schaltflanken die Verlustleistung im Fet sehr schnell ansteigt!

Dann müsstest du zumindest auf einen Gate-Vorwiderstand von 120 Ohm gehen, je nach Stromstärke vielleicht sogar eine Push-Pull-Stufe vorschalten.

Womo-Fahrer:
für den anfang möchte ich auf eine H-brücke verzichten, da ich diese selbst löten wollte, 2,53mm lochraster... ging 2 mal schief, warum auch immer (ich vermute kriechströme, wegen zu kleinem abstand)..

Moin Moin,
Kriechströme sind mit Sicherheit nicht der Grund.
mögliche Gründe:

  • falsch verschaltet
  • defekte Bauelemente
  • Kurzschlüsse

Wenn Du ein Foto postest und genau beschreibst, was Du willst, können wir helfen.
Ein eigener Thread wäre ratsam.

Gruss
Kurti

Hallo Zusammen,

erstmal danke für die unterstützung!

@ Marcus W:
Ich habe den gleichen gedanken gehabt, bis mir eingefallen, dass wenn ich einen "puffer" einbaue, ich den PWM effeckt verändere, da er ja aus schnellem AN / AUS wechseln besteht. genau das würde man mit einem kondensator unterbinden.

@ guntherb:
danke für den tip mit der frequenzänderung! ich hatte das mit digitalWrite und delay gelöst.. bin halt noch ein anfänger.. :blush: ...

Aber Achtung: wenn du mit der Schaltfrequnz höher gehst, dann steigen auch die Anforderungen an die Ansteuerung des FETs, weil mit zu langsamen Schaltflanken die Verlustleistung im Fet sehr schnell ansteigt!

Dann müsstest du zumindest auf einen Gate-Vorwiderstand von 120 Ohm gehen, je nach Stromstärke vielleicht sogar eine Push-Pull-Stufe vorschalten.

Kannst du mir das nochmal genauer erklären? ich dachte immer, dass der wiederstand an der basis von der spannung (5V) abhängt,..

@ kurti:
ja, daran habe ich auch schon gedacht, jedoch momentan ist es nicht dringend.. werde aber mit sicherheit drauf zurück kommen! :wink: XD

gruß andy

Nicht FETs mit Bipolar-Transistoren verwechseln! FETs werden mit Spannung gesteuert, nicht mit Strom. Man sagt zwar oft "leistungslos", aber das Gate des Transistors bildet einen kleinen Kondensator mit ein paar pF (wobei die Gate-Kapizität meistens in nano-Coulomb angegeben ist). Und der braucht Zeit bis er Geladen und Entladen wird. Bei langsamen Zeiten fällt das nicht auf, aber wenn man schnelle PWM macht sehen die Schaltflanken zunehmend wie die Ladekurven von Kondensatoren aus (e-Funktion). Deshalb braucht man dann irgendwann doch mehr Strom - einfach um das Gate schnell genug umzuladen.

Hier kann man vielleicht einen NPN davorhängen um das zu machen. Bei Schaltnetzteilen gibt es dafür spezielle FET-Treiber.

Serenifly:
Nicht FETs mit Bipolar-Transistoren verwechseln! FETs werden mit Spannung gesteuert, nicht mit Strom. Man sagt zwar oft "leistungslos", aber das Gate des Transistors bildet einen kleinen Kondensator mit ein paar pF (wobei die Gate-Kapizität meistens in nano-Coulomb angegeben ist). Und der braucht Zeit bis er Geladen und Entladen wird. Bei langsamen Zeiten fällt das nicht auf, aber wenn man schnelle PWM macht sehen die Schaltflanken zunehmend wie die Ladekurven von Kondensatoren aus (e-Funktion). Deshalb braucht man dann irgendwann doch mehr Strom - einfach um das Gate schnell genug umzuladen.

Hier kann man vielleicht einen NPN davorhängen um das zu machen. Bei Schaltnetzteilen gibt es dafür spezielle FET-Treiber.

also wenn ich dich richtig verstehe, bleibt es bei den 5V, aber die stromstärke die man brauch zum schalten ist größer als die 40mA wo der arduino über die pins zur verfügung stellen kann???

Womo-Fahrer:

Aber Achtung: wenn du mit der Schaltfrequnz höher gehst, dann steigen auch die Anforderungen an die Ansteuerung des FETs, weil mit zu langsamen Schaltflanken die Verlustleistung im Fet sehr schnell ansteigt!

Dann müsstest du zumindest auf einen Gate-Vorwiderstand von 120 Ohm gehen, je nach Stromstärke vielleicht sogar eine Push-Pull-Stufe vorschalten.

Kannst du mir das nochmal genauer erklären? ich dachte immer, dass der wiederstand an der basis von der spannung (5V) abhängt,..

Klar:
Ein Fet hat zwischen Gate und Source einen Kondensator. Wenn dieser Kondenstor geladen wird, dann wir der FET leitend.
Ein Kondenstor ist aber sehr niederohmig, den Gatevorwiderstand (=RG) brauche ich also vor allem um die treibende Stufe (in dem Fall der Arduino) vor zu hohen Strompeaks zu schützen.
In dem Falle: Imax = 40mA; U=5V, macht 5V/0,04A = 125 Ohm.

Die Dimensionierung von RG geht aber auch die Schaltgeschwindigkeit mit ein. Je schneller ich die Gate-Source Kapazität umladen kann, um so schneller schaltet der Fet. Das ist wichtig, weil der FET während des Umschaltens im linear Betrieb ist, in dem Strom durch den FET fließt, aber auch Spannung anliegt. Im Moment des Umschalten wird ein hoher Verlustleistungspuls erzeugt. Der ist um so kürzer, je schneller ich die Gate-Source Kapazität umlade, und er tritt um so häufiger auf, je höher meine Schaltfrequenz ist. Hier wird das Mär der "leistungslosen Steuerung" eines Fets entlarvt. Das funktioniert nur statisch. Wenn ich schnell und oft schalten will, dann muß ich hier richtig Strom reinschieben. Schaltverluste

Mit RG=125 Ohm sollte Schaltzeiten von ca 2µs drin sein. Wenn deine Ströme auf der Verbraucherseiten nicht zu hoch werden, sollte das reichen. Aber das merkst du, wenn der FET heiß wird.

hallo zusammen,

leider hab ich erst jetzt zeit wieder zu basteln und auch zu antworten.

@ guntherb:

ohh je.. so halb hab ich es verstanden,... mit meinen worten:
--> um über das gate, die drain zu öffnen benötige ich immer mehr strom und irgendwann mehr als der arduino ausgang liefern kann. um so öffter ich schlate, desto mehr amper fließen, also vereinfacht:
wenn 1 x schalten 5mA brauch und die PWM frequenz 100Hz hat, dann würden 500mA fließen, richtig?

also sollte ich die frequenz nieder einstellen, um den fließenden gate-strom klein zu halten??

gruß andy

EDIT: kann ich auch die fequenz anders ändern, ohne in die taktzeiten einzugreifen? also, der lüfter soll verschiedene geschwindigkeiten hab, muss nicht zwingend über PWM laufen.

Nein. Der Strom fließt so oder so. Egal wie hoch die Frequenz ist. Und er wird schon durch den Gate-Widerstand begrenzt. Du braucht bei einem kleineren Ladestrom nur länger um das Gate zu laden. Entsprechend länger ist der Transistor im Linearbetrieb. Oder genau genommen: er ist öfter im linearen Bereich, da öfters geschaltet wird. Bezogen auf einen einzigen Schaltvorgang dauert das Laden genauso lange. Das mit dem höheren Strom war nicht so gemeint, dass da automatisch mehr Strom fließt, sondern dass man mehr Strom benötigt um das Gate schnell genug zu laden.

Du kannst es auch einfach so machen:

Dann ist egal wie viel der Arduino liefern kann.

Aber, wie gesagt es geht vielleicht auch ohne. Vor allem wenn relativ wenig Strom fließt. Wenn der Transistor nicht heiß wird, kannst du es auch lassen und einfach die PWM-Frequenz erhöhen indem du den Prescaler des Timers änderst. Wie sich der Transistor genau verhält könnte man mit einem Oszilloskop messen, aber ich nehme an du hast keins.

wenn ich die PWM frequenz ändere, verändert sich ja trotzdem die taktzeit des arduino, so fern ich das richtig verstanden habe.
..
nee,.. leider habe ich momentan nur begrnzte mittel.. ein etwas besserer multimeter, als der baumarkt standart ist momentan, das höchste der gefühle an mess möglichkeiten die ich hab..

Kommt darauf an an welchem Timer du was änderst.

Wenn du Timer0 veränderst (Pins 13 und 4 auf dem Mega, Pins 5 und 6 auf dem Uno) ändern sich millis() und delay() entsprechend. Das kann man aber durch einen Faktor korrigieren. Wenn du an Timer1 und Timer2 schraubst (oder den anderen Timern auf dem Mega), ändert sich sonst nichts.

Siehe hier:
http://playground.arduino.cc/Main/TimerPWMCheatsheet

also ändern sich die delay() und so nicht bei allen pins, richtig? sondern nur die, die im timer stehen?

de nlink kenne ich, aber werde nicht ganz schlau.. (schlechts english!)

Standardmäßig läuft immer Timer0 und delay() benutzt diesen um die Zeit zu zählen. Jeder Timer ist fest mit 2 Pins verbunden und bei PWM werden diese über den Timer gesteuert.

Am einfachsten ist du steuerst den Lüfter über einen Pin der nicht an Timer0 hängt. Also einen anderen als 5 und 6 (auf dem UNO), bzw. 4 und 13 (auf dem Mega). Dann kannst du den Prescaler/Vorteiler ändern ohne etwas anderes zu beeinflussen

Für den UNO:
Pins 9 und 10: TCCR1B = TCCR1B & 0b11111000 | 0x01;
Pins 11 und 3: TCCR2B = TCCR2B & 0b11111000 | 0x01;

In setup(). Dann sollte er mit ca. 31kHz laufen

Oder 0x02 für ca. 4kHz

okay, allso alle pins vom timer sind betroffen, rest nicht und funktioniert wie sonst auch

... timer3 ist beim mega, der für (glaube) 2,4,5 und den zweiten will ich im nicht hörbaren bereich betreiben.
müsste also unter 20Hz gehen.. wie müsste denn der code dafür aussehen?
was bedeutet denn dein code genau?

TCCR1B steht für die änderung am timer1 aber der rest?

müsste also unter 20Hz gehen.. wie müsste denn der code dafür aussehen?

Das geht nicht. 30Hz ist das niedrigste mit 0x07 für Timer2 und höher. Du musst die Frequenz höher machen.

Für Timer 3 musst du das machen:
TCCR3B = TCCR3B & 0b11111000 | 0x01

Oder:
TCCR3B = TCCR3B & 0xF8 | 0x01

UND 0b11111000(=0xF8) bedeutet, dass die unteren 3 Bits auf 0 gesetzt werden. Der Rest bleibt. Mit diesen 3 Bits wird der Prescaler eingestellt. Das ODER danach setzt die entsprechenden Bits.

Siehe Datenblatt Seite 162:

Wie man da sieht ist 0x01 kein Prescaler, d.h. der Timer läuft dem Systemtakt.

okay,.. 30Hz ist ein sehr tiefer ton, der eigentlich nur durch sub-woofer hörbar wird, wenn ich mich nicht täusche..
werde es mal versuchen.. zur verständnis:

die niedrigste frequenz (30Hz) geht nur mit timer2, was die pins 9 und 10 betrifft.
somit müste ich den transistor, an einen von den beiden hängen und der andere ist dann eigentlich nur für digitale befehle sinnvoll nutzbar, weil das veränderte PWM signal ja an beiden pins ausgegeben wird.

daher müsste der code ja so aussehen:

...
void setup(){
TCCR2B = TCCR2B & 0xF8 | 0x07;
pinMode(9,OUTPUT)
}

void loop(){
analogWrite(9,150);
}

ist das soweit richtig?

Bei PWM gilt: je höher die Frequenz, desto besser. Bei 30Hz werden die Aus-Zeiten zu lang sein

Und alle Einstellungen die auf Timer2 gehen, gehen auf für Timer3 und Timer4. Das ist was ich mit "und höher" gemeint habe. Nur Timer0 und Timer1 sind intern anders aufgebaut. Die restlichen Timer funktionieren gleich.

okay,.. dann sollteich doch bei meiner lösung bleiben:

für 50%:

digitalWrite(motor, HIGH);
delay(50);
digitalWrite(motor, LOW);
delay(50);

für 25%:

digitalWrite(motor, HIGH);
delay(25);
digitalWrite(motor, LOW);
delay(75);

usw....

Hast du dich mit der Transistorgeschichte abschrecken lassen? Es ist nicht mal sicher, dass das überhaupt eine Rolle spielt.