Encoders

More
6 years 3 months ago #175364 by blazini36
Replied by blazini36 on topic Encoders

natholego11 wrote: so seeing that the DYN4 will do all the PID internally, I suppose i need to remove the connection to the PID on the spindle. is that as simple as setting all the PID values to 0? or do I need to remove the hal components of the PID for the spindle?


No, Setting the PID to 0 is well....setting the PID to 0. PID is a single component with multiple pins and to remove it is to "rewire" the hal file without it.....really if you're going to try to do all of the stuff you want to you will have to get familiar with hal. And just as I said above, others have said setting a PID to 0 is basically removing it, this has not been my experience. If the PID works for ya, use the PID, it did not work for me with the DYN4 so I took 5 minutes and removed it.

You can check out this fella's youtube video. He had quite a time setting up the DMM spindle motor. He ran into issues with using the encoder and stepgen single ended like you are. I spoke to him a couple of times and I don't really agree with alot of the conclusions that were drawn here but he also had some PID issues, I had issues with lousy autotune software but that's about it.

Please Log in to join the conversation.

More
6 years 3 months ago #175365 by blazini36
Replied by blazini36 on topic Encoders

tommylight wrote: I do not think you have to remove those, most probably it will not work without it.

Without what? the PID? it works fine with the Spindle PID removed,

Please Log in to join the conversation.

More
6 years 3 months ago #175376 by tommylight
Replied by tommylight on topic Encoders

blazini36 wrote:

tommylight wrote: I do not think you have to remove those, most probably it will not work without it.

Without what? the PID? it works fine with the Spindle PID removed,

I was not sure it would, so thanks for confirming that.

Please Log in to join the conversation.

More
6 years 3 months ago #175445 by natholego11
Replied by natholego11 on topic Encoders
yea, I tried removing the HAL PID components that control the spindle and it certainly didnt act the same, so im just gonna leave those be for now, because it seems to be working as it should.

So I got the linear encoders wired up and input into HAL. but as I am reading through the INI documentation I am noticing that the PID functionality is adjusting voltages sent to servos. im not sure that is going to work for me here as I am sending step and direction signals to my clearpath servos. so How do I get the PID and FF0,1,2 commands to work for my system? I played with it a little bit but I couldnt even get any of the axis' to oscillate.

on a side note, when I power the machine up the encoders get power as well, at what point does the encoder count begin? after the application starts up? or is the 7i96 taking counts once it has power? if this is the case I would prefer that the counter is reset to 0 after the system boots up and the machine is homed. is there a good way to do this? would it be a simple encoder.01.counter = 0 or something?

