Drehbank schneidet Gewinde unsauber

More
15 Oct 2017 13:06 #100387 by Skyline
Hallo liebe LinuxCNC Community,

ich habe mich heute hier angemeldet, weil ich seit Wochen vor einem Problem stehe für das ich keine Lösung finde.

Ich habe es bereits bei CNC-Area.de versucht, doch hier kommen wir im Moment leider auch nicht mehr vorran.
Deshalb würde ich euch hier gerne mein Problem vorstellen und was bisher versucht wurde und dabei raus kam:



"Ich stehe seit Wochen vor einem Problem auf dessen Lösung ich nicht komme und zu dem mir so langsam auch die Ideen ausgehen.

Und zwar weigert sich meine selbst auf CNC umgebaute Drehmaschine, ordentliche Gewinde zu produzieren.

Da Bilder ja bekanntlich mehr als 1000 Worte sagen, fange ich damit an:



Das sollte eigentlich ein "normales" metrisches Gewinde sein mit 60° Winkel, 3mm Steigung und 0,8mm Tiefe.
Verwendet haben ich hierfür einen Meißel für Außengewinde, der schon die passenden 60° hat.
Das System ist ein LinuxCNC das noch mit der parallelen Schnittstelle arbeitet.
Der G-Code dafür sieht folgendermaßen aus:
%
(GEWINDE TEST)
M3
G97S85
G0X19Z5
G76 P3 Z-5 I-1 J0.05 R1 K0.8
G0X16Z180
M5
%


Wenn das Gewinde geschnitten wird, kann man schön erkennen, dass der jeweils nächste Schnitt, leicht versetzt vor dem letzten statt findet. Diese laufen dann immer parallel. Das Gewinde verschiebt dich dadurch also immer weiter nach links, was dann links den definierten 30° Winkel entstehen lässt und rechts, nun ja, diese Rampe da...
Bisher dachte ich fälschlicher weiße, dass der nächste Schnitt immer leicht hinter dem ersten liegt. Das also die CNC zu spät einschneidet oder zu langsam wäre. Wie auch immer ich das so lange glauben konnte ^^ Die CNC setzt, wie oben beschrieben, definitiv zu früh ein. Sie kann also, zumindest würd ich das jetzt mal denken, nicht zu langsam sein.

Und genau dazu habe ich jetzt überhaupt keine Idee mehr. In meinem Kopf schwirrt ein "Zu früh? Wtf?"
Für einen Moment dachte ich vielleicht ein eine Korrektur die LinuxCNC ausführt, aber ich habe nirgends etwas entsprechendes eingestellt.


Was ich bisher schon alles versucht habe:
-PC neu aufgesetzt
-anderen PC versucht
-LPT Kabel frei gelegt und weit von jedem Störeinfluss verlegt (Kabel ist erst 2 Jahre alt)
-SPP, EPP, ECP, EPP+ECP und "Normal". Falls es ver. Versionen gab hab ich auch diese getestet.
-verschiedene U/min an der Spindel
-habe mit dem G76 Befehl rumprobiert, wobei nichts raus kam was mich einer Lösung näher brachte


Noch ein paar Daten (falls mehr benötigt werden, bitte einfach sagen welchen):

-DB25-1205 Breakout Board
-Motoren laufen in 1/8 Schritten
-Drehzahlsensor: 62 Impulse pro Umdrehung

Und ganz wichtig: Die Maschine läuft ansonsten einwandfrei! Ich habe schon mehrere Teile gedreht, die sie selbst, ganz alleine gefahren hat. Alles funktioniert genau so wie es soll. Außer Gewinde:cursing:^^




Hallo Peter,

danke für deine neuen Ansätze. Bin gerade dazu gekommen sie zu probieren. Also:

