Forum: Projekte & Code Drehzahlregler für DC-Motor, ATmega48-328


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Toralf W. (willi)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

Gut, das müßte ich mal bei Gelegenheit probieren.

von Toralf W. (willi)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

Für eine konstruktive Diskussion bist Du mir einfach zu dumm!

von Kaktusbombe (Gast)


Lesenswert?

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.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von 0804 (Gast)


Lesenswert?

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.

von 0804 (Gast)


Lesenswert?

Nachtrag: aber mit 16khz zwei Signale mittels eines ADCs abzutasten wird 
mit dem kleinen MC bei weitem nicht gehen, denke ich.

von m.n. (Gast)


Lesenswert?

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.

von 0804 (Gast)


Lesenswert?

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.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Horst H. (horha)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.