Here is my current HAL and INI files
HAL:
Code:
# Generated by PNCconf at Sat Jun 20 13:41:33 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=5 num_pwmgens=0 num_stepgens=5 sserial_port_0=00xxxx" setp hm2_7i96.0.watchdog.timeout_ns 5000000 loadrt pid names=pid.x,pid.y,pid.z,pid.s loadrt abs names=abs.0,abs.spindle loadrt lowpass names=lowpass.spindle loadrt scale names=scale.spindle loadrt near addf hm2_7i96.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_7i96.0.write servo-thread addf near.0 servo-thread addf abs.0 servo-thread # external output signals # external input signals #******************* # 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_7i96.0.stepgen.00.dirsetup [JOINT_0]DIRSETUP setp hm2_7i96.0.stepgen.00.dirhold [JOINT_0]DIRHOLD setp hm2_7i96.0.stepgen.00.steplen [JOINT_0]STEPLEN setp hm2_7i96.0.stepgen.00.stepspace [JOINT_0]STEPSPACE setp hm2_7i96.0.stepgen.00.position-scale [JOINT_0]STEP_SCALE setp hm2_7i96.0.stepgen.00.step_type 0 setp hm2_7i96.0.stepgen.00.control-type 1 setp hm2_7i96.0.stepgen.00.maxaccel [JOINT_0]STEPGEN_MAXACCEL setp hm2_7i96.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_7i96.0.stepgen.00.velocity-cmd #net x-pos-fb <= hm2_7i96.0.stepgen.00.position-fb net x-pos-fb => joint.0.motor-pos-fb net x-enable <= joint.0.amp-enable-out net x-enable => hm2_7i96.0.stepgen.00.enable # ---Encoder feedback signals/setup--- setp hm2_7i96.0.encoder.01.counter-mode 0 setp hm2_7i96.0.encoder.01.filter 1 setp hm2_7i96.0.encoder.01.index-invert 0 setp hm2_7i96.0.encoder.01.index-mask 0 setp hm2_7i96.0.encoder.01.index-mask-invert 0 setp hm2_7i96.0.encoder.01.scale [JOINT_0]ENCODER_SCALE net x-pos-fb <= hm2_7i96.0.encoder.01.position net x-vel-fb <= hm2_7i96.0.encoder.01.velocity net x-pos-fb => joint.0.motor-pos-fb net x-index-enable joint.0.index-enable <=> hm2_7i96.0.encoder.01.index-enable net x-pos-rawcounts <= hm2_7i96.0.encoder.01.rawcounts # ---setup home / limit switch signals--- net x-home-sw => 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_7i96.0.stepgen.01.dirsetup [JOINT_1]DIRSETUP setp hm2_7i96.0.stepgen.01.dirhold [JOINT_1]DIRHOLD setp hm2_7i96.0.stepgen.01.steplen [JOINT_1]STEPLEN setp hm2_7i96.0.stepgen.01.stepspace [JOINT_1]STEPSPACE setp hm2_7i96.0.stepgen.01.position-scale [JOINT_1]STEP_SCALE setp hm2_7i96.0.stepgen.01.step_type 0 setp hm2_7i96.0.stepgen.01.control-type 1 setp hm2_7i96.0.stepgen.01.maxaccel [JOINT_1]STEPGEN_MAXACCEL setp hm2_7i96.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_7i96.0.stepgen.01.velocity-cmd net y-pos-fb <= hm2_7i96.0.stepgen.01.position-fb net y-pos-fb => joint.1.motor-pos-fb net y-enable <= joint.1.amp-enable-out net y-enable => hm2_7i96.0.stepgen.01.enable # ---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_7i96.0.stepgen.02.dirsetup [JOINT_2]DIRSETUP setp hm2_7i96.0.stepgen.02.dirhold [JOINT_2]DIRHOLD setp hm2_7i96.0.stepgen.02.steplen [JOINT_2]STEPLEN setp hm2_7i96.0.stepgen.02.stepspace [JOINT_2]STEPSPACE setp hm2_7i96.0.stepgen.02.position-scale [JOINT_2]STEP_SCALE setp hm2_7i96.0.stepgen.02.step_type 0 setp hm2_7i96.0.stepgen.02.control-type 1 setp hm2_7i96.0.stepgen.02.maxaccel [JOINT_2]STEPGEN_MAXACCEL setp hm2_7i96.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_7i96.0.stepgen.02.velocity-cmd net z-pos-fb <= hm2_7i96.0.stepgen.02.position-fb net z-pos-fb => joint.2.motor-pos-fb net z-enable <= joint.2.amp-enable-out net z-enable => hm2_7i96.0.stepgen.02.enable # ---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_7i96.0.stepgen.03.dirsetup [SPINDLE_0]DIRSETUP setp hm2_7i96.0.stepgen.03.dirhold [SPINDLE_0]DIRHOLD setp hm2_7i96.0.stepgen.03.steplen [SPINDLE_0]STEPLEN setp hm2_7i96.0.stepgen.03.stepspace [SPINDLE_0]STEPSPACE setp hm2_7i96.0.stepgen.03.position-scale [SPINDLE_0]STEP_SCALE setp hm2_7i96.0.stepgen.03.step_type 0 setp hm2_7i96.0.stepgen.03.control-type 1 setp hm2_7i96.0.stepgen.03.maxaccel [SPINDLE_0]MAX_ACCELERATION setp hm2_7i96.0.stepgen.03.maxvel [SPINDLE_0]MAX_VELOCITY net spindle-vel-cmd-rps => hm2_7i96.0.stepgen.03.velocity-cmd #(Powers the drive external contactor) net estop-out <= iocontrol.0.user-enable-out net estop-out => hm2_7i96.0.ssr.00.out-01 #(enables the DMM drive with the power button) net machine-is-on <= halui.machine.is-on net machine-is-on => hm2_7i96.0.ssr.00.out-00 #(enables the spindle stepgen) net machine-is-enabled <= motion.motion-enabled net machine-is-enabled => hm2_7i96.0.stepgen.03.enable # ---Encoder feedback signals/setup--- setp hm2_7i96.0.encoder.04.counter-mode 1 setp hm2_7i96.0.encoder.04.filter 1 setp hm2_7i96.0.encoder.04.index-invert 0 setp hm2_7i96.0.encoder.04.index-mask 0 setp hm2_7i96.0.encoder.04.index-mask-invert 0 setp hm2_7i96.0.encoder.04.scale [SPINDLE_0]ENCODER_SCALE net spindle-revs <= hm2_7i96.0.encoder.04.position net spindle-vel-fb-rps <= hm2_7i96.0.encoder.04.velocity net spindle-index-enable <=> hm2_7i96.0.encoder.04.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-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--- net spindle-vel-fb-rps => abs.0.in net spindle-vel-fb-rps-abs abs.0.out net spindle-vel-cmd-rps => near.0.in1 net spindle-vel-fb-rps-abs => near.0.in2 net spindle-at-speed <= near.0.out setp near.0.scale 1.000000 setp near.0.difference 2.00 # 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--- # ---estop signals--- net estop-out <= iocontrol.0.user-enable-out net estop-out => iocontrol.0.emc-enable-in # ---toolchange signals for custom tool changer--- net tool-number <= iocontrol.0.tool-prep-number net tool-change-request <= iocontrol.0.tool-change net tool-change-confirmed => iocontrol.0.tool-changed net tool-prepare-request <= iocontrol.0.tool-prepare net tool-prepare-confirmed => iocontrol.0.tool-prepared