-G97 vorher weg zu lassen brachte leider keine Veränderung. Ergebnis sieht genau gleich aus.
-der Beispielcode
G0 Z-0.5 X0.2
G76 P0.05 Z-1 I-.075 J0.008 K0.045 Q29.5 L2 E0.045
läuft, aber ich finde ihn wenig aussagekräftig oder ich verstehe was falsch. Zumindest ist er, so wie er dort steht, erst einmal ohne Wirkung. Bei einer Driveline von 0.2, einem Innenversatz von -0.075 und einer Schnitttiefe von 0.045, was insgesamt 0.12 macht, berührt er damit nicht einmal das Werkstück. Wenn ich die Driveline dann auf 0.05 setze, bekomme ich zwar ein Ergebnis, aber bei einer Steigung von 0.05 kann ich leider nichts erkennen.

-in meiner Hal habe ich mal nachgeschaut, ich meine, sie würde alle Anforderungen erfüllen. motion.spindle-at-speed und encoder.0.phase-Z sind vorhanden. Bei mir ist es allerdings encoder.0.phase-Z statt encoder.n.phase-Z . Ich weiß nicht, wo der Unterschied liegt oder ob das etwas aus macht. Damit kenne ich mich leider zu wenig mit der Hal aus. Ich poste sie mal mit. Vielleicht fällt ja dir oder jemand anderem ein Fehler auf.

-hab eben auch grad nochmal schnell die 0 durch das n ersetzt, damit startet es dann das Programm nicht mehr sondern gibt nur eine Fehlermeldung aus

# Generated by stepconf 1.1 at Sat Sep 23 13:13:57 2017
# Änderungen an dieser Datei werden beim nächsten
# Aufruf von stepconf überschrieben.
loadrt trivkins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt hal_parport cfg="0 out"
loadrt stepgen step_type=0,0
loadrt encoder num_chan=1
loadrt abs count=1
loadrt scale count=1
loadrt lowpass count=1
loadrt pwmgen output_type=1
addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf encoder.update-counters base-thread
addf pwmgen.make-pulses base-thread
addf parport.0.write base-thread
addf stepgen.capture-position servo-thread
addf encoder.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
addf pwmgen.update servo-thread
addf abs.0 servo-thread
addf scale.0 servo-thread
addf lowpass.0 servo-thread
net spindle-cmd-rpm => pwmgen.0.value
net spindle-on <= motion.spindle-on => pwmgen.0.enable
net spindle-pwm <= pwmgen.0.pwm
setp pwmgen.0.pwm-freq 1000.0
setp pwmgen.0.scale 624.0
setp pwmgen.0.offset 0.0128205128205
setp pwmgen.0.dither-pwm true
net spindle-cmd-rpm     <= motion.spindle-speed-out
net spindle-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle-cmd-rps     <= motion.spindle-speed-out-rps
net spindle-cmd-rps-abs <= motion.spindle-speed-out-rps-abs
net spindle-at-speed    => motion.spindle-at-speed
setp encoder.0.position-scale 62.000000
setp encoder.0.counter-mode 1
net spindle-position encoder.0.position => motion.spindle-revs
net spindle-velocity-feedback-rps encoder.0.velocity => motion.spindle-speed-in
net spindle-index-enable encoder.0.index-enable <=> motion.spindle-index-enable
net spindle-phase-a encoder.0.phase-A
net spindle-phase-b encoder.0.phase-B
net spindle-phase-a encoder.0.phase-Z
setp parport.0.pin-01-out-invert 1
net zstep           => parport.0.pin-01-out
setp parport.0.pin-02-out-invert 1
net xenable         => parport.0.pin-02-out
setp parport.0.pin-03-out-invert 1
net xdir            => parport.0.pin-03-out
net zdir            => parport.0.pin-07-out
setp parport.0.pin-08-out-invert 1
net xstep           => parport.0.pin-08-out
setp parport.0.pin-14-out-invert 1
net xenable         => parport.0.pin-14-out
net spindle-pwm     => parport.0.pin-16-out
net max-x           <= parport.0.pin-10-in-not
net min-z           <= parport.0.pin-11-in-not
net spindle-phase-a <= parport.0.pin-12-in
net estop-ext       <= parport.0.pin-15-in
setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 1
setp stepgen.0.dirhold 22650
setp stepgen.0.dirsetup 22650
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step
net xdir <= stepgen.0.dir
net xenable axis.0.amp-enable-out => stepgen.0.enable
net max-x => axis.0.pos-lim-sw-in
setp stepgen.1.position-scale [AXIS_2]SCALE
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 1
setp stepgen.1.dirhold 22650
setp stepgen.1.dirsetup 22650
setp stepgen.1.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.1.position-cmd
net zpos-fb stepgen.1.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.1.step
net zdir <= stepgen.1.dir
net zenable axis.2.amp-enable-out => stepgen.1.enable
net min-z => axis.2.neg-lim-sw-in
net estop-out <= iocontrol.0.user-enable-out
net estop-ext => iocontrol.0.emc-enable-in
loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared




