Step or velocity control for servo gantry

More
10 years 6 months ago #73287 by crisiacuf
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.

Attachment not found

Code:
#******************* # 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
Can anyone help me spot the problem in my Y axis setup?

Please Log in to join the conversation.

More
10 years 6 months ago #73288 by andypugh
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.

Please Log in to join the conversation.

Time to create page: 0.032 seconds
Powered by Kunena Forum