yet another Joint.0.Following error (but I promised I searched a lot first)

More
6 years 2 months ago #179976 by jhandel
Howdy all,
I am working out my first axis on this machine, its a retrofit AC Servo based machine with encoders. I am using an 7i76e + 7i89 and a 5 Axis Bob. I have the X axis wired up and pulses are moving it (yah) the encoder is returning data (yah). However between .3 and .6mm of movement I get Joint 0 Following Error.

Here are some machine/servo facts.
1) 5000 steps/rotation
2) 5mm sweep ball screw
3) 2000 encoder pulses/ unit (or 10000 encoder pulses/rotation)
a) encoders are using RS-422, tried TTL and nothing was recording
4) testing as confirmed hm2.0.7i76e.0.encoder.00.count is bang on the correct number of encoder pulses for the distance moved before it fails out...
5) I have some scope data (see below) & I did a latency histogram (40 minutes with two glxgears running and a long youtube video streaming)
6) yes I have wifi on here
7) I am using dedicated ethernet and have the 7i76e using 10.10.10.10 ip
8) I have tried several different FERROR and MIN_FERROR values
a) min_ferror that isn't 0 causes the ferror to crawl upwards when nothing is moving
b) negative min_ferror actually causes the axis to move VERY slowly
c) any FERROR over about 500 causes the error to happen almost instantly and I can have to press the "power" multiple times before it will stay on long enough to try to jog the axis
d) FERROR of around 10 "turns on" very stably but the machine movement is significantly smaller than