INI:
Code:
# Generated by PNCconf at Sat Jun 20 13:41:33 2020 # Using LinuxCNC version: UNAVAILABLE # If you make changes to this file, they will be # overwritten when you run PNCconf again [EMC] MACHINE = torcente_test DEBUG = 0 VERSION = 1.1 [DISPLAY] DISPLAY = axis GLADEVCP = -H gvcp_call_list.hal gvcp-panel.ui POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL MAX_FEED_OVERRIDE = 2.000000 MAX_SPINDLE_OVERRIDE = 2.000000 MIN_SPINDLE_OVERRIDE = 0.500000 INTRO_GRAPHIC = linuxcnc.gif INTRO_TIME = 5 PROGRAM_PREFIX = /home/cncmill/linuxcnc/nc_files INCREMENTS = .1in .01in .001in .0001in POSITION_FEEDBACK = ACTUAL DEFAULT_LINEAR_VELOCITY = 0.500000 MAX_LINEAR_VELOCITY = 5.000000 MIN_LINEAR_VELOCITY = 0.016670 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_7i96.0 [HAL] HALUI = halui HALFILE = torcente_test.hal HALFILE = custom.hal POSTGUI_HALFILE = postgui_call_list.hal SHUTDOWN = shutdown.hal [HALUI] MDI_COMMAND = G10 L20 P0 X0 ( Set X to zero ) MDI_COMMAND = G10 L20 P0 Y0 ( Set Y to zero ) MDI_COMMAND = G10 L20 P0 Z0 ( Set Z to zero ) [KINS] JOINTS = 3 KINEMATICS = trivkins coordinates=XYZ [TRAJ] COORDINATES = XYZ MAX_ANGULAR_VELOCITY = 360.00 DEFAULT_ANGULAR_VELOCITY = 36.00 LINEAR_UNITS = inch ANGULAR_UNITS = degree DEFAULT_LINEAR_VELOCITY = 0.83 MAX_LINEAR_VELOCITY = 8.33 [EMCIO] EMCIO = io CYCLE_TIME = 0.100 TOOL_TABLE = tool.tbl TOOL_CHANGE_QUILL_UP = 1 #****************************************** [AXIS_X] MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.0 MIN_LIMIT = -0.001 MAX_LIMIT = 17.75 [JOINT_0] TYPE = LINEAR HOME = 0.0 FERROR = 0.5 MIN_FERROR = 0.05 MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.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 = 10.42 STEPGEN_MAXACCEL = 125 P = 1 I = 0 D = 0 FF0 = 0 FF1 = 1 FF2 = 0 BIAS = 0 DEADBAND = 0.0005 MAX_OUTPUT = 10 ENCODER_SCALE = -5080 # these are in nanoseconds DIRSETUP = 5000 DIRHOLD = 5000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 4064 MIN_LIMIT = -0.001 MAX_LIMIT = 17.75 HOME_OFFSET = 0.0 #****************************************** #****************************************** [AXIS_Y] MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.0 MIN_LIMIT = -12.00 MAX_LIMIT = 0.00 [JOINT_1] TYPE = LINEAR HOME = 0.00 FERROR = 0.5 MIN_FERROR = 0.05 MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.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 = 10.42 STEPGEN_MAXACCEL = 125 P = 1000 I = 0 D = 0 FF0 = 0 FF1 = 1 FF2 = 0 BIAS = 0 DEADBAND = 0 MAX_OUTPUT = 0 # these are in nanoseconds DIRSETUP = 5000 DIRHOLD = 5000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = -4064 MIN_LIMIT = -12.00 MAX_LIMIT = 0.00 HOME_OFFSET = 0.00 #****************************************** #****************************************** [AXIS_Z] MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.0 MIN_LIMIT = -12.0 MAX_LIMIT = 0.001 [JOINT_2] TYPE = LINEAR HOME = 0.0 FERROR = 0.5 MIN_FERROR = 0.05 MAX_VELOCITY = 8.33333333333 MAX_ACCELERATION = 100.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 = 10.42 STEPGEN_MAXACCEL = 125 P = 1000 I = 0 D = 0 FF0 = 0 FF1 = 1 FF2 = 0 BIAS = 0 DEADBAND = 0 MAX_OUTPUT = 0 # these are in nanoseconds DIRSETUP = 5000 DIRHOLD = 5000 STEPLEN = 5000 STEPSPACE = 5000 STEP_SCALE = 4064 MIN_LIMIT = -12.0 MAX_LIMIT = 0.001 HOME_OFFSET = 0.0 #****************************************** [SPINDLE_0] MAX_VELOCITY = 310.268 MAX_ACCELERATION = 80 # 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 = 387.835 STEPGEN_MAXACCEL = 50 P = 50 I = 0 D = 0 FF0 = 0 FF1 = 0 FF2 = 0 BIAS = 0 DEADBAND = 0.00015 MAX_OUTPUT = 2000 ENCODER_SCALE = 402.8777 # these are in nanoseconds DIRSETUP = 10000 DIRHOLD = 10000 STEPLEN = 2000 STEPSPACE = 2000 STEP_SCALE = -805.755

