Um die Drehzahl eines DC-Motors einzustellen, kann seine
Betriebsspannung per PWM und MOSFET geschaltet werden. Klemmt man den
+Motor-Anschluß an die +Betriebsspannung, reichen für die Ansteuerung
ein billiger N-Kanal Fet und eine Freilaufdiode. Der Nachteil dieser
Schaltung ist jedoch, daß die Drehzahl stark von der Last abhängig ist.
Um die Drehzahl zu stabilisieren, muß bei schwankender Last die
Pulsweite permanent angepaßt werden. Bei bürstenbehafteten DC-Motoren
mißt man üblicherweise die Generatorspannung des Motors (EMK) in der
passiven PWM-Phase, um die momentane Drehzahl zu messen und die PWM
entsprechend nachzuregeln.
Das Schaltbild zeigt, wie eine einfache Ansteuerung mit einem µC (hier
ATmega328) aussehen kann. Da der Motor für die EMK Messung nicht mit GND
sondern mit V+ verbunden ist, braucht man zwei ADC-Kanäle zu Messung der
Motor-EMK. Für die Sollwertvorgabe dient hier ein einfaches Poti.
Das Programm erzeugt die PWM für den MOSFET, vergleicht Sollwert mit
Istwert und regelt permanent die Drehzahl. Damit die EMK sicher gemessen
werden kann, liegt die PWM-Frequenz im Bereich 100 – 300 Hz. Das führt
zu Geräuschen des Motors und begrenzt die Regelgeschwindigkeit. Ferner
muß die PWM auf ein maximales Tastverhältnis begrenzt werden. Hier sind
es 80%. Der Vorteil: man braucht keinen separaten Drehzahlsensor.
Das Programm ist experimentell, das heißt, es muß noch auf den
vorliegenden Motor angepaßt werden, benutzt aber schon sinnvolle
Vorgabewerte, wie sie an einem Getriebemotor (ähnl.
Scheibenwischermotor) ermittelt wurden.
Abschließend noch ein Schaltbild, wie man mit einem kleinen µC
(ATtiny45) einen DC-Motor bidirektional ansteuern kann. Eine Regelung
ist dabei noch nicht vorgesehen - ein Programm dafür auch noch nicht.
Guten Abend,
man muss nicht mit 100-300 Hz PWM Frequenz arbeiten. Ich nehme 16 kHz
und schalte die zu messen ab. Das hört man dann zwar auch als brummen
(vor allem bei sehr geringer Drehzahl), weil für die Messzeit liegt ja
keine PWM an, ist aber ins gesamt gesehen meiner Empfindung nach viel
ruhiger.
LG
Moin,
mach das ruhig mal. PWM Pins abtrennen, ADC starten, beim ADC fertig
IRQ, PWM wieder einschalten. Wobei ich 16 ADC Messungen hintereinander
mache und den Mittelwert zum rechnen nehme. Die EMK Spannung ist ja ein
Sinus, mit 16 Messungen bekommt man schon einen recht brauchbaren
Mittelwert. Starten der EMK Messreihe wird alle 10ms gemacht, das ist
bei mir in einem Timer IRQ mit an gehangen.
Hier gibt es übrigens auch schöne Ausführungen zu PID Reglern, das
könntest Du als Regel Algo auch noch einbauen.
LG
Zeig doch einfach Deine Schaltung und Dein Programm. Dann haben Alles
etwas davon. PID-Regler einzubauen halte ich für ein einfaches
Verständnis von Schaltung und Programm etwas zu viel.
Für die möglichen Interessenten wäre eher eine Formulierung in BASCOM
hilfreicher, wenn ich so die Fragen hier im Forum sehe.
Zu der oben gezeigten 2. Schaltung mit L6203 fehlte noch ein Programm,
was ich hiermit nachreiche.
Bei Mittenstellung des Potis steht der Motor und dreht sich je nach
Potidrehung nach rechts oder links, wobei die ausgegebene PWM
proportional zum Drehausschlag erzeugt wird. PWM-Werte <10% werden nicht
ausgegeben, wodurch die Mittenstellung gut einzuhalten ist.
Die PWM-Frequenz beträgt ca. 16 kHz, was die Ohren schont. Falls der
Motor damit überfordert ist (zu schlapp), kann die Frequenz nach Bedarf
verringert werden.
Der Motorstrom wird noch nicht bewertet, sodaß die 'sense'-Widerstände
0 Ohm haben können. Normalerweise verwende ich pro 1 A Motorstrom einen
1 Ohm Widerstand, was bei drei Widerständen 0,33 Ohm ergäbe. Das ist in
etwa in der gleichen Größenordnung wie die Innenwiderstände der aktiven
MOSFETs in der H-Brücke und läßt sich gut mit dem ADC auswerten.
Bei anderen Treibern und höheren Strömen wird man kleinere Werte nehmen
müssen, um die Verlustleistung (Wärme) zu reduzieren.
Die angehängt .hex-Datei ist für einen ATtiny25 erzeugt und läuft
unverändert auch auf ..45 oder ..85. Die 'fuses' können im Lieferzustand
belassen werden. Es ist aber sinnvoll, den BOD auf 4,3 V zu setzen.
M. N. schrieb:> Das Schaltbild zeigt, wie eine einfache Ansteuerung mit einem µC (hier> ATmega328) aussehen kann..
Und du willst jetzt wissen, warum es nicht funktioniert, oder wie war
die Frage ?
Ein IRFZ34 taugt nicht, um mit den 5V eines uC-Ausgangs voll
durchgeschaltet zu werden, du brauchst schon einen IRLZ34.
Ich habe nur IRLZ34, meinte IRLZ34 und ein IRFZ34 würde je nach
Strombedarf auch reichen.
Es bedarf schon einer besonderen 'Begabung', sich wegen eines
Tippfehlers derart aufzupusten.
m.n. schrieb:>> Es bedarf schon einer besonderen 'Begabung', sich wegen eines> Tippfehlers derart aufzupusten.
Es ist kein Tippfehler wie du durch diesen Nachsatz erklärst, sondern
offensichtlich grobe Unkenntnis deinerseits:
> und ein IRFZ34 würde je nach Strombedarf auch reichen.
ist natürlich Quatsch.
http://www.vishay.com/docs/91290/91290.pdf
Bei 4V fliessen schlechtestenfalls gerade mal 250uA, bei 5V (Fig. 3 -
Typical Transfer Characteristics) können das dann 6,25mA sein. Kein
Strombedarf für einen Motor.
Offensichtlich weisst du nicht, was die UGS(th) eines MOSFETs aussagt
und warum im Datenblatt RDS(on) bei UGS=10V steht.
Leute, das ist doch kein Grund, sich deshalb an die Kehle zu springen.
Es ist doch für jeden, der den nötigen Wissensstand mitbringt, diese
Schaltung auf seine Aufgabe anzupassen, klar, dass man auch die Daten
des Mosfets überprüfen muss. (idR wird man ohnehin lieber gleich einen
fertigen Treiberbaustein verwenden wollen)
Wer kein Datenblatt lesen kann oder will, der sollte sich gut überlegen,
ob er eine entsprechende Schaltung nicht lieber kaufen sollte als einen
Internet-Fund nachzubauen.
Ganz offensichtlich wurde hier ohnehin das Hauptaugenmerk auf die
Umsetzung des Messverfahrens gelegt als auf die hardwareseitige
Umsetzung.
Ein "Patzer" bei der Verwendung des Leistungsbauteils kann man ja gerne
mitteilen, um das zu diskutieren, aber es sollte doch möglich sein, das
in einem höflichen und konstruktiven Tonfall abzuhandeln.
Die beiden oben gezeigten Schaltbilder habe ich noch einmal
überarbeitet.
Bei der ersten Schaltung ist der N-Kanal MOSFET durch einen BTS462
ersetzt, der mit internen Schutzvorrichtungen Überstrom und
Übertemperatur überwacht. Ferner ist der Motor nun einseitig mit GND
beschaltet, wodurch seine EMK direkt GND-bezogen gemessen werden kann.
Der Spannungsteiler R1/R2 kann auf die maximale Betriebsspannung des
Motors ausgelegt werden und muß nicht mehr die max. Versorgungsspannung
berücksichtigen, um Übersteuerung des ADC zu vermeiden.
Für höhere Ströme kann ein stärkerer 'high-side'-Treiber verwendet
werden.
Bei der 2. Schaltung mit L6203 sind die Spannungsteiler bestehend aus
R6-R8 und R9-R11 ergänzt. Diese ermöglichen nun auch eine EMK-Messung
und damit Drehzahlregelung des Motors, wenn PB4 das notwendige
PWM-Signal erzeugt. Zur Messung werden die Pins PB0 und PB1 auf Eingang
geschaltet und per ADC ausgewertet. Die Drehzahlregelung arbeitet
bidirektional, sodaß die Potistellung Richtung und Drehzahl vorgeben
kann.
Inwieweit sich die ursprüngliche PWM-Erzeugung mit 16 kHz und die
EMK-Messung für leisen Motorlauf und schnelle Regelung kombinieren
lassen, muß noch ermittelt werden.
Lässt sich beim Atmega der ADC mit dem PWM Timer triggern? Wäre denke
ich in deinem Fall ganz praktisch, dass der ADC automatisch zur Offzeit
der PWM triggert.
Wenn der beginnende PWM-Zyklus den ADC starten würde, käme die Messung
zu spät.
Beim obigen Programm für den ATmega werden fortlaufend das Poti, sowie
die Spannung über dem Motor gemessen und zwischengespeichert. Bevor das
PWM-Signal wieder aktiviert wird, wird der Istwert der Motorspannung
gebildet. Würde man die Messung erst danach starten, würde der
(langsame) ADC u.U. die volle Betriebsspannung messen. Hier der
betreffende Programmteil:
if(pwm_cnt >= PWM_AUFLOESUNG){ // am Ende des PWM-Zyklus
pwm_cnt = 0; // neu beginnen
istwert = adc_plus - adc_minus; // Spannung am Motor ermitteln
adc_sync = 1; // Auswertung in main() starten
if(pwm_wert)
PORTC |= BIT(PWM_AUSGANG); // bei 0 nicht einschalten
}
Mit 'adc_sync' wird die neue Auswertung angefordert.
0804 schrieb:> Nachtrag: aber mit 16khz zwei Signale mittels eines ADCs> abzutasten wird> mit dem kleinen MC bei weitem nicht gehen, denke ich
Das ginge so oder so nicht, da auch hier die Ansteuerung abgeschaltet
werden muß, um die EMK zu messen. Nur würde hier nicht das
niederfrequente PWM-Signal moduliert werden, sondern das der
Hardware-PWM. Beispielsweise würde dann die 16 kHz PWM für 4 ms den
Motor ansteuern und für 1 ms würde die EMK gemessen werden. Ob man nun 1
ms braucht oder die Messung in 0,2 ms schafft hängt davon ab, wie
schnell man den Motor auf Generatorbetrieb bekommt.
Der Idealfall wäre ein separater Tachogenerator (kleiner Zusatzmotor)
der permanent eine zur Drehzahl proportionale Spannung erzeugt. Damit
könnte die Hardware-PWM voll durchlaufen und die Regelung wäre schnell
und unhörbar. Nachteilhaft dabei wäre der zusätzliche mechanische
Aufwand.
m.n. schrieb:> Das ginge so oder so nicht, da auch hier die Ansteuerung abgeschaltet> werden muß, um die EMK zu messen
Die Ansteuerung wird ja jeden PWM Zyklus kurz abgeschaltet solange man
nicht auf 100% PWM Duty geht.
Ich kenne es vom STM32 so, dass man die PWM zb. nie über 90% Duty
stellt.
Deshalb hat man pro PWM Zyklus ein "Fenster" von 10% wo das Signal Low
ist.
Genau an dieser Stelle wird der ADC getriggert damit er misst.
So wird nicht die volle Versorgungsspannung sondern nur die EMK des
Motors gemessen.
Bei 16kHz 16000Mal die Sekunde.
Beim STM32 sind die ADCs allerdings auch sehr schnell. Ein
STM32F4@168Mhz benötigt <1uS für ein ADC Sample.
Wie lange benötigt dein MC für ein ADC Sample? Ich kenne mich mit den
ATMegas leider nicht aus.
Wenn man weiß wie lange er braucht, kann man sich ausrechnen welche PWM
Frequenz maximal möglich ist und wieviel Duty man maximal fahren kann.
0804 schrieb:> Genau an dieser Stelle wird der ADC getriggert damit er misst.> So wird nicht die volle Versorgungsspannung sondern nur die EMK des> Motors gemessen.> Bei 16kHz 16000Mal die Sekunde.> Beim STM32 sind die ADCs allerdings auch sehr schnell. Ein> STM32F4@168Mhz benötigt <1uS für ein ADC Sample.
Ich könnte ja auch einen F4 nehmen, nur ist das einem Motor völlig egal
;-)
Angehängt sind zwei Bilder, die die Spannungen am Motor mit L6203 und
PWM am Enable-Eingang zeigen: jeweils 60% PWM einmal ohne Last und
einmal mit Last an der Motorachse. Der Triggerpunkt in der Mitte zeigt
das Abschalten der PWM. Danach muß die Freiwerdezeit des Motors
abgewartet werden, bevor die EMK als Differenz zwischen oberer und
unterer Kurve meßbar wird. Nach 800 µs beginnt ein neuer PWM-Zyklus.
Unter Last ist die Freiwerdezeit des Motors 'dummerweise' länger und die
Phase für die EMK-Messung kürzer. Wegen der geringeren Drehzahl ist auch
die EMK selbst verringert.
Wie man sieht, hilft ein schneller ADC hier garnicht. Man muß zunächst
die Freiwerdezeit kürzer bekommen, indem man den Motor nicht zu lange
aber ganz 'rabiat' kurzschließt.
Hallo,
ist es meist nicht ausreichend genau, nur den Strom zu messen.
https://de.wikipedia.org/wiki/Gleichstrommaschine#Mathematische_Grundlagen
Gleichung 1a
Ua = Ri*I + k* n ;
Spannung am Motor == Spannungsabfall durch den Strom am Innenwiderstand
+ Konstante*Drehzahl.
Ua ist ja durch die PWM einstellbar.I messbar.
Ra ist bestimmbar und k bestimmbar durch eine Strommessung im
Leerlaufversuch und Vertruene auf die Typschildangaben für maximale
Drehzahl und Spannung dabei.
Sonst eben Strommmessung,Spannungsmessung und Drehzahlmessung.
Wenn man k und Ri ( man kann auch alle Widerstände der Wege bis zur
Spannungsquelle mit reinpacken, stehen ja dem Motor nicht zur Verfügung
) kennt ist es nur eine leichte Formel.
k*n und Ri sollten konstant sein.Ua = U_PWM
Ua = Ri*I + k* n ; // k*n/Ri in eine Konstante packen
U_PWM = (I+ K)*Ri
wobei I der gemessener Strom - Leerlaufstrom ist, also der Strom, der
Leistung abgibt und nicht nur die innere Reibung überwindet.
In den Datenblättern zu Motoren steht doch einiges:
http://www.pollin.de/shop/dt/NTYzOTg2OTk-/Motoren/Gleichstrommotoren/Gleichstrommotor_JOHNSON_1397220469_13_V_.html
Alle Angaben bei U0 = 13 V.
LeerlaufStrom I0 = 1,09 A; Leerlaufdrehzahl n0 = 6229 U/min
Dynamischer Innenwiderstand Ri = 0,238 Ohm
Drehmomentkonstante: 18,491 mNm/A
DrehzahlSpannungsabhägigkeit 1/k = 479,154 (U/min)/V (n0/U0)
DrehzahlLastabhängigkeit : 6,291 (U/min) / mNm
in A umgerechnet:
DrehzahlLastabhängigkeit : 116,327 (U/min) / A
U_PWM = I*0,238 + n / 479,154
Beispiel für maximalen Wirkungsgrad bei 13 V, sollte 13V ergeben.
Last sei 122,54 mNm -> Strom = 122,54/18,491 = 6,627 A
Drehzahl sei 5458 U/min.-> Leerlaufspannung = 5458/479,9 = 11,39V
U_PWM = 6,627*0,238 +11,39 = 12,968 ~13 V ;-)
wenn die Last sich verdoppelt:
Strom = 2*(122,54/18,491) = 13,254 A
U_PWM = 13,254*0,238 +11,39 = 14,54 V
Bei höheren Drehzahlen und großen Lasten müsste dies Verfahren einfacher
sein.
Horst H. schrieb:> Bei höheren Drehzahlen und großen Lasten müsste dies Verfahren einfacher> sein.
Aber das ist doch der Punkt. Die EMK-Messung läßt kleinere Drehzahlen
und dynamische Lasten zu, die man von einer Strommessung von ganz
unterschiedlichen Motoren nicht erwarten kann. Mit
Drehzahlstabilisierung per Strommessung funktionieren ja die uralten
Antriebe z.B. für Tonbandgeräte. Aber da ist die Drehzahl konstant und
die Last nahezu auch.
Bei höheren Drehzahlen bietet sich auch ein Impulsgeber mit einfacher
Auflösung an, da Änderungen schnell erfaßt werden können und man die PWM
höherfrequent und ohne Unterbrechung betreiben könnte: leise!
Gerade bei niedrigen Drehzahlen kann die Auswertung der EMK punkten, da
diese entsprechnend der PWM-Frequenz einige 100 Istwerte/s liefern kann.
Auch liefert der Motor seine eigene Konstante Drehzahl/Spannung gleich
mit.
Ich habe hier mit einem Getriebemotor mit 2. freier Motorachse gespielt.
2 - 3 UPM direkt an der Motorachse einzustellen, sind kein Problem. Mit
den Fingern kann man sie nicht festhalten, da die PWM gnadenlos
nachgeregelt wird und die Drehzahl stabil hält.
Noch etwas: für die Drehzahlregelung mit einem L6203 sollte man einen >=
ATtiny24 verwenden. Hier hätte man auch die Option, einen höher
aufgelösten Drehzahlgeber auszuwerten: Timer1 Capture.