Selbstbau Lichtpult - Motorfader Ansteuerung

  • Motor-Fadersteuerung mit ATtiny2313A, programmiert in Assembler für ein DMX-Lichtpult,


    Liebe DMX-Gemeinde,


    auf der Suche nach einer Motorfadersteuerung für ein DMX-Pult bin ich durch Moritz animiert worden, meine Anfrage im Forum zu veröffentlichen, in der Hoffnung, vielleicht jemanden zu finden, der mir helfen kann.
    Umgekehrt kann ich Infos für einen DMX-Sender geben. Alles ist unten beschrieben:
    --------------------------
    Hallo Herr Przybilla,


    ihr Projekt klingt spannend, ich kann aber zu dem Thema jetzt leider nichtssagen, da ich mich dort auch nicht auskenne :)


    Ich würde ihnen Vorschlagen ihr Problem in unserem Forum zu posten: https://forum.dmxcontrol-projects.org/
    Wir als Vereinsmitglieder sind dort sehr aktiv und helfen soweit wir könnenjedem, unabhängig davon ob er Vereinsmitglied ist oder nicht.
    Das Forum ist unser zentraler Anlaufpunkt in unserer Vereinstätigkeit. Zudemgibt es eventuell auch noch weitere Mitleser die helfen könnten.
    In irgend einer Form garantieren, dass jemand genau die Antwort kennt die siesuchen kann ich aber leider nicht.


    Mit freundlichen Grüßen
    Moritz
    DMXControl Projects e.V.
    --------------------------------
    Am 12.02.2018 um 14:54schrieb Theodor Przybilla:
    Hallo, liebes DMXCONTROL_-Team,


    ich bin zwar inzwischen seitkurzem Rentner, war aber mein Leben lang im Kongreß- und Veranstaltungsbereichbei der Messe-Berlin tätig.
    Ich bin studierterTonmeister. Wohl hat mich aber etwa das letzte Jahrzehnt auch die Lichttechnikinteressiert. Ausgehend davon, daß wir Veranstaltungstechniker ausgebildethaben, habe ich mich veranlaßt gesehen, mich auch in den Lichtbereich,insbesondere die DMX-Steuerung einzuarbeiten.
    Ich will nicht alleserzählen, würde zu lange dauern.


    Ich bin bereits seit längeremdabei, mir ein eigenes Lichtpult mit Motorfadern zu bauen. Es ist schonziemlich viel fertig. Es besitzt insgesamt 24 Motor-Kanal-Fader und einenSummenkanal, der durch Umschalten auch 3 Gruppen bedienen kann, wobei man jedenKanal in eine der drei Gruppen eintasten kann.
    Aktuell habe ich esgeschafft, mit einem ATtiny2313A und einer leicht veränderten vorgefundenenSoftware diesen MC in Assembler als DMX-Sender zu programmieren. Mit diesem MC kann ich 118Kanäle steuern. Das funktioniert einwandfrei. Hauptbestandteil des gesamten Lichtpultes ist ein RASPImit einer Oberfläche, die dem Pult entspricht. Mit diesem RASPI steuere ich dasLichtpult. Die DMX-Werte werden dem Lichtpult übergeben, d.h. der ATtiny2313Aerhält die Signale und erzeugt das DMX-Signal. Ich bin dabei so variabel, daß ichjeden Kanal einem eigenen DMX-Kanal zuordnen kann.


    Jetzt allerdings stehe ichvor einem recht großen Problem. Ich möchte jeden einzelnen Motorfader ebenfallsmit einem ATtiny2313A ansteuern. Das ist recht kompliziert. Es sollte mit einerPID-Regelung gemacht werden, kann allerdings nirgendwo eine entsprechendeSoftware in Assembler finden. Natürlich habe ich schon eine Regelung erstellt,geht aber nicht richtig. Ein Endpunkt wird nicht richtig angefahren.
    Nun bin ich also auf EureSeite gestoßen und habe mir gedacht, daß Ihr mir vielleicht helfen könntet. Vielleichtkönnten ja meine Programmier- und Hardware-Kenntnisse auch anderen helfen. DasLichtpult enthält eine recht aufwendige Hardware, da es mit dem RASPI redenmuß. Alles ist komplett selbst erstellt. Ich bin also auch in Hardwaretechnikrecht gut zu Hause.


    Freue mich auf eine baldigeNachricht.


    Mit freundlichem Gruß,

    Theodor Przybilla

  • Hallo Theodor,


    super! Genau mein Thema :D Ich mache Antriebstechnik :D Da kann ich ersma schööön den Fachidioten raushängen lassen:


    Was du da vor hast ist eine sogenannte Lageregelung. Weil du willst ja das der Fader die Position (Lage) hält die dem anliegenden DMX-Wert entspricht.
    Lageregelung ist dummerweise nicht so ganz ohne weiteres zu machen. Der Wikipedia-Artikel ganz unten ist schonmal hilfreich aber wirklich erklärt wird es eher im Buch (auch unten). Trotzdem will ich mal versuchen das wesentliche in meinen Worten wiederzugeben:


    Hardware:
    Hardwareseitig hast du sicherlich irgendetwas, um die abgegriffene Spannung zu messen nicht wahr? Und das geht dann an einen ADC aufm µC und irgendwie rechnest du das dann in einen Wert zwischen 0 und 255 um. Das ist ja dein Messsignal der Regelschleife
    Und am Fader ist sicher ein kleiner DC-Motor der von einer H-Brücke angesteuert wird, damit man den Motor in beide Richtungen mit beliebiger Spannung speisen kann.


    Lageregelkreis:
    Man könnte jetzt versuchen mit diesem Spannungssignal direkt auf Lage zu regeln, indem man schlicht einen PID-Regler nimmt, die Differenz aus Soll- und Ist-Wert einfüttert und dann eben z.B. -12 bis +12V Spannung auf den Motor ausgibt. Kann funktionieren. Wird sehr leicht schwingen, wenig präzise und vor allem nicht so schnell ausregeln wie man das evtl. von professionellen Pulten kennt, wo man aufs Knöpfchen drückt und zack sind die Regler an Ort und Stelle, so schnell, dass man es fast net sieht. Das Problem bei dieser Art Regelung ist, dass man versucht mit Hilfe eines Lagesignals (Abgegriffene Spannung am Potis) den Strom am Motor zu Regeln (Spannung und Strom am Motor stehen ja logischerweise in Verbindung). Der Motorstrom bestimmt jedoch das Drehmoment des Motors also quasi die Beschleunigung. Die Beschleunigung ist die zweite Ableitung des Ortes (Lage) => spätestens hier sollten die Alarmglocken losgehen: Umgangssprachlich: "Stellgröße (Motorspannung) und Regelgröße (Potisspannung) sollten nicht durch eine oder gar mehrere Ableitungen/Integrale getrennt sein." Wie gesagt kann funktionieren, hat aber halt so seine Tücken, ist aber manchmal aufgrund begrenzter Ressourcen das einzig Mögliche. Man kann auch versuchen nicht einfach nur einen PID-Regler zu nehmen, sondern z.B. auch die Parameter adaptiv einstellen oder einen Fuzzy-Regler sind aber alles Tricks die zwar ihre Berechtigung haben aber naja... Einfacher wirds dadurch auch net.


    Elektrische Maschinen sollten Momentengeregelt betrieben werden. Da man das Moment aber nur kostenintensiv messen kann, realisiert man eine Stromregelung. Strommessung ist ja recht einfach über einen Shunt-Widerstand möglich, der im einfachsten Fall unter die H-Brücke kommt, Messverstärker dran und Signal am ADC einlesen. Über die sog. Motorkonstante lässt sich aus dem Strom direkt das Drehmoment bestimmen. Misst man also den Strom hat man das Drehmoment -> Regelbar. PI-Regler reicht in der Regel, sonst schwingt es eh nur.
    Der Momentenregler wird von einem Drehzahlregler überlagert, der wie der Name sagt, die Drehzahl des Motors regelt. Dazu ist natürlich wiederum eine Messung der Drehzahl nötig, die i.d.R. durch einen Drehgeber erfolgt in deinem Fall kann das aber auch die Ableitung der Potisspannung sein. Auch hier PI.
    Und schließlich der überlagerte Lageregler, der die Lage oder Position des Motors regelt. Messsignal wäre hier deine Potisspannung. Auch hier reicht ein PI völlig aus.
    Die Kunst an dieser Sache ist jetzt natürlich erstmal die drei Signale sauber zu messen und dann die drei Regler einzustellen.


    Sinn des Ganzen ist erstens dieses Spiel mit "Ableitungen der Stellgröße" rauszukriegen und dein System aufzuteilen. Ab jetzt ist es nämlich "nur" noch eine Sache von Wie stelle ich meinen Regler ein. Wenn du das aber schaffst, ist das fast das schnellstmöglich was du machen kannst um auf Lage zu regeln.
    Wenn nämlich der Lageregler eine Abweichung feststellt gibt er eine Solldrehzahl aus. Die natürlich nicht beliebig ist, sondern bei kleinen Abweichungen eben klein aber bei großen halt auch schon mal saftig sein kann. Der Momentenregler schaut, dass er das entsprechende Drehmoment erzeugt bekommt um auf diese Geschwindigkeit zu kommen. Also die Aufgaben sind verteilt und jeder macht das was er kann. Es wird dadurch z.B. auch möglich einen Fader festzuhalten. Weil egal wie stark du drückst. Der Drehzahlregler gibt Drehzahl 0 aus und der Momentenregler drückt halt entsprechend dagegen, um das zu halten. Natürlich alles im Rahmen seiner physikalischen Möglichkeiten.


    Also zum Testen würde ich erstmal einen PI Regler bauen und direkt mit der Potisspannung die Motorspannung regeln. Vielleicht reicht es ja. Wenn es nicht reicht wirst du um die typische Lagereglerstruktur nicht drumrumkommen.


    Software:
    A und O jeder Regelung ist ja eine saubere, möglichst verzögerungsfreie Messung. Potis haben allerdings eine recht hohe Toleranz. Ich denke also, dass es nötig sein wird für jedes Potis den unteren und oberen Messwert einzulernen und irgendwo im µC abzulegen. Nur dann kannst du korrekt aus der Potisspannung auf ein DMX Signal zwischen 0 und 255 umrechnen. Verzögerungsfrei dürfte kein Problem sein allerdings würde ich in betracht ziehen das sogar absichtlich etwas mit einem Kondensator zu glätten, damit man weniger Rauschen reinkriegt und Regler nicht die ganze Zeit nervös zappelt.
    Was jetzt konkret den Code angeht würde ich dazu raten einen möglichst einfachen PI Regler in C zu suchen und dann eben von Hand dein spezifischen ATtiny Assembler Code zu übersetzen.


    Mein Rat:
    Was ich in so einem Fall als Erstes tun würde wäre erstmal den guten alten Arduino rausholen, da alles anstöpseln, die bewährten Standardbibliotheken für z.B. PID Regler nehmen und einfach mal irgendwie zum laufen bringen. Und dann halt schrittweise zum Zielsystem vorarbeiten. Also z.B. wenn du merkst, dass dir ein einfacher Regler nicht gut genug regelt erstmal den Lageregelkreis aufm Arduino aufbauen, bevor man das im vergleichsweise komplizierten Assembler macht... Und dann mal den Regler selbst schreiben... usw.


    Das war jetzt erstmal recht umfangreich und vielleicht noch zu wenig konkret... Aber frag ruhig nach :)



    Lg
    MWSysTech


    https://de.wikipedia.org/wiki/Lageregelung
    Elektrische Antriebe - Regelung von Antriebssystemen, Dierk Schröder, Springer Vieweg

  • Lieber MWSysTech,


    vielleicht hast Du auch einen Namen, wäre schöner in der Kommunikation.
    Danke erstmal für Deine umfangreiche Antwort. Na ja, so richtig anfangen kann ich damit nicht viel.


    Ich will noch einmal erklären, wie mein Ist-Zustand aussieht:
    Ich benutze einen Motorfader von ALPS.
    Der Schleifer vom Fader geht zu einem AD-Eingang des TLC 549. Er wird vom Tiny direkt gesteuert, sendet seriell einen Wert, erhält ein Clocksignal und ein CS-Signal, das geht alles. Umsetzung dauert etwa 4 µsec.
    Der Motor wird von einem BA 6208 Motortreiber angesteuert, der wiederum bekommt seine zwei Inputs von zwei Portausgängen des Tiny.
    Meine Überlegung war, mit der ich sehr viel herumexperimentiert habe, folgende:


    Der Tiny bekommt über PortB einen 8 Bit Wert vom übergeordnete Rechner, bei mir ist des der RASPI. Der wird verglichen mit dem 8 Bit Wert des Faders. Das ist der IST-Wert. Ist der etwa tiefer als der SOLL-Wert, bekommt der Motor einen Schups auf einem der beiden Portausgänge. Nach einer Zeit wird der Fader ausgelesen. Dazu halte ich den Motor ersteinmal an. Je nachdem, welcher Wert gelesen wird, wird durch Vergleich mit dem SOLL-Wert entweder derselbe Port wieder geschaltet oder der andere, der den Fader in die Gegenrichtung fährt.
    Sollten beide Werte gleich groß sein, wäre die Regelung beendet und der Fader kann ganz normal von Hand bedient werden.
    Klingt irgendwie sehr einfach, geht aber im Prinzip gar nicht. Ich bin zwar schon durch diverse Experimente auf eine recht gute Regelung gekommen, der Motor bleibt halt nicht stehen, wenn man ihn abschaltet, sondern läuft etwas weiter.
    Ich habe daraufhin die Spannungspulse verkürzt, damit der Fader langsamer sein Ziel erreicht. Erhält er aber einen zu kurzen Spannungspuls, bewegt er sich halt nicht.


    Ich habe kürzlich eine PID-Regelung gefunden für einen Akkulader. Ein recht kurzes Programm, habe es zu verstehen versucht. Als es nicht lief, wie ich dachte, habe ich eine Simulation durchgeführt.
    Ich arbeite mit dem Entwicklungskit STK500 von Atmel, es ist ein prima Teil. Jedenfalls habe ich auch da nicht verstanden, wie die P, D und I Teile laufen und was sie bewirken sollen.


    Was mir bei meinem Prinzip nicht richtig einleuchtet ist, daß ich den Motor zur Messung eines aktuellen Wertes abschalte. Wenn ich das aber nicht mache, kann ich zwar einen Wert auslesen, der Motor läuft aber natürlich weiter, während die Software am Arbeiten ist.
    In der Analogtechnik schaltet man ja auch nicht ab, dachte ich, sondern es findet permanent eine Rückkopplung statt, sodaß ein komplett geschlossener Regelkreis vorhanden ist.


    Jedenfalls komme ich nicht weiter.
    Ich wäre sehr dankbar, wenn ich entweder direkt einen Regelcode von irgendwoher bekommen könnte oder zumindest erfahren könnte, wie man mit Software insbesondere die D- und I-Teile programmieren muß.
    Es bestünde auch die Möglichkeit einer PWM-Steuerung, doch sind meine Ports dafür bereits als Eingangs-PortB vergeben.


    Ich habe mich derzeit auf die Assemblerprogrammierung gestürzt.
    Zuvor habe ich recht lange mit dem Control-C Programm von Conrad gearbeitet, mit dem ATMega 32, programmiert in C. Mit ihm wollte ich gleich 4 Motoren steuern, was von der Möglichkeit des Prozessors möglich sein sollte, mußte aber erfahren (habe ich auch von anderer Seite gehört), daß dieser C-Compiler wohl kein richtiger C-Compiler ist, sondern auch nur ein Interpreter. Und der braucht Zeit, bis er meint, arbeiten zu müssen.


    Du hast mir diverse Tipps gegeben, wie man Herr des Motors wird. Ich habe von einem sehr bekannten großen Berliner Mischpulthersteller Infos bekommen, wie die das machen. Natürlich habe ich keine Lösung bekommen.
    Und ich besitze wohl das erste Yamaha-Digitalpult, das DMP 7. Es hat nur 11 Fader, aber alle laufen wie geschmiert. Aus der Schaltung erkennt man, daß der Motor direkt über einen Treiber vom Prozessor gesteuert wird. Aus dieser Schaltung habe ich auch meine abgekupfert mit dem BA 6208.
    Und das Nachfolgemodell, das O2R, besitze ich auch, incl. kompletter Schaltunterlagen. Dort ist die gleiche Regelung im Einsatz. Alles wird ausschließlich über Software gesteuert. Das bewundere ich, wie genau die Fader immer in dieselbe Position fahren.


    Meinst Du, Du könntest mir jetzt weiter helfen?


    Sei herzlich gegrüßt,


    Theodor

  • Hallo Theodor,


    ich habe noch ein wenig Hoffnung, dass mein realer Name durch dieses Pseudonym nicht zu ermitteln ist. Und da unsere Kommunikation öffentlich und nicht privat stattfindet, würde ich es gerne dabei belassen.


    Aber ja, ich denke ich habe etwas besser begriffen worum es bei beider spezifischen Aufgabenstellung geht.


    Das mit dem TLC... und dem und dem Motortreiber klingt soweit mal ganz solide. Ich denke was die Hardware angeht sind wir d'accord.



    Der Tiny bekommt über PortB einen 8 Bit Wert vom übergeordnete Rechner, bei mir ist des der RASPI. Der wird verglichen mit dem 8 Bit Wert des Faders. Das ist der IST-Wert. Ist der etwa tiefer als der SOLL-Wert, bekommt der Motor einen Schups auf einem der beiden Portausgänge. Nach einer Zeit wird der Fader ausgelesen. Dazu halte ich den Motor ersteinmal an. Je nachdem, welcher Wert gelesen wird, wird durch Vergleich mit dem SOLL-Wert entweder derselbe Port wieder geschaltet oder der andere, der den Fader in die Gegenrichtung fährt.
    Sollten beide Werte gleich groß sein, wäre die Regelung beendet und der Fader kann ganz normal von Hand bedient werden.
    Klingt irgendwie sehr einfach, geht aber im Prinzip gar nicht. Ich bin zwar schon durch diverse Experimente auf eine recht gute Regelung gekommen, der Motor bleibt halt nicht stehen, wenn man ihn abschaltet, sondern läuft etwas weiter.
    Ich habe daraufhin die Spannungspulse verkürzt, damit der Fader langsamer sein Ziel erreicht. Erhält er aber einen zu kurzen Spannungspuls, bewegt er sich halt nicht.


    Eine Nebenbemerkung bevor ich zum Wesentlichen komme: Was die Problemmatik mit dem "Faderposition auf Wert von der Steuerung fahren und dann aber Manuell bedienbar" angeht, gibt es das Konzept der Reglerfreigabe. Das ist im einfachsten Fall ein bit, das eben gesetzt ist oder auch nicht. Immer wenn es gesetzt ist arbeitet der Regler, sonst nicht. Damit kann man recht leicht z.B. wenn die "Seite" auf dem Mischpult umgestellt wird kurz alle Fader auf einem Pin triggern, dass sie den Regler freigeben und wenn eine gewisse Abbruchbedingung, z.B. Differenz(Soll-Ist) < 5% erreicht ist wird die Reglerfreigabe gelöscht und der Fader kann von Hand bedient werden.


    Soweit ich das verstanden habe, gibt es bei deinem Antrieb nur Stop, Vollgas-Vorwärts, Vollgas-Rückwärts. Sollte das der Fall sein, dann liegt hier die Quelle der unbefriedigenden Verhaltens. Das was du tust, nennt sich Vier-Quadranten-Betrieb und unterscheidet sich von einer PWM in einem Punkt: Man muss suuuuper genau timen, wenn man auch nur eine Chance haben will, dass das funktioniert. Deswegen macht, das keiner und die ganze Welt nutzt PWM.
    Gedankenexperiment: Dein Fader ist nur ein ganz wenig vonn der Sollposition entfernt. Gerade so viel, dass die Regelung anspringt. Der kürzest mögliche Schaltimpuls von der Regelung also die Zeit vom Einschalten des Motors, bis zum Logikverarbeiten und wieder Ausschalten des Motors sei 10µs. in diesem 10µs halt sich Fader aber, weil er ja auf vollgas lief viel zu weit bewegt. Es hätte perfekt gepasst wenn er 10µs auf 20% gelaufen wäre. Das ist total blöd zu erklären. Also wenn du nur an/aus kannst, musst du brutal genau timen, i.d.R. genauer als technisch möglich. Durch PWM kanns du aber sozusagen genau so viel Gas geben wie eben gerade nötig. Und der Motor könnte mit einer PWM auch aktiv gebremst werden, dass man dieses Auslaufverhalten rausbekommt.
    Ich würde also dringend empfehlen, das wenigstens testweise mal mit einer PWM-Ansteuerung des Motors zu versuchen.


    Motor während der Messung abschalten wird dann auch nicht mehr nötig sein, im Gegenteil es muss beides laufen. Ist ja ein Regelkreis, wie du bereits richtig erwähntest.


    Was den Reglercode angeht würde ich das noch erstmal zurückstellen, sonst machen wir hier 5 Themen auf einmal auf und keiner blickt mehr durch. Nur so viel. D wirst du nicht brauchen. Würde ich auch erstmal noch raus lassen. Es wird auch nur mit P-Regler funktionieren. Der I-Anteil holt am Ende nur die letzten 10% Präzision raus.


    Ja, C-Control ist ein Krapf ^^



    Lg
    MWSysTech

  • Hi MWSysTech,


    na gut, dann sollst Du geheim bleiben.
    Grundsätzlich danke ich Dir ersteinmal, daß Du offensichtlich mit mir ziehen willst.
    Einige weitere Gedanken.
    1.) Mein Motorfader soll nicht nur auf einen bestimmten Wert fahren, etwa durch Szenewechsel. Er soll auch von einem anderen Fader gesteuert werden können. Einfachste Variante in Audio-Digitalpulten ist, daß man zwei Fader zu einem Stereopärchen verkoppelt.
    2.) Soll man auch die Möglichkeit haben, sehr kleine Bewegungen machen zu können, eben geregelt von einem anderen Fader.
    3.) In meinem Pult gibt es auch einen Gruppenregler. Ich kann meine Fader jeweils einer von drei Gruppen zuordnen. Und dieser gruppenfader soll dann eben auch alle in die Gruppe eingetasteten Fader regeln können.


    Zu PWM: PWM ist ja nichts weiteres, als durch unterschiedliche Pulsweite einen Steuervorgang herzustellen. Deshalb habe ich mir halt gedacht, daß ich das so auch mit meinem zwei PortBits machen kann. einfach die Pulslänge variieren. "Mein Berliner Pulthersteller" gab mir den Tipp und Rat, mit einer Abtast- bzw. Steuerfrequenz von 5 - 10 kHz zu regeln. Mit 5 kHz habe ich es auch schon geschafft, also mit 0,2 ms gesteuert, konnte auch das Pulsverhältnis ändern. Er gab mir auch den Rat, unbedingt in Assembler zu programmieren der Schnelligkeit wegen.
    Also habe ich in einer Weise ersteinmal alle Voraussetzungen geschaffen, um ein vernünftig arbeitendes Gebilde zu erstellen. Aber mir fehlt einfach die Lösung dazu.


    Ich hoffe, von Dir eine erhalten zu können, sodaß ich eine vernünftige Steuersoftware daraus erstellen kann.


    Machst Du denn auch so etwas ähnliches? Woran arbeitest Du?
    Ich habe in der Vergangenheit bisher noch nicht mit beweglichen Teilen gearbeitet. Habe in meiner ehemaligen Firma einmal eine von AEG erstellte Diskussionsanlage, die nie funktionierte, mit C programmiert und notwendige Hardwareteile dazu entwickelt.
    Es konnten in insgesamt 3 Sälen etwa 500 Mikrophone und 240 Lautsprecher richtungsgetreu gesteuert werden. Das alles war einmal zu DOS-Zeiten.
    Und jetzt habe ich mich halt wieder an Assembler gemacht, Lichtsteuerung fasziniert mich.


    Sei herzlich gegrüßt,


    Theodor

  • Hallo Theodor,


    jaja diese Anwendungsfälle dachte ich mir schon. Klassisches Mischpult eben ;)


    PWM: Dein Gedanke war ja auch erstmal richtig. Im Grunde ist es ja möglich das mit Portbits so zu machen. Nur ist eben nicht so trivial... Was die PWM Frequenz angeht hätte ich bei der Größe des Motors auch so 8kHz geschätzt. Ist aber für die Regelung an sich eher nebensächlich. Auch mit Assembler hat deine Quelle natürlich was Wahres gesagt. Macht die ganze Sache nunmal nicht gerade einfacher ^^


    Also einen genauen Code kann ich dir leider nicht anbieten. Dazu müsste ich mich ja erstmal mit genau deinem Controller vertraut machen und ich habe im Moment ehrlich gesagt nicht die nerven Datenblätter mit Registern zu wälzen^^ Aber kann gerne das Prinzip zusammenfassen.


    In der Regel haben µC ja sog. Timer, meistens auch mehrere davon. Ein Timer läuft mehr oder weniger unabhängig vom eigentlichen Programm im Hintergrund und zählt kontinuierlich mit einer gewissen Geschwindigkeit hoch. Wenn er beim Maximalwert angelangt ist, springt er zurück auf 0 fängt von vorne an. Also so eine Art Dreiecksfunktion. Einen Timer kann man entsprechende Register konfigurieren. Z.B. An- Ausschalten, Geschwindigkeit. Die Geschwindigkeit des Timers wird später die PWM Frequenz definieren. Über sog. Compare-Register kann man den Timer zu einer PWM Quelle machen. Angenommen der Timer zählt bis 255. Steht im Compare-Register nun 64 so läuft der PWM Ausgang auf 25%. Während der Timer von 0 bis 64 hochzählt ist der Ausgang HIGH, danach LOW. Du kannst also im Hintergrund auf diese Weise deine PWM-Erzeugung laufen lassen und im Programm nur ab und zu dieses Compare-Register beschreiben.
    Welche Register du genau wie beschreiben musst, musst du aus dem Datenblatt des Prozessors raussuchen, das ist bei jedem etwas anders aufgeteilt und benannt.


    Wie du links sehen kannst, studiere ich noch Mechatronik. Arbeite aber seit dem 1. Semester in einem Unternehmen der Antriebstechnik. Da geht es zwar eher um Motoren im kW Bereich und dementsprechende Frequenzumrichter aber das ist ja im Prinzip immer gleich, egal wie groß die Maschine. Beim Thema Lageregelung bin ich aber besonders hellhörig geworden, weil mir das aktuell im Studium schlaflose Nächte bereitet ^^


    Lg
    Martin

  • Hallo Martin,


    vielleicht liest Du die Zeitschrift "Elektronik".
    Dort ist im betreffenden Blatt ein Artikel über Entwicklungsboards: Motorsteuerungs-Design leicht gemacht abgedruckt. Wäre etwas für Dich.


    https://shop.weka-fachmedien.d…elektronik-42018-737.html
    Mikrocontroller, Tools

    • Leistungsfähigkeit und Stromaufnahme von µC: EEMBC-Benchmarks in der Praxis
    • Entwicklungsboards: Motorsteuerungs-Design leicht gemacht

    Ich dachte, den Artikel gäbe es auch online, ist offensichtlich nicht der Fall.
    Ich könnte ihn auch scannen, möchte dies aber über dieses Medium nicht verbreiten. Melde Dich, falls er Dich interessieren sollte.


    Mit meinem Projekt bin ich noch nicht weiter gekommen. Ich konnte bisher nicht in Erfahrung bringen, wie man bei PID einen Integral und Differenz-Teil als Assembler-Code erzeugen kann.
    Ich bin allerdings momentan mit Tim Wescott in Kontakt, der einen Artikel über "PID Without a phD" verfaßt hat. Es kann sein, daß ich von ihm geeignete Infos erhalten kann.
    http://wescottdesign.com/articles/pid/pidWithoutAPhd.pdf


    Herzlichen Gruß,


    Theodor

  • Hallo Philipp,


    vielen Dank für den Link. ich konnte aber irgendwie nichts genaues finden, keinen Code.
    Ich kann auch nicht herauslesen, wie das ganze funktionieren soll. Offensichtlich kann man über MIDI einen der 8 Fader regeln oder umgekehrt mit den 8 Fadern ein MIDI-Signal senden.
    Hast Du denn bei Deinen Experimenten feststellen können, daß die Fader exakt einen Wert angefahren haben? Kann man eigentlich nur, wenn man softwaremäßig den Faderwert auch lesen kann.
    Bei meiner Steuerung soll und muß es so sein: Ich übergebe einen SOLL-Wert, den der Fader exakt übernehmen soll. Wenn er das gemacht hat, darf und soll er aus der Regelung aussteigen, sodaß ich ihn per Hand wieder normal bedienen kann.
    Bei Audiomischpulten ist es halt so: man kann eine komplette Fadereinstellung mit einem Knopfdruck gegen eine andere tauschen. Und die Werte müssen immer dieselben sein, wenn man wieder zurück schaltet. Wenn aber ein Fader nicht denselben Wert annimmt, merkt das die Software nicht und erkennt dann den neuen falsch übernommenen Wert als aktuellen, was beim nächsten Faderwechsel auch zu einer falschen Übernahme führt.
    Hättest Du denn einen Tipp, wie man ein Differential oder Integral in einen Assemblercode umsetzt?


    Herzlichen Gruß,


    Theodor

  • Differential: wirst du wohl nicht brauchen und lässt sich nicht schön realisieren, pseudocode:


    C
    static Fehler_old;d = Fehler_old - Fehler_new;Fehler_old = Fehler_new

    du musst dir den alten Fehler immer merken.


    Der Integralanteil ist der Fehler aufsummiert, bist zu "zu niedrigt" steigt I in jedem Schritt. Bist du zu niedrig sinkt I in jedem Schritt entsprechend. Du solltest I meistens noch beschränken, damit dieser weder überläuft noch sich riesig groß wird. Durch den I-Anteil wird erreicht das du keine bleibende Regelabweichung hast.

    Gruß
    Scyte

    Was mit Gaffer nicht klebt, ist kaputt! :rolleyes:


    Je mehr Käse desto mehr Löcher
    Je mehr Löcher desto weniger Käse
    Ergo:
    Je mehr Käse desto weniger Käse :thumbup:

  • Hallo Skyte,


    leider helfen mir Deine Infos nicht. Solche und ähnliche Antworten habe ich schon mehrfach erhalten.
    Ich beschrieb doch konkret mein Problem und suche einfach nach einer Softwarelösung in Assembler für den ATtiny2313A. Da die Befehle bei den Tinies und Megas ähnlich sind, kann es auch ein Code für einen anderen Prozessor sein.
    Vielleicht nochmals:
    1.) Der Motor wir von einem Driver BA6208 gesteuert, der seine zwei Signale für UP und DOWN von zwei Port-Pins vom µC bekommt.
    2.) Der Fader wird von einem ADC-Wandler, dem TLC 549, abgefragt, der sein serielles 8-Bit-Signal an den µC abgibt.
    3.) Der SOLL-Wert mit 8 Bit kommt von einem RASPI, der das gesamte Lichtpult steuert, über PORT_B.
    4.) Über ein PIN vom PORT_D erhält der µC einen Steuerbefehl zur Datenübernahme. Im µC wird ein Interrupt ausgelöst, der den Motor-Wert ans Programm übergibt.
    5.) Alles muß oder sollte mit einer PID-Regelung erfolgen. Den P-Teil gewinne ich aus der Differenz von SOLL und IST. Das ist wohl der Wert, der offensichtlich als ERROR gehandelt wird. Je nachdem, welcher beider Werte größer oder kleiner ist, erhält der Motor ein UP-Signal oder ein DOWN-Signal an den beiden PINs. Betreffendes Signal steht für eine bestimmte Zeit an. Je nach Tempo, ist das Signal länger oder kürzer, also eine PWM-Steuerung. Nur hält mit diesem P-Teil der Motor nicht am gewünschten Ende nicht, er läuft etwas weiter. Und hierfür benötige ich eine Lösung. Kannst Du mir eine nennen?


    Herzlichen Gruß,


    Theodor

  • Das es etwas weiter läuft ist ein Überschwinger, der P-Anteil ist zu groß, bzw. dein System zu träge und läuft nach.
    Wenn du es schön machen willst folgender Ansatz:
    1. Auf Hardware-PWM umbauen: Timer konfigurieren, und dann nur ORCXN (timer compare) o.ä. bzw. Vorwärts/Rückwärts anpassen.
    2. PI Regelung: Stellgröße(Wert für timer compare) = P(Error + I* Aufsummierter_Fehler), P und I so Anpassen, das diese für dein System funktionieren/passen.


    Im Endeffekt ca. sowas:


    Das musst du dann halt in ASM abbilden. OCRXN steht zum Beispiel für OCRA1 o.ä. da musst du mal gucken wie die Register bei deinem Controller heißen. Das brauchst du halt dann jeweils pro Fader.
    Am Ende läuft das auf Dauerschleife raus, die immer wieder durchlaufen wird. Du kannst die Schleife verlassen wenn alle Fader über eine bestimmte Zeit in der richtigen Position sind.


    Du wirst hier von niemandem den ASM-Code vorgekaut bekommen. Das ist nicht böse gemeint, aber das implementieren hängt sehr vom System an sich ab, da wird sich keine hinsetzten und das aus der Ferne machen. Da von abgesehen ist diese simple PID regelung sehr einfach zu implementieren. Eine richtige Lageregelung mit mehreren überlagerten Regelnern ist nicht viel schwerer, aber man muss verstehen, was da passiert.


    Gruß
    Scyte

    Was mit Gaffer nicht klebt, ist kaputt! :rolleyes:


    Je mehr Käse desto mehr Löcher
    Je mehr Löcher desto weniger Käse
    Ergo:
    Je mehr Käse desto weniger Käse :thumbup:

    Edited 2 times, last by Scyte ().

  • Hi,


    auf der Seite weiter unten bei Firmware gibt es einen Link zu einem ZIP-File.
    Dort ist auch der Code zu finden.


    Ja genau man kann den Wert per Midi senden (Input), dann stellen sich die Fader ein. Wenn man während dessen die Fader berührt (Metallbeschichtete Kappen und entsprechende Fader vorausgesetzt) geht der Motor auch aus.
    Der aktuelle Wert der Fader wir am Midi Out ausgegeben.


    Ich hatte damals ein bisschen mit den Einstellungen gespielt und es hat ganz gut funktioniert. War teilweise ein kleinwenig zittrig, sollte man aber mit den Einstellungen hinbekommen.


    Gruß Philipp

  • Hallo Philip,


    vielleicht habe ich Tomaten auf den Augen, aber einen Code kann ich im Zip-File nicht finden. Dort sind nur zwei asm-Files, die aber keinen Code beinhalten.
    Habe ich da etwas übersehen?


    Gruß,


    Theodor

  • Hallo Scyte,


    ich danke Dir für Deine neuerlichen Infos, die mir aber auch etwas bömisch vorkommen. Du scheinst Dich mit diesem Thema sehr intensiv befaßt zu haben, weshalb Du wahrscheinlich vieles für selbstverständlich hältst.
    Das trifft bei mir bei einer Motoregelung nicht zu. Ich habe schon viel in C und Assembler programmiert. Hast ja wahrscheinlich gelesen, was für ein aufwendiges Lichtpult es jetzt schon ist.
    1.) Gesamtsteuerung über einen Raspi, programmiert mit Python 2, der insgesamt 5 Stück I2C- Bausteine ansteuert, weshalb ich 40 EA-Leitungen zum Steuern des gesamten Pultes zur Verfügung habe.
    2.) Im Pult ist ein ATtiny2313A zuständig für das Senden der DMX-Signale. Er erhält die DMX-Daten vom Raspi durch einen Interruptaufruf. Mit diesem µC kann ich 118 DMX-Adressen steuern. Es sollen einmal mit einem anderen µc, wahrscheinlich mit dem ATMega16 aufgebaut, mit dem ich 511 DMX-Adressen ansteuern könnte. Die Software ist darauf bereits ausgelegt.
    3.) Im Pult und auf dem Desktop sind 24 Kanalfader enthalten, dazu im Pult ein Master, der auch als Gruppenfader von drei Gruppen umgeschaltet werden kann.
    4. Jeder Kanal (Fader) kann einer von drei Gruppen zugeteilt werden. Dies wird auf dem Desktop durch einen Radiobutton angezeigt, im Pult durch eine LED.
    4.) Im Pult ist eine Hardware-Abfrageeinheit für insgesamt 64 Tasten eingebaut, die ihre Daten an den Raspi per Interrupt schickt.
    5.) Ein interessantes Detail ist eingebaut: Ich kann jeden der 24 Fader einer eigenen Adresse zuordnen. Findet man so nicht unbedingt in einem Lichtpult.
    6.) Und wenn das alles spielt, sollen einzelne Szenen abgespeichert und aufgerufen werden, Ebenso denke ich an eine Zeitsteuerung.


    Alles also, bis auf die Prozessoren, ist selbst erstellt, Soft- wie Hardware.


    Und nun suche ich halt jemanden, der mir einen solchen Tipp geben kann, daß ich meine Motorfader richtig steuern kann.


    Sei herzlich gegrüßt,


    Theodor

  • Hallo Philipp,


    ja, habe nochmals alles angeschaut. Ein ungeheurer Wust an Dateien. Ich vermute mal, das ist wegen Midi notwendig.
    Irgendwie habe ich keine Lust, mich da durchzufressen.
    Ich hatte mir alles wesentlich einfacher vorgestellt.
    Hättest Du denn nicht irgendeine einfachere Lösung im Topf?
    Inzwischen habe ich eine Steuerung geschafft, die total leise läuft. Der Endpunkt wird zwar ganz gut erreicht, aber eben nicht ganz. Und das ist immer noch mein Problem.
    Auch kann ich einen Fader von einem anderen steuern.
    Ich finde immer wieder nur Prinzipien, was alle zu beachten ist, aber keine Details. Es muß doch möglich sein, irgendwo einen Code zu finden, wo so etwas nachvollziehbar wäre.
    Ich bin doch nicht der erste, der einen Motorfader steuern möchte.
    In einem YouTube-Film habe ich auch eine Steuerung gefunden, in der gezeigt wird, wie ein Motorfader läuft. Dazu verschiedene Parameteränderungen. Sieht irgendwie immer
    ganz imposant aus, aber man findet nichts, wie das gemacht wird.
    Vielleicht sollte ich doch noch Elektrotechnik und Informatik studieren? Habe eigentlich genügend Elektrotechnikerfahrung und Kenntnisse im Programmieren. Einen C++ Fernlehrgang bei einem renommierten Anbieter habe ich mit "Summa cum Laude" abgeschlossen und bin so klug, als wie zuvor. Nichts war da über Hardwareprogrammierung.


    Noch gebe ich meine Hoffnung nicht auf.


    Sei herzlich gegrüßt,


    Theodor

  • Hallo Theodor,


    die Frage mit dem "ich bin doch nicht der Einzige" ist teilweise echt interessant. Nein, bist Du sicher nicht, aber möglicherweise sind alle die das machen nicht so offen und berichten darüber. Oder sie machen es ganz anders.
    Ich musste auch schon feststellen, dass es bei einigen Dingen sehr sehr eng wird. Und auch wir hier im Team stellen immer wieder fest, dass die Schnittmenge zwischen Lichttechnik, Programmieren und im Internet aktiv sein nur ganz klein ist.
    Du suchst nun zu allem oben drauf auch noch jemanden mit Assemblerfähigkeiten.
    Wenn Du z.B auf die Seite hier schaust "Das sind die populärsten Programmiersprachen 2016", dann wirst Du Assembler gut suchen müssen (man findet es schon ;) ). Sogar wir hier im Team haben Probleme wenn irgend ein Assemblercode auftaucht.
    Alle machen nur noch Web, Apps und irgendwelche Gimmicks. Hardware ansteuern ist für die hippen Leute von heute nur was im Arduino-(Robo-)Bereich.


    Also nicht aufgeben, es ist nur halt vielleicht mühsamer als woanders. Ich musste das auch selbst gerade erst feststellen. Für ein kleines Projekt nutze ich einen Chip, der noch nicht soooo populär ist. Nur um eine einfaches LCD-Display anzusteuern gabs viel Code der alles unbrauchbar war. Keine einzige Seite hatte die 100% passende Lösung. Nur die Kombination daraus (und ein exotische chinesische Bibliothek für ein eigentlich unpassendes Display) brachte die Lösung. Nur Mut!


    Viel Erfolg,
    Hoc

    Mein Equipment:
    1x Hirn | 2x Augen (leicht defekt) |2x Ohren | 1x Mund |32x Zahn (zum Teil V1.5) | 1x Handundfuß-Interface

    *SCNR*

  • Hallo Hoc, Hallo Stefan,


    zunächst finde ich es toll, daß ich offensichtlich doch Interessierte an meinem Problem und meinem Projekt finde. Ich wußte gar nicht, daß das Thema so exotisch ist. Ich komme aus der Audiobranche. Da gibt es inzwischen so viele Digital-Mischpulte, die mit Motorfadern ausgestattet sind. Ich erwähne als Beispiel nur Yamaha. Was mich fasziniert an diesen Pulten, ist die Schnelligkeit, Präzision und Wiederholbarkeit der Fadersteuerung. Von zwei Yamaha-Pulten habe ich mir die Schaltunterlagen besorgt. Aus diesen habe ich die Hardware-Ansteuerung im Prinzip kopiert. Nichts weiter, als ein Motortreiber, dessen zwei Pins entweder direkt von einem µC kommen oder einem Interface. Der Fader wird meist von einem gemultipexten AD-Wandler abgefragt. Keine weitere Hardware.
    Also alles komplett mit Software gesteuert. Und da es ja sehr viele Firmen sind, die das können, kann es doch nicht so kompliziert sein, eine Software zu entwerfen. Von einem anderen namhaften Mischpulthersteller habe ich erfahren, daß eben die reine Motorsteuerung in Assembler programmiert wird. Ich habe zu DOS-Zeiten auch sehr viel mit Assembler programmiert, aber eben nie bewegliche Teile, wie hier ein Motor. Danach bin ich auf C umgestiegen, was ich recht gut verstehe. Habe sehr viel in C programmiert.
    Meinen ersten Motorfader habe ich so auch mit C programmiert mit der Entwicklungsumgebung C-Control von Conrad, die auf dem ATMEGA32 basiert. Wollte mit diesem Controller gleich 4 Motorfader steuern, was mir aber nicht gelang. Schließlich mußten die Steuerzeiten jeweils durch 4 geteilt werden. Und so bin ich halt wieder bei Assembler angekommen. In den entsprechenden Datenblättern der AVRs sind ja auch entsprechende Assemblerbefehle enthalten, aber keine C-Befehle.
    Man kann wohl auch mit dem STK500, mit dem ich jetzt arbeite, in C programmieren, habe es aber noch nicht versucht.


    Die Hoffnung stirbt zuletzt.


    Herzlichen Gruß,


    Theodor

  • Newly created posts will remain inaccessible for others until approved by a moderator.

    The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.