Hast du mal die Encoderleitung abgeklemmt und das Programm laufen lassen? Sollte ja stehen bleiben da kein Feedback.

Aber in deiner HAL sehe ich nur

net spindle-phase-a <= parport.0.pin-12-in
net spindle-phase-b <=
net spindle-phase-z <=

b und z sind nicht mit der Außenwelt verbunden.
Wenn ich das richtig verstehe orientiert sich LinuxCNC am Z Signal und da ist bei dir kein Pin vom parport angeschlossen.
Du nutzt "spindle-phase-a" ich gehe mal davon aus als Drehzahlanzeige.
Das PWM Signal wird starr rausgegeben und nicht geregelt. Denn einen PID Regler sehe ich in der HAL nicht.
Somit wird bestimmt die Achsgeschwindigkeit an der akutellen Drehzal angepasst. Wenn richtig in der HAL vernetzt.


--->

Hallo Peter,

heute bin ich mal wieder dazu gekommen. Du liegst vollkommen richtig, ich stelle den Motor an und dann richtet dich die CNC nach dem Eingangssignal des Sensores an der Spindel. Und das funktioniert eigentlich auch. Wenn ich die Spindel schneller drehen lasse, ist die Vorschubgeschwindigkeit höher, bei langsamer langsamer und wenn ich den Motor aus mache, verfolgt es schön noch den Nachlauf bis zu, Stillstand und steht dann auch still.

Danach verstehe ich leider nicht mehr so viel. Was ich noch sagen kann und was ich heute noch probiert habe ist:
Ja, ich lasse mir die Spindeldrehzahl auf den Bildschirm ausgeben.

Probiert habe ich heute mal

net spindle-phase-a <= parport.0.pin-12-in zu net spindle-phase-z <= parport.0.pin-12-in setzen.

Einfach weil ich mir gedacht habe, a brauch ich doch eigentlich nicht, die z Achse muss doch synchron sein. Resultat: Die Maschine fährt in die Startposition an und bleibt dort stehen. Beginnt als nicht mit dem Schneiden.

Dann hab ich mir überlegt ob das was damit zu tun hat, dass ich erst etwas in der .hal ändern musste bevor die Maschine überhaupt synchron zur Spindel gelaufen ist. Damals habe ich

net spindle-index encoder.0.phase-Z zu net spindle-phase-a encoder.0.phase-Z geändert.

Also habe ich es wieder zu net spindle-index encoder.0.phase-Z gemacht. Das Ergebnis bleibt aber leider gleich. Fährt zur Startposition und rührt sich dann nicht mehr. Als letztes habe ich dann noch versucht

net spindle-phase-a <= parport.0.pin-12-in und net spindle-phase-z <= parport.0.pin-12-in

gleichzeitig zu setzen. Das brachte einen Error und das CNC Programm startete nicht. Liegt das daran, weil beide auf Pin 12 zugreifen möchten?

Dann hatte ich noch die Idee

net spindle-phase-a encoder.0.phase-Z zu net spindle-phase-z encoder.0.phase-Z zu machen. Leider wieder nur Stillstand.

Als letztes dann noch in Kombination mit

net spindle-phase-z <= parport.0.pin-12-in aber leider immer noch nur Stillstand.

Jetzt ist wieder alles auf a eingestellt und sie läuft wie bisher. Leider.





Hallo Goldschmiedel,