Please Log in to join the conversation.

More
6 years 3 months ago #175522 by tommylight
Replied by tommylight on topic Encoders
From a quick glance
- Only X axis has encoder feedback
- X axis has a value of 10 for MAX_OUTPUT, i do not think that is correct, i have it at 0 and works properly with encoder feedback.
MAX_OUTPUT = 10 should be for servo systems with +-10V control.

Please Log in to join the conversation.

More
6 years 3 months ago #175543 by Todd Zuercher
Replied by Todd Zuercher on topic Encoders
You control your step/dir motor by sending a velocity command to the step generator which is analogous to the +/-10v command sent to an analog servo. The step/gen then sends a position feedback that is used to control the PID loop in an open loop set up. To switch to closed loop you simply replace the step/gen's feedback with feedback from an encoder (or other position device).

For the X-axis, do you have the linear encoder connected to hm2_7i96.0.encoder.01?
If so it is controlling the PID, (Where originally hm2_7i96.0.stepgen.00.position-fb was).

Now you need to tune the PID by increasing P until it becomes unstable (should be somthing between 1 and 1000). Basically you'll then follow the steps use in an ordinary velocity servo tuning tutorial.

Please Log in to join the conversation.

More
6 years 3 months ago #175587 by blazini36
Replied by blazini36 on topic Encoders
Well, unless you've made a cut in some metal you have no Idea what the PID is going to do, and unless you've re-tuned the DMM drive gains after removing the PID, we didn't give it a fair shake.......but cross that road when you get there.

No idea what you have going on with your encoders there. You have a highspeed dedicated encoder channel but you're using a GPIO MPG encoder input for the Spindle? The spindle drive is outputting quadrature but you have the encoder channel set to step/direction? Are your linear scales incremental quadrature (A+B )? or are they step/direction too? Do you plan on changing direction at all?

