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.
Für eine konstruktive Diskussion bist Du mir einfach zu dumm!
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.
Nachtrag: aber mit 16khz zwei Signale mittels eines ADCs abzutasten wird mit dem kleinen MC bei weitem nicht gehen, denke ich.
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.
m.n. schrieb: > 2 - 3 UPM direkt an der Motorachse einzustellen, sind kein Problem. Korrektur: 2 - 3 Umdrehungen/s sind gemeint und auch langsam genug.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.