Encoders

More
21 Jul 2020 23:49 #175364 by blazini36
Replied by blazini36 on topic Encoders

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 or Create an account to join the conversation.

More
21 Jul 2020 23:52 #175365 by blazini36
Replied by blazini36 on topic Encoders

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,
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

More
22 Jul 2020 10:06 #175376 by tommylight
Replied by tommylight on topic Encoders

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 or Create an account to join the conversation.

More
23 Jul 2020 01:48 - 23 Jul 2020 01:59 #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:
# 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:
# 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
Last edit: 23 Jul 2020 01:59 by natholego11.

Please Log in or Create an account to join the conversation.

More
23 Jul 2020 11:43 #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 or Create an account to join the conversation.

More
23 Jul 2020 13:43 #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 or Create an account to join the conversation.

More
23 Jul 2020 23:55 - 23 Jul 2020 23:56 #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.
Last edit: 23 Jul 2020 23:56 by blazini36.

Please Log in or Create an account to join the conversation.

More
24 Jul 2020 11:07 - 24 Jul 2020 11:08 #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.
Last edit: 24 Jul 2020 11:08 by natholego11.

Please Log in or Create an account to join the conversation.

More
24 Jul 2020 23:16 - 24 Jul 2020 23:20 #175693 by blazini36
Replied by blazini36 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.


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.
Last edit: 24 Jul 2020 23:20 by blazini36.
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

More
31 Jul 2020 15:17 #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!
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

Moderators: cncbasher
Time to create page: 0.167 seconds
Powered by Kunena Forum