mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei einer Motoransteuerung


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe folgendes Problem:

Ich absolviere zur Zeit ein "Berufspraktisches Semester" in einer
kleineren Firma. Habe dort bereits die geforderte Hardware entwickelt
und aufgebaut. Nun soll ich in C ein Programm zur Motoransteuerung
schreiben und darin bin ich sozusagen Anfänger! Das Problem bei der
Sache ist, dass es bei der kleinen Firma nur einen Mitarbeiter gibt der
darauf spezialisiert ist. Der ist aber zur Zeit krank und danach ist er
ne ganze Weile in Urlaub. Ich hoffe, dass ihr mir helfen könnt!

Nun zu der genaueren Aufgabenbeschreibung:

Das Programm soll nicht so kompliziert, sondern leicht und knackig
sein!
Ich habe auf meiner Platine einen PIC18F458. Dieser steuert den DC
Motor und fährt ihn in die gewünschte Position. Damit ist gemeint, dass
ich einen Winkel oder einen ähnlichen Wert für -45° bis +45° vorgebe
und er dann in die entsprechende Position fährt. Der Motor soll aber
einfach nur über eine Puls Weiten Modulation (PWM) gesteuert werden.
Das bedeutet, dass auf einen PID Regler verzichtet werden soll, was das
Programm vereinfachen sollte! Um den Motor in die richtige Position zu
bringen, ist dann quasi ein ständiger und schneller Soll- Istwert
Vergleich nötig. Ein Hall- Sensor überwacht das ganze und gibt mir
quasi den Winkel als analoge Spannung bzw. Istwert wieder. Die
Skalierung ist so gwählt, dass 0,05V=1° entsprechen. Das heißt, dass
bei 0,25V -45° anliegen, bei 2,5V 0° und bei 4,75V +45° anliegen.
Der Motor steht in der "richtigen" Position, wenn der
Unterschied zwischen Soll- und Istwert logischerweise ziemlich gering
ist. Soweit erst einmal zur Aufgabenstellung, ich hoffe das es
einigermaßen klar ist!

Ich hoffe ihr habt ein paar Starttips und Anregungen für mich, wie das
programmiert werden muss und wie ich die Thematik umsetzen kann!

Vielen Dank im Vorraus!

Mfg

Basti

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm soll nicht so kompliziert, sondern leicht und knackig
sein!

Verstehe ich nicht: soll das Programm knacken oder der Motor ?

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Basti,

prinzipiell würde ich wie folgt vorgehen:

- Eingabe der anzufahrenden Position (Taster  Schnitstelle 
whatever)

- Ermitteln der Aktuellen Position (Mittels A/D Wandler Spannung in
Winkel umrechenen)

- Ermitteln der "Fahrtrichtung" also ob nach links bzw. Rechts
gedreht werden soll.

- Anfahren der eingegebenen Position mit ständiger Kontrolle der
aktuellen Position wenn eingegebene Position erreicht Motor aus. ggf
Position noch nachkorrigieren.

Das ganze noch in C umsetzten und gut is ;-)

Gruß Jochen

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jochen,

vielen Dank für die ersten Anregungen, aber gerade das Umsetzen
in C ist mein Hauptproblem!

Gruß

Basti

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

mit leicht und knackig ist lediglich das Programm gemeint.
Soll heißen, dass es kurz und bündig sein soll!

Gruß Basti

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Basti,

was heißt Hauptproblem in diesem Zusammenhang? Hast Du
Programmiererfahrung in C? Weißt du wie der verwendete Mikrocontroller
funktioniert.

Beschreibe mal etwas genauer was Du wissen willst bzw. was Dein Problem
ist.

Mein Kristallkugel ist heute leider nicht sehr gesprächig ;-)

Grüßle der Jochen

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jochen,

das heißt, dass ich keine Programmiererfahrung in C habe und mich da
jetzt irgendwie durchwursteln muss! Was dem Nikrocontroller betrifft,
so habe ich mir ein ausführliches Datenblatt auf der Homepage von
Microchip  heruntergeladen. Wenn es dich interessiert, dann geh einfach
auf die Hompage und gib bei Suche PIC18F458 ein und dann bekommst du
den Link fürs Datenblatt.
Mein Problem ist, dass ich wegen der Unerfahrung gar keinen
programmiertechnischen Ansatz habe. Die Theorie, wie du es oben auch
schon vorgeschlagen hast, ist nicht das Problem. Aber wie zu Hölle
setze ich das mit C um?

Gruß Basti

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Basti,

da wirst Du wohl nicht drumrummkommen dich ein bisschen mit dem
Controler und zu zu beschäftigen. Da ich selber nix mit den PICs mache
sondern mit AVRs kann ich Dir da jetzt auch keine Details geben.

Soweit ich das aus Deinem Posting oben ablese sin den uC Kenntnisse
auch auf das Datenblatt beschränkt ;-)

Daher solltest du Dich mit dem ansteuern der I/Os vertraut machen,
sowohl in als auch aus dem uC. (Sprich die üblen LED / Testerversuche)

