double pid loop ?
In position mode the drives have internal pid loop is possible to tune outer pid loop in linuxcnc ?
I mean with 2 pid loops 1 in drive and 1 in linuxcnc will be conflict between 2 pid loops ?
I made a simple breakout for 5i24 with 1 AM26LS31 & 1 AM26LS32 for testing in position mode with step dir
and possition feedback to linuxcnc but the operation is not stable i have some oscillation and delays to go in commanded possition
in last 0.05mm and some overshoot.
Is possible to pid tune in linuxcnc this setup or i must go for analog and have only one pid loop in linuxcnc and not in drive ?
Are there tutorials for tunning pid tunning for these 2 configs ?
Also if i get one 7i33TA for analog driving in speed mode how can i connect the spindle because pwm outputs from 7i33
are -10v +10v and my vfd for spindle gets 0-10v and has 2 pins for cw and ccw.Must make a new breakout that convert -10v +10v
to 0-10v CW CCW ?
7i33TA cooperates with 5i24 SVST4_8 firmware ?
Please Log in or Create an account to join the conversation.
Note that most of the tuning will be with FF1
a 7I33 will work with 0-10 just fine, you just dont supply negative PWM values
(motion has a absolute spindle speed pin that can be used for this)
Please Log in or Create an account to join the conversation.
With 7i33 i undestand can output 0-10V but can output the ccw cw signals ?
i have tested now with P=1 FF1=1 others=0 and does not overshoot does not oscillate but delays to travel the last 0.05mm-0.005mm
Please Log in or Create an account to join the conversation.
Are there pid tuning tutorials for both speed and position mode ?
With 7i33 i undestand can output 0-10V but can output the ccw cw signals ?
No, but you can use other I/O pins for this (and motion provides spindle forward and spindle reverse hal pins to drive the I/O)
i have tested now with P=1 FF1=1 others=0 and does not overshoot does not oscillate but delays to travel the last 0.05mm-0.005mm
Note that FF1=1 will only work if the input and output scale are both in machine units, is this the case?
can you post your hal/ini files here?
Please Log in or Create an account to join the conversation.
1mm/revolution
# Generated by PNCconf at Tue Jul 19 02:19:23 2016
# If you make changes to this file, they will be
# overwritten when you run PNCconf again
[EMC]
MACHINE = test1
DEBUG = 0
[DISPLAY]
DISPLAY = axis
POSITION_OFFSET = MACHINE
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/labros/linuxcnc/nc_files
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
LATHE = 1
POSITION_FEEDBACK = ACTUAL
DEFAULT_LINEAR_VELOCITY = 16.666667
MAX_LINEAR_VELOCITY = 32.500000
MIN_LINEAR_VELOCITY = 0.000000
DEFAULT_ANGULAR_VELOCITY = 0.250000
MAX_ANGULAR_VELOCITY = 1.000000
MIN_ANGULAR_VELOCITY = 0.010000
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
COMM_WAIT = 0.010
SERVO_PERIOD = 1000000
[HOSTMOT2]
# **** This is for info only ****
# DRIVER0=hm2_pci
# BOARD0=5i24
[HAL]
HALUI = halui
HALFILE = test1.hal
HALFILE = custom.hal
POSTGUI_HALFILE = postgui_call_list.hal
SHUTDOWN = shutdown.hal
[HALUI]
[TRAJ]
AXES = 3
COORDINATES = X Z
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 3.25
MAX_VELOCITY = 32.50
[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl
#********************
# Axis X
#********************
[AXIS_0]
TYPE = LINEAR
HOME = 0.0
FERROR = 10.0
MIN_FERROR = 1.0
MAX_VELOCITY = 32.5
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 = 40.62
STEPGEN_MAXACCEL = 937.50
P = 50.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
# these are in nanoseconds
DIRSETUP = 1500
DIRHOLD = 1500
STEPLEN = 1500
STEPSPACE = 1500
STEP_SCALE = 10000.0
MIN_LIMIT = -400.0
MAX_LIMIT = 400.0
HOME_OFFSET = 0.0
#********************
# Axis Z
#********************
[AXIS_2]
TYPE = LINEAR
HOME = 0.0
FERROR = 50.0
MIN_FERROR = 10.0
MAX_VELOCITY = 32.5
MAX_ACCELERATION = 1000
# 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 = 40.62
STEPGEN_MAXACCEL = 1250
P = 1.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 = 10000.0
# these are in nanoseconds
DIRSETUP = 1500
DIRHOLD = 1500
STEPLEN = 1500
STEPSPACE = 1500
STEP_SCALE = 10000.0
MIN_LIMIT = -1000.0
MAX_LIMIT = 1000.0
HOME_OFFSET = 0.0
#********************
# Spindle
#********************
[SPINDLE_9]
P = 0
I = 0
D = 0
FF0 = 1
FF1 = 0
FF2 = 0
BIAS = 0
DEADBAND = 0
MAX_OUTPUT = 2000
# Generated by PNCconf at Tue Jul 19 02:19:23 2016
# If you make changes to this file, they will be
# overwritten when you run PNCconf again
loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt hostmot2
loadrt hm2_pci config="firmware=hm2/5i24/SVST4_8.BIT num_encoders=1 num_pwmgens=0 num_stepgens=2"
setp hm2_5i24.0.watchdog.timeout_ns 5000000
loadrt pid names=pid.x,pid.z,pid.s
addf hm2_5i24.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.z.do-pid-calcs servo-thread
addf pid.s.do-pid-calcs servo-thread
addf hm2_5i24.0.write servo-thread
# external output signals
# external input signals
#*******************
# AXIS X
#*******************
setp pid.x.Pgain [AXIS_0]P
setp pid.x.Igain [AXIS_0]I
setp pid.x.Dgain [AXIS_0]D
setp pid.x.bias [AXIS_0]BIAS
setp pid.x.FF0 [AXIS_0]FF0
setp pid.x.FF1 [AXIS_0]FF1
setp pid.x.FF2 [AXIS_0]FF2
setp pid.x.deadband [AXIS_0]DEADBAND
setp pid.x.maxoutput [AXIS_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-vel-cmd => pid.x.command-deriv
net x-pos-fb => pid.x.feedback
net x-output => pid.x.output
# Step Gen signals/setup
setp hm2_5i24.0.stepgen.01.dirsetup [AXIS_0]DIRSETUP
setp hm2_5i24.0.stepgen.01.dirhold [AXIS_0]DIRHOLD
setp hm2_5i24.0.stepgen.01.steplen [AXIS_0]STEPLEN
setp hm2_5i24.0.stepgen.01.stepspace [AXIS_0]STEPSPACE
setp hm2_5i24.0.stepgen.01.position-scale [AXIS_0]STEP_SCALE
setp hm2_5i24.0.stepgen.01.step_type 0
setp hm2_5i24.0.stepgen.01.control-type 1
setp hm2_5i24.0.stepgen.01.maxaccel [AXIS_0]STEPGEN_MAXACCEL
setp hm2_5i24.0.stepgen.01.maxvel [AXIS_0]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net x-pos-cmd <= axis.0.motor-pos-cmd
net x-vel-cmd <= axis.0.joint-vel-cmd
net x-output <= hm2_5i24.0.stepgen.01.velocity-cmd
net x-pos-fb <= hm2_5i24.0.stepgen.01.position-fb
net x-pos-fb => axis.0.motor-pos-fb
net x-enable <= axis.0.amp-enable-out
net x-enable => hm2_5i24.0.stepgen.01.enable
# ---setup home / limit switch signals---
net x-home-sw => axis.0.home-sw-in
net x-neg-limit => axis.0.neg-lim-sw-in
net x-pos-limit => axis.0.pos-lim-sw-in
#*******************
# AXIS Z
#*******************
setp pid.z.Pgain [AXIS_2]P
setp pid.z.Igain [AXIS_2]I
setp pid.z.Dgain [AXIS_2]D
setp pid.z.bias [AXIS_2]BIAS
setp pid.z.FF0 [AXIS_2]FF0
setp pid.z.FF1 [AXIS_2]FF1
setp pid.z.FF2 [AXIS_2]FF2
setp pid.z.deadband [AXIS_2]DEADBAND
setp pid.z.maxoutput [AXIS_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-vel-cmd => pid.z.command-deriv
net z-pos-fb => pid.z.feedback
net z-output => pid.z.output
# Step Gen signals/setup
setp hm2_5i24.0.stepgen.00.dirsetup [AXIS_2]DIRSETUP
setp hm2_5i24.0.stepgen.00.dirhold [AXIS_2]DIRHOLD
setp hm2_5i24.0.stepgen.00.steplen [AXIS_2]STEPLEN
setp hm2_5i24.0.stepgen.00.stepspace [AXIS_2]STEPSPACE
setp hm2_5i24.0.stepgen.00.position-scale [AXIS_2]STEP_SCALE
setp hm2_5i24.0.stepgen.00.step_type 0
setp hm2_5i24.0.stepgen.00.control-type 1
setp hm2_5i24.0.stepgen.00.maxaccel [AXIS_2]STEPGEN_MAXACCEL
setp hm2_5i24.0.stepgen.00.maxvel [AXIS_2]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net z-pos-cmd <= axis.2.motor-pos-cmd
net z-vel-cmd <= axis.2.joint-vel-cmd
net z-output <= hm2_5i24.0.stepgen.00.velocity-cmd
#net z-pos-fb <= hm2_5i24.0.stepgen.00.position-fb
net z-pos-fb => axis.2.motor-pos-fb
net z-enable <= axis.2.amp-enable-out
net z-enable => hm2_5i24.0.stepgen.00.enable
# ---Encoder feedback signals/setup---
setp hm2_5i24.0.encoder.00.counter-mode 0
setp hm2_5i24.0.encoder.00.filter 1
setp hm2_5i24.0.encoder.00.index-invert 0
setp hm2_5i24.0.encoder.00.index-mask 0
setp hm2_5i24.0.encoder.00.index-mask-invert 0
setp hm2_5i24.0.encoder.00.scale [AXIS_2]ENCODER_SCALE
net z-pos-fb <= hm2_5i24.0.encoder.00.position
net z-vel-fb <= hm2_5i24.0.encoder.00.velocity
net z-pos-fb => axis.2.motor-pos-fb
net z-index-enable axis.2.index-enable <=> hm2_5i24.0.encoder.00.index-enable
net z-pos-rawcounts <= hm2_5i24.0.encoder.00.rawcounts
# ---setup home / limit switch signals---
net z-home-sw => axis.2.home-sw-in
net z-neg-limit => axis.2.neg-lim-sw-in
net z-pos-limit => axis.2.pos-lim-sw-in
#*******************
# SPINDLE S
#*******************
setp pid.s.Pgain [SPINDLE_9]P
setp pid.s.Igain [SPINDLE_9]I
setp pid.s.Dgain [SPINDLE_9]D
setp pid.s.bias [SPINDLE_9]BIAS
setp pid.s.FF0 [SPINDLE_9]FF0
setp pid.s.FF1 [SPINDLE_9]FF1
setp pid.s.FF2 [SPINDLE_9]FF2
setp pid.s.deadband [SPINDLE_9]DEADBAND
setp pid.s.maxoutput [SPINDLE_9]MAX_OUTPUT
setp pid.s.error-previous-target true
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
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= motion.spindle-speed-out-rps
net spindle-vel-cmd-rps-abs <= motion.spindle-speed-out-rps-abs
net spindle-vel-cmd-rpm <= motion.spindle-speed-out
net spindle-vel-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle-enable <= motion.spindle-on
net spindle-cw <= motion.spindle-forward
net spindle-ccw <= motion.spindle-reverse
net spindle-brake <= motion.spindle-brake
net spindle-revs => motion.spindle-revs
net spindle-at-speed => motion.spindle-at-speed
net spindle-vel-fb-rps => motion.spindle-speed-in
net spindle-index-enable <=> motion.spindle-index-enable
# ---Setup spindle at speed signals---
sets spindle-at-speed true
#******************************
# connect miscellaneous signals
#******************************
# ---HALUI signals---
net joint-select-a halui.joint.0.select
net x-is-homed halui.joint.0.is-homed
net jog-x-pos halui.jog.0.plus
net jog-x-neg halui.jog.0.minus
net jog-x-analog halui.jog.0.analog
net joint-select-c halui.joint.2.select
net z-is-homed halui.joint.2.is-homed
net jog-z-pos halui.jog.2.plus
net jog-z-neg halui.jog.2.minus
net jog-z-analog halui.jog.2.analog
net jog-selected-pos halui.jog.selected.plus
net jog-selected-neg halui.jog.selected.minus
net spindle-manual-cw halui.spindle.forward
net spindle-manual-ccw halui.spindle.reverse
net spindle-manual-stop halui.spindle.stop
net machine-is-on halui.machine.is-on
net jog-speed halui.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
# ---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
Please Log in or Create an account to join the conversation.
For closed loop, can you not set P higher than 1 and remain stable?
(P=1 means a 1 mm error will cause a velocity adjustment of 1 mm/sec)
Please Log in or Create an account to join the conversation.
if i set P=50 for Z oscillates & overshoots
Please Log in or Create an account to join the conversation.
There's quite a range between 1 and 50.
You need to find the maximum stable P value for best performance
(this is no different on analog interfaces)
Please Log in or Create an account to join the conversation.
Please Log in or Create an account to join the conversation.
- Todd Zuercher
- Offline
- Platinum Member
- Posts: 5007
- Thank you received: 1441
Linuxcnc can't be expected to work properly with a position mode servo drive if the drive isn't properly tuned first.
Please Log in or Create an account to join the conversation.