einfache DC-Motorsteuerung

Hallo zusammen,

Ich (arduino-newbie) möchte bei einen einfachen DC-Motor (1-Phase, 2A) die Drehzahl PWM lastunabhängig regeln. Als Umdrehungsreferenz-Taktgeber setze ich einen einfachen Hallsensor oder ein Lichtschranke auf der Welle ein.

  • H-Bridge L6205 (grösser Bruder vom L298)
  • Arduino-UNO
  • Sensor Hall oder LED

Ich hab versucht die richtigen sketchs zu finden, bin aber nicht ganz schlau geworden, was ich nun wirklich einsetzen soll.

Welche Libary (wenn es überhaupt eine braucht) soll (kann) ich einsetzen ? Es gibt da ja die servo.h und eventuell die AFMotor.h (wenn diese nicht nur mit dem Motor-Shield eingesetzt werden kann).

Wie soll ich diese Simple-Testumgebung am besten aufbauen ?

Gruss Pet

Servo.h ist bestenfalls für eine Motorsteuerung (ESC), die an einen normalen Empfänger angehängt werden kann und sich wie ein Servo verhält, geeignet.

Für die Ansteuerung mit der H-Bridge würde ich nach Arduino und L298 suchen. Da kommen auch Beiträge mit Beispielen wie diesem hier raus.

Korman

Ein praktisches Beispiel einer Motorsteuerung beschreibt dieses Tutorial:
http://itp.nyu.edu/physcomp/Labs/DCMotorControl

Der Zusatz mit dem Sensor muss dann aber noch zusätzlich realisiert werden.

Da du noch ein Newbie bist, empfehle ich dir dass du zuerst eine “einfache” Motorsteuerung, wie das Beispiel aufbaust. Wenn du die Schaltung und den Programmcode verstehst, kannst du noch die Erweiterung mit dem Sensor machen.
Bitte jetzt nicht einfachen fragen “wie mach ich das?”. :wink:

die beiden Beispiele habe ich bereits schon gesehen. Was ich nicht gefunden habe ist der Input für den Sensor, der die Drehzahl synchronisiern soll. damit diese konstant bleibt. das müsste doch ihrgend ein counter sein oder ?

pet

Hallo Pet Das mußt Du selbst programmieren. Die Ansteuerung der Motore sieht keine Sollgröße vor. Du mußt die Drehzahl messen und dementsprechend das PWM Signal regeln.

Um die Drehzahl zu messen kannst Du PulseIn verwenden. Sei DIr aber bewußt daß PulseIn wie Delay die Ausführung des Programms stoppt und erst nach erfolgter Messung das Programm weiter abarbeitet. http://arduino.cc/en/Reference/PulseIn

Grüße Uwe

Das ganze wird ne ziemlich harte Nuss für einen Einstiger, da das in den Bereich Regelungstechnik abdriftet. Da gibt es ja verschiedene Regler. Welcher davon für dein Vorhaben geeignet ist, lässt sich aufgrund mangelnder Informationen auch nicht sagen. Unter Umständen tut es ja auch ein vergleichsweise einfacher I-Regler. Schlimmstenfalls ist ein PID-Regler zu programmieren. Bevor Fragen aufkommen: selbst habe ich das noch nicht gemacht. Im "Exhibition"-Teil des Forums findet man jedoch einen selbstbalancierenden Roboter, der auf eine PID-Regelung setzt. eventuell kann man sich da was abschauen.

ok... dann sind wir ja nicht mehr bei der 'einfachen' Motorsteuerung :) Dann werde ich vielleicht doch auf einen Schrittmotor ausweichen.

Auf jeden Fall thanks für die Hinweise.

pet

Dann werde ich vielleicht doch auf einen Schrittmotor ausweichen.

Was willst du denn genau mit deinem Motor anstellen?

ich habe hier ein filmprojektor, den ich umbauen (steuern) möchte. da muss die drehzahl genau stimmen. also eigentlich keine grosse rechenleistung (... zumindest wie ich gedacht habe). aber eben nur eine konstante geschwindigkeit braucht es hier.

vielleicht gibts ja auch eine regelbare h-bridge, die dann über den arduino angesteuert werden kann. hab so was schon mal gesehen, finde den artikel aber nicht mehr. schrittmotor wäre dann einfach eine weitere option.

pet

Ich bin anfangs davon ausgegangen, dass mit stark wechselnden Drehmomenten zu rechnen ist. Spult man ein paar Filmrollen ab, bleibt die Last ja nahezu konstant. Im Normalfall sind das ja auch Getriebemotoren, die entsprechend untersetzt sind und damit ein hohes Drehmoment liefern können, ohne stark gebremst zu werden. Probier es doch erst mal ohne Regelung und stell die Drehzahl passend ein, bevor du dich an andere Antriebsmöglichkeiten wagst. :wink:

das hab ich bereits getestet. ich müsste einen sehr grossen motor nehmen um das absolut lastunabhängig zu bauen. eine filmspule 450mm/16mm hat, wenn sie ganz voll ist, einges mehr an energiebedarf, als wenn diese dann am schluss fast leer ist. auch die tonübertragung bedingt eine möglichst genaue lastunabhängige drehzahl. die besseren projektoren hatten genau für das früher auch teilweise rein analoge steuerungen. das müsste so vor etwa 20-30 jahren gewesen sein. arduino finde ich eine absulut geniales projekt (nicht nur um einen motor zu steuern) und 'nur' um einen motor zu regeln müsste das ding ja wohl auch von nutzen sein :)