Dann solltest Du dich mal mit dem einlesen von analog Werten vertraut
machen. (im PIC wenn der einen A/D Wandler hat oder mit externem
A/D-Wandler)

Und zu guter letzt muss Du dich noch mit Timern auseinandersetzen um
ein vernünftiges PWM Signal zu erzeugen.

Zu all disen Themen finden man im Internet einige Informationen.

Variante B ist Du findest jemanden der das für Dich macht.

Interesannt wäre noch zu wissen ob es da schon eine vorhandene SW gibt
und was die bis dato kann bzw. was man davon weiter verwenden kann.

Fakt ist eben das wenn du wender von C programmieren noch von uC
einigermassen ein Ahnung hast das ganze nicht einfach so zu machen ist.


Musst Dir eben entweder das fehlede Wissen, und das ist erst mal nicht
wenig, aneignen oder jemand anderen finden der das macht.

Grüßle Jochen

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jochen,

ganz so düster wie du jetzt geschrieben hast sieht es nicht aus! Bin
zur Zeit ja auch dabei mich in die Thematik einzulesen. Zum PIC kann
ich dir sagen, dass er über A/S Wandler verfügt. Aktuell bin ich setze
ich mich mit den Timern auseinander. Sind das nur drei Eckpfeiler oder
kann mit den drei Dingen die du beschrieben hast das Programm
erstellen?
Variante B ist sicher ne gute Lösung, aber ich will da voll dahinter
steigen und bin auch hoch motiviert!

Gruß Basti

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Basti,

also ich dene mit den drei Sachen solltes Du schon recht weit kommen.
A/D Wandler zum einlesen des Sensorergebnisses, I/Os und Timer für das
erzeugen des PWM-Signal und die Regelung muss dann halt noch in C
Programmiert werden.

Wie gesagt, es hängt halt auch davon hab ob schon was vorhanden ist was
Du weiter verwenden kannst (Ansteuer-Routine für den Motor).

Viel Erfolg und Spaß auf jeden Fall schon mal, Jochwen

Autor: Gottfried Bremer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie wird mir aus deinen Anforderungen nicht ganz klar, wozu du PWM
brauchst. Wenn du die Position des Motors messen kannst (wie
beschrieben), kann der sich doch einfach mit
Maximalgeschwindigkeit(einfach ein Digitales Signal auf "AN") in
Richtung der Soll-Position bewegen(wenn der Motor über der
Soll-Position steht, ergibt sich das Anhalten bei der extremen Rate,
mit der ein moderner µC(deinen PIC kenne ich im einzelnen nicht.) das
überprüfen kann, schon von selbst.).

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gottfried,

das ist das vorgeschriebene Anforderungsprofil. Die Firma möchte das so
umgesetzt haben. Auf meiner Platine befindet sich eine Leistungsbrücke,
die durch das PWM-Signal diagonal angesteuert wird. Diese Brücke soll
dient mur auch als elektronische Kurzschlussbremse.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gottfied,

hab deinen Vorschlag hier in der Firma vorgestellt und mit den
entsprechenden Personen darüber diskutiert. Somit wurde das Thema PWM
nun erst einmal bei Seite gelegt!
So wie ich dich verstanden habe, kann ich das jetzt einfach mit einem
Timer realisieren. Ich steuere den Motor quasi über die Transistoren-
Schaltung. Wenn dann ein High Signal anliegt, dann soll sich der Motor
bewegen und bei Low logischerweise stehen. Die Frequenz, die durch den
Timer verursacht wird steurt den Motor über dessen Induktivität, oder
wie ist die genaue Funktionsweise bei dieser Steuerung? Wie ist es dann
mit der Rechts- bzw. Linksdrehung des Motors? Es ist aber doch nicht
ratsam den Motor mit Maximalgeschwindigkeit zu bewegen, da ich doch so
bestimmt Überschwinger erhalte und die gewünschte Position nicht genau
erreiche, oder wie sieht das bei diesem Prinzip mit der Genauigkeit
aus? Wäre super, wenn du weitere Ideen oder Anregungen für mich hast.

Gruß Basti

Autor: Gottfried Bremer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Basti
Bei dem Motor handelt es sich um einen Gleichstrommotor, nehme ich
an(der Typ wurde im ganzen Thread nicht explizit genannt.)?
Die Links-Rechts-Drehung lässt sich über 4 Transistoren, die mit 2
Kanälen(einer low und anderer High ist eine Richtung, andersrum die
andere und beide low heisst Stillstand. Beide High sollte die Software
vermeiden, da dies zu einem Kurzschluss führt) des µControllers
angesteuert wird, bewerkstelligen(ein Schaltplan liegt diesem Posting
bei). Die Transistortypen und Widerstände sind nur mal exemplarisch
eingesetzt (je 2mal PNP und NPN der gewünschten Leistung halt).
Sollten zwei Leitungen nicht möglich sein, wird die Schaltung etwas
komplizierter. Dann kann man (entweder ein moduliertes Signal erzeugen
oder) über einen Spannungsteiler(und zwei Ports des µC) Pegel von
-5V,0V und +5V für Links,Stillstand und Rechts übermitteln(braucht dann
für die Motoransteuerung aber 6 Transistoren).
Das Problem mit den Überschwingern ist bei ausreichender Abfragerate
i.d.R. nicht so schlimm, da die Betriebsspannung beim Pendeln über der
Zielstelle so schnell umschaltet, dass der Motor automatisch langsamer
wird (wenn der Motor natürlich einen Zeichenarm oder sowas steuert,
könnte das hässlich werden. Soll er einfach so schnell wie möglich an
der Zielposition anhalten, geht das aber mindestens genausoschnell, wie
schon vorher die Ansteuerrate verringern.).

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gottfried,

