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
Das Programm soll nicht so kompliziert, sondern leicht und knackig sein! Verstehe ich nicht: soll das Programm knacken oder der Motor ?
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
Hallo Jochen, vielen Dank für die ersten Anregungen, aber gerade das Umsetzen in C ist mein Hauptproblem! Gruß Basti
Hallo Michael, mit leicht und knackig ist lediglich das Programm gemeint. Soll heißen, dass es kurz und bündig sein soll! Gruß Basti
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
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
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
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
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
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.).
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.
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
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.).
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?
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.).
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?
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.
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!
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.