Hallo Gemeinde,
ich stecke noch voll in meinem Drehmaschinenprojekt fest und komme mit dem Spindelservo nicht weiter.
Drehzahl funktioniert, aber ich bekomme keine Spindelorientierung hin also zB. "M19 R180", dass heißt für mich, auch Gewindedrehen wird nicht klappen. Da das ganze unter LinuxCNC läuft und völliges Neuland für mich ist, muss ich mir mehr oder weniger alles zusammenkopieren und anpassen.
Der Servotreiber ist ein "JASD15002-20B" und der Motor ist ein "80JASM510230K-M23B-T"
Mesakarten sind eine 7i92TM-->7i76-->7i85 mit passendem Bitfile.
Vorlage für die Spindel habe ich von Talla83:
(6) LinuxCNC & Mesa 7i76e - Step/dir - Spindel mit Orientierung z.B. für Werkzeugwechsel - YouTube
Ich weiß nicht woran es liegt das es nicht funktioniert, liegt es an der Verkabelung oder an der HAL oder den Parametern des Servotreibers.
Belegung 7i76
Hier der Auszug aus der HAL-Datei:
#*******************
# SPINDEL
#*******************
setp hm2_7i92.0.encoder.05.counter-mode 0
setp hm2_7i92.0.encoder.05.filter 1
setp hm2_7i92.0.encoder.05.index-invert 0
setp hm2_7i92.0.encoder.05.index-mask 0
setp hm2_7i92.0.encoder.05.index-mask-invert 0
setp hm2_7i92.0.encoder.05.scale [SPINDLE_0]ENCODER_SCALE
setp hm2_7i92.0.stepgen.04.dirsetup [SPINDLE_0]DIRSETUP
setp hm2_7i92.0.stepgen.04.dirhold [SPINDLE_0]DIRHOLD
setp hm2_7i92.0.stepgen.04.steplen [SPINDLE_0]STEPLEN
setp hm2_7i92.0.stepgen.04.stepspace [SPINDLE_0]STEPSPACE
setp hm2_7i92.0.stepgen.04.position-scale [SPINDLE_0]OUTPUT_SCALE
setp hm2_7i92.0.stepgen.04.step_type 0
setp hm2_7i92.0.stepgen.04.control-type 1
setp hm2_7i92.0.stepgen.04.maxaccel [SPINDLE_0]STEPGEN_MAXACCEL
setp hm2_7i92.0.stepgen.04.maxvel [SPINDLE_0]STEPGEN_MAXVEL
#loadrt pid names=pid.s
loadrt limit2 names=spindle-ramp
loadrt near names=spindle-at-speed,spindle-at-pos
loadrt timedelay names=spindle-active-delay
loadrt mux2 names=spindle-out-switch
loadrt or2 count=1
loadrt not count=2
loadrt and2 count=1
loadrt mult2 count=2
loadrt offset count=1
loadrt invert count=1
loadrt tristate_bit count=1
loadrt oneshot count=1
#addf pid.s.do-pid-calcs servo-thread
addf spindle-ramp servo-thread
addf spindle-at-speed servo-thread
addf spindle-at-pos servo-thread
addf spindle-active-delay servo-thread
addf spindle-out-switch servo-thread
addf or2.0 servo-thread
addf not.0 servo-thread
addf not.1 servo-thread
addf and2.0 servo-thread
addf mult2.0 servo-thread
addf mult2.1 servo-thread
addf offset.0.update-output servo-thread
addf invert.0 servo-thread
addf tristate-bit.0 servo-thread
addf oneshot.0 servo-thread
setp pid.s.Pgain [SPINDLE_0]P
setp pid.s.Igain [SPINDLE_0]I
setp pid.s.Dgain [SPINDLE_0]D
setp pid.s.bias [SPINDLE_0]BIAS
setp pid.s.FF0 [SPINDLE_0]FF0
setp pid.s.FF1 [SPINDLE_0]FF1
setp pid.s.FF2 [SPINDLE_0]FF2
setp pid.s.deadband [SPINDLE_0]DEADBAND
setp pid.s.maxoutput [SPINDLE_0]MAX_OUTPUT
setp pid.s.error-previous-target true
setp spindle-ramp.maxv [SPINDLE_0]ACCELERATION
setp spindle-at-speed.difference [SPINDLE_0]MAX_ERROR
setp spindle-at-pos.difference 0.01
setp spindle-at-pos.in1 0
setp spindle-active-delay.on-delay 0
setp spindle-active-delay.off-delay [SPINDLE_0]OFF_DELAY
setp oneshot.0.width 0.1
setp offset.0.offset [SPINDLE_0]POS_OFFSET
setp invert.0.in 360
setp tristate-bit.0.in 1
# Winkelvorgabe zur Orientierung
net orient-angle0 spindle.0.orient-angle => mult2.0.in0
net orient-angle1 invert.0.out => mult2.0.in1
net orient-enable spindle.0.orient => and2.0.in1
# Position vom Encoder
net spindle-pos spindle.0.revs <= hm2_7i92.0.encoder.05.position => pid.s.feedback
# Encodergeschwindigkeit U/sek in den near und spindle schieben
net spindle-fb-rps spindle.0.speed-in <= hm2_7i92.0.encoder.05.velocity => spindle-at-speed.in2
# Positionsvorgabe vom orient in den pid schieben
net spindle.otient-cmd mult2.0.out => offset.0.in
net spindle-orient-cmd1 offset.0.out => pid.s.command
# Drehzahlvorgabe U/min aus spindle in das limit2 schieben
net spindle-speed-rpm spindle.0.speed-out => spindle-ramp.in
# Drehzahlvorgabe U/sek aus spindle in das near schieben
net spindle-speed-rps spindle.0.speed-out-rps => spindle-at-speed.in1
# Wenn Solldrehzahl gleich Istdrehzahl dann aus near das bit ......
net spindle-at-speed spindle-at-speed.out => spindle.0.at-speed
# Wenn Sollpositon gleich Istpositon dann aus near das bit .....
net spindle-pos-err spindle-at-pos.in2 <= pid.s.error
net spindle-at-pos spindle-at-pos.out =>
net spindle-on0 spindle.0.on => spindle-active-delay.in
net spindel-on1 spindle-active-delay.out => or2.0.in0 => not.0.in
net spindel-on2 and2.0.in0 <= not.0.out
# pid aktivieren
net orient-active and2.0.out => or2.0.in1 => spindle-out-switch.sel => pid.s.enable
net spindle-enable or2.0.out => hm2_7i92.0.stepgen.04.enable
# Signal an Encoder das beim naechsten Z Signal auf 0 gestellt werden soll
net spindle-sync spindle.0.index-enable => hm2_7i92.0.encoder.05.index-enable => tristate-bit.0.out
net orient-active => oneshot.0.in
net testeee oneshot.0.out <= tristate-bit.0.enable
sets spindle-sync 1
# Drehzahlsignal Weiche
net out-switch-in0 spindle-out-switch.in0 <= spindle-ramp.out
net out-switch-in1 spindle-out-switch.in1 <= pid.s.output
net out-switch-out spindle-out-switch.out => hm2_7i92.0.stepgen.04.velocity-cmd
# Spindelmodus Drehzal / Position
#
loadrt comp names=spindle.0.mode.1
addf spindle.0.mode.1 servo-thread
setp spindle.0.mode.1.hyst 250
setp spindle.0.mode.1.in0 [SPINDLE_0]MODE_VEL
#Umrechnen von Sekunde auf 1/min
#
setp mult2.1.in0 60
net spindle-vel-cmd-rpm-abs mult2.1.out => spindle.0.mode.1.in1
net spindle-fb-rps => mult2.1.in1
net vel-mode-1 spindle.0.mode.1.out => hm2_7i92.0.7i76.0.0.output-04 #hier weiss ich nicht wo am Servo anschließen
net vel-mode-1 not.1.in
net vel-mode-2 not.1.out => hm2_7i92.0.7i76.0.0.output-05 #hier weiss ich nicht wo am Servo anschließen
#
und hier der Teil in der INI-Datei:
[SPINDLE_0]
# PID zur Spindelorientierung
P = 500
I = 0
D = 0
FF0 = 0
FF1 = 0
FF2 = 0
BIAS = 0
DEADBAND = 0.001
MAX_OUTPUT = 50
# Stepgeneratoreinstellungen
DIRSETUP = 1000
DIRHOLD = 1000
STEPLEN = 1000
STEPSPACE = 1000
STEPGEN_MAXVEL = 3000
STEPGEN_MAXACCEL = 5000
# Sonstiges
ENCODER_SCALE = 10000
ACCELERATION = 1000
MAX_ERROR = 0.2
OFF_DELAY = 1.5
OUTPUT_SCALE = 166.0667
# Berechnung: 10000 / 60 = 166.06666667 (Endocer Impulse pro Umdrehung durch 60 = Impulse pro Sekunde Output Scale)
POS_OFFSET = 1
# Positionsoffset 1 + X.XX **** Wert darf nicht kleine 1 sein! ****
MODE_VEL = 1000
# Ab welcher Drehzahl Drehzahl/Positionsmode
Wäre super wenn mir jemand helfen könnte, denn so langsam aber sicher bereue ich den Schritt zu LinuxCNC.
Danke und Gruß
Olli