du hast das alles richtig erkannt und die Tranistorschaltung habe ich
bereits so ähnlich realisiert! Du sagst ja, dass bei ausreichender
Abfragerate die Überschwinger nicht so schlimm sind, heißt das, dass
ich keinen PID Regler programmieren muss? Wenn ich dich richtig
verstanden habe, dann brauche ich nur die richtige Abfragerate
bestimmen und programmieren und wenn ich dann ne Winkelvorgabe mache
fährt er in die gewünschte Position, richtig??? Wie bestimme ich die
geeignete Abfragerate? Was letztendlich irgendwann einmal als Last an
dem Motor hängt kann ich nicht sagen und interessiert mich im Moment an
diesem Punkt überhaupt nicht. Meine Aufgabe ist dann beendet hier, wenn
der Motor ordnungsgemäß die gewünschte Position erreicht. Zum Testen
und Vorführen wird natürlich ein kleiner Zeiger am Motor hängen, aber
sollte sich meiner Meinung nach nicht groß auswirken oder? Der Motor
(übrigens ein Maxon RE-max 24 10W/ 36V) soll einfach möglichst genau in
die Vorgegebene Position fahren und fertig! Ich kann mir schon
vorstellen, dass das ganze so funktioniert wenn eine längere
Winkelstrecke zu fahren ist. Aber klappt das auch bei kleinen Strecken,
z.B. dann von 5° auf 6°. Ist das Verfahren dann auch noch genau, denn
auf die kurze Strecke wird er wohl kaum die Maxgeschwindigkeit
erreichen oder?

Autor: Gottfried Bremer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gut die Empfindlichkeit im einzelnen wird, kann ich nicht sagen
(hängt eben von Motor, Last, Genauigkeit des Sensors usw. ab). Wenn bei
kleinen Strecken die Maximalgschwindigkeit nicht erreicht wird, ist das
doch um so besser(Überschwingen). Da du über den Hallsensor eine
Rückkopplung hast, brauchst du die Geschwindigkeit ja auch nicht zu
kennen. Wahrscheinlich musst du auch noch eine Art Toleranz(die
mindestens so groß ist wie die des Sensors) einstellen, damit du nicht
permanent über dem Zielpunkt schwankst.
Sollte doch etwas überschwingen, kannst du auch noch eine Regelung der
Art
If (Timer mod Abstand)=0 then motor=aus
einbauen. Eventuell brauchst du noch einen Vorteiler für den
Abstand(bei Abstand=1 steht er schon ganz, bei Abstand=0 darfst
natürlich nicht dividieren.). Dann erreichst du bei einem schnell
laufenden Timer(ob kHZ oder MHZ ist bei der Trägheit des Motors wohl
egal), dass die Einschalt-Phase immer kürzer(also der Motor langsamer)
wird, je näher du dem Ziel kommst (das macht das Hardware-PWM im
Prinzip auch.).

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sehe ich genauso! Das wesentliche ist also das ständige Einlesen
meines Signals vom A/D Wandler über einen A/D Port. Dieser Wert muss
dann ständig mit dem Sollwert verglichen werden und der Motor dreht so
lange bis der Wert erreicht ist. Das sollte für den ersten Schuss erst
einmal ausreichen oder? Wie das letztendlich mit der Genauigkeit ist
muss man dann sehen, oder?

Autor: Thomas V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
die Aufgabe mit PWM zu lösen ist gar nicht so abwegig.
So arbeiten nämlich viele CNC-Maschinen und SMD-Bestückungs-
automaten. Bei einem Tastverhältnis von 50% steht der Motor
still und hält die Last mit seiner vollen Kraft. Sobald sich
das Tastverhältnis ändert, dreht der Motor in die eine oder
andere Richtung. Je nach Tastverhältnis schneller oder
langsamer. Das scheint recht verschwenderisch, wenn der Motor
ständig Leistung aufnimmt, man spart sich jedoch die Bremse im
Stillstand. Das ganze nennt sich dann Servoantrieb, kann man
das statt mit µC natürlich auch analog machen. Habe mal eine
Leiterplatten-Bohrmaschine mit 5 Spindeln repariert. Da wurde
diese Technik für x- und y-Antrieb eingesetzt.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis Thomas, aber ich werde erst einmal bei dem anderen
Lösungsvorschlag bleiben. Ich denke, dass dieser schneller zu
realisieren ist und der Zeitfaktor spielt mittlerweile eine große
Rolle!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.