ja, die Umdrehungen stimmen. Die Steigung der Gewindes ist auch richtig, nur die Flanke ist verschoben dadurch, dass er den jeweils nächsten Schritt einen Hauch VOR den davor setzt. Deswegen denke ich auch, dass es nicht an der elektrischen Seite liegt, da er ja zu früh und nicht zu spät einsticht.






Also Elektronik denke ich kann man ausschließen. Ich kann mir nicht vorstellen wie sie zu früh einsetzten soll. Sie bekommt ja erst den Befehl und dann setzt sie ein. Also muss der Befehl zu früh kommen.
An die Mechanik habe ich auch schon gedacht, habe demletzt mal mit backlash nochmal am Umkehrspiel rumprobiert, leider ohne Verbesserung.
Was mich so fuchst ist vor allem, dass er jeden Schnitt gleichmäßig weiter nach vorne versetzt.
Also quasi erster Einstich bei 0.0 zweiter bei 0.1 dritter bei 0.2 vierter bei 0.3 usw. Die laufen dann genau parallel, also mit der gleichen Steigung, zum ersten Schnitt. Als würde das Programm sagen, es muss beim nächsten Schritt jeweils 0.1 früher ansetzen.
Das kann ich mir dann auch durch einen mechanisches Problem nicht mehr erklären, weil dann dürfte sich der Versatz nicht immer weiter nach vorne verschieben.
Bei mir sind auch alle Achsen Direkt angetrieben, als eine ungenaue Übersetzung fällt auch weg.





Den Code schreibe ich selbst nach den Angaben von LinuxCNC auf die Peter verwiesen hat.
Aber so Fragen sind durchaus gut, meist ist es ja irgendwas einfaches was man übersieht weil man direkt davor steht.

So, ich war heute Abend natürlich nicht faul und hatte noch einen Einfall welcher kuriose Ergebnisse brachte.
Und zwar dachte ich mir, ich setze die Impulse pro Umdrehung in Linux einfach mal auf 63 statt 62.

Das Ergebnis: Mit meinem Testcode

G76 P3 Z-5 I-1 J0.05 R1 K0.8

kommt ein echtes Gewinde raus! :D Hurra! Dachte ich schon. Endlich! ABER, zu früh gefreut.

Nächster Gedanke: Jetzt will ich es mal länger als 5mm haben damit man auch richtig was sieht.
Was macht es, es fängt an viele Gewindegänge zu fahren, sprich, es setzt scheinbar willkürlich wieder an einem anderen Punkt an und am Ende ist dann das ganze Teil einfach nur noch abgeschruppt und gar kein Gewinde zu erkennen.

Na gut, wieder zurück zu 5mm Länge. Wie sieht es da mit 1mm statt 0.8mm Tiefe aus?
Es entsteht eine Rampe wie man sie ganz oben im ersten Post im Bild erkennen kann, nur diesmal nach links statts rechts. Ergo, der Drehmeißel sticht jedes mal einen Hauch zu spät ein.
Und was macht er bei 0.6mm statt 0.8mm Gewindetiefe, er macht wieder eine Rampe nach rechts. Genau so, wie er es auch die ganze Zeit gemacht hat.

Ich bin ratlos, kann mir keinen Reim darauf machen und musste bei der Erkenntnis fast schon lachen^^




hast du nicht mal die Möglichkeit den Code mit einem Programm zu erstellen zum Test?

--->

Ehr weniger. Das Programm das ich habe gibt einen G84 Code aus, der wird offiziell nicht unterstützt. Aber, da ich ja eh gerade nur am rumprobieren bin, könnt ich es einfach mal versuchen. Dabei fällt mir auch ein, es gibt auch ein G33 Befehl mit dem man, wenn auch nicht so bequem, eigentlich auch Gewinde schneiden könnte.
Wenn ich dazu komme, werde ich die beiden mal testen und euch berichten was die kleine damit anstellt^^

Um nochmal zum G76 zurück zu kommen:
Also der sollte eigentlich schon richtig sein.

G0X19Z5
G76 P3 Z-5 I-1 J0.05 R1 K0.8

Mit der ersten Zeile fahre ich auf den Ausgangspunkt x19 und z5