Here is the HAL (Most of these settings are "out of the box" from PNCCONFIG and seem pretty conservative compared to the settings the controller I am replacing had)
Code:
# Generated by PNCconf at Thu Aug 27 19:47:31 2020 # Using LinuxCNC version: UNAVAILABLE # If you make changes to this file, they will be # overwritten when you run PNCconf again loadrt [KINS]KINEMATICS loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS loadrt hostmot2 loadrt hm2_eth board_ip="10.10.10.10" config="num_encoders=10 num_pwmgens=0 num_stepgens=6 sserial_port_0=0000xx" setp hm2_7i76e.0.watchdog.timeout_ns 5000000 loadrt pid names=pid.x,pid.y,pid.z,pid.s loadrt abs names=abs.spindle loadrt lowpass names=lowpass.spindle loadrt scale names=scale.spindle addf hm2_7i76e.0.read servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf pid.x.do-pid-calcs servo-thread addf pid.y.do-pid-calcs servo-thread addf pid.z.do-pid-calcs servo-thread addf pid.s.do-pid-calcs servo-thread addf scale.spindle servo-thread addf abs.spindle servo-thread addf lowpass.spindle servo-thread addf hm2_7i76e.0.write servo-thread #******************* # AXIS X JOINT 0 #******************* setp pid.x.Pgain [JOINT_0]P setp pid.x.Igain [JOINT_0]I setp pid.x.Dgain [JOINT_0]D setp pid.x.bias [JOINT_0]BIAS setp pid.x.FF0 [JOINT_0]FF0 setp pid.x.FF1 [JOINT_0]FF1 setp pid.x.FF2 [JOINT_0]FF2 setp pid.x.deadband [JOINT_0]DEADBAND setp pid.x.maxoutput [JOINT_0]MAX_OUTPUT setp pid.x.error-previous-target true setp pid.x.maxerror .0005 net x-index-enable <=> pid.x.index-enable net x-enable => pid.x.enable net x-pos-cmd => pid.x.command net x-pos-fb => pid.x.feedback net x-output <= pid.x.output # Step Gen signals/setup setp hm2_7i76e.0.stepgen.00.dirsetup [JOINT_0]DIRSETUP setp hm2_7i76e.0.stepgen.00.dirhold [JOINT_0]DIRHOLD setp hm2_7i76e.0.stepgen.00.steplen [JOINT_0]STEPLEN setp hm2_7i76e.0.stepgen.00.stepspace [JOINT_0]STEPSPACE setp hm2_7i76e.0.stepgen.00.position-scale [JOINT_0]STEP_SCALE setp hm2_7i76e.0.stepgen.00.step_type 0 setp hm2_7i76e.0.stepgen.00.control-type 1 setp hm2_7i76e.0.stepgen.00.maxaccel [JOINT_0]STEPGEN_MAXACCEL setp hm2_7i76e.0.stepgen.00.maxvel [JOINT_0]STEPGEN_MAXVEL # ---closedloop stepper signals--- net x-pos-cmd <= joint.0.motor-pos-cmd net x-vel-cmd <= joint.0.vel-cmd net x-output <= hm2_7i76e.0.stepgen.00.velocity-cmd net x-enable <= joint.0.amp-enable-out net x-enable => hm2_7i76e.0.stepgen.00.enable # ---Encoder feedback signals/setup--- setp hm2_7i76e.0.encoder.00.counter-mode 0 setp hm2_7i76e.0.encoder.00.filter 1 setp hm2_7i76e.0.encoder.00.index-invert 0 setp hm2_7i76e.0.encoder.00.index-mask 0 setp hm2_7i76e.0.encoder.00.index-mask-invert 0 setp hm2_7i76e.0.encoder.00.scale [JOINT_0]ENCODER_SCALE net x-pos-fb <= hm2_7i76e.0.encoder.00.position net x-vel-fb <= hm2_7i76e.0.encoder.00.velocity net x-pos-fb => joint.0.motor-pos-fb net x-index-enable joint.0.index-enable <=> hm2_7i76e.0.encoder.00.index-enable net x-pos-rawcounts <= hm2_7i76e.0.encoder.00.rawcounts # ---setup home / limit switch signals--- net home-x => joint.0.home-sw-in net x-neg-limit => joint.0.neg-lim-sw-in net x-pos-limit => joint.0.pos-lim-sw-in #******************* # AXIS Y JOINT 1 #******************* setp pid.y.Pgain [JOINT_1]P setp pid.y.Igain [JOINT_1]I setp pid.y.Dgain [JOINT_1]D setp pid.y.bias [JOINT_1]BIAS setp pid.y.FF0 [JOINT_1]FF0 setp pid.y.FF1 [JOINT_1]FF1 setp pid.y.FF2 [JOINT_1]FF2 setp pid.y.deadband [JOINT_1]DEADBAND setp pid.y.maxoutput [JOINT_1]MAX_OUTPUT setp pid.y.error-previous-target true setp pid.y.maxerror .0005 net y-index-enable <=> pid.y.index-enable net y-enable => pid.y.enable net y-pos-cmd => pid.y.command net y-pos-fb => pid.y.feedback net y-output <= pid.y.output # Step Gen signals/setup setp hm2_7i76e.0.stepgen.01.dirsetup [JOINT_1]DIRSETUP setp hm2_7i76e.0.stepgen.01.dirhold [JOINT_1]DIRHOLD setp hm2_7i76e.0.stepgen.01.steplen [JOINT_1]STEPLEN setp hm2_7i76e.0.stepgen.01.stepspace [JOINT_1]STEPSPACE setp hm2_7i76e.0.stepgen.01.position-scale [JOINT_1]STEP_SCALE setp hm2_7i76e.0.stepgen.01.step_type 0 setp hm2_7i76e.0.stepgen.01.control-type 1 setp hm2_7i76e.0.stepgen.01.maxaccel [JOINT_1]STEPGEN_MAXACCEL setp hm2_7i76e.0.stepgen.01.maxvel [JOINT_1]STEPGEN_MAXVEL # ---closedloop stepper signals--- net y-pos-cmd <= joint.1.motor-pos-cmd net y-vel-cmd <= joint.1.vel-cmd net y-output <= hm2_7i76e.0.stepgen.01.velocity-cmd net y-enable <= joint.1.amp-enable-out net y-enable => hm2_7i76e.0.stepgen.01.enable # ---Encoder feedback signals/setup--- setp hm2_7i76e.0.encoder.01.counter-mode 0 setp hm2_7i76e.0.encoder.01.filter 1 setp hm2_7i76e.0.encoder.01.index-invert 0 setp hm2_7i76e.0.encoder.01.index-mask 0 setp hm2_7i76e.0.encoder.01.index-mask-invert 0 setp hm2_7i76e.0.encoder.01.scale [JOINT_1]ENCODER_SCALE net y-pos-fb <= hm2_7i76e.0.encoder.01.position net y-vel-fb <= hm2_7i76e.0.encoder.01.velocity net y-pos-fb => joint.1.motor-pos-fb net y-index-enable joint.1.index-enable <=> hm2_7i76e.0.encoder.01.index-enable net y-pos-rawcounts <= hm2_7i76e.0.encoder.01.rawcounts # ---setup home / limit switch signals--- net y-home-sw => joint.1.home-sw-in net y-neg-limit => joint.1.neg-lim-sw-in net y-pos-limit => joint.1.pos-lim-sw-in #******************* # AXIS Z JOINT 2 #******************* setp pid.z.Pgain [JOINT_2]P setp pid.z.Igain [JOINT_2]I setp pid.z.Dgain [JOINT_2]D setp pid.z.bias [JOINT_2]BIAS setp pid.z.FF0 [JOINT_2]FF0 setp pid.z.FF1 [JOINT_2]FF1 setp pid.z.FF2 [JOINT_2]FF2 setp pid.z.deadband [JOINT_2]DEADBAND setp pid.z.maxoutput [JOINT_2]MAX_OUTPUT setp pid.z.error-previous-target true setp pid.z.maxerror .0005 net z-index-enable <=> pid.z.index-enable net z-enable => pid.z.enable net z-pos-cmd => pid.z.command net z-pos-fb => pid.z.feedback net z-output <= pid.z.output # Step Gen signals/setup setp hm2_7i76e.0.stepgen.02.dirsetup [JOINT_2]DIRSETUP setp hm2_7i76e.0.stepgen.02.dirhold [JOINT_2]DIRHOLD setp hm2_7i76e.0.stepgen.02.steplen [JOINT_2]STEPLEN setp hm2_7i76e.0.stepgen.02.stepspace [JOINT_2]STEPSPACE setp hm2_7i76e.0.stepgen.02.position-scale [JOINT_2]STEP_SCALE setp hm2_7i76e.0.stepgen.02.step_type 0 setp hm2_7i76e.0.stepgen.02.control-type 1 setp hm2_7i76e.0.stepgen.02.maxaccel [JOINT_2]STEPGEN_MAXACCEL setp hm2_7i76e.0.stepgen.02.maxvel [JOINT_2]STEPGEN_MAXVEL # ---closedloop stepper signals--- net z-pos-cmd <= joint.2.motor-pos-cmd net z-vel-cmd <= joint.2.vel-cmd net z-output <= hm2_7i76e.0.stepgen.02.velocity-cmd net z-enable <= joint.2.amp-enable-out net z-enable => hm2_7i76e.0.stepgen.02.enable # ---Encoder feedback signals/setup--- setp hm2_7i76e.0.encoder.02.counter-mode 0 setp hm2_7i76e.0.encoder.02.filter 1 setp hm2_7i76e.0.encoder.02.index-invert 0 setp hm2_7i76e.0.encoder.02.index-mask 0 setp hm2_7i76e.0.encoder.02.index-mask-invert 0 setp hm2_7i76e.0.encoder.02.scale [JOINT_2]ENCODER_SCALE net z-pos-fb <= hm2_7i76e.0.encoder.02.position net z-vel-fb <= hm2_7i76e.0.encoder.02.velocity net z-pos-fb => joint.2.motor-pos-fb net z-index-enable joint.2.index-enable <=> hm2_7i76e.0.encoder.02.index-enable net z-pos-rawcounts <= hm2_7i76e.0.encoder.02.rawcounts # ---setup home / limit switch signals--- net z-home-sw => joint.2.home-sw-in net z-neg-limit => joint.2.neg-lim-sw-in net z-pos-limit => joint.2.pos-lim-sw-in #******************* # SPINDLE #******************* 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 pid.s.maxerror .0005 net spindle-index-enable <=> pid.s.index-enable net spindle-enable => pid.s.enable net spindle-vel-cmd-rpm => pid.s.command net spindle-vel-fb-rpm => pid.s.feedback net spindle-output <= pid.s.output # Step Gen signals/setup setp hm2_7i76e.0.stepgen.05.dirsetup [SPINDLE_0]DIRSETUP setp hm2_7i76e.0.stepgen.05.dirhold [SPINDLE_0]DIRHOLD setp hm2_7i76e.0.stepgen.05.steplen [SPINDLE_0]STEPLEN setp hm2_7i76e.0.stepgen.05.stepspace [SPINDLE_0]STEPSPACE setp hm2_7i76e.0.stepgen.05.position-scale [SPINDLE_0]STEP_SCALE setp hm2_7i76e.0.stepgen.05.step_type 0 setp hm2_7i76e.0.stepgen.05.control-type 1 setp hm2_7i76e.0.stepgen.05.maxaccel [SPINDLE_0]MAX_ACCELERATION setp hm2_7i76e.0.stepgen.05.maxvel [SPINDLE_0]MAX_VELOCITY net spindle-enable => hm2_7i76e.0.stepgen.05.enable net spindle-vel-cmd-rps => hm2_7i76e.0.stepgen.05.velocity-cmd # ---Encoder feedback signals/setup--- setp hm2_7i76e.0.encoder.09.counter-mode 0 setp hm2_7i76e.0.encoder.09.filter 1 setp hm2_7i76e.0.encoder.09.index-invert 0 setp hm2_7i76e.0.encoder.09.index-mask 0 setp hm2_7i76e.0.encoder.09.index-mask-invert 0 setp hm2_7i76e.0.encoder.09.scale [SPINDLE_0]ENCODER_SCALE net spindle-revs <= hm2_7i76e.0.encoder.09.position net spindle-vel-fb-rps <= hm2_7i76e.0.encoder.09.velocity net spindle-index-enable <=> hm2_7i76e.0.encoder.09.index-enable # ---setup spindle control signals--- net spindle-vel-cmd-rps <= spindle.0.speed-out-rps net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs net spindle-vel-cmd-rpm <= spindle.0.speed-out net spindle-vel-cmd-rpm-abs <= spindle.0.speed-out-abs net spindle-enable <= spindle.0.on net spindle-cw <= spindle.0.forward net spindle-ccw <= spindle.0.reverse net spindle-brake <= spindle.0.brake net spindle-revs => spindle.0.revs net spindle-at-speed => spindle.0.at-speed net spindle-vel-fb-rps => spindle.0.speed-in net spindle-index-enable <=> spindle.0.index-enable # ---Setup spindle at speed signals--- sets spindle-at-speed true # Use ACTUAL spindle velocity from spindle encoder # spindle-velocity bounces around so we filter it with lowpass # spindle-velocity is signed so we use absolute component to remove sign # ACTUAL velocity is in RPS not RPM so we scale it. setp scale.spindle.gain 60 setp lowpass.spindle.gain 1.000000 net spindle-vel-fb-rps => scale.spindle.in net spindle-fb-rpm scale.spindle.out => abs.spindle.in net spindle-fb-rpm-abs abs.spindle.out => lowpass.spindle.in net spindle-fb-rpm-abs-filtered lowpass.spindle.out #****************************** # connect miscellaneous signals #****************************** # ---HALUI signals--- net axis-select-x halui.axis.x.select net jog-x-pos halui.axis.x.plus net jog-x-neg halui.axis.x.minus net jog-x-analog halui.axis.x.analog net x-is-homed halui.joint.0.is-homed net axis-select-y halui.axis.y.select net jog-y-pos halui.axis.y.plus net jog-y-neg halui.axis.y.minus net jog-y-analog halui.axis.y.analog net y-is-homed halui.joint.1.is-homed net axis-select-z halui.axis.z.select net jog-z-pos halui.axis.z.plus net jog-z-neg halui.axis.z.minus net jog-z-analog halui.axis.z.analog net z-is-homed halui.joint.2.is-homed net jog-selected-pos halui.axis.selected.plus net jog-selected-neg halui.axis.selected.minus net spindle-manual-cw halui.spindle.0.forward net spindle-manual-ccw halui.spindle.0.reverse net spindle-manual-stop halui.spindle.0.stop net machine-is-on halui.machine.is-on net jog-speed halui.axis.jog-speed net MDI-mode halui.mode.is-mdi # ---coolant signals--- net coolant-mist <= iocontrol.0.coolant-mist net coolant-flood <= iocontrol.0.coolant-flood # ---probe signal--- net probe-in => motion.probe-input # ---motion control signals--- net in-position <= motion.in-position net machine-is-enabled <= motion.motion-enabled # ---digital in / out signals--- net dout-00 <= motion.digital-out-00 net dout-02 <= motion.digital-out-02 # ---estop signals--- net estop-out <= iocontrol.0.user-enable-out net estop-out => iocontrol.0.emc-enable-in # ---manual tool change signals--- loadusr -W hal_manualtoolchange net tool-change-request iocontrol.0.tool-change => hal_manualtoolchange.change net tool-change-confirmed 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