pet

Die Spule die den Film aufrollt hat eine Drehzahl die von der Menge Film abhängt. Vmin zu Vmax ist normalerweise 1:4. Dies wird entweder mit einer Kupplung oder mit einem Motor gemacht der überdimensioniert ist und darum nicht kaputgeht wenn er ganz eingebremst wird, realisiert.

Die konstante Drehzahl des Films vor dem Tonabnehmer bzw das schrittweise Vorrücken des Films vor dem Bildfenster wird durch einen Redundanz-synchromotor oder Asynchronmotor bewerkstelligt. Diese Last ist konstant.

Da die Drehrichtung immer die gleiche ist brauchst Du keine H-Brücke sondern nur einen Transistor.

Grüße Uwe

Wie schnell kommen die Impulse von deinem Encoder daher oder wie schnell sollen sich die Spulen drehen? Wenn sich das in einem vernünftigen Rahmen abspielt, dann ist das nicht so kompliziert. Für einen Anfänger trotzdem eher anspruchsvoll, aber es sollte machbar sein. Wegen der Algorithmen für den Regelkreis kannst du mit den einfachen anfangen und dich nach Bedarf zu den komplizierten raufarbeiten, bis das Resultat gut genug ist.

Korman

Kann man DMOS und CMOS Bausteine beliebig in einer Schaltung miteinander vermischen ?

Währe es möglich beide Kanäle des L6205 so zu schalten das Sie gemeinsam einen Motor betreiben der dann mit 5.6 A versorgt werden könnte ?

L6205 APPLICATION NOTE: http://www.st.com/stonline/books/pdf/docs/9944.pdf

@uwefed der antrieb ist eine vorlaufrolle, die unmittelbar vor der filmbühne den film unabhängig von der spulenwicklung durchzieht. die last aber ändert sich, wenn der film sich abrollt. also muss der motor geregelt laufen. die sogenannte ueberlast ist nur die bremse, die dafür sorgt, dass der film nicht nachläuft. eine capstan-rolle übernimmt dann den absoluten glaichlauf, wie bei einem tonband.

@Korman die anzahl pulse kommt auf den geber(encoder) drauf an, den kann ich so einbauen, wie es für die umsetzung dann notwendig ist. aktuell habe ich einen motor mit 1200 u/min ein signal von 1-6 pulsen pro umdrehung sollte in etwa funktionieren.

@Megaionstorm das habe ich mir auch schon für den 298er überlegt ich weiss nicht ob man die parallel schalten darf.

pet

Vielleicht sollte ich das mit dem parallelschalten mal mit einem L293B ausprobieren. Der kostet nur 1/6 des L6205.

1200 rpm mit 6 Impulsen pro Umdrehung gibt etwa einen Impuls alle 8 ms maximal. Das klingt nicht so schlimm.

Ich würde die Impulsdauer mit einer simplen Interruptfunktion messen, die bei jedem Puls an Pin 2 oder 3 ausgelöst wird. In loop() hast du dann immer wie von magischer Hand die aktuelle Impulsdauer und du kannst gemütlich deinen Motor regeln. Bei der Interruptfunktion muß man nur auf ein paar Details achten, es ist aber nicht so kompliziert.

Korman

interrupts unterbrechen jedoch die applikation für die zähldauer.

würde ein counter ++ der die pulse zählt und ein setzen des timestamps mit micros() oder millis() auch gehen ? oder ist das zu ungenau ?

im prinzip von example currentTime = millis(); ... if (millis()-currentTime = 50 { ....

pet

Ja Pet, Du hast Recht, hab die erste Antriebsrolle Rolle vergessen. hab lange keinen 16mm Projektor von nahem mehr gesehen.

Die Ausgänge des L293B kannst Du nicht paralell schalten.

Ich verstehe noch nicht wieso Du den Motor in beide Richtungen drehen lassen willst. Der Film läuft nur in eine Richtung. Um einen Motor in eine Richtung laufen zu lassen genügt ein Transistor der zwischen Minuspol des Motors und Masse geschaltet ist. zB eine MOSFET IRF540.

Viele grüße Uwe

Naja, du kannst entweder Impulse zählen oder die Dauer der Impulse messen. Bei schnellen Impulsen ist zählen besser, bei langsamen messen. Mit maximal 120 Impulse pro Sekunde bist du schon im Bereich langsame Impulse, da dauert zählen bald zu lange bis du eine genaue Drehgeschwindigkeit bekommst. Messen ist da besser.

Wegen der Interrupts mußt du dir keine Sorgen machen, deine Interruptroutine belastet das System etwa genau so wenig wie die Aktualisierung von millis() wenn sie richtig geschrieben ist. Du bist auch sonst im sicheren Bereich, da es weder bei deiner Messung auf 8µs nicht ankommen sollte (das wäre ein maximaler Fehler von 0.1%) noch die Frequenz hoch genug ist damit Interrupts verloren gehen.

Korman