Step or velocity control for servo gantry
14 Apr 2016 09:55 - 14 Apr 2016 09:56 #73287
by crisiacuf
Replied by crisiacuf on topic Step or velocity control for servo gantry
Long time no see
Been working on the gantry lately.
Velocity control seems to work very good after pid setup and such.
I tried to escape the problems induced by paralleling two joints in linuxcnc and used the Y master encoder output as the Y slave axis input as it seems bulletproof, but i have a delay as expected because of the MR J2S servo drive processing.
The problem is that this delay is bigger than expected and gives me noticeable squaring errors.
So back to hal configuration.
I am now using my X and Z axis to simulate the two Y joints that makeup my Y axis and adapted the Y part paralleling part from SnSmill hal writen by DaBit(thank you again for your work) in my hal.
It works in normal conditions, X and Z move as expected, in parallel, but if I stop my Z axis(using the amplifier max or min limit) no error is reported altough more than 1mm is the position error between the two.
More than that, after I release the motor to move freely it's racing in the direction it couldn't move and hits the software limit.
Can anyone help me spot the problem in my Y axis setup?
Been working on the gantry lately.
Velocity control seems to work very good after pid setup and such.
I tried to escape the problems induced by paralleling two joints in linuxcnc and used the Y master encoder output as the Y slave axis input as it seems bulletproof, but i have a delay as expected because of the MR J2S servo drive processing.
The problem is that this delay is bigger than expected and gives me noticeable squaring errors.
So back to hal configuration.
I am now using my X and Z axis to simulate the two Y joints that makeup my Y axis and adapted the Y part paralleling part from SnSmill hal writen by DaBit(thank you again for your work) in my hal.
It works in normal conditions, X and Z move as expected, in parallel, but if I stop my Z axis(using the amplifier max or min limit) no error is reported altough more than 1mm is the position error between the two.
More than that, after I release the motor to move freely it's racing in the direction it couldn't move and hits the software limit.
#*******************
# AXIS Yd [1], joint 1
#*******************
# axis enable chain
net yenable1 <= axis.1.amp-enable-out
net yenable1 => pid.yd.enable
setp pid.yd.Pgain [AXIS_1]P
setp pid.yd.Igain [AXIS_1]I
setp pid.yd.Dgain [AXIS_1]D
setp pid.yd.bias [AXIS_1]BIAS
setp pid.yd.FF0 [AXIS_1]FF0
setp pid.yd.FF1 [AXIS_1]FF1
setp pid.yd.FF2 [AXIS_1]FF2
setp pid.yd.deadband [AXIS_1]DEADBAND
setp pid.yd.maxoutput [AXIS_1]MAX_OUTPUT
setp pid.yd.error-previous-target true
net yd-index-enable <=> pid.yd.index-enable
#net yd-enable => pid.yd.enable
#net yd-pos-cmd => pid.yd.command
#net yd-vel-cmd => pid.yd.command-deriv
#net yd-pos-fb => pid.yd.feedback
#net yd-output => pid.yd.output
# ---PWM Generator signals/setup---
setp hm2_5i25.0.7i77.0.1.analogout3-scalemax [AXIS_1]OUTPUT_SCALE
setp hm2_5i25.0.7i77.0.1.analogout3-minlim [AXIS_1]OUTPUT_MIN_LIMIT
setp hm2_5i25.0.7i77.0.1.analogout3-maxlim [AXIS_1]OUTPUT_MAX_LIMIT
net ypos-cmd1 axis.1.motor-pos-cmd => pid.yd.command
net yd-output pid.yd.output => hm2_5i25.0.7i77.0.1.analogout2
# ---Encoder feedback signals/setup---
setp hm2_5i25.0.encoder.00.counter-mode 0
setp hm2_5i25.0.encoder.00.filter 1
setp hm2_5i25.0.encoder.00.index-invert 0
setp hm2_5i25.0.encoder.00.index-mask 0
setp hm2_5i25.0.encoder.00.index-mask-invert 0
setp hm2_5i25.0.encoder.00.scale [AXIS_1]ENCODER_SCALE
net yd-pos-fb <= hm2_5i25.0.encoder.00.position => pid.yd.feedback
net yd-vel-fb <= hm2_5i25.0.encoder.00.velocity => pid.yd.feedback-deriv
net yd-pos-fb => axis.1.motor-pos-fb
net yd-index-enable axis.1.index-enable <=> hm2_5i25.0.encoder.00.index-enable
net yd-pos-rawcounts <= hm2_5i25.0.encoder.00.rawcounts
# ---setup home / limit switch signals---
net home-yd => axis.1.home-sw-in
net min-yd => axis.1.neg-lim-sw-in
net max-yd => axis.1.pos-lim-sw-in
#*******************
# AXIS Ys [2], joint 2
#*******************
# axis enable chain
net yenable1 => pid.ys.enable
setp pid.ys.Pgain [AXIS_1]P
setp pid.ys.Igain [AXIS_1]I
setp pid.ys.Dgain [AXIS_1]D
setp pid.ys.bias [AXIS_1]BIAS
setp pid.ys.FF0 [AXIS_1]FF0
setp pid.ys.FF1 [AXIS_1]FF1
setp pid.ys.FF2 [AXIS_1]FF2
setp pid.ys.deadband [AXIS_1]DEADBAND
setp pid.ys.maxoutput [AXIS_1]MAX_OUTPUT
setp pid.ys.error-previous-target true
net ys-index-enable <=> pid.ys.index-enable
#net ys-enable => pid.ys.enable
#net ys-pos-cmd => pid.ys.command
#net ys-vel-cmd => pid.ys.command-deriv
#net ys-pos-fb => pid.ys.feedback
#net ys-output => pid.ys.output
# ---PWM Generator signals/setup---
setp hm2_5i25.0.7i77.0.1.analogout0-scalemax [AXIS_1]OUTPUT_SCALE
setp hm2_5i25.0.7i77.0.1.analogout0-minlim [AXIS_1]OUTPUT_MIN_LIMIT
setp hm2_5i25.0.7i77.0.1.analogout0-maxlim [AXIS_1]OUTPUT_MAX_LIMIT
# ---Encoder feedback signals/setup---
setp hm2_5i25.0.encoder.02.counter-mode 0
setp hm2_5i25.0.encoder.02.filter 1
setp hm2_5i25.0.encoder.02.index-invert 0
setp hm2_5i25.0.encoder.02.index-mask 0
setp hm2_5i25.0.encoder.02.index-mask-invert 0
setp hm2_5i25.0.encoder.02.scale [AXIS_1]ENCODER_SCALE
net ys-pos-fb-int <= hm2_5i25.0.encoder.02.position => pid.ys.feedback => offset_yjoints.fb-in
net ys-pos-fb <= offset_yjoints.fb-out
net ys-vel-fb <= hm2_5i25.0.encoder.02.velocity => pid.ys.feedback-deriv
net ypos-cmd1 => offset_yjoints.in
net ypos2_offsetted <= offset_yjoints.out => pid.ys.command
net ymotor-command2 pid.ys.output => hm2_5i25.0.7i77.0.1.analogout4
# Y-axis joint2 offset/squaring logic
setp offset_yjoints.offset 0.0
#Y-axis position verification: check if the Y-axes don't deviate too much
# ################
net ypos-fb1 => yjoints_comp.in0
net ypos-fb2 => yjoints_comp.in1
setp yjoints_comp.hyst [AXIS_1]SLAVEAXES_MAXDEVIATION
net yaxes_equal yjoints_comp.equal => yjointscomp_not.in
net slavedaxes_err <= yjointscomp_not.out
# ################
# Amplifier fault logic. Also (mis)used to signal slaved Y-axes position deviation
# sets-es are there until servos are wired completely
# ################
net jointY1ampfault <= hm2_5i25.0.7i77.0.0.input-16 => yjoint_faultgen_or2_1.in0
net jointY2ampfault <= hm2_5i25.0.7i77.0.0.input-17 => yjoint_faultgen_or2_1.in1
net yjoints-ampfault <= yjoint_faultgen_or2_1.out => yjoint_faultgen_or2_2.in0
net slavedaxes_err => yjoint_faultgen_or2_2.in1
net jointYampfault_p <= yjoint_faultgen_or2_2.out => axis.1.amp-fault-in
Last edit: 14 Apr 2016 09:56 by crisiacuf.
Please Log in or Create an account to join the conversation.
14 Apr 2016 09:57 #73288
by andypugh
Replied by andypugh on topic Step or velocity control for servo gantry
Have a look at the "gantry" component:
linuxcnc.org/docs/2.7/html/man/man9/gantry.9.html
Better still would be to use gentrivkins and the Joints-Axes branch of LinuxCNC.
linuxcnc.org/docs/2.7/html/man/man9/gantry.9.html
Better still would be to use gentrivkins and the Joints-Axes branch of LinuxCNC.
Please Log in or Create an account to join the conversation.
Time to create page: 0.058 seconds