Hallo, ich habe schon das ganze Internet durchgestöbert, nix gefunden. Vielleicht kann mir hier jemand helfen. Ich möchte 2 Incrementalgeber mit RS422, also A /A,B /B, Z /Z Spuren auf einen Koppler , der daraus ein Signal macht. Sowas gibt es fertig bei dig. Maßstäben, z.b. bei einer Drehbank, weil die ja oft 2 Z Achsen hat, eine am Maschinenbett und eine am Support. Der Nachteil bei fertigen Kopplern ist, dass die Signale 1:1 summiert oder abgezogen werden. Ich bräuchte aber noch einen Getriebefaktor, am besten einstellbar oder fest programmiert. Hat jemand eine Ahnung, wo man sowas kriegt? Danke im Voraus Waschle
Verstehe ich nicht was das mit RS422 zu tun hat. Ein Inkrementalgeber hat ja phasenverschobene Signale. Der RS422-Standard hat keine phasenverschobene Signale, sondern immer nur wenn A positiv ist, dann ist /A negativ und umgekehrt. Oder willst du die Positionen irgendwie codiert übertragen? Ansonsten würde ich einen Mikrocontroller nehmen. Ist recht einfach, sowas zu programmieren. Man könnte z.B. die geringere Geschwindigkeit als Maßstab wählen, aber im Microcontroller mit der höheren Geschwindigkeit zählen, sodaß ein Impuls am Ausgang generiert wird, wenn x Impulse am Eingang mit der höheren Geschwindigkeit reinkommen. Ist allerdings ein wenig von hinten durch die Brust. Wenn deine Steuerungslogik es erlaubt, einfach alle Inkrementalgebersignale reingeben und dort auswerten. Die Lösung mit vorgeschalteten Microcontroller und Neugenerierung der Inkrementalgebersignale finde ich nicht so elegant.
Danke für die schnelle Antwort. Dass das nicht elegant ist, weiß ich. Aber die Steuerung lässt nix anderes zu. Wenn sich die Achse in Lageregelung befindet, regelt sie automatisch nach, wenn sich die Incremente dazuaddieren oder abziehen. Deshalb die vorgeschaltete Box. Waschle
Frank Buss schrieb: > Verstehe ich nicht was das mit RS422 zu tun hat. Waschle schrieb: > Dass das nicht elegant ist, weiß ich. Das gibt es nicht. Zumindest ist es kein RS422. Wie es sein könnte: Decoder -> Codierung -> RS422 Was man dann machen könnte: Decoder -> AVR/Microncontroller (verändert Signale) -> Codierung -> RS422 ^ das wäre dann 'die Box' Das liese sich realisieren. Fertig gibt es sowas mit an Sicherheit grenzender Warscheinlichkeit nicht. Entweder lernst du selbst C + AVR http://www.mikrocontroller.net/articles/AVR http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial oder du beauftragst jemanden hier im Forum mit der Konstruktion eines solchen Projektes. Kostenpunkt mit Material ~ 100-120€ ... je nach Anforderungen an die Einstellbarkeit (evtl. Display, etc)
Du meinst, mit ca 120 Euro wäre ich dabei? Mach ich sofort. Aber nochmal die Anforderung, damit wir vom gleichen reden: Die Encoder liefern die digitalen Spuren a und b, die 90° auseinander liegen. Damit kann man feststellen, wie rum die Encoder drehen. Dann gibt es noch das Z Signal, das kommt einmal pro Umdrehung. Die Topologie ist RS 422. Die Problematik ist folgende: Der eine Encoder liefert zb. 1500 Impulse pro Umdrehung, der andere zb. 4096 Impulse pro Umdrehung. Also müssten meiner Meinung nach (als Programmierlaie) im Microcontroller 2 unabhängige Zähler laufen, die unabhängig für sich vor oder zurückzählen. Die 2 Ergebnisse müssten mit einem Teiler oder Multiplizierer angepasst werden können. Dann werden die 2 Ergebnisse in einem weiteren Zähler summiert. Unter Umständen über eine Anzeige angezeigt werden. Dann aber müssten wieder die Impulse A B und Z ausgegeben werden. Wobei mir Z von einem Geber reichen würde. Also Z wäre aussen vor. Müsste nur durchgeschleift werden. Wo kann ich denn so eine Anfrage stellen, wer mir das machen könnte? Habe ich das hiermit schon getan? Danke mal Waschle
Also RS422 wäre es nicht, wie schon geschrieben, da es bei RS422 keine um 90° phasenverschobene Signale gibt. Wenn du aber noch was zur Spannung der Signale sagst und wie schnell es sein soll, dann kommen wir der Sache schon näher, denn bei 4096 Impulsen pro Umdrehung und Maschinen da dran, die vielleicht auch noch hoch drehen mit vielleicht bis zu 100 Umdrehungen pro Sekunde, wird könnte ein kleiner AVR schon ins schwitzen kommen. Per CPLD sollte es aber auch im MHz-Bereich noch machbar sein. Wenn du es nicht selber bauen willst, dann ist es laut Netiquette besser, wenn du im Markt-Forum nochmal eine Anfrage stellst, am besten mit exakter Anforderungsbeschreibung, damit man auch realistische Angebote machen kann.
Klar gibts die Geber mit RS422, ist halt nur das elektrische Interface. 5V differenzielle Ausgänge. Und davon 3 Stück, also insgesamt 6 Anschlüsse. Aber das voneinander abziehen ist nicht sooo trivial, vor allem bei unterschiedlichen Auflösungen. Und dann muss man es ja auch wieder ausgeben, da muss man dann die unteren beiden Bits des Zählers in Graycode wandeln. Insgesamt würde ich sagen, ist das eher eine Aufgabe für einen FPGA.
Waschle schrieb: > Die 2 Ergebnisse müssten mit einem Teiler oder Multiplizierer angepasst > werden können. Dann werden die 2 Ergebnisse in einem weiteren Zähler > summiert. Unter Umständen über eine Anzeige angezeigt werden. Dann aber > müssten wieder die Impulse A B und Z ausgegeben werden. Hallo Waschle, bis dahin richtig, aber da liegt der Haken - mit welcher Taktrate? Damit das für die Steuerung einen Sinn ergibt, muss man nicht nur die Positionen verrechnen, sondern auch die Taktraten = Verfahrgeschwindigkeiten addieren bzw. subtrahieren und die Ausgabesignale mit einer Taktrate entsprechend der resultierenden Verfahrgeschwindigkeit ausgeben. Das wird viel komplizierter und rechenintensiver als du annimmst. Aber wenn dir das jemand für 120 Euro machen will, schliess sofort einen wasserdichten Vertrag. Gruss Reinhard
Danke Cristian, Christian R. schrieb: > Klar gibts die Geber mit RS422, ist halt nur das elektrische Interface. > > 5V differenzielle Ausgänge. Und davon 3 Stück, also insgesamt 6 > > Anschlüsse Genau so ist es. Noch 2 Anschlüsse für die 5V und Gnd. Christian R. schrieb: > Insgesamt würde ich sagen, ist das eher eine Aufgabe > > für einen FPGA. Wie ist das mit dem FPGA, früher war das so, dass man die Verbindungen durchgeschossen hat, also im prinzip waren das schnelle Logikgatter, nix auf Microcontroller Basis. Ist das heute noch so? Wir könnte man dann aber die unterschiedlichen Auflösungen programmieren? Muss das vorher klar sein? Wäre aber auch nicht tragisch. Ich bräuchte auch nicht unbedingt eine Anzeige. Wäre das prizipiell eine Box mit 2 RS422-> TTL Treibern, den FPGA, bischen drumrum und am Ausgang wieder ein TTL -> RS422 Treiber?
Mag ja sein, daß manche Hersteller von RS422 reden, habe gerade hier einen gefunden: http://tinyurl.com/2vfhcgz , aber laut Wikipedia ( http://de.wikipedia.org/wiki/EIA-422 ) heisst es u.a. "Da beide Leitungen das jeweils zueinander invertierende Sendesignal übertragen, spricht man auch von balanced transmission.". Ich habe jetzt zwar nicht den Standard gelesen, aber auch die verschiedenen Treiber-ICs für RS422 unterstützten keine phasenverschobenen Signale. Ist also wohl einfach nur TTL gemeint, vielleicht mit anderen Spannungen, aber kein RS422 im engeren Sinne. Warum meinst du, man braucht eine Gray-Codierung? Ich würde das sowieso getaktet vorschlagen, z.B. mit 10 MHz oder so und alles synchron in einem process-Block per VHDL auswerten. Sollte noch in ein CPLD reinpassen. Ich habe schon einen 16 Bit Counter, der synchron zu einem externen Takt zählte, mit noch zusätzlicher Logik und SPI-Interface zum Auslesen, in ein XC9572XL reinbekommen, den man für 2 Euro bekommt. FPGAs sind teurer und auch meist komplizierter in der Anwendung, wegen der unterschiedlichen Spannungsversorgungen, meist noch externem notwendigen Konfig-Flash usw. Im XC9572XL ist das Flash schon eingebaut, allerdings nur per externen Prorgammer änderbar. Das Teilerverhältnis könnte man aber per DIP-Switch einstellbar machen.
Reinhard Kern schrieb: > bis dahin richtig, aber da liegt der Haken - mit welcher Taktrate? Damit > > das für die Steuerung einen Sinn ergibt, muss man nicht nur die > > Positionen verrechnen, sondern auch die Taktraten = > > Verfahrgeschwindigkeiten addieren bzw. subtrahieren und die > > Ausgabesignale mit einer Taktrate entsprechend der resultierenden > > Verfahrgeschwindigkeit ausgeben. Das wird viel komplizierter und > > rechenintensiver als du annimmst. Aber wenn dir das jemand für 120 Euro > > machen will, schliess sofort einen wasserdichten Vertrag. Stimmt, das heißt also, gar nicht so viel umwandeln, sondern ganz anders angehen. Nehmen wir mal an, es würde sich um 2 Geber handeln, die die gleiche Auflösung haben. Dann bräuchte man doch nur die Flanken zählen, darauf achten, welche zuerst kommt, damit man weiß, ob aufwärts oder abwärts gezählt wird, und dann ensprechend diese Impulse einfach als + oder - Impulse durchleiten. Kommen 2 + Impulse, werden 2 + Impulse durchgeleitet. Kommt ein - Impuls und eine + Impuls, wird nix durchgeleitet, kommen 2 - Impulse, werden 2 - Impulse durchgeleitet. Liege ich da prinzipiell richtig?
Waschle schrieb: > Stimmt, das heißt also, gar nicht so viel umwandeln, sondern ganz anders > angehen. Nehmen wir mal an, es würde sich um 2 Geber handeln, die die > gleiche Auflösung haben. > Dann bräuchte man doch nur die Flanken zählen, darauf achten, welche > zuerst kommt, damit man weiß, ob aufwärts oder abwärts gezählt wird, > und dann ensprechend diese Impulse einfach als + oder - Impulse > durchleiten. > Kommen 2 + Impulse, werden 2 + Impulse durchgeleitet. Kommt ein - Impuls > und eine + Impuls, wird nix durchgeleitet, kommen 2 - Impulse, werden 2 > - Impulse durchgeleitet. Liege ich da prinzipiell richtig? Vermutlich meint Reinhard, daß es manche Steuerungen gibt, die nicht nur die Quadratursignale auswerten, sondern anhand der Taktrate auch Zwischenwerte berechnen können. Dann würde es tatsächlich aufwendiger werden und man käme wohl auch um ein FPGA nicht drumherum. Dein Ansatz kommt mir merkwürdig vor. Es gibt ja nicht ein + Impuls und ein - Impuls, sondern es müssen zwei eingehende Quadratursignale, die in unterschiedlichen Phasensignalen zueinandern anliegen können, verrechnet werden. Da ist es wahrscheinlich einfacher, das erstmal intern aufzuaddieren und dann neu zu generieren.
Frank Buss schrieb: > Dein Ansatz kommt mir merkwürdig vor. Es gibt ja nicht ein + Impuls und > > ein - Impuls, sondern es müssen zwei eingehende Quadratursignale, die in > > unterschiedlichen Phasensignalen zueinandern anliegen können, verrechnet > > werden. Da ist es wahrscheinlich einfacher, das erstmal intern > > aufzuaddieren und dann neu zu generieren.Beitrag melden | Bearbeiten | Löschen | Ich habe mich nicht gut ausgedrückt. Ich meine das so: Wenn ein Geber zb. 1000 Impulse pro Umdrehung hat, dann sind das in Wirklichkeit 1000 x A und 1000 x B. Jeweils eine ansteigende Flanke und eine fallende Flanke. Die meisten Auswertesyteme arbeiten mit der 4 fach Auswertung, dh. sie zählen alle Flanken, das hat den Vorteil, dass der Geber höher auflöst. Jetzt braucht man ja nur hergehen, und schauen, welche Flanke zuerst kommt, kommt erst A, dass B, zählen wir positiv. Kommt erst B, dann A, zählen wir negativ, das meinte ich mit + und - Impuls. Ist es jetzt verständlicher? Schau mal hier http://www.lamb.de/uploads/media/products/LA-L_L560-562-7-04.pdf Da sind die Signale mal beschieben.
Ok, jetzt macht RS422 auch ein wenig mehr Sinn. Ich war davon ausgegangen, daß die beiden Ausgänge auf den beiden Leitungen einer einzigen RS422-Verbindung übertragen werden, aber scheint so zu sein, daß für A und B jeweils eine extra RS422-Verbindung mit jeweils den zwei differentiellen Leitungen verwendet wird. Daher ist die Idee schonmal gut: zwei RS422-nach-TTL Konverter, dann Microcontroller oder CPLD und danach wieder zwei TTL-nach RS422-Konverter. Mit der Zählung wird aber dennoch nicht so einfach funktionieren, denn es kann auch sein, daß erst eine fallende Flanke auf A kommt, dann eine fallende Flanke auf B, was dieselbe Richtung ist, wie wenn erst eine steigende Flanke auf A kommt, und dann eine steigende Flanke auf B. Daher ist eine einfache Zusammenschaltung auch schon bei zwei Inkrementalgebern mit 1:1 Umsetzung nicht ganz so einfach, insbesondere auch wenn die sich unterschiedlich schnell bewegen können, wovon ich mal ausgehe.
Im Prinzip ist das mit dem FPGA heutzutage noch ähnlich. Allerdings jederzeit wieder programmierbar. Bei hohen Verfahrgeschwindigkeiten kommen an den Gebern nämlich schnell Frequenzen im 100kHz oder gar MHz Bereich zustande. Aber eine grundsätzliche Frage, wieso müssen die Geber unterschiedliche Auflösungen haben, wenn es schon so eine Spezialanwendung sein muss? Die Geber arbeiten ja inkrementell, du willst aber absolute Werte summieren/subtrahieren. Eine Verarbeitung der beiden Geber in der Steuereinheit wäre da wesentlich sinnvoller. Da kann man einfach die gezählten Positionen addieren/subtrahieren.
Frank Buss schrieb: > Vermutlich meint Reinhard, daß es manche Steuerungen gibt, die nicht nur > die Quadratursignale auswerten, sondern anhand der Taktrate auch > Zwischenwerte berechnen können. Nein, ich meine was ganz anderes: eine Steuerung regelt nach dem Stand der Technik den Antrieb mit einem PID-Regler, d.h. sie braucht als Eingangsinformation nicht nur die aktuelle Position, sondern auch die aktuelle Geschwindigkeit (RICHTIG: das ist die Ableitung der Position nach der Zeit!). Damit die Steuerung mit der Summeninformation funktionieren kann, muss also nicht nur die Summe der Impulse am Ausgang der Blackbox der aktuellen Position entsprechen, sondern zugleich muss die Frequenz dieser Ausgangsimpulse der aktuellen Summe der Verfahrgeschwindigkeiten beider Eingänge entsprechen. Ersatzweise kann man auch verlangen, dass die synthetisierte Position in einem sehr engen Zeitraster (ms oder weniger) der aktuellen Summe der beiden Eingänge entspricht, dann berechnet sich die Steuerung die Geschwindigkeit halbwegs korrekt. Nichts was bisher diskutiert wurde kommt auch nur in die Nähe des Problems, aber macht nur weiter mit den 120-Euro-Lösungen, die Wahrheit holt einen spätestens beim Einschalten ein. > Kommen 2 + Impulse, werden 2 + Impulse durchgeleitet. Kommt ein - Impuls > und eine + Impuls, wird nix durchgeleitet, kommen 2 - Impulse, werden 2 > - Impulse durchgeleitet. Liege ich da prinzipiell richtig? Ach ja, und wie bringst du da deine verschiedenen und sogar teilerfremden Auflösungen der Drehgeber unter?? Gruss Reinhard
Reinhard Kern schrieb: >> Kommen 2 + Impulse, werden 2 + Impulse durchgeleitet. Kommt ein - Impuls >> und eine + Impuls, wird nix durchgeleitet, kommen 2 - Impulse, werden 2 >> - Impulse durchgeleitet. Liege ich da prinzipiell richtig? > > Ach ja, und wie bringst du da deine verschiedenen und sogar > teilerfremden Auflösungen der Drehgeber unter?? Wenn´s nur das wäre. So ein Drehgeber hat genau 4 verschiedene Ausgangswerte. Da ist schon mal gar nix mit + und - Pulsen. Die Steuerung bildet aufgrund des aktuellen 2-Bit Wertes und des vorhergehenden Wertes die Zählimpulse für den Positionszähler. Da kann man nicht einfach 2 Geber ineinander wursteln. Denn absolute Werte gibts bei den Gebern nicht. Ich bin mir ziemlich sicher, dass man da auf Geber-Ebene nix machen kann. Gibts übrigens mal einen Link oder Beschreibung so einer "Adapter-Box" die im allerersten Beitrag genannt wurde? Kann mir jetzt erst mal gar nicht vorstellen, wie die aus 2 Gebersignalen eins machen sollte....
Christian R. schrieb: > Wenn´s nur das wäre. So ein Drehgeber hat genau 4 verschiedene > Ausgangswerte. Da ist schon mal gar nix mit + und - Pulsen. Hallo, ganz so ist es auch wieder nicht, man kann natürlich + und - Impulse generieren. Würde also heissen: 1. Stufe : macht aus Quadratursignal pos. und neg. Zählimpulse 2. Stufe : verknüpft Zählimpulse der beiden Drehgeber - es macht eigentlich auch nichts, wenn man alle weitergibt, aber dann müsste man dafür sorgen, dass sich keine Impulse überlappen, das ist auch nicht so einfach. 3. Stufe : steuert mit den Zählimpulsen eine 4-State-Machine, die wieder Quadratursignale ausgibt. Allerdings funktioniert das selbstverständlich nur mit 2 Drehgebern gleicher Schrittweite!! Also nicht im vorliegenden Fall. Völlig ungelöst und von keinem 120 Euro-Entwickler bisher angesprochen ist das Problem der Referenz - die resultierende Referenz kann nur dort sein, wo beide Drehgeber ihren Referenzimpuls abgeben, aber das passiert ja niemals gleichzeitig. Die Drehgeber gemeinsam auf ihren Referenzpunkt zu stellen, wäre ein echtes Kunststück, das den Bediener zum Verzweifeln bringen würde. @Waschle: wäre nett, wenn wir mal erfahren könnten, wieviel Schritte/Sekunde das Ding vertragen soll, das ist nämlich für die Prozessorwahl ziemlich entscheidend. Sofern noch Interesse vorhanden. Gruss Reinhard
Welche Größen sollen die Drehgeber auswerten? Sollen Wege anhand der Drehungen einer Spindel ausgewertet und addiert werden? Wenn ja, würde ich die beiden Drehgeber separat auswerten, den Weg jedes Gebers errechnen, die Wege addieren und als neues Quadratursignal oder auch als numerischen Wert ausgeben. Liege ich mit meiner Vermutung richtig? Dann wären die Indeximpulse Z unbedeutend, wenn man einen Referenzpunkt nach dem Einschalten anfährt.
Vielen Dank für die zahlreichen Antworten. In den Beiträgen steht vieles, was stimmt, aber nicht alles. Die Anwendung ist die folgende: Ich habe mir eine Laserschneidmaschine gekauft, beim Aufstellen haben wir den Rofin Laser umgeschmissen, (kopflastig) Nachdem ich mich seelisch erholt hatte, habe ich beschlossen, aus der Laserschneidmaschine eine Wasserstrahlanlage zu bauen. Habe soweit alles am Laufen, habe auch die alte Steuerung rausgeschmissen, da war eine kapazitive Höhenkorrektur dran. Ist mir bis heute nicht klar, wie die funtionierte, da die Z Impulse der Z Achse direkt in die CNC STuerung ging.Für die Höhenkorrektur habe ich keine Unterlagen. Da ich sowieso unter Wasser schneiden möchte, brauche ich eine mechanische Höhenkorrektur. Und da fiel mir ein, wie ich das bei meiner Fräsmaschine gelöst habe. Dort habe ich Acu Rite Maßstäbe, in der Z Achse eine Pilole und ein verfahrbarer Tisch. Aus dem Abstand der Pinole zum Tisch ergibt sich die Höhe Z. DA man diese Höhe genau kennen muss, war ich gezwungen, 2 Maßstäbe anzubauen, die Signale gehen in einen sogenannten " Maßstabskoppler extern" (soviel zum Thema, gibts nicht) hat 2002 408 € gekostet. Am Eingang 2 x RS422, am Ausgang 1 x RS 422, jeweils mit A,B,Z. Und das funktioniert sehr gut. Wenn sich die Achse im Regelkreis befindet, möchte sie ja immer genau am gleichen Punkt stehen, versuche ich die Achse mit Gewalt zu bewegen, wird sofort gegengesteuert, (PID Regler) Verfahre ich nun den Tisch, der nicht an der CNC Steuerung angeschlossen ist, dann verfährt die Pinole automatisch immer um den gleichen Wert.D.H, der Abstand ist immer der Gleiche. Und das möchte ich mir an der Wasserschneidanlage zu Nutze machen. Dort hat der Z Motor einen Incrementalgeber mit 1024 Impulsen. Aber da ist noch eine Umlenkeinheit mit Zahnriemen und eine Kugelgewindespindel mit 5rer STeigung. Die Verfahrgeschwindigkeit dürfte nicht so hoch sein, ich schätze mal, die macht max. 50mm/sek -> 10 Umdrehungen x1024 Impulse, ist ca 10.000 Impulse/ sek. max. also 40.000 Flanken. (alles geschätzt) Und meine Idee war folgende: ich montiere einen Pneumatik Zylinder, der ganz leicht mit Luft vorgespannt ist, unten ist das Seil eines Seilzugdrehgebers montiert, dessen Zählerwerte in die Berechnung der Höhe mit eingehen. Also im Prinzip gleiche Anwendung wie bei der Fräsmaschine. Wölbt sich das Material, geht die Kolbenstange in den Zylinder, das Seil wird aufgefollt, der Regelkreis versucht, auszugleichen.Und der Abstand zum Material stimmt wieder. Sollte ich keine Lösung finden, werde ich wohl 2 Maßstäbe mit gleicher Auflösung kaufen sowie diese Kopplerbox und das dann so lösen, das kostet aber über 1200 Euro und ist aufwändig.
Laser, Wasser, Pneumatik, ... Je mehr Du schreibst, desto weniger verstehe ich es.
So schwer kann das doch nicht sein. Anderes Beispiel: Du hast einen Drehgeber und eine Digitalanzeige. Drehst du linksrum, wird abwärts gezählt. Drehst du rechtsrum, wird aufwärts gezählt. Nun stell dir vor, du könntest einen 2. Geber anschließen, und auch dran rumdrehen, drehst du den linken und den rechten rechtsrum, wird aufwärts gezählt, andersrum abwärts, und wenn einer linksrum dreht und einer rechtsrum verändert sich der Wert nicht. Alles klar? Kann doch nicht so schwer sein. Es gibt 4 Flanken, 2 ansteigende und 2 abfallende. Anhand der Flanke vorher ist eindeutig festzustellen wie rum gezählt wird. Aus diesem Ergebnis wird ein Zählimpuls generiert. Und zwar ein positiver oder ein negativer. Das ganze 2 mal. Daraus werden neue Impulse generiert, usw. bin leider kein Programmierer..
>und wenn einer linksrum dreht und einer >rechtsrum verändert sich der Wert nicht. Alles klar? Du mußt mit nicht erklären, wie ein Quadraturdekoder funktioniert. Aber wenn sich der eine so und der andere andersherum dreht, wozu dann der ganze Aufwand? Wo ist das Problem?
Mal kurz was ich verstanden habe: der 1 Encoder steuert deine Z-Achse, der 2 Encoder "fühlt" die echte Z-Höhe des Tisches Sinn und Zweck soll es sein die Z-Achse immer im gleichen Abstand zum Tisch zu Regeln. Sowas nennt man einen Tactil Sensor. Ist das so richtig ?
noch nichwach schrieb: > der 1 Encoder steuert deine Z-Achse, > > der 2 Encoder "fühlt" die echte Z-Höhe des Tisches > > > > Sinn und Zweck soll es sein die Z-Achse immer im gleichen > > Abstand zum Tisch zu Regeln. Stimmt genau noch nichwach schrieb: > Sowas nennt man einen Tactil Sensor. habe mal gegoogelt, weiß nicht so recht. Bei den Laser oder Wasserstrahlherstellern nennt man das z.b. automatische Höhenkorrektur
Waschle schrieb: > gezählt wird. Aus diesem Ergebnis wird ein Zählimpuls generiert. > Und zwar ein positiver oder ein negativer. Und genau hier liegt das Problem. EIN Impuls ist erst mal nur EIN Impuls. Dem kann man nicht ansehen ob er nun ein 'positiver' oder ein 'negativer' ist. Deine Steuerung hat also Anschlüsse für die Encoder, die elektrisch gleich zu einer RS422 sind. Nur: wie ist die Signalform? Wie müssen die Pulse aussehen, damit die Steuerung 'positiv' von 'negativ' auseinanderhalten kann. RS422 kanns nicht sein, denn RS422 in seiner eigentlichen Form funktioniert ganz anders (was nicht bedeutet, dass man sich nicht die elektrische Spezifikation davon klauen kann, was hier offenbar geschehen ist) Und damit sind wir beim nächsten Teil, den du noch gar nicht angesprochen hast: Welche Steuerung hast du denn schon? Irgendwas musst du ja schon haben, sonst würdest du ja kein elektrisches RS422 fordern mit dem die Geber an die Steuerung angeschlossen werden.
Karl heinz Buchegger schrieb: > EIN Impuls ist erst mal nur EIN Impuls. Dem kann man nicht ansehen ob er > > nun ein 'positiver' oder ein 'negativer' ist. Falsch , siehe http://www.lamb.de/uploads/media/products/LA-L_L560-562-7-04.pdf, seite 3 nach einer fallenden Flanke von A kommt entweder eine fallende Flanke von b oder eine steigende Flanke, das ist eindeutig, und in jeder Stellung so. Man kann das genau nachvollziehen, man muss sich nur die Stellung davor merken, bevor man sagt, des ist positiv oder negativ. Diese -Signalanordnung in den Gebern ist genormt. Die ist in jedem Geber gleich. Nur die Topologie ist unterschiedlich: TTL, HTL, RS422 usw.
Höhenkorektursensor ist OK. Bei Dispensern nennt man das Tactilsensor. Es gibt da viele Möglichkeiten sowas zu realisieren. Der Tactile funktioniert mit einem Schalter, der bei Abweichung nach unten (Freiraum) Abschaltet und somit der Z-Achse signalisiert weiter nach unten zu Fahren. Nachteil: er muss von Hand auf die gewünschte Tiefe eingestellt werden. Laser Sensor (scheidet im Wasser ja aus) Mechanisch, mit einer Pinole (Zahnstange und Encoder) also wie du es vorhast geht es wohl am Preiswertesten. Die Elektronik muss nun nach z.B. Tastendruck die Differenz der beiden Encoder halten und bei Abweichung dieser Differnz (Tisch uneben, oder Portal Paralelität) der Steuerung "Vorgaukeln" das der Z-Encoder sich bewegt hat.
Rafael Engelbrecht schrieb: > Karl heinz Buchegger schrieb: >> EIN Impuls ist erst mal nur EIN Impuls. Dem kann man nicht ansehen ob er >> >> nun ein 'positiver' oder ein 'negativer' ist. > Falsch , siehe > http://www.lamb.de/uploads/media/products/LA-L_L560-562-7-04.pdf, seite > 3 > nach einer fallenden Flanke von A kommt entweder eine fallende Flanke > von b oder eine steigende Flanke, das ist eindeutig, und in jeder > Stellung so. Die Rede war von EINEM Impuls auf 1 Leitung (bei RS422 auf 2 Leitungen, weil differentielle Übertragung)! Du gehst von ZWEI Impulsen auf 2 Leitungen (bei RS422 auf 4 physikalischen Kabeln) aus! Was genau will deine Steuerung haben? Hat die für EINEN Encoder 4 Eingänge oder nur 2? Und bitte hör auf uns zu erklären, wie ein Enocder funktioniert. Das wissen hier fast alle. Die eigentliche Frage, auf die sich keiner einen Reim machen kann lautet: Wie genau funktioniert denn die Übertragung zur Steuerung? Und was hat RS422 damit zu tun? Denn danach richtet sich, was denn hinter die Encoder muss um die Signale für die Steuerung aufzubereiten. Das hängt aber in erster Linie davon ab, was die Steuerung haben will! Daher nochmal die Frage: Welche Steuerung hast du denn?
Hm, also mit dem Begriff "Maßstabskoppler extern" finde ich bei Google nix sinnvolles. Aber ich denke, die Triviallösung für 2 Geber gleicher Auflösung könnte so funktionieren. Allerdings mit gewissen Rahmenbedingungen, so wie ich das sehe, darf sich dann immer nur ein Geber bewegen, damit das hinhaut. Die Lösung für unterschiedliche Auflösungen ist komplizierter. Dazu würde ich in einem FPGA die beiden Geber erst mal dekodieren, bei jedem Schritt gibts einen Zählpuls und das Richtungssignal. Daran ein up/down Zähler angeschlossen, und an dessen Ausgang ein "Gleichrichter", der den Absolutwert des Zählers bildet. Danach ein Komparator, der den Absolut-Zählerstand mit deinem Korrekturfaktor vergleicht. Ist der Zähler am Korrekturfaktor angekommen, wird ein Impuls erzeugt und der Zähler wieder auf Null gesetzt. Die Richtung muss dann wieder aus dem obersten Bit des up/down Zählers bestimmt werden. Somit gibts dann nach x absolut zurück gelegten Schritten einen neuen Impuls, und du hast die Geber-Auflösung geteilt. Die so neu generierten Pulse dann wie im Trivial-Koppler ODER-Verknüpfen und auf einen 2-Bit up/dwon Zähler mit anschließendem Gray-Encoder schicken. Das RS422 ist doch nur die elektrische Seite, haben fast alle industriellen Drehgeber, damit man das Signal nach 100m Kabel immer noch sauber übertragen bekommt. Das hat mit dem eigentlichen Problem überhaupt gar nix zu tun.
Karl heinz Buchegger schrieb: > Und bitte hör auf uns zu erklären, wie ein Enocder funktioniert. Das > > wissen hier fast alle. Die eigentliche Frage, auf die sich keiner einen > > Reim machen kann lautet: Wie genau funktioniert denn die Übertragung zur > > Steuerung? Und was hat RS422 damit zu tun? Denn danach richtet sich, was > > denn hinter die Encoder muss um die Signale für die Steuerung > > aufzubereiten. Das hängt aber in erster Linie davon ab, was die > > Steuerung haben will! Sorry, aber das scheint nicht so zu sein, zumindest Du scheinst es nicht zu wissen, von was ich rede. Sonst würdest du nicht diese Art von Fragen stellen, ( welche Steuerung) das spielt nämlich überhaupt keine Rolle! Ein Inrecmentalgeber mit einem RS 422 Ausgang ist genormt, auch, wenn ich mir wiederhole. Da dürfte es von Deiner Seite nicht eine einzige Frage geben! Karl heinz Buchegger schrieb: > Die Rede war von EINEM Impuls auf 1 Leitung (bei RS422 auf 2 Leitungen, > > weil differentielle Übertragung)! > > Du gehst von ZWEI Impulsen auf 2 Leitungen (bei RS422 auf 4 > > physikalischen Kabeln) aus! > > > > Was genau will deine Steuerung haben? > > Hat die für EINEN Encoder 4 Eingänge oder nur 2? Nochmal zur Xten Wiederholung. Es sind immer 2 Spursignale A und B, und einmal pro Umdrehung ein Impuls Z. Also hat die Steuerung immer 3 Eingänge. Aber das weiß ja jeder.
Rafael Engelbrecht schrieb: > Sorry, aber das scheint nicht so zu sein, zumindest Du scheinst es nicht > zu wissen, von was ich rede. WEnn du dich etwas besser ausdrücken würdest, dann wäre das so. Da du allerdings die meiste Zeit nur Bla-Bla von dir gibst, ist das eben nicht so. > Nochmal zur Xten Wiederholung. Es sind immer 2 Spursignale A und B, und > einmal pro Umdrehung ein Impuls Z. Also hat die Steuerung immer 3 > Eingänge. Das kann nicht sein. Denn RS422 verwendet pro Signal 2 physikalische Kabel. Genau das ist nämlich der Witz an RS422 - die symetrische Übertragung EINES Signals auf 2 Kabel wodurch man Störungen ausfiltern kann. Und auf EINER Signalleitung (also 2 physikalischen Kabeln) kann man nun mal nicht die A-Spur und die B-Spur gleichzeitig übertragen. Das geht nun mal nicht, selbst wenn du das noch so gerne wolltest. Also muss deine Steuerung 6 Eingänge haben (die möglicherweise in 3 Buchsen zusammengefasst sind) > Aber das weiß ja jeder. Na, wenn es ohnehin jeder weiß, wo liegt dann das Problem? Du brauchst offenbar eine Umsetzung von TTL (oder was auch immer deine Encoder liefern) auf RS422 Pegel. Einfach mal danach googeln und du wirst fündig. Alles natürlich nur unter der Voraussetzung, dass deine Enocder mehr oder weniger direkt an die Steuerung angeschlossen werden und die Steuerung selber die Auswertung der Pulslage macht. Tut sie das aber nicht, dann musst du dir was einfallen lassen. Und genau dazu muss man dann wissen, was denn die Steuerung wirklich haben will.
Karl heinz Buchegger schrieb: > Das kann nicht sein. > Denn RS422 verwendet pro Signal 2 physikalische Kabel. Genau das ist > nämlich der Witz an RS422 - die symetrische Übertragung EINES Signals > auf 2 Kabel. Naja, nun stell dich mal nicht so an. :) Bei solchen Gebern ist einfach jedem der 3 Signale ein RS422 Treiber nachgeschaltet. Jedes Signal für sich bildet sozusagen eine RS422 Strecke. Daher insgesamt 6 Signalleitungen zzgl. Betriebsspannung. Aber das hat wie gesagt mit dem eigentlichen Problem überhaupt gar nix zu tun, hier gehts um die Differenzbildung der Signale aus 2 Gebern, auf unterster Ebene, die dazu auch noch verschiedene Auflösungen haben sollen. Das RS422 ist nur ein winziger Nebeneffekt.
Christian R. schrieb: > Karl heinz Buchegger schrieb: >> Das kann nicht sein. >> Denn RS422 verwendet pro Signal 2 physikalische Kabel. Genau das ist >> nämlich der Witz an RS422 - die symetrische Übertragung EINES Signals >> auf 2 Kabel. > > Naja, nun stell dich mal nicht so an. :) Bei solchen Gebern ist einfach > jedem der 3 Signale ein RS422 Treiber nachgeschaltet. Das sehe ich auch so. Zumindest lese ich das so raus > Jedes Signal für > sich bildet sozusagen eine RS422 Strecke. Daher insgesamt 6 > Signalleitungen zzgl. Betriebsspannung. > > Aber das hat wie gesagt mit dem eigentlichen Problem überhaupt gar nix > zu tun, hier gehts um die Differenzbildung der Signale aus 2 Gebern, auf > unterster Ebene, die dazu auch noch verschiedene Auflösungen haben > sollen. Gut dann formuliere ich das eigentliche Problem neu: gesucht ist eine Schaltung, die man zwischen Enocder und RS422 Leitung klemmt. Aufgabe der Schaltung ist es Die Enocder-Signale auszuwerten Mit den Werten eine Transformation durchzuführen (die Werte zu verändern) Mit diesen neuen Werten neue (gefakte) Encodersignale zu erzeugen Diese neuen Enocdersignale per RS422 der Steuerung als eigentliche Encodersignale unterzujubeln Und? War das jetzt so schwer für den TO, diese Aufgabe einmal klar und deutlich zu formulieren?
Christian R. schrieb: > Naja, nun stell dich mal nicht so an. :) Bei solchen Gebern ist einfach > jedem der 3 Signale ein RS422 Treiber nachgeschaltet. Jedes Signal für > sich bildet sozusagen eine RS422 Strecke. Daher insgesamt 6 > Signalleitungen zzgl. Betriebsspannung. Genau so ist es. > Aber das hat wie gesagt mit dem eigentlichen Problem überhaupt gar nix > zu tun, hier gehts um die Differenzbildung der Signale aus 2 Gebern, auf > unterster Ebene, die dazu auch noch verschiedene Auflösungen haben > sollen. Das RS422 ist nur ein winziger Nebeneffekt. auch das stimmt so. Ich habe aber inzwischen das Gefühl, dess es doch ganz schön aufwändig wird. Ich werde morgen mal die Hersteller von Inkrementalgebern anrufen, vielleicht gibt es das ja schon fertig. Das muss es geben, jede Drehbank, die mit Glasmaßstäben nachgerüstet wird, braucht in der Z Achse 2 Glasmaßstäbe die zusammen in die Messung eingehen. Nur wird meistens das ganze im Anzeigegerät gemacht, was ich aber nicht brauchen kann.
Jo so in etwa. Für manche ist das halt schwer. Speziell Leuten, die keine ingenieurstechnische Ausbilung haben, fällt es oft schwer, ein Problem auf das wesentliche herunter zu brechen und es somit anderen verständlich zu machen. Wie so etwas aussehen könnte, hab ich ja oben schon mal angedeutet. Bei unterschiedlichen Gebern kann dabei der Aufwand schnell sehr groß werden.
Rafael Engelbrecht schrieb: > Das muss es geben, jede Drehbank, die mit Glasmaßstäben nachgerüstet > wird, braucht in der Z Achse 2 Glasmaßstäbe die zusammen in die Messung > eingehen. > Nur wird meistens das ganze im Anzeigegerät gemacht, was ich aber nicht > brauchen kann. Meine Rede. Inkrementalgeber auf Geber-Ebene so zu "verrechnen" ist meiner Meinung nach ziemlicher Murks. Das macht man in der Auswertung. Solche Drehbänke haben garantiert 2 Geber-Eingänge pro Achse und dann wirds nach dem Zählen verrechnet.
Ich denke nicht, daß es sowas fertig gibt, denn ist doch viel besser, und auch einfacher, wenn das alles in der Steuerung zusammenkommt und dort dann optimal verrechnet wird. Aber ich verstehe das richtig: Du hast eine Maschine aufgebaut und da ist dann der Laser kaputt gegangen beim Aufbau. Statt das der Versichrung zu melden oder meinetwegen auch beim Hersteller einen neuen Laser zu kaufen, falls die Versicherung das nicht abdeckt, baust du also die gesamte Maschine mit einer anderen Technologie um, die jetzt nicht richtig läuft?
Frank Buss schrieb: > Aber ich verstehe das richtig: Du hast eine Maschine aufgebaut und da > > ist dann der Laser kaputt gegangen beim Aufbau. Statt das der > > Versichrung zu melden oder meinetwegen auch beim Hersteller einen neuen > > Laser zu kaufen, falls die Versicherung das nicht abdeckt, baust du also > > die gesamte Maschine mit einer anderen Technologie um, die jetzt nicht > > richtig läuft? Der Laser mit Verfahreinheit (Mittelformat 2500 x 1250 mm Verfahrbereich) kostete 1992 ca 1.000.000 DM, Der Laser an sich von Rofin ist beim Aufstellen umgefallen, alle Glasröhren kaputt, Rep. mind. 40.000 Euro, die ganze Maschine hatte ich für 11.000 Euro gekauft, es gibt keine Versicherung, die sowas übernimmt, ich hatte alles versucht. Und die neue Maschine läuft, ich wollte nur noch zusätzlich eine automatische Höhenkorrektur einbauen. Frank Buss schrieb: > Ich denke nicht, daß es sowas fertig gibt, denn ist doch viel besser, > > und auch einfacher, wenn das alles in der Steuerung zusammenkommt und > > dort dann optimal verrechnet wird. Doch, gibt es, ich habe es ja, nur nicht mit unterschiedlichen Auflösungen. Morgen werde ich mehr wissen, da rufe ich mal durch, falls die alle schon wieder arbeiten. Nochmals Danke für die vielen Anregungen und Antworten Waschle.
Ich wiederhole es noch einmal: >Wenn ja, würde ich die beiden Drehgeber separat auswerten, den Weg jedes >Gebers errechnen, die Wege addieren und als neues Quadratursignal oder >auch als numerischen Wert ausgeben.
Karl heinz Buchegger schrieb: > War das jetzt so schwer für den TO, diese Aufgabe einmal klar und > deutlich zu formulieren? Diese ganze Stellungnahme ist völlig überflüssig, die ganze Aufgabe war so etwa 2 - 3 m weiter oben schon völlig klar, aber dann hast du mit deinem totalen Unverständnis von RS422 alles zerredet. Dass ein Drehgeber mit RS422 alle 3 Signale auf RS422-Differentialleitungen umsetzt und folglich 6 Anschlussdrähte hat, ist so trivial, dass man schon annehmen muss, du interpretierst das absichtlich falsch, um die Diskussion aufzumischen. Gruss Reinhard
Das tolle an so einem exteren Koppler ist eben, dass die Achse vollautomatisch nachregelt, ohne, dass man in die Steuerung eingreifen muss. Ich würde das nicht behaupten, wenn ich das nicht schon an einer anderen Maschine hätte, das geht wirklich einwandfrei. Im schlimmsten Fall kaufe ich mir halt wieder den Koppler, den ich schon mal habe, aber da muss ich auf 2 gleiche Meßsysteme umstellen.
Kakadu schrieb: > Ich wiederhole es noch einmal: > >>Wenn ja, würde ich die beiden Drehgeber separat auswerten, den Weg jedes >>Gebers errechnen, die Wege addieren und als neues Quadratursignal oder >>auch als numerischen Wert ausgeben. Genau da liegt ja das Problem. Das sind Inkrement-Geber und keine Absolutwergeber. Da kann man nicht einfach was addieren. Zumindest nicht, wenn es über 4 Schritte hinaus geht, denn mehr Zustände bekommt man nicht aus den 2 Bit. Und seine Steuerung erwartet ja nur die 2 Bits. Denn das ganze muss ja live passieren und nicht irgendwie erst wenn man paar tausend Impulse gezählt hat, denn da hängt ja eine Regelung dran.
>Das sind Inkrement-Geber
Ich habe tagtäglich mit Inkremtalgebern zu tun. Damit geht das.
Kakadu schrieb: > Ich habe tagtäglich mit Inkremtalgebern zu tun. Damit geht das. Hallo Kakadu, das scheint hoffnungslos zu sein - es gibt hier 2 übermächtige Fraktionen, die einen wissen nicht, was ein Drehgeber ist, und die anderen wissen nicht, was RS422 ist. Die verschwindende Minderheit, die weiss worum es geht, wird einfach niederdiskutiert. Waschle kann einem leid tun, entweder gibt er jemandem 100 Euro für eine Nonsense-Schaltung oder er muss sich selbst helfen. Aber wahrscheinlich ist er dazu auch in der Lage, denn er hat wohl begriffen, dass das mit den verschiedenen Auflösungen ein viel komplexeres Problem ist, und dass er also am besten fährt, wenn er seinen Inkrementalmixer nimmt und beide Teil-Achsen mit gleicher Schrittweite betreibt. Ich denke, ich könnte das mit unterschiedlichen Schritten schon konstruieren, aber es würde um Grössenordnungen teurer als hier veranschlagt und wäre auch nach meiner eigenen Meinung rausgeworfenes Geld - man muss ja ein Problem nicht teuer lösen, wenn man es auch vermeiden kann. Hornberg lässt grüssen. Gruss Reinhard
wenn die STeuerung zwei Eingänge für die betreffende Achse hat muss man die zwei Signale ja auch nicht mischen, sondern man kann doch auch das schnellere runterteilen so dass die Signale "gleich schnell" sind
Walter schrieb: > wenn die STeuerung zwei Eingänge für die betreffende Achse hat muss man > die zwei Signale ja auch nicht mischen, sondern man kann doch auch das > schnellere runterteilen so dass die Signale "gleich schnell" sind Hallo, ich bedanke mich für die umgehende Bestätigung meiner Einschätzung zu dieser Diskussion. Gruss Reinhard
also Leute, mit was glaubt Ihr dass ich mein Geld verdiene. Richtig......, u.A. baue ich Inkrementaladdierer für Meßsysteme. Natürlich für TTL-Ähnliche Differenzleitungssignale nach RS422. Aber nicht in diesem Forum. Das Prinzip wäre einfach zu erklären und ist etwa so alt wie die Fa. Heidenhain Maßstäbe baut. Es sind allerdings schon einige IC's notwendig. Wenn der Teilfaktor einstellbar und zu dem noch ungerade sein muss, wird es noch etwas aufwändiger.
>sondern man kann doch auch das >schnellere runterteilen so dass die Signale "gleich schnell" sind Mich würde diese Schaltung interessieren. Nehmen wir eine Teilung von 1:4,45 an :-) >aber es würde um Grössenordnungen teurer als hier veranschlagt und Das müßte nicht unbedingt so sein. Es gibt Prozessoren, die zwei Quadraturdekoder auf dem Chip haben und problemlos die Eingangssignale erfassen können. Die "Verarbeitung" und Erzeugung eines Ausgangssignals könnten locker mit 50kHz ablaufen - schneller als die Signale am Eingang hier zu sein scheinen. Ein ATXmega könnte das auch schon schaffen. Aber Waschle kann seine Aufgabe auch mit mehreren Anläufen nicht klar beschreiben. Für ihn ist alles selbstverständlich, aber wenn er eine Frage formuliert, muß er es dem Adressaten verständlich machen. Der Zeitaufwand das zu klären, was gefordert wird, wäre das Teure an einer Lösung; nicht die paar Zeilen Code und die paar Chips.
Josef Huber schrieb: > Das Prinzip wäre einfach zu erklären und ist etwa > so alt wie die Fa. Heidenhain Maßstäbe baut Dann klär uns doch bitte mal auf, nach welchem Prinzip und unter welchen Randbedingungen die arbeiten.
Kakadu schrieb: >>sondern man kann doch auch das >>schnellere runterteilen so dass die Signale "gleich schnell" sind > > Mich würde diese Schaltung interessieren. > Nehmen wir eine Teilung von 1:4,45 an :-) z.B. ein Attiny, hat doch max. 6 Ein/Ausgänge, passt also exakt
>z.B. ein Attiny, hat doch max. 6 Ein/Ausgänge, passt also exakt
@Walter
Wir haben heute erst den 4.01..
Hättest Du mit Deinem Beitrag nicht bis zum 1.04. warten können?
Warum sollte es nicht mit einem Attiny gehen? Die Arithmetik ist trivial. Unten mal ein erster Versuch. Man kann die Anzahl Impulse pro Umdrehung für beide Eingänge per Variable festlegen (und mit einem fetteren Microprozessor somit z.B. per Hex-Codierer auch außen einfach einstellbar machen, aber so oft ändert sich die Mechanik ja wahrscheinlich nicht) und auch noch eine Umsetzung auf den Ausgang definieren. Ist die Umsetzung auf den Ausgang kleiner als max(STEPS1, STEPS2), dann werden mehrere Schritt-Signale mit hoher Frequenz generiert (so schnell wie die Schleife läuft), wenn sich der niedrig aufgelöste Drehgeber bewegt. Ist die Umsetzung >= max(STEPS1, STEPS2), dann werden die Schritte von dem höher aufgelösten Drehgeber solange akkumuliert, bis sich ein Schritt als Ausgang ergibt. So zumindest die Idee, ist aber ungetestet, sind also garantiert noch Fehler drin :-) Jetzt müsste das mal einer auf einen Attiny aufspielen.
1 | #include <stdint.h> |
2 | |
3 | // Anzahl Impulse pro Umdrehung für Eingang A1/B1
|
4 | #define STEPS1 1500
|
5 | |
6 | // Anzahl Impulse pro Umdrehung für Eingang A2/B2
|
7 | #define STEPS2 4096
|
8 | |
9 | // Anzahl Impulse pro Umdrehung für den Ausgang
|
10 | #define OUTPUT_STEP STEPS2
|
11 | |
12 | // Tabelle für alle Zustandübergange der Eingänge,
|
13 | // abgebildet auf die Zählrichtung
|
14 | // A oldA B oldB Zähler
|
15 | // 0 0 0 0 0
|
16 | // 0 0 0 1 1
|
17 | // 0 0 1 0 -1
|
18 | // 0 0 1 1 0
|
19 | // 0 1 0 0 -1
|
20 | // 0 1 0 1 0
|
21 | // 0 1 1 0 0
|
22 | // 0 1 1 1 1
|
23 | // 1 0 0 0 1
|
24 | // 1 0 0 1 0
|
25 | // 1 0 1 0 0
|
26 | // 1 0 1 1 -1
|
27 | // 1 1 0 0 0
|
28 | // 1 1 0 1 -1
|
29 | // 1 1 1 0 1
|
30 | // 1 1 1 1 0
|
31 | static int8_t g_delta[16] = { |
32 | 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 |
33 | };
|
34 | |
35 | // Tabellen für die Generierung der Quadratursignale am Ausgang
|
36 | static uint8_t g_outA[4] = { |
37 | 1, 0, 0, 1 |
38 | };
|
39 | static uint8_t g_outB[4] = { |
40 | 1, 1, 0, 0 |
41 | };
|
42 | |
43 | // liefert die Richtung, in der sich ein Drehgeber gedreht hat: -1, 1 oder 0
|
44 | int8_t getDelta(uint8_t a, uint8_t oldA, uint8_t b, uint8_t oldB) |
45 | {
|
46 | return g_delta[oldB | (b << 1) | (oldA << 2) | (a << 3)]; |
47 | }
|
48 | |
49 | uint8_t getA1() |
50 | {
|
51 | // TODO: abhängig vom Microcontroller
|
52 | return 0; |
53 | }
|
54 | |
55 | uint8_t getB1() |
56 | {
|
57 | // TODO: abhängig vom Microcontroller
|
58 | return 0; |
59 | }
|
60 | |
61 | uint8_t getA2() |
62 | {
|
63 | // TODO: abhängig vom Microcontroller
|
64 | return 0; |
65 | }
|
66 | |
67 | uint8_t getB2() |
68 | {
|
69 | // TODO: abhängig vom Microcontroller
|
70 | return 0; |
71 | }
|
72 | |
73 | void setOutA(uint8_t value) |
74 | {
|
75 | // TODO: abhängig vom Microcontroller
|
76 | }
|
77 | |
78 | void setOutB(uint8_t value) |
79 | {
|
80 | // TODO: abhängig vom Microcontroller
|
81 | }
|
82 | |
83 | int main(int argc, char** argv) |
84 | {
|
85 | int16_t counter = 0; |
86 | uint8_t oldA1 = getA1(); |
87 | uint8_t oldB1 = getB1(); |
88 | uint8_t oldA2 = getA2(); |
89 | uint8_t oldB2 = getB2(); |
90 | uint8_t outIndex = 0; |
91 | while (1) { |
92 | // wenn Eingang 1 für einen Schritt eine Einheit zählt, dann entspricht
|
93 | // ein Schritt für Eingang 2 1500/4096 Einheiten.
|
94 | // Wenn somit ein Schritt an Eingang 1 4096 Einheiten sind, dann entspricht
|
95 | // ein Schritt an Eingang 2 1500 Einheiten.
|
96 | |
97 | // Eingang A1/B1 auswerten
|
98 | uint8_t a1 = getA1(); |
99 | uint8_t b1 = getB1(); |
100 | int8_t delta1 = getDelta(a1, oldA1, b1, oldB1); |
101 | if (delta1 < 0) counter -= STEPS2; |
102 | if (delta1 > 0) counter += STEPS2; |
103 | oldA1 = a1; |
104 | oldB1 = b1; |
105 | |
106 | // Eingang A2/B2 auswerten
|
107 | uint8_t a2 = getA2(); |
108 | uint8_t b2 = getB2(); |
109 | int8_t delta2 = getDelta(a2, oldA2, b2, oldB2); |
110 | if (delta2 < 0) counter -= STEPS1; |
111 | if (delta2 > 0) counter += STEPS1; |
112 | oldA2 = a2; |
113 | oldB2 = b2; |
114 | |
115 | // Ausgangssignal per Modulo-Arithmetik generieren
|
116 | if (counter > OUTPUT_STEP) { |
117 | counter -= OUTPUT_STEP; |
118 | if (outIndex < 3) outIndex++; else outIndex = 0; |
119 | }
|
120 | if (counter < -OUTPUT_STEP) { |
121 | counter += OUTPUT_STEP; |
122 | if (outIndex > 0) outIndex--; else outIndex = 3; |
123 | }
|
124 | setOutA(g_outA[outIndex]); |
125 | setOutB(g_outB[outIndex]); |
126 | }
|
127 | return 0; |
128 | }
|
Ist ja interessant, dass sich doch noch jemand dafür interessiert, ob man das machen kann. Frage zu der Tabelle mit den Zustandsübergängen. du schreibst von 16 verschiedenen Möglichkeiten, aber ich komme nur auf 8. Also pro Zählrichtung 4 , oder ist die Tabelle für beide Geber? oder verstehe ich das falsch? Bin kein Programmierer. Wass heißt oldA oldB? Frank Buss schrieb: > // Tabelle für alle Zustandübergange der Eingänge, > > // abgebildet auf die Zählrichtung > > // A oldA B oldB Zähler > > // 0 0 0 0 0 > > // 0 0 0 1 1 > > // 0 0 1 0 -1 > > // 0 0 1 1 0 > > // 0 1 0 0 -1 > > // 0 1 0 1 0 > > // 0 1 1 0 0 > > // 0 1 1 1 1 > > // 1 0 0 0 1 > > // 1 0 0 1 0 > > // 1 0 1 0 0 > > // 1 0 1 1 -1 > > // 1 1 0 0 0 > > // 1 1 0 1 -1 > > // 1 1 1 0 1 > > // 1 1 1 1 0
Rafael Engelbrecht schrieb: > Frage zu der Tabelle mit den Zustandsübergängen. > du schreibst von 16 verschiedenen Möglichkeiten, aber ich komme nur auf > 8. Die 4 Bit, also 16 Zustände sind der aktuelle und der vorhergehende Zustand des Gebers. Nur so kann man feststellen ob und wohin er sich bewegt hat.
Ich habe jetzt mal ein wenig mit Drehgebern experimentiert, da ich vorher damit noch nie was mit gemacht habe. Hier ein Projekt mit Anzeige der Drehgeberposition per Grafikdisplay, einem recht netten und einfach anzusteuernden OLED-Display: http://www.frank-buss.de/attiny/index.html Da mich das Problem hier interessiert hat, habe ich dann mal unverbindlich versucht, es zu lösen. Zunächst mit einem PCI16F628 und dem C-Code von oben, zwei angeschlossenen Drehgebern und dann das neu generierte Drehgeber-Ausgangssignal in die andere Schaltung zur Anzeige eingespeist. Im Prinzip funktionierte das auch, aber als ich den Zeitbedarf der Hauptschleife ausgemessen habe (per Pin-Toggling und Oszilloskop), kam ich auf eine maximal mögliche Frequenz von ca. 3 kHz bei 18 MHz Takt für die CPU. Der generierte Assembler sieht auch nicht besonders gut aus, aber viel besser kann man es selbst in Assembler wohl auch nicht schreiben, da die CPU leider nur 8-Bit Register kennt und auch einen umständlichen Befehlssatz hat. Vielleicht würde man auf 20 kHz oder so kommen, schätze ich mal, was aber dann noch weit weg von den notwendigen 40 kHz wäre. Und wenn 40 kHz die maximale Impulsfrequenz ist, dann wäre es schon gut, wenn man da noch ein mehrfaches drüberliegt mit der Abtastfrequenz, für eine sichere Erkennung. Ich habe das daher mal in VHDL programmiert, siehe Code unten. ISE sagt mir, die maximale Frequenz für die clock-Leitung liegt bei ca. 8 MHz (der XC9572XL-10-TQ100 ist übrigens zu 78% belegt mit der Anwendung, bleibt aber natürlich kühl bei den niedriegen Takten). Ich habe mal einen 4 MHz Quarz angeschlossen und läuft damit prima. Da im dem CPLD nicht viel Platz ist, musste ich die Abarbeitung noch serialisieren, statt wie in C parallel beide Drehgeber pro Durchlauf zu testen, sodaß die Abtastrate effektiv bei 1/3, also ca. 1,3 MHz liegt. Da hat man dann genügend Reserve, auch für schnelle Drehgeber. Geflasht ist das ganze auf einem kleinen Board, wo der CPLD verlötet ist und das über eine 20-polige Pfostenleiste verfügt, um die Versorgungsspannung und die Signale anzuschließen. Sind außerdem noch zwei LEDs drauf, von denen ich die rote bei jedem Wechsel irgendeines der Drehgeber-Eingänge jeweils invertiere. Außerdem sind zwei Taster drauf, die aber aktuell die grüne LED anschalten, solange der Taster gedrückt gehalten wird. Anbei ein Foto des Testaufbaus. Wie erwartet wird der erste Drehgeber 1:1 zur Anzeige durchgegeben und die Position des zweiten Drehgebers ca. durch drei geteilt (also ein Zählschritt alle drei Impulse) bei dem 4096:1500 Verhältnis. Kommt also gut hin. Wer möchte, dem schicke ich das programmierte CPLD-Board. Die Signaleingänge können sowohl mit 5 V, als auch mit 3,3 V betrieben werden. Die beiden Ausgangssignale haben 3,3 V und die Versorgungsspannung des CPLD-Moduls ist 3,3 V. Man braucht außerdem noch einen Quarz. Für die RS422-Umsetzung müsste man auch noch insgesamt 4 RS422-Receiver und 2 RS422-Transmitter haben. Könntest du dir auf Lochraster aufbauen, oder ich kann ich dir das auch alles professionell zusammen auf einer geätzten Platine aufbauen, was wohl besser wäre, damit das auch was haltbarer ist. Falls Interesse, dann eMail an mich. Könnte man dann auch vom Quarz her und dem Rest der Schaltung alles auf 3,3 V auslegen. Oder ich kann ich dir auch einfach das programmierte CPLD-Board mit Flachbandkabel, den 4 MHz Quarz, 5 V Spannungsregler (für den Quarz) und 3,3 V Spannungsregler (für den CPLD, nebst Kondensatoren) für 50 Euro schicken, falls du den Rest selber aufbauen möchtest. Hier der VHDL-Code:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | entity main is |
6 | port( |
7 | -- Takteingang |
8 | clock: in std_logic; |
9 | |
10 | -- Eingänge für den ersten Drehgeber |
11 | inA1: in std_logic; |
12 | inB1: in std_logic; |
13 | |
14 | -- Eingänge für den zweiten Drehgeber |
15 | inA2: in std_logic; |
16 | inB2: in std_logic; |
17 | |
18 | -- Drehgeber Ausgang |
19 | outA: out std_logic; |
20 | outB: out std_logic; |
21 | |
22 | -- Anschlüsse auf dem Board |
23 | greenLED: out std_logic; |
24 | redLED: out std_logic; |
25 | switch1: in std_logic; |
26 | switch2: in std_logic |
27 | ); |
28 | end main; |
29 | |
30 | architecture rtl of main is |
31 | -- Anzahl Impulse pro Umdrehung für Eingang A1/B1 |
32 | constant STEPS1: integer := 1500; |
33 | |
34 | -- Anzahl Impulse pro Umdrehung für Eingang A2/B2 |
35 | constant STEPS2: integer := 4096; |
36 | |
37 | -- Anzahl Impulse pro Umdrehung für Eingang A2/B2 |
38 | constant OUTPUT_STEPS: integer := STEPS2; |
39 | |
40 | -- gelatchte Eingangssignale |
41 | signal a1: std_logic; |
42 | signal b1: std_logic; |
43 | signal a2: std_logic; |
44 | signal b2: std_logic; |
45 | |
46 | -- vorherige Signale, ein Takt früher |
47 | signal oldA1: std_logic; |
48 | signal oldB1: std_logic; |
49 | signal oldA2: std_logic; |
50 | signal oldB2: std_logic; |
51 | |
52 | -- Zähler für die Schritte der beiden Drehgeber |
53 | signal counter: integer range |
54 | -(STEPS1 + STEPS2 + OUTPUT_STEPS) to |
55 | (STEPS1 + STEPS2 + OUTPUT_STEPS) := 0; |
56 | |
57 | -- Index für die Ausgangssignalgenerierung |
58 | signal outIndex: natural range 0 to 3 := 0; |
59 | |
60 | -- Variablen der Statemachine zur Serialisierung des Prozesses |
61 | type stateType is (test1, test2, updateOutIndex); |
62 | signal state: stateType := test1; |
63 | |
64 | -- Variablen für LED Statusanzeige |
65 | signal iRedLED: std_logic := '0'; |
66 | |
67 | begin |
68 | |
69 | koppler: process(clock) |
70 | |
71 | -- lokale Funktion: |
72 | -- liefert die Richtung, in der sich ein Drehgeber gedreht hat, |
73 | -- multipliziert mit "offset": -offset, offset oder 0 |
74 | function getDelta( |
75 | signal a : in std_logic; |
76 | signal oldA : in std_logic; |
77 | signal b : in std_logic; |
78 | signal oldB : in std_logic; |
79 | offset : integer) return integer is |
80 | variable testPattern: std_logic_vector(3 downto 0); |
81 | variable result: integer; |
82 | begin |
83 | testPattern := a & oldA & b & oldB; |
84 | case testPattern is |
85 | when "0000" => result := 0; |
86 | when "0001" => result := offset; |
87 | when "0010" => result := -offset; |
88 | when "0011" => result := 0; |
89 | when "0100" => result := -offset; |
90 | when "0101" => result := 0; |
91 | when "0110" => result := 0; |
92 | when "0111" => result := offset; |
93 | when "1000" => result := offset; |
94 | when "1001" => result := 0; |
95 | when "1010" => result := 0; |
96 | when "1011" => result := -offset; |
97 | when "1100" => result := 0; |
98 | when "1101" => result := -offset; |
99 | when "1110" => result := offset; |
100 | when "1111" => result := 0; |
101 | when others => result := 0; |
102 | end case; |
103 | return result; |
104 | end getDelta; |
105 | |
106 | -- Prozessbegin |
107 | begin |
108 | if rising_edge(clock) then |
109 | -- Eingangssignale latchen |
110 | a1 <= inA1; |
111 | b1 <= inB1; |
112 | a2 <= inA2; |
113 | b2 <= inB2; |
114 | |
115 | -- Statemachine, um die benötigte Anzahl Logikzellen durch |
116 | -- Serialisierung zu verringern |
117 | case state is |
118 | |
119 | -- Drehgeber 1 testen |
120 | when test1 => |
121 | counter <= counter + getDelta(a1, oldA1, b1, oldB1, STEPS2); |
122 | oldA1 <= a1; |
123 | oldB1 <= b1; |
124 | state <= test2; |
125 | |
126 | -- Drehgeber 2 testen |
127 | when test2 => |
128 | counter <= counter + getDelta(a2, oldA2, b2, oldB2, STEPS1); |
129 | oldA2 <= a2; |
130 | oldB2 <= b2; |
131 | state <= updateOutIndex; |
132 | |
133 | -- Ausgangsindex per Modulo-Arithmetik berechnen |
134 | when updateOutIndex => |
135 | if counter > OUTPUT_STEPS then |
136 | counter <= counter - OUTPUT_STEPS; |
137 | if outIndex < 3 then |
138 | outIndex <= outIndex + 1; |
139 | else |
140 | outIndex <= 0; |
141 | end if; |
142 | end if; |
143 | if counter < -OUTPUT_STEPS then |
144 | counter <= counter + OUTPUT_STEPS; |
145 | if outIndex > 0 then |
146 | outIndex <= outIndex - 1; |
147 | else |
148 | outIndex <= 3; |
149 | end if; |
150 | end if; |
151 | state <= test1; |
152 | end case; |
153 | |
154 | -- Ausgangssignal generieren |
155 | case outIndex is |
156 | when 0 => outA <= '1'; outB <= '1'; |
157 | when 1 => outA <= '0'; outB <= '1'; |
158 | when 2 => outA <= '0'; outB <= '0'; |
159 | when 3 => outA <= '1'; outB <= '0'; |
160 | end case; |
161 | |
162 | -- bei jedem Zustandswechsel an den Drehgebereingängen die rote LED invertieren |
163 | if oldA1 /= a1 or oldB1 /= b1 or oldA2 /= a2 or oldB2 /= b2 then |
164 | iRedLed <= not iRedLed; |
165 | end if; |
166 | redLED <= iRedLED; |
167 | end if; |
168 | end process; |
169 | |
170 | -- grüne LED anschalten, wenn einer der beiden Taster gedrückt wurde |
171 | greenLED <= (not switch1) or (not switch2); |
172 | |
173 | end architecture rtl; |
Rafael, warum paßt Du nicht einfach die Welle des Seilzugdrehgebers an? Feinmechanik scheinst Du ja zu können. Der "Analogrechner" ist dann extrem einfach. Gruß, Raimund
Frank Buss schrieb: > Ich habe jetzt mal ein wenig mit Drehgebern experimentiert, da ich > vorher damit noch nie was mit gemacht habe. Hier ein Projekt mit Anzeige > der Drehgeberposition per Grafikdisplay, einem recht netten und einfach > anzusteuernden OLED-Display: > Hallo Frank, ist ja schon toll, was du gemacht hast, nur, bis das ganze wirklich steht, ist eine Unmenge an Zeit und Programmieraufwand draufgegangen, das merkt man jetzt schon. Raimund schrieb: > warum paßt Du nicht einfach die Welle des Seilzugdrehgebers an? > > Feinmechanik scheinst Du ja zu können. Der "Analogrechner" ist dann > > extrem einfach. Daran habe ich natürlich auch schon gedacht, aber das scheitert alles an verschiedenen Sachen, z.b. Die Achse macht 3,6mm bei 1024 incr. Würde ich jetzt einen 2. Geber nehmen, eine Seilrolle dranmachen, und das Seil auf einen Kolben festmachen, der bis nach Unten auf das Material stößt, dann würde sich das Seil entprechend der Bewegung des Kolbens ab- oder Aufrollen. Und da kommt man schnell an die Grenzen. Die Welle des Gebers hat min. 6mm. Machen wir mal eine einfache Rechnung: Sagen wir mal, eine Umdrehung des 2. Gebers entspricht 36mm Weg, dann ist der Umfang der Rolle 36mm, der Durchmesser entsprechend ca 11,5mm. Dann müsste der Geber aber schon 10240 Impulse liefern, und das wird auch schwierig. DA ist mir was besseres eingefallen. Ich nehme statt dem 2. Geber eine Schaltwippe, mit einem Ini oder Lichtschranke für Auf oder Ab. Bei der Schaltung gibt es statt dem 2. Geber nur diese 2 Eingänge. Mittenstellung ist 0. Nun wird ein Oszillator programmiert, der entsprechend bei den Eingängen entweder positive oder negative Impulse erzeugt, und zwar solange, wie der entsprechende Eingang belegt ist. Die Frequenz sollte regelbar sein, damit man besser das Einschwingverhalten im Griff hat. Somit habe ich relativ wenig Mechanikaufwand und keine Probleme mit der Übersetzung mehr. Habe einen Bekannten drauf angesprochen, der könnte das für mich machen.
Rafael Engelbrecht schrieb: > ist ja schon toll, was du gemacht hast, nur, bis das ganze wirklich > steht, ist eine Unmenge an Zeit und Programmieraufwand draufgegangen, > das merkt man jetzt schon. Die Einarbeitung in die Auswertung von Drehgebern und die ATtiny-Programmierung mit Display und Aufbau usw. hat ca. 1 Tag gebraucht, da ich vorher auch noch nie einen ATtiny Microcontroller verwendet habe. Die Lösung deines Problems per CPLD war dann in ca. 2 Stunden fertig, da ich das CPLD-Board mit Xilinx ISE-Projekt usw. schon hier liegen hatte von einem anderen Projekt und daher nur den C-Code nach VHDL portieren musste, und mit VHDL habe ich schon einige Jahre Programmiererfahrung. Damit wäre zumindest das Problem mit der Kopplung zweier Drehgeber gelöst und man müsste nur noch die RS422-Wandlungen dranbasteln, die man auch fertig als Module kaufen kann, falls man die Verdrahtung der Treiberchips usw. auf einer Platine nicht machen möchte. Ich habe es eben übrigens nochmal etwas mehr getestet: Wenn ich den zweiten Drehgeber 10 Umdrehungen drehe, der bei mir eine Rasterung von 24 pro Umdrehung hat, dann ergibt das eine Anzeige von 88, was exakt passt: 4096/1500*88=240. Die Modulo-Arithmetik funktioniert also tatsächlich so, wie gedacht und es wird exakt das Verhältnis 4096:1500 abgebildet. Nicht daß ich je daran gezweifelt hätte, aber wie schon Lenin so schön sagte: Das Kriterium der Wahrheit ist die Praxis :-) > DA ist mir was besseres eingefallen. Ich nehme statt dem 2. Geber eine > Schaltwippe, mit einem Ini oder Lichtschranke für Auf oder Ab. Bei der > Schaltung gibt es statt dem 2. Geber nur diese 2 Eingänge. > Mittenstellung ist 0. > Nun wird ein Oszillator programmiert, der entsprechend bei den Eingängen > entweder positive oder negative Impulse erzeugt, und zwar solange, wie > der entsprechende Eingang belegt ist. Die Frequenz sollte regelbar sein, > damit man besser das Einschwingverhalten im Griff hat. Somit habe ich > relativ wenig Mechanikaufwand und keine Probleme mit der Übersetzung > mehr. > Habe einen Bekannten drauf angesprochen, der könnte das für mich machen. Ich habe keine Ahnung von Mechanik und kann mir das auch nicht richtig vorstellen, aber klingt irgendwie wackelig. Interessant wären ein paar Bilder von der Mechanik, vielleicht haben dann andere auch noch Ideen.
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.