Here is the INI
Code:
# Generated by PNCconf at Sat Aug 29 14:43:44 2020 # Using LinuxCNC version: UNAVAILABLE # If you make changes to this file, they will be # overwritten when you run PNCconf again [EMC] MACHINE = Skyfire DEBUG = 0 VERSION = 1.1 [DISPLAY] DISPLAY = axis POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 2.000000 MAX_SPINDLE_OVERRIDE = 1.000000 MIN_SPINDLE_OVERRIDE = 0.500000 INTRO_GRAPHIC = linuxcnc.gif INTRO_TIME = 5 PROGRAM_PREFIX = /home/cnc/linuxcnc/nc_files PYVCP = pyvcp-panel.xml INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .001mm POSITION_FEEDBACK = ACTUAL DEFAULT_LINEAR_VELOCITY = 6.000000 MAX_LINEAR_VELOCITY = 25.000000 MIN_LINEAR_VELOCITY = 0.500000 DEFAULT_ANGULAR_VELOCITY = 12.000000 MAX_ANGULAR_VELOCITY = 180.000000 MIN_ANGULAR_VELOCITY = 1.666667 EDITOR = gedit GEOMETRY = xyz [FILTER] PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image PROGRAM_EXTENSION = .py Python Script png = image-to-gcode gif = image-to-gcode jpg = image-to-gcode py = python [TASK] TASK = milltask CYCLE_TIME = 0.010 [RS274NGC] PARAMETER_FILE = linuxcnc.var [EMCMOT] EMCMOT = motmod COMM_TIMEOUT = 1.0 SERVO_PERIOD = 1000000 [HMOT] # **** This is for info only **** CARD0=hm2_7i76.0 [HAL] HALUI = halui HALFILE = Skyfire.hal HALFILE = custom.hal POSTGUI_HALFILE = postgui_call_list.hal SHUTDOWN = shutdown.hal [HALUI] [KINS] JOINTS = 3 KINEMATICS = trivkins coordinates=XYZ [TRAJ] COORDINATES = XYZ LINEAR_UNITS = mm ANGULAR_UNITS = degree DEFAULT_LINEAR_VELOCITY = 2.50 MAX_LINEAR_VELOCITY = 25.00 [EMCIO] EMCIO = io CYCLE_TIME = 0.100 TOOL_TABLE = tool.tbl #****************************************** [AXIS_X] MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 MIN_LIMIT = -0.01 MAX_LIMIT = 200.0 [JOINT_0] TYPE = LINEAR HOME = 0.0 FERROR = 100.0 MIN_FERROR = 0.0 MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. STEPGEN_MAXVEL = 31.25 STEPGEN_MAXACCEL = 937.50 P = 1000.0 I = 0.0 D = 0.0 FF0 = 0.0 FF1 = 1.0 FF2 = 0.0 BIAS = 0.0 DEADBAND = 0.0 MAX_OUTPUT = 0.0 ENCODER_SCALE = 2000.0 # these are in nanoseconds DIRSETUP = 10000 DIRHOLD = 10000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 1000.0 MIN_LIMIT = -0.01 MAX_LIMIT = 200.0 HOME_OFFSET = 0.000000 HOME_SEARCH_VEL = -1.000000 HOME_LATCH_VEL = -0.500000 HOME_FINAL_VEL = 0.000000 HOME_USE_INDEX = NO #****************************************** #****************************************** [AXIS_Y] MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 MIN_LIMIT = -0.01 MAX_LIMIT = 200.0 [JOINT_1] TYPE = LINEAR HOME = 0.0 FERROR = 10.0 MIN_FERROR = 1.0 MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. STEPGEN_MAXVEL = 31.25 STEPGEN_MAXACCEL = 937.50 P = 1000.0 I = 0.0 D = 0.0 FF0 = 0.0 FF1 = 1.0 FF2 = 0.0 BIAS = 0.0 DEADBAND = 0.0 MAX_OUTPUT = 0.0 ENCODER_SCALE = 4000.0 # these are in nanoseconds DIRSETUP = 10000 DIRHOLD = 10000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 200.0 MIN_LIMIT = -0.01 MAX_LIMIT = 200.0 HOME_OFFSET = 0.0 #****************************************** #****************************************** [AXIS_Z] MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 MIN_LIMIT = -100.0 MAX_LIMIT = 0.01 [JOINT_2] TYPE = LINEAR HOME = 0.0 FERROR = 10.0 MIN_FERROR = 1.0 MAX_VELOCITY = 25.0 MAX_ACCELERATION = 750.0 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. STEPGEN_MAXVEL = 31.25 STEPGEN_MAXACCEL = 937.50 P = 1000.0 I = 0.0 D = 0.0 FF0 = 0.0 FF1 = 1.0 FF2 = 0.0 BIAS = 0.0 DEADBAND = 0.0 MAX_OUTPUT = 0.0 ENCODER_SCALE = 4000.0 # these are in nanoseconds DIRSETUP = 10000 DIRHOLD = 10000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 200.0 MIN_LIMIT = -100.0 MAX_LIMIT = 0.01 HOME_OFFSET = 0.0 #****************************************** [SPINDLE_0] MAX_VELOCITY = 150.0 MAX_ACCELERATION = 300.0 # The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION # If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger. STEPGEN_MAXVEL = 187.50 STEPGEN_MAXACCEL = 375.00 P = 0.0 I = 0.0 D = 0.0 FF0 = 1.0 FF1 = 0.0 FF2 = 0.0 BIAS = 0.0 DEADBAND = 0.0 MAX_OUTPUT = 2000.0 ENCODER_SCALE = 4096.0 # these are in nanoseconds DIRSETUP = 10000 DIRHOLD = 10000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 1024.0

