Moin Leute, bin ein absoluter neuling auf dem Gebiet der Microcontroller, also bitte verzeiht mit meine Uniwssenheit :-) Für ein Projekt muss ich eine 128 Kanel PWM Schrittmotorsteuerung bauen. Dabei soll alle 15 mikrosekunden der Zustand aller 128 Kanäle neu gesetzt werden ( ein / aua ). Meine erste Überlegung war folgende: Eine Art USB-Relais Karte ( eigentlich nur eine USB auf 8 Bit parallel Karte), und dann mit Demuxen und FlipFlops das Signal auf 128 Kanäle aufteilen und speichern. Das Problem liegt aber in dem Fall dort, dass das ganze vermutlich zu langsam wäre, zumal mehrere dieser Schnittstellen wiederrum an einen PC sollen .... BESSERE LÖSUNG: Per LAN werden Microcontroller mit dem PC Verbunden, die jeweils 128 Kanäle Steuern. Man schickt dann über das Netzwerk nur einen Befehl, wie "stark" einer der Motoren angesteuert werden soll, und der Microcontroller kümmert sich darum, wann er dann letztendlich Impulse setzt. Das sieht dann wie folgt aus: Der Mikroconrtoller gibt über einen seriallen Port einfach eine Reihe NULLEN und EINSEN aus. Eine zusätzliche Schaltung legt die aktuelle anliegende 0/1 auf den Flip Flop der zu einem Motor x gehört. Dann zählt die Schaltung hoch, und legt den Wert am Seriell Port auf den Motor x +1, x+2 ...., bis alle 128 Motoren ein / aus geschaltet sind, Dann beginnt das Ganze von vorne und läuft immer wieder durch Meine Frage: Könnte das so klappen? wo sind nach eurer Sicht die Probleme, und vor allem WAS FÜR BAUTEILE KANN ICH NEHMEN ? Die Frequenz würde bei ca. 8,5 MHZ liegen. Das ist verdammt viel finde ich. Könnte man das ganze auch über den USB Port eines Microcontrollers realisieren, der ist ja auch seriell, aber schneller !?? Vielen Dank im Voraus
Ich hab deine Flip-Flop Lösung nicht verstanden, kannst du da mal einen Schaltplan zeichnen? Und was meinst du mit einer "128 Kanel PWM Schrittmotorsteuerung"? Zum Schluss noch die Frage wie du auf 8,5 MHZ kommst.
Hab mal eine einfach Schema Zeichnung angehängt: - Der Miktocontroller gibt einen einfachen seriallen Bit Stream aus. ( USB oder RS232 ) - Der Impulszähler ( wird später vermutlich im Microcontroller selber sein) gibt den Impuls wann die Zählschaltung hochzählen und durchschalten soll - Die Zählschaltung zählt immer wieder von 1 bis 128, und legt das Eingangssignal dass sie vom Mikrocontroller bekommt an den entsprechenden Motor (1-128). - Die Flip Flops speichern für jeden Motor ob dieser an oder aus ist, bis der nächste Impuls kommt. ( Selbstverständlich wäre noch ein Schalt-Trsnsistor hinter dem Flip Flop .... ) :-) Achso, die 8,5 MHZ: Alle 15 Mikrosekunden alle 128 Motoren -> 8,5 Mio Schaltvorgänge pro Sekunde insgesamt ...
> ( ein / aua ) Diese beiden Signalzustände sind mir bekannt... :-D > Eine Art USB-Relais Karte... ... wird garantiert nicht in 15us aktualisiert werden können :-o Sieh dir mal die Taktzeiten (Timeslots) von USB an. Da bist du im ms-Bereich... 128 Schrittmotoren mit 1 uC alle 15 us aktualisieren zu können ist eine sehr anspruchsvolle Aufgabe...
Vielleicht sollte ich auf 64 Bit reduzieren ? Wären dann "nur" 4 MHZ, aber das würde vielleicht helfen ? Kennte ihr Firmen die sowas zuverlässig nach Auftrag bauen ? Vielen Dank!
Wie steuerst du mit einem Flipflop einen Schrittmotor an? Oder ist das doch nur ein "normaler" DC Motor der per PWM gesteuert werden soll?
> Vielleicht sollte ich auf 64 Bit reduzieren ? Wären dann "nur" 4 MHZ, > aber das würde vielleicht helfen ? Dein Problem ist nicht irgendeine Taktfrequenz. Nein, das liegt woanders... Zeichne mal auf, welche Anschlüsse ein Schrittmotor hat, und welche Signale du zum Ansteuern dieser Anschlüsse brauchst. Dann kommst du mit 128 Schrittmotoren auf mindestens 256 Signale (Richtung+Takt) oder noch mehr, wenn du die Spulen direkt ansteuern willst. Und wenn du das hast, sieh dir die angesprochenen Schnittstellen an, wie dort mit welcher Datenrate Informationen übertragen werden (können). Dann siehst du schnell, dass irgendein "intelligenter" Verwalter für den Datenstrom und die Pufferung nötig ist.
Bei 128 Motoren kommen schon ganz ordentliche Ströme zusammen, die Deinen Mikrocontroller beträchtlich stören können. Wie sieht denn Dein Spannungsversorgungs-Konzept aus? Sind galvanische Trennungen vorgesehen? (Einige Blockkondensatoren wild verteilt reichen hier mit Sicherheit nicht aus.)
Danke erstmal für die vielen Antworten: - @ Gast (Gast):Ja, sorry, es sind eigentlich nur normale Motoren die PWM gesteuert werden! Sorry, wie gesagt, allgemein etwas unbewandert auf dem Gebiet ... - @Lothar Miller und Jörg S.: Damit hätte euer Einwand dann auch erledigt, sorry sorry, sorry !!! Sind normale Motoren mit 2 Pins. Jeweils ca. 4 - 8 Watt wobei niemals alle auf einmal laufen. Maximal vielleicht ca. 15% der Motoren laufen auf einmal ... Ich denke wir werden ein vernünftiges 300 - 400 Watt Netzteil verwenden, und dann per Software die Anzahl der gleichzeitig aktivierten Motoren begrenzen ... Gibt es eine Möglichkeit meinen Ersten Beitrag zu editieren, damit nicht jeder die Falsche Problemstellung mitbekommt ?
Also ein Kunstprojekt? Eine Installation, wo sich alle möglichen Teile drehen/bewegen?
Sowas in der Art, ich darf leider nicht genau sagen worum es geht. Ist für die Uni, und wenn ich es ausplauder und jemand anderes ließt es, bekommt ich ganz gehörig eine drüber ... Ist nicht böse euch gegenüber gemeint, zumal es nichts Weltbewegendes ist :-) Aber mal angenommen ich versuche nun diese 128 Kanäle alle 15 mikrosekunden zu aktualisieren, dann ergäbe sich eine Rate von ca 8,5 Mbit oder ?! Das müsste doch mit USB 2.0 ( Full Speed sind ja schon 12 MBit ) machbar sein. Vielleicht auch einfach mit einem Extra PC ? Da wir ja mehrere dieser 128 Kanal Karten benötigen wäre es vielleicht flexibler das ganze direkt an einen PC zu machen. Damit erspart man sich die Programmierung der Mikrocontroller ... ??? Vielen Dank nochmal für euere Geduld und das schnelle Feedback!
Versuch doch erst mal 1 (in Worten: einen) Motor zum laufen zu kriegen. Dann 2. Und dann reden wir mal über 10. Und wenn du die dann im Griff hast, gehts es an 128. > Moin Leute, bin ein absoluter neuling auf dem Gebiet der > Microcontroller, also bitte verzeiht mit meine Uniwssenheit Immer das Gleiche. Keine Grundlagen aber zum Mond fliegen wollen.
Mit SPI kannst Du locker mit 10 MBit/s Daten in eine Flip-Flop-Kette schieben und dann noch pro Flip-Flop ein Latch-Enable um die neuen Daten über Output-Lachtes ausgeben. Kann mit IC's Diskret aufgebaut werden, eleganter und vernüftiger ist, das ganze in ein CPLD zu packen...
Hallo Florian, ich würde mich der Sache annehmen,aber deine Infos sind noch viel zu dürftig. Bin erreichbar unter Raich Punkt Geraetebau at aon Punkt at. Grüße
> Immer das Gleiche. > Keine Grundlagen aber zum Mond fliegen wollen. Jo, genau wie damals, und da hats auch funktioniert :-) Ne, mal im ernst, wie ist dein Post genau gemeint ? Was soll ich genau in Worten erklären ?
Florian Schwarz schrieb: >> Immer das Gleiche. >> Keine Grundlagen aber zum Mond fliegen wollen. > Jo, genau wie damals, und da hats auch funktioniert :-) Irrtum. Die Leute hatten Grundlagen. Die haben sie sich in den 20 Jahren davor erarbeitet. Sie haben klein angefangen und sich dann hochgearbeitet.
Hallo Florian! Es scheint so zu sein, daß du 128 DC Motoren unabhängig voneinander steuern willst.Gut. Sollen die jetzt auf Position fahren, oder ist nur die Drehzahl interessant? Deine 15us Takt kommen mir etwas seltsam vor, in dieser Zeit dreht sich die Achse eines Motors vermutich im milli-Grad Bereich. Grüße
- @Peter (Gast): Das klingt ja schonmal gut. Wie ich die Logikschaltung im Endeffekt realisiere ist mir persönlich egal, wenn das mit CPLDs besser geht, dann wirds so gemacht. Danke für den Anstoß, werde mich diesbezüglich mal einlesen - @geb (Gast): Danke für das Angebot, werde dir vermutlich im Laufe der nächsten Tage mal mailen ... - @ Jörg S.: Prinzipiell sind mir alle Mittel recht, die zum Ziel führen :-) Danke für Vorschlag, ich lese mir jetzt erstmal durch, was genau man mit diesen DMX Karten machen kann
>> Immer das Gleiche. >> Keine Grundlagen aber zum Mond fliegen wollen. >Jo, genau wie damals, und da hats auch funktioniert :-) Aber erst als dutzende Raketen abgestuerzt und explodiert sind. Und die haben nicht gerade mit der Saturn 5 angefangen sondern mit der V2.
Florian Schwarz schrieb: > - @Peter (Gast): Das klingt ja schonmal gut. Wie ich die Logikschaltung > im Endeffekt realisiere ist mir persönlich egal, wenn das mit CPLDs > besser geht, dann wirds so gemacht. Danke für den Anstoß, werde mich > diesbezüglich mal einlesen CPLD schrieb ich schon frueher. Wenn das lesen nichtmal ganz klappt... :D
Hi Leute, ich komme euch kaum mehr hinterher mit dem Posten, ich werde nun erstmal eine Post verfassen, indem ich nochmal die Anforderungen zusammenfasse, um wieder mehr Überblick rein zu bringen ... Sorry, das Chaos ist wohl das Produkt meiner ungenauen und falschen Fragestellung :-) Gebt mir ein paar Minuten ...
Mit 8.5MBit kannst Du nur Ein/Ausschalten, nix mit PWM. Wenn PWM, dann kommt's auf die Auflösung drauf an, bei einer Auflösung von nur 16 Schritten wären das: 66.7kHz Updaterate x 128 Kanäle x 16 Schritte ~ 17 MByte/s, die wollen erstmal erzeugt und übertragen werden.
Florian Schwarz schrieb: > nun erstmal eine Post verfassen, indem ich nochmal die Anforderungen > zusammenfasse, um wieder mehr Überblick rein zu bringen ... Das ist eine gute Idee. Beschreibe aber fürs erste nur deine Anforderungen auf hoher Ebene. Also: welche Motoren willst du steuern (Typ). Was müssen die tun können. Wie schnell muss ein einzelner Motor reagieren können. Wie genau müssen Drehzahlen etc. eingehalten werden, etc ... Verzichte fürs erste darauf irgendwelche Ideen einzubringen, wie man das alles realisiern könnte. Zuerst muss klar sein, was eigentlich die Aufgabenstellung ist und welche Rahmenparamter gelten.
Anforderung: Wir haben 128 Motoren die wir per PWM ( PWM bedeutet doch Pulsweiten Modulation, also die Zeit die man ein / ausschaltet oder ?!? ) gleichzeitig, aber absolut unabhängig steuern möchten. Interessant ist nur die Leistung an jedem Motor. Es muss keine Position eingelesen werden. Welche Motoren wir genau verwenden wissen wir noch nicht genau. Jeder Motor hat ca. 4-8 Watt Leistung bei ca. 12-28 Volt Gleichspannung. Alle Motoren müssen ca. alle 15 Mikrosekunden aktualisiert ( Ein / Ausgeschaltet ) werden. ( Die genauen Drehzahlen die im Endeffekt anliegen müssen kenne ich selber nicht, ein Kollege hat mir nur die 15 Mikrosekunden Aktualiserungsrate vorgegeben ) Eine Grundlegende Idee habe ich in der Zeichnung im Anhang. Die Erläuterung dazu ist folgende: --- Mikrocontroller / PC: Ob nun ein Mikrocontroller oder einfach ein PC verwendet werden soll weiß ich noch nicht. Wenn man mal ausrechnet kommt man auf eine reine Bitrate von ca. 8,5 MBit um alle Motoren im 15 Mikrosekunden Takt ein/aus zu schalten. Die einfache RS232 Schnittstelle ist dafür vermutlich zu langsam. Daher tendiere ich zu USB. DAS SYSTEM MUSS ABER AUSBAUFÄHG SEIN, AM ENDE WERDEN VIELLEICHT 4 DIESER 128 KANAL KARTEN GLEICHZEITIG BETRIEBEN. Man könnte nun einen Mikrocontroller mit einem USB Ausgang auf jeder 128 Kanal Karte verwenden, und diesen per Netzwerk mit dem PC Kommunizieren lassen. Lieber wäre mir aber, wenn man sich den Mikrocontroller sparen könnte, und das ganze per USB direkt an einen PC machen könnte. Der Vorteil läge dort, dass man sich die Kosten für mehrere Mikrocontroller spart ( PCs haben wir genug :-) und die Programmierung einfacher ( bzw konfortabler) wäre. Die Software die am Ende die Motoren betreibt, soll per Netzwerk nur einfach Befehle senden, in den steht: "Betreibe Motor X mit Leistung Y". Der Microcontroller / PC soll sich dann darum kümmern, wann welcher Motor genau eingeschaltet wird. --- Adressierung der Motoren: Natürlich muss man wissen welcher Motor nun gerade gesteuert werden soll. Hierzu würde ich gerne eine Logikschaltung aufbauen, die bei jedem Takt das BIT welches am Eingang anliegt nimmt, auf den Motor X durchschaltet. Dann zählt die Schaltung hoch, und schaltet das nächste Bit an den nächsten Motor weiter. Bis zur nächsten "Runde" muss diese Bit natürlich gespeichert werden, sowas sollte mit einem Flip Flop gehen. Hinter dem Flip Flop wäre dann noch ein Transistor, der dann endgültig den Motor schaltet. Die eigentliche Logikschaltung kann man offensichtlich mit CPLDs realisieren. --- Fragen: Wo seht ihr die Probleme ? Ich vermute dass die eigentliche serielle Ausgabe des Bitstroms per USB garnicht sooo wild ist, aber die Logikschaltung zur Adressierung muss mitkommen, und das ganze muss irgendwie synchronisiert werden. Meint ihr es wäre möglich das direkt per USB an einen PC zu packen, oder vermutet ihr, es wäre doch besser einen Mikrocontroller zwischen zu schalten ? MWS schrieb: > Mit 8.5MBit kannst Du nur Ein/Ausschalten, nix mit PWM. Genau das ist dass, was ich vorhabe. Sorry ist das nicht PWM ? Die Software regelt wie lange ein Motor an ist, und wie lange er aus ist. Daraus ergibt sich approximiert die Leistung > Verzichte fürs erste darauf irgendwelche Ideen einzubringen, wie man das > alles realisiern könnte. Zuerst muss klar sein, was eigentlich die > Aufgabenstellung ist und welche Rahmenparamter gelten. Zu spät :-) sorry, war schon kräftig am schreiben ... Hab ich erst nachher gesehen
MWS schrieb: >> Mit 8.5MBit kannst Du nur Ein/Ausschalten, nix mit PWM. >Genau das ist dass, was ich vorhabe. Sorry ist das nicht PWM ? Die >Software regelt wie lange ein Motor an ist, und wie lange er aus ist. >Daraus ergibt sich approximiert die Leistung Vielleicht solltest du dir erst ansehen, was PWM bedeutet. Ich lehne mich mal weit aus dem Fenster und versuche mal darzustellen wie ich deine Aufgabenstellung verstehe: Du willst nicht alle 15 us die Leistung der Motoren ändern, sondern nur eine PWM mit einer Periodendauer von 15 us erreichen. Das verringert den Aufwand erheblich.
Kürzeste Verzögerungszeit von USB ist 2ms. Dazu kommen noch Softwarebuffer, Wartebuffer und die Übertragungszeit. Damit sind 15µs nicht zu schaffen. Auch mit einer reinen rs232 Schnittstelle sind 15µs seeehr knapp. Schließlich entspricht 1MBit bei 15µs nur 15 Flankenwechseln, also ungefähr 1byte. Deine Anforderung / Aufgabenstellung ist also so nicht zu erfüllen. Wahrscheinlich hast du deinen Kollegen falsch verstanden und dieser hat sich auf die PWM Frequenz bezogen. Das wären immer noch sehr hohe 66kHz. Ich tippe auf f_PWM ~20kHz. Dann entweder Software/ Hardware PWM (+ AND Gatter zum auswählen der aktiven Motoren) oder FPGA. Wenn du die weniger als 128Motoren/Modul wählst ist alles viel einfacher.
> Ich vermute dass die eigentliche serielle > Ausgabe des Bitstroms per USB garnicht sooo wild ist Nur kann USB eben keinen kontinuierlichen Datenstrom übertragen... Sinvoller wäre eine Dezentralisierung und eine Teilung der Aufgaben: Ein uC steuert z.B. 8 Motoren an. Das kann er mit seinen eingebauten PWM-Kanälen. Etliche dieser 8er-Gruppen sind über SIO oder SPI mit einem Master verbunden, der jetzt nur noch die aktuellen Geschwindigkeiten an diese Motor-Controller sendet. Dieser Master-Controller bekommt Informationen vom PC via USB. Und hier ist die Datenrate so gering, dass auch ein kurzer Aussetzer (10ms sind bei Windows immer drin) nichts weltbewegendes mehr ausmacht. Denn die eigentliche zeitkritische PWM-Erzeugung läuft in Hardware, keiner der Motoren ruckelt und zuckelt. BTW: Ich würde für die Motor-PWM-Hardware ein FPGA nehmen... Aber wenn du das noch nicht gemacht hast, solltest du bei uCs bleiben.
Hallo Florian, du hast selbst geschrieben, das es dir an Grundlagen fehlt. Das macht natürlich die Kommunikation hier im Forum sehr viel schwerer. Wenn du nicht veraten kannst, was du genau machen möchtest, wird es sehr schwer dir zu helfen. Einfach mal so Bit-Ströme aus der USB-Leitung rauswerfen geht leider nicht. Ohne korrekte Angaben zu Anforderung wird dir kaum einer helfen können.
> Ich lehne mich mal weit aus dem Fenster und versuche mal darzustellen > wie ich deine Aufgabenstellung verstehe: > Du willst nicht alle 15 us die Leistung der Motoren ändern, sondern nur > eine PWM mit einer Periodendauer von 15 us erreichen. Das verringert den > Aufwand erheblich. Ganz genau das ist das Ziel :-) Es soll alle 15us Ein / Aus geschaltet werden, wodruch dann wiederrum die Pulsweitenmodulation erreicht werden soll.
>> Genau das ist dass, was ich vorhabe. Sorry ist das nicht PWM ? Die >> Software regelt wie lange ein Motor an ist, und wie lange er aus ist. >> Daraus ergibt sich approximiert die Leistung Die 66.7kHz Updaterate enstprechen also der PWM Frequenz ? Welche Auflösung soll die PWM denn haben ? 8 Bit, also 256 Stufen ? Also 8333 mal pro Sek eine neue Drehzahl ? Immer noch viel und nicht notwendig zur Ansteuerung von Motoren, allein wegen der Trägheit. Red' doch mal mit dem Kollegen, bevor Du falschen Voraussetzungen hinterherjagst. Hat denn der Kollege Ahnung, was er machen soll ? Für eine Schaltung laut Deiner Zeichnung könnte man 74595 nehmen, das sind Schieberegister mit Latch, die könnten genau das machen, was Du willst. Brauchen trotzdem einen schnellen µC.
> Sinvoller wäre eine Dezentralisierung und eine Teilung der Aufgaben: > Ein uC steuert z.B. 8 Motoren an. Das kann er mit seinen eingebauten > PWM-Kanälen. Etliche dieser 8er-Gruppen sind über SIO oder SPI mit einem > Master verbunden, der jetzt nur noch die aktuellen Geschwindigkeiten an > diese Motor-Controller sendet. Dieser Master-Controller bekommt > Informationen vom PC via USB. Das mit der Dezentralisierung ist ein guter Einwand. Ich vermute wenn ich direkt zwischen 128 Kanälen schalten wollen würde, dann würde die Logikschaltung zu langsam und zu träger werden
Hab irgendwo im Thread was von FPGA gelesen. Kann mich diesem nur anschliessen; für solche Anwendungen mit vielen, vielen Kanälen ist ein FPGA bestens geeignet und kann mit einem einzelnen Baustein (plus Zugemüse) realisiert werden. Natürlich kann sich die Einarbeit in die Länge ziehen, aber wahrschienlich lohnt es sich, wenn Du öfters mal sowas bauen willst.
Also ich habe mir jetzt mal diesen Artikel durchgelesen: http://www.mikrocontroller.net/articles/Pulsweitenmodulation Hatte es vorher mit Wikipedia probiert, völlig fürn A... :-) Also, die PWM Grundfrequenz liegt bei 66,7 Khz. Nochmal zur Kontrolle: Alle 15 Mikrosekunden wird jeder Motor ein/aus geschaltet, und hält diesen Zustand für 15 Mikrosekunden. Die PWM Frequenz beträgt also 1 / 0.000015 Sek = 66,7 KHZ. Hoffe dort treten nun keine Widersprüche mehr auf. Gesamtbandbreite: Nur mal angenommen, ich würde es schaffen einen Bitstrom zu erzeugen, wobei jedes Bit direkt an den passenden Motor geht, dann würde die Bandbreite für 128 Motoren genau 128 * 66700 Bit/Sek = 8,5 MBit/Sek betragen. Seid ihr damit soweit konform ?
Bei 1Bit PWM, Ja. Aber ist es das was du willst? Also die 66700 Hz runter und die Auflösung hoch.
1-Bit PWM bedeutet, wenn ich das richtig interpretiere, dass ich nur den Zustand Ein/Aus kenne, und keine Zwischstufen. Wenn dem so ist, dann ja! 1-Bit bei 66,7 KHZ Wäre die Antwort. Und das für 128 parallele Kanäle...
Ooops, gemerkt daß die Rechnung 66666 / 256 keine 8333 ergibt, sorry. Also 260 Hz PWM Frequenz bei 8 Bit. Je geringer diese Frequenz wird und je geringer die Auflösung der PWM, desto einfacher wäre das Ziel zu erreichen. Einfacher würde bedeuten ein Atmel schafft's auch noch. Es wäre wichtig zu wissen, wie der eigentliche Neudatendurchsatz sein muss. Das scheint mir nicht zwingend 15µS zu sein. Ein µC kann kontinuierlich die in seinem Speicher gehaltenen Werte für die PWM ausgeben, das macht der von alleine, die Motoren laufen dann mit der im Speicher befindlichen Einstellung. Wie oft pro Sekunde dagegen sollen die Motoren neue Drehzahlwerte bekommen ? Möglicherweise würde das die zu übertragende Datenmenge stark reduzieren. >> Alle 15 Mikrosekunden wird jeder Motor ein/aus geschaltet, und hält >> diesen Zustand für 15 Mikrosekunden. Jede PWM hat eine gewisse Auflösung, denn pro Motor muss ein gewisser Wert zwischen 0 .. ? übertragen werden. Nimm 4 Bit Auflösung an, damit können 16 Leistungsstufen geregelt werden: 0 = aus 1 = 15µS ein, 210µS aus 8 = 120µS ein, 105µS aus 15 = ein Wieviele Stufen, resp. Bit Auflösung soll nun Deine PWM haben ?
Dein Motor kennt dann also auch nur "Vollgas" und "Stopp". Immernoch das was du willst?
Genau das ist es, auch nach Rückfrage mit dem Kollegen Physiker :-) Also 1-BIT PWM mit 66,7 KHZ Grundfreqeunz auf 128 unabhängigen Kanälen! Schwere Geburt, sorry :-)
Florian Schwarz schrieb: > Genau das ist es, auch nach Rückfrage mit dem Kollegen Physiker :-) > > Also 1-BIT PWM mit 66,7 KHZ Grundfreqeunz auf 128 unabhängigen Kanälen! > Schwere Geburt, sorry :-) Warum dann PWM? o0
Vergiss doch bitte einmal diese 15µs Das ist NICHT die Zeit, die jetzt momentan interessiert. Die Frage ist in welchen Zeiteinheiten wird dem Motor eine neue DREHZAHL zugeordnet und wieviele Abstufungen muss diese Drehzahl haben. Die 15µs sind gaaaanz tief unten anzusiedeln. Die ergeben sich. Aber das ist ja nicht die Stellgröße, die der Künstler einstellen wird. Der stellt ein: nach 1.5 Sekunden von 30% Leistung auf 70% Leistung gehen. Das sind jetzt erst mal die Rahmenparameter.
Also dann kürzt sich das 1-Bit und das PWM weg und übrig bleiben 128 simple Ausgänge. Kannst du noch beantworten warum es diese 66,7kHz braucht? Wurde ja schon viele Male geschrieben dass der Motor viel zu träge ist.
Wir können es auch einfach Ein / Aus mit 66,7 KHZ nennen :-) Ist aber doch auch ne Form von PWM. Oder muss man bei PWM zwingend in bestimmten "Paketgrößen" ein und ausschalten ? Im Endeffekt kommt es doch nur auf den Flächeninhalt der Leistungskurve an oder ? @ MWS (Gast): Das Problem ist folgendes: Würde man nicht jeden Motor alle 15 mikrosekungen aktualisieren, sondern nur die paar bestimmten, deren Wert sich geändert hat, dann müsste man wiederrum mit übertragen, WELCHER motor nur umgeschaltet werden soll. Bei 128 Motoren müsste man also wieder 5 Bit senden, um den korrekten Motor aus zu wählen. Genau deshalb würde ich das ganze lieber "Braindead" machen, und einfach kontinuierlich den Bitstrom senden, der für jeden Motor sagt ob dieser die nächsten 15 msec an oder aus ist. Die Adressierung mit einer der Zählschaltung. Ist zwar wie schon gesagt irgendwie "Braindead", aber mehr vermutlich Simpler.
Karl heinz Buchegger schrieb:
> Das sind jetzt erst mal die Rahmenparameter.
Bin unterbrochen worden.
Und daruas ergibt sich dann der Rest.
Das kann natürlich sein, dass dann eine PWM Frequenz von 66kHz rauskommt
(und damit die 15µs), kann aber auch sein, das dem nicht so ist.
Du arbeitest im Moment nach dem Muster:
Wenn ich einen 90PS Motor bauen will und meine Stösselstangen 2mm haben
werden, wie dimensioniere ich die Nockenwelle.
Florian Schwarz schrieb: > Das Problem ist folgendes: Würde man nicht jeden Motor alle 15 > mikrosekungen aktualisieren, sondern nur die paar bestimmten, deren Wert > sich geändert hat, dann müsste man wiederrum mit übertragen, WELCHER > motor nur umgeschaltet werden soll. Ja und. Da ja wohl nicht jedem Motor alle 15µs eine neue Drehzahl zugeordnet werden soll, ist das in Summe viel weniger. Nochmal: vergiss die 15µs. Das ist unpraktikabel das vom PC aus zu machen. Dazu benutzt du jeweils eine Schaltung vor Ort, der du vorgibst: Motor mit 67% Leistung. Und diese Schaltung vor Ort erzeugt dann die PWM Impulse. Alles andere kriegst du nicht geregelt! Weder von der Datenmenge her, noch von der Gleichförmigkeit der Datenübertragung!
> Kannst du noch beantworten warum es diese 66,7kHz braucht? > Wurde ja schon viele Male geschrieben dass der Motor viel zu träge ist. Die haben wohl was damit zu tun, dass damit zu tun, dass sich die Magnetfelder der Motoren gegenseitig beeinflussen / bzw. das sogar explizit sollen. Daher reicht eine geringere Frequenz nicht
> Nochmal: vergiss die 15µs. Das ist unpraktikabel das vom PC aus zu > machen. Dazu benutzt du jeweils eine Schaltung vor Ort, der du vorgibst: > Motor mit 67% Leistung. Und diese Schaltung vor Ort erzeugt dann die PWM > Impulse. Alles andere kriegst du nicht geregelt! Weder von der > Datenmenge her, noch von der Gleichförmigkeit der Datenübertragung! Das ist mal ein Wort ... ich kläre nochmal ab, wieviel PWM Abstufungen genau gebraucht werden. EDIT: Also ein, es sollte möglich sein, jeden Motor in 256 Stufen zu schalten. Die Grundfrequenz muss leider 66,7 KHZ betragen. Von den 256 Stufen sollte man 127 bei negativer Polarität haben, eine ist aus, 128 bei Positiver Polarität. Die Aktualisierung erfolgt ziemlich genau 25 Mal in der Sekunde...
1Bit PWM gibt's nur als Patent für Audioanwendung, ansonsten ist das zur Ansteuerung von 128 Motoren völliger Käse. Florian, ich glaube Du hast das Prinzip der PWM nicht verstanden >> Hatte es vorher mit Wikipedia probiert, völlig fürn A... :-) Der Wiki Artikel gibt die PWM recht gut wieder: http://de.wikipedia.org/wiki/Pulsweitenmodulation Überleg' doch mal, wann ein Motor läuft, bzw. wann er anläuft. Anlaufen wird er bei einer bestimmten Mindestpulsdauer, vorher steht er nur. Würdest Du den Motor nur 15µS in einer Sekunde einschalten, würde der noch keinen Mucks machen. Diese Mindestpulsdauer möchte der Motor, solange er läuft, in gewissen regelmässigen Abständen erhalten, sonst ruckelt er. Das ist also die PWM Frequenz. Das Tastverhältnis dagegen bestimmt die zugeführte Leistung und damit die Drehzahl. Aufgrund der regelmäßigen Wiederholung der PWM muss das Tastverhältnis irgendwie in einen Wert gefasst werden. Selbst wenn Du das auf der PC Seite machen würdest, muss das geschehen, also 4Bit 8Bit 16Bit pro Motor. Das Problem dabei ist, je größer die Aufösung und je höher die PWM, desto mehr Daten. Diese Daten alleine per PC zuführen, also USB direkt zu 128 Ausgängen geht überhaupt nicht, da brauchst Du ein echtzeitfähiges Betriebssystem. Ob es sinn voll ist nur die geänderten Daten zu übertragen, hängt stark davon ab, wie schnell sich die Daten ändern. Das ist eine simple Kosten/Nutzen Rechnung, kann aber einfach den Unterschied ausmachen. Wenn Du mehr Details zur genauen Anwendung liefern würdest, wäre auch ein Ratschlag einfacher. Edit: >> Die Aktualisierung erfolgt ziemlich genau 25 Mal in der Sekunde... 25 x 128 Byte pro Sekunde, 3200 Byte/s ? Das schafft die serielle Schnittstelle ja auch noch :D
Florian Schwarz schrieb: > EDIT: Also ein, es sollte möglich sein, jeden Motor in 256 Stufen zu > schalten. Also eine 8-Bit PWM > Die Grundfrequenz muss leider 66,7 KHZ betragen. Ist ja ok. Solange nicht der PC die PWM erzeugt, ist das ja in Ordnung. Jetzt muss man nur noch Bausteine finden, die * sich leicht addressieren lassen * eine 8-Bit PWM bei mindestens dieser Frequenz erzeugen können. * billig sind > Von den 256 > Stufen sollte man 127 bei negativer Polarität haben, eine ist aus, 128 > bei Positiver Polarität. Das ist eine reine Frage der Beschaltung der PWM-Ausgänge. > Die Aktualisierung erfolgt ziemlich genau 25 > Mal in der Sekunde... und damit in einem Zeitbereich, der mit einer seriellen Schnittstelle ohne gröbere Probleme abdeckbar ist. (Ich denke das Thema: PWM vom PC aus erzeugen, ist damit endgültig abgehakt. Uff. Schwere Geburt)
Sehr gut! vielen Dank erstmal an alle! Ich bin heute erstmal unterwegs, melde mich aber auf jeden Fall wieder wenn es konkreter wird. Das es nicht mit einem PC geht, ist schonmal gut zu wissen :-)
Hat jemannd vielleicht jemand ein paar initiale Vorschläge, für Microcontroller die schnell genug sind, und möglichst viele parallele Pins haben, die man gleichzeitig schalten kann ? Ich finde meistens nur welche mit seriellen Schnittstellen.
viele parallele pins sind der falsche ansatz. du wirst keinen mikrcontroller finden, der 256 (richtung!) IOs spendiert. ich würde dir auch zu karl-heinz' konzept raten und die 128 kanäle auf mehrere µC aufteilen. die (meiner meinung nach übertriebenen) 67kHz kannst du leicht mit seriellen schieberegistern erzeugen. daher können die controller ruhig "klein und dumm" sein. zwischen den kleinen und dem großen controller muss dann ein klug definiertes protokoll her. nachtrag: ich würde dir zu AVRs für die controller raten. zum einen sind sie günstig, zum anderen weit verbreitet und dokumentiert. als schnittstelle zum pc kannst du RS232 oder usb nehmen. wenn usb, dann aber bitte einen parallel-wandler á la ft245
Hallo Florian, Schieberegister spart Pins aber parallele Ausgabe ist schneller. Für deinen Fall wäre eine Kombination sinnvoll. 2 Schieberegister in Reihe steuern 16 Motoren an, 8 solcher Ausgabestränge sitzen an einem Port. Damit hast du deine 128 Motoren. Du must also nur nacheinander 16 Byte an einem Port ausgeben, jeweils einen Clock machen (für alle zusammen) und hinterher den Übernahmeimpuls (auch zusammen). In den 16 Byte entspricht jedes Bit einem Motor. Du benötigast nur 1 kpl. Port für die Daten und 2 Pins an einem anderen Port für Clock und Übernahme. avr
avr schrieb: > 2 Schieberegister in Reihe steuern 16 Motoren an, 8 solcher > Ausgabestränge sitzen an einem Port. nein, denn... > Damit hast du deine 128 Motoren. je motor braucht er 2 pins. er will ja links- und rechtslauf. > Du must also nur nacheinander 16 Byte an einem Port ausgeben, dann rechne dir mal aus, wie schnell das sein muss. er will 8bit auflösung...
sorry, oben stand mal was von ein/aus ;( avr
avr schrieb:
> sorry, oben stand mal was von ein/aus ;(
ach, das änderte sich minütlich =)
Mit einem µC sollen also 128 PWM-Kanäle erzeugt werden. Eigentlich sind es sogar doppelt so viele, denn eine H-Brücke (nötig für Richtungswechsel) hat nunmal zwei Eingänge. Kurz gesagt: Das ist Blödsinn. Vergiss diese Idee ganz schnell, das wird nie laufen. Auch wenn du wirklich einen Controller findest und programmierst, dass er dir 256 saubere und schnelle PWM-Signale liefert (am besten über 25 kHz, sonst hört man es pfeifen und die Motoren laufen unsauber), wirst du die Signale nie sauber zu den Motoren bekommen. Deswegen würde ich mir an deiner Stelle "intelligente" Motoren basteln. D.h. jeder Motor bekommt eine eigene kleine Platine, auf der sich ein Leistungsteil und ein kleiner, billiger Controller befindet. Dieser Controller kann hauptsächlich zwei Dinge: Den Motor steuern und auf einem Bus auf Kommandos lauschen. Für den Steuerungs-Part kannst du mehrere Funktionen vorsehen, z.B. "5 Sekunden lingsrum mit 50% PWM", oder ähnliches. Außerdem gibt es einen Master-Controller, der über den PC mit Daten gefüttert wird, oder Programme von einer Speicherkarte lädt. Über die Bus-Anbindung schickt er dann Kommandos an die einzelnen Motoren. Da die Motoren "intelligent" sind, ist dabei das Timing auch recht einfach einzuhalten. D.h. du musst den Motor nich nach gewünschter Zeit wieder stoppen und dabei aufpassen, dass dir kein Interrupt das Timing versaut. Du sendest einfach die Laufzeit und andere Daten an die Motoren. Etwas weiter gedacht, könntest du auch eine Blockweise Übertragung vorsehen. Jeder Motor-Slave hat einen Zeitgeber, der beim Start Synchronisiert wird. Evtl. auch zwischendrin mal. Du sendest jedem Slave dann die Daten für z.B. die nächsten 30 Sekunden. Dadurch hast du eine Menge Zeit gut. In dieser Zeit kannst du Programm-Teile nachladen, mit dem PC kommunizieren, oder einfach bei einem langsamen Bus alle 128 Teilnehmer füllen. Sollte es später noch nötig sein, bestimmte Wege zu fahren, können das die einzelnen Motoren übernehmen. Ansonsten müsstest du bei deinem Ansatz noch 128 Encoder, Endschalter oder was auch immer auswerten... Als Bus eignet sich z.B. RS485 oder DMX. Auf jeden Fall solltest du mit Optokopplern, Watchdog usw. arbeiten, damit der Bus nicht bei Fehlern in einzelnen Modulen steht. Dein Programm sollte auch eine Möglichkeit haben, abstürzte Teilnehmer wieder in den Ablauf mit aufzunehmen (Watchdog). Wenn sich die Installation über eine große Fläche erstreckt, hättest du so auch keine Probleme den Strom zu den Motoren zu bekommen, ohne eine riesige Antenne zu bauen. So ein PWM-gesteuerter Motor stört nämlich saumäßig.
Gast schrieb: > (am besten über 25 kHz, sonst hört man es pfeifen und die Motoren laufen > unsauber) Zeig mir einen Menschen, der >18khz hoert.
Gast schrieb: > nie laufen. Auch wenn du wirklich einen Controller findest und > programmierst, dass er dir 256 saubere und schnelle PWM-Signale liefert > (am besten über 25 kHz, sonst hört man es pfeifen und die Motoren laufen nö. das geht auch über ein filter, das die hörbaren oberwellen wegnimmt. gewünscht sind außerdem 67kHz > unsauber), wirst du die Signale nie sauber zu den Motoren bekommen. aha? y? > D.h. jeder Motor bekommt eine eigene kleine Platine, auf der sich ein totaler overkill. nicht gewünscht, nicht gebraucht und für einen anfänger völlig ungeeignet. > auf einem Bus auf Kommandos lauschen. Für den Steuerungs-Part kannst du überleg dir mal, wie schnell der bus sein muss, damit die geforderte aktualisierungsrate zustandekommt. -> das geht so nicht. > Dadurch hast du eine Menge Zeit gut. In dieser Zeit kannst du bei 128 motoren? jede menge zeit? -> nein
Michael M. schrieb: >> auf einem Bus auf Kommandos lauschen. Für den Steuerungs-Part kannst du > überleg dir mal, wie schnell der bus sein muss, damit die geforderte > aktualisierungsrate zustandekommt. > -> das geht so nicht. Wir sind mitlerweile bei 25 Aktualisierungen pro Sekunde und Motor. Wobei ich mir ehrlich gesagt keine Anwendung vorstellen kann (ausser in einer Regelschleife natürlich), bei der man einem Motor 25 mal pro Sekunde eine neue Leistung zuordnet. Rechnerisch sind das 2*8*128 = 2048 Bytes pro Sekunde. Sollte eigentlich kein allzugrosses Problem sein, diese Datenmenge zu bewältigen. Geht man dann am Bus auch noch auf 'Übertragung nur bei Änderung', fällt da sicherlich auch noch jede Menge weg.
7 bit adressierung, 8 bit wert, 128 mal und das alle 1/25s macht 48kBit/s oder liege ich da falsch? ist auf alle fälle machbar. hab bei meinem oben zitierten post mit 256*bit* gerechnet - da kam natürlich eine ganz andere größenordnung raus. mein fehler an dieser stelle.
Ja, aber bei DMX hat man z.B. eine Wiederholrate von ca. 30Hz (bei 512Byte Daten) und kann dabei Leitungslängen bis zu 1000m erreichen. DMX wird mit 250Kbs permanent gesendet. Das schafft der Uart eines AVR. Die Adressierung bei DMX funktioniert über abzählen der Daten-Bytes. Jeweils zum Start einer neuen Übertragungssequenz syncronisieren sich alle Teilnehmer. Allerdings können wohl nur 32 Teilnehmer an einem Bus hängen. Ansonsten benötigt man sogenante Repeater(Treiber für den Bus). Also der Bus sollte nicht das Problem darstellen. Schönen Abend noch
Michael M. schrieb: > 7 bit adressierung, 8 bit wert, 128 mal und das alle 1/25s macht > 48kBit/s Mist, du hast recht. Ich hab die 25 bei der Rechnerei vergessen :-) Ich denke immer noch, dass die 25 'echten' Updates in der Sekunde (also nicht auf den gleichen Wert updaten) nicht vorkommen werden, bzw. sich ganz leicht umgehen lassen. Selbst wenn man eine Rampe fahren will, muss ja nicht der PC die Zwischenwerte berechnen und ausgeben, dass können die µC vor Ort genausogut aus Anfangs und Endwert ausrechnen: Datenrate geht schon wieder runter. Mit etwas der grauen Zellen lässt sich die Datenrate sicher enorm drücken.
Moin Zusammen! Und nochmal danke für eure Zeit und mühe! @All: Ich hatte es bis jetzt nur kurz erwähnt weil es mir selber erst später mitgeteilt wurde: Die Polung muss änderbar sein. Dafür hätte ich folgendes IC gefunden: SN754410NE - Mit jeweils vier H-Bridges müsste man doch an einem IC 2 Motoren betreiben und polen können. Die Spannungen und der Strom passt auch. Man spart sich dadurch ne Menge Transistoren und Dioden... . @Michael M.: Hätte mich besser ausdrücken sollen. Ich hatte nicht vor direkt alle 128 Pins parallel aus dem Microcontroller zu ziehen. Ich denke das vernünftige mittelmaß macht hier mehr sinn. Also 8 - 16 Pins parallel, und diese mit Schiebregistern durchschalten. Den ft245 habe ich mir angeschaut. Nach sowas habe ich gesucht. Man könnte also eine Microcontroller nehmen, den ft245 an den USB anschluss machen, und hätte dann 8 parallele Pins, die ich wiederrum mit Schieberegistern zum richtigen Motor leiten kann. @avr (Gast): Wie schon gesagt, gesundes Mittelmaß. Ich denke wenn ich über einen Pin parallel ausgebe wird die Schaltung mit den Schieberegistern zu "tief" und somit träge.
@Florian S: Der IC hat 4 HALB Brücken. Für eine Steuerung des Motors brauchst du 4 Halb Brücken, also 1 IC. Ich würde das ganze Aufteilen, wie schon oben erwähnt. 1 Master uC der Daten vom PC Empfängt (per RS232 oder USB oder wie auch immer), intern die letzten Daten puffert und per SPI permanent an die Motor Slaves schickt, alle Slaves hängen am gleichen SPI Bus. Pro Motor 2 Bytes (1 Byte: 1 Bit Richtung, 7 Bit Adresse, 2 Byte: 256 Stufen Geschwindigkeit) "n"(32) Motor Slaves, die per SPI (Slave only) die Daten vom Master SPI hören. Passt die Adresse wird das in interne Speicher übernommen. Aus dem Internen Speicher generieren die Slaves die PWM. Da wir mit dem IC 2 Ausgänge brauchen, könnte man mit einem ATTiny 2313 oder so, schon mal 4 Motoren Steuern. Da sollten die mit dem Internen 4MHz Oszi locker hin bekommen. 32 solcher Platinen und du bist am Ziel. 25 Update 128 Motoren 2 Bytes = 6400Bytes pro Sekunde. Sollte für Hardware SPI eine Kleinigkeit sein. Vorteil: - Einfach umzusetzen - Alle Slaves haben das gleiche Programm (Welche Adressen gesteuert werden kommt aus dem EEPROM im Slave) - Du kannst eine Platine machen und diese umsetzen und danach alle anderen Stück für Stück hinzufügen (einfache Entwicklung) - 4 Motoren = ca 4 Ampere. Mehr würde ich nicht auf eine Platine packen. Wegen Größe, Leiterbahen, Entstörung usw. - Sollte noch gut auf eine Europe Platine und somit in einen Kartenträger passen - Mann kann alle Enable auf einen Pin des Slave uC zusammenfassen. Sollte die Schaltung in den Standby gehen, kann man so etwas Strom sparen. Denke an die Kühlkörper für den IC der Motor Steuerung. Nettes Projekt :-)
Korrektur: 1 IC Enthält 4 Halbrücken, man kann also 2 Motoren mit einem IC Steuern
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.