Encoder counts begin when the 7i96 is initialized. It is the 7i96 itself that is doing the counting. You have absolutely no reason to want to reset the counts, and your config doesn't use counts anyway, it uses the encoder position. The encoder's position isn't being used directly, the real position is coming from the motion.joint pins and that is what resets to 0 while homing. The encoder position is taken for it's position for where it is now compared to where it was and where it goes from here......the actual hm2 position value doesn't matter and it's never reset, otherwise you would have some connection to the 7i96.0.encoder.xx.reset pin as that resets count and position. SO basically if the encoder position is 10.257 when the home switch is activated, then the encoder's 10.257 becomes what the motion controller knows as "0" disregarding the switch offsets your config set.

Please Log in to join the conversation.

More
6 years 3 months ago #175618 by natholego11
Replied by natholego11 on topic Encoders
@Blazini,
I ended up using the encoder from the DMM spindle. so I am no longer using the other encoder. I might keep that for a home position or a spindle orientation position sensor in the future. but I ended up moving to the DMM encoder.

on the linear encoders they are TTL encoders. and from what I can tell they are working as they should, I did some moving around last night and when I input the 4064 pul/in on the ballscrew I am getting very close to the calculated pul/in on the encoder (5um/div = 5080pul/in) I think I am getting like 5085 or something, so pretty pleased with that, and I have my deadband set at 0.0005 which if i read correctly is the allowable variation the PID is tuning to.

That being the case you are saying i need to tune the PID during a cut? not just jogging the machine around? I get it that there arnt any loads on the machine (other than the inertia of the components that make up the machine) but I feel like i should see at least something when its just jogging around.

@Todd
do you have any references for the "velocity tuning tutorial?" Ill give it a try assuming everything i have setup is correct.

Please Log in to join the conversation.

More
6 years 3 months ago #175693 by blazini36
Replied by blazini36 on topic Encoders

natholego11 wrote: @Blazini,
I ended up using the encoder from the DMM spindle. so I am no longer using the other encoder. I might keep that for a home position or a spindle orientation position sensor in the future. but I ended up moving to the DMM encoder.

on the linear encoders they are TTL encoders. and from what I can tell they are working as they should, I did some moving around last night and when I input the 4064 pul/in on the ballscrew I am getting very close to the calculated pul/in on the encoder (5um/div = 5080pul/in) I think I am getting like 5085 or something, so pretty pleased with that, and I have my deadband set at 0.0005 which if i read correctly is the allowable variation the PID is tuning to.

That being the case you are saying i need to tune the PID during a cut? not just jogging the machine around? I get it that there arnt any loads on the machine (other than the inertia of the components that make up the machine) but I feel like i should see at least something when its just jogging around.


Look here:
linuxcnc.org/docs/html/man/man9/hostmot2.9.html

In your hal file:
setp hm2_7i96.0.encoder.01.counter-mode 0 (X)
setp hm2_7i96.0.encoder.04.counter-mode 1 (spindle)

This has nothing to do with "TTL". Transistor to Transistor Logic means "single ended" as referred to in the Mesa manual as opposed to differential. Quadrature, as opposed to Step/direction is what you are setting with "counter-mode". Quadrature is comparing 4 pulse edges between 2 separate phases, and the order the pulses come in from the 2 phases is what the controller understands as your encoder changing direction. Step/direction, uses a single pulse channel and holds the direction channel high or low to determine the direction change while the pulses are exactly the same. So if your DMM servo is outputting quadrature on AB channels, why do you have it set for step/direction? I never used the "MPG" encoder config but isn't your dedicated encoder channel still hm2_7i96.0.encoder.00? So why use a GPIO encoder channel for your fastest encoder?

Of course you can't tune the PID while it's cutting, lol I have nothing more to add to that conversation.

Please Log in to join the conversation.

More
6 years 3 months ago #176672 by natholego11
Replied by natholego11 on topic Encoders
Everyone,
I wanted to say thank you for your help and insight and training! I think I got it tuned yesterday, I need to take a cut and verify that everything measures correctly, but I have the deadband set on all 3 axis to 0.0003 and it seems stable. on to the next thing! gotta figure out the rest of my inputs and out puts.

Thanks again!

Please Log in to join the conversation.

Time to create page: 0.607 seconds
Powered by Kunena Forum