Dann G76
die Steigung ist P = 3mm
Z ist die Länge die geht bis -5
I ist die Entfernung zur "Driveline" welche durch den Startpunkt festgelegt wird, das wäre bei x19. I-1 heißt dann also, ansetzen bei x18 was dann einen Durchmesser von 36mm entspricht.
J ist die Tiefe je Durchgang. Also immer 0.05mm tiefer schneiden je Durchgang.
R1 sagt, dass er konstant immer die 0.05 runter gehen soll
K gibt an, wie tief es am Ende werden soll, nämlich 0.8mm

Und das steht alles genau in der Reihenfolge wie es auf der LinuxCNC Seite beschrieben wird.
Was ich mal noch versuchen könnt, wäre ein Q0 dahinter zu stellen. Ich habe bisher glaube nur Q29.5 Q30 und Q90 versucht. Aber nahm bisher immer an, er geht von Q0 aus wenn nichts weiter angegeben.






So, neuer Tag, neues Pech^^

Also: Mein Programm gibt nicht wie oben beschrieben einen G84 Code raus, sondern einen G92. Da habe ich mich vertan. Pech an der Sache ist, G92 wird nicht nur nicht unterstützt, es ist auch anderweitig belegt. Fällt also komplett raus als Option.

Und als ich gerade den G33 schreiben wollte fiel mir wieder ein, warum er nur bedingt für Gewinde schneiden geeignet ist. Ich dachte zu erst nur an den Aufwand, da man alles für jeden Schnitt wiederholen muss, aber ein Gewinde in mehreren Schnitten zu fahren ist damit leider gar nicht erst möglich. Der Befehl bietet mir zwar die Möglichkeit an, synchron zur Drehzahl zu arbeiten, aber nicht immer wieder an der gleichen an zu setzen :( Es wäre dann also immer Zufall, wo er beim nächsten Schnitt einsticht.

Q0 habe ich versucht ohne eine Änderung feststellen zu können.


Ich bin auch am überlegen, warum das bei 63 P/U auf einmal ging? Mein Zahnrad das, ich mit Hilfe einer Lichtschranke, zur Drehzahl Messung missbrauche, hat 62 Zähne und natürlich auch 62 Täler."




Ich weiß, ganz schön viel zu lesen :( Aber ich denke, so wisst ihr am besten bescheid. Falls noch irgendwas offen ist an Daten die ihr braucht, liefer ich diese sehr gerne. Ich muss nur wissen welche.

Ich hoffe ihr könnt mir weiter helfen und wir finden das Problem.


In Hoffnung und mit lieben Grüßen
Matthias
Attachments:

Please Log in or Create an account to join the conversation.

More
22 Oct 2017 11:32 #100626 by Skyline
Habt ihr auch keine neuen Idee/Ansätze? Ich weiß nicht mehr weiter.
Oder soll ich es mal auf englisch oben im allgemeinen Bereich versuchen?

Liebe Grüße
Matthias

Please Log in or Create an account to join the conversation.

More
30 Oct 2017 11:03 #101010 by newbynobi
Ich habe leider keien Drehe mit Spindelencoder, aber für mich sieht das so aus, als ob der Index der Spindle nicht richtig übertragen wird.

Poste mal deien Config, dann kann man da mal reinschauen, wie der Z Impuls verbunden ist.

Norbert

Please Log in or Create an account to join the conversation.

More
31 Oct 2017 09:19 #101045 by RotarySMP
Wie sieht Ihre Drehgeber aus? Auf meine Drehmaschine habe ich eine 1/U index signal für Z und ein 40/U für A. In deine E-mail hast du beide Z und A in die Hal am gleichen signal verknupft oder?

madmodder.net/index.php/topic,7884.msg129525.html#msg129525

Wenn Ihre Encoder mehr als ein zahn hat, und Sie den Index Z auch damit speisen, dann weisst LinuxCNC nicht wo es anfangen soll. Die anzahl von Gewinde Start winkeln gleicht die Anzahl von A Puls.
Mark

Please Log in or Create an account to join the conversation.

Time to create page: 0.135 seconds
Powered by Kunena Forum