Attached are pictures of the histogram and scope

as always thanks in advance for any suggestions on what to tinker with

Please Log in to join the conversation.

More
6 years 2 months ago #179981 by tommylight

Please Log in to join the conversation.

More
6 years 2 months ago #179984 by PCW
Set all the P terms to about 5 to start

Delete all the "setp pid.N.maxerror .0005" statements

Expect runaways as it looks like you have the feedback reversed
If you get runaways, reverse the sign of STEP_SCALE

Then try tommylight's tuning suggestions

Please Log in to join the conversation.

More
6 years 2 months ago #179990 by jhandel
PCW, yes I had it backwards... (well I had it to spec, but that meant the servo went backwards.. Easy flip in the Hal... Thanks for the max error & starting at P = 5..

I also copied over my max rapid and max acceloration from the old controller (10000mm/m & 600mm/s^2)

Those didn't help sadly... I also got a new error because I guess it maxes out the pulse count/speed is maxed out hm2_7i76e.0:stepgen.00.maxvel is to slow for the current step timing & position scale..... clipping to max possible.

And still getting joint failures..

I also got two new quarks
1 ) I can move with rarely a joint failure, going - joint failures all the damn time..
2) sometimes at the end of a move it will spend 10 seconds or so moving just the tiniest bit back and forth or crawling in one direction (the crawling is usually when it errors, the hunting is usually when I stop the jog on my own)

Please Log in to join the conversation.

More
6 years 2 months ago #179991 by PCW
Joint following errors are pretty much expected until you get the tuning right
They may also be caused by drive setup (filtering or acceleration limits in the drive itself)

To eliminate the velocity limit you will have to lower the step time and step space
parameters

Crawling in one direction suggests you have a problem with the encoder feedback

Please Log in to join the conversation.

More
6 years 2 months ago #180151 by jhandel
I wouldn't say crawling in one direction... More like hunting or settling.. Sometimes it stops on a dime, sometimes it sits there and vibrates back and forth a few microns (yes microns) sometimes it crawls a few 10ths of a mm in one direction before settling..

The hunting behavior back and forth can happen anytime I stop a jog, the crawl to a settle happens only with a joint error..

Neither are consistent behaviors

Please Log in to join the conversation.

More
6 years 2 months ago #180153 by PCW
Where is the encoder feedback coming from?

Please Log in to join the conversation.

More
6 years 2 months ago #180159 by jhandel
Encoder -> Servo Drive/Controller -> 7i89 -> 7i76e.P2 -> LinuxCNC (ethernet connection)

Same servo drive/servo ran the axis fine with no hunting behavior. So I think the behaviors are coming from LinuxCNC..

To be clear, the Servo Controller uses Step/Direction pulses.. But its an AC servo so really its all just "math" that the controller manages it actually uses the encoder steps/rotation and a "gear ratio" setting to define your desired steps/rotation.

I left it at 5000/rotation because that was what it was set-at with the old controller and with 5mm ball-screws it means its easy math 1 pulse/micron

Please Log in to join the conversation.

More
6 years 2 months ago #180160 by PCW
I asked about the the feedback source because linear scale systems often
have issues with hunting because of backlash

You might try open loop, since that is likely what you were doing before.
This just means changing the feedback from the encoders to the stepgen
position feedback pin (you would also set the P term back to 1000 in this case)

With LinuxCNC setup for open loop you can now use the encoder feedback
to see how well the drives actually follow the step/dir commands

Please Log in to join the conversation.

More
6 years 1 month ago #180247 by jhandel
Converting to open does make a lot of since, I tried that and yah things move fine (which makes since because there is no feedback to adjust for..) I am guessing that getting close loop to work is a little crazy given there is a controller doing its own "PID" like control on the servo.. which means the two would end up "fighting" each other..

Now that the servo was moving pretty well, it gave me time to mess with the encoder weirdness you suggested. Sure enough halscope did display your suspected issue with encoder and going backwards (comparing commanded location to encoder location...

its clear that the encoder is not counting backwards correctly when I go in the -- direction..

Any ideas why an encoder would count perfect and consistently one direction but not the other?

All the same pulses should be going off in both directions right?

Please Log in to join the conversation.

Time to create page: 0.204 seconds
Powered by Kunena Forum