7i77 > Huanyang GT series VFD issues

More
02 Jun 2018 01:06 #111425 by fungus
Good evening!

I am tuning a retrofit I have been working on, in which I am controlling a lathe spindle (on a Nardini FastTrace toolroom lathe) utilizing a Huanyang GT series VFD. This VFD supports bipolar analog input, -10V -> +10V. I am using encoder 5 input and servo 5 output on the 7i77.

On to the issue: after configuring through PnCConf, I just can't get a decent response from the spindle. It wants to run away every time I use it. Looking through the .ini file, I see things that don't seem to match the documentation here.

Example:

MAX_OUTPUT = 10 - The maximum value for the output of the PID compensation that is written to the motor amplifier, in volts.

Mine is set by PnCConf to be 500, the maximum spindle speed.
Same thing goes for OUTPUT_SCALE (supposedly volts, but set to 500 by PnCConf).
OUTPUT_MIN_LIMIT & OUTPUT_MAX_LIMIT are also set to -500 & 500.

The axis servo outputs make sense:
OUTPUT_SCALE = 10.0
OUTPUT_MIN_LIMIT = -10.0
OUTPUT_MAX_LIMIT = 10.0

Am I missing something? Changing the settings in the .ini to acceptable ranges yields varying results. The spindle always wants to max out, even when commanding ridiculously low speeds (M03 S1, etc). The reported spindle speed in pyVCP is scaled correctly. The "Spindle-At-Speed" marker responds correctly.

This thing really has me scratching my head.

.ini:
# Generated by PNCconf at Thu May 31 16:58:19 2018
# If you make changes to this file, they will be
# overwritten when you run PNCconf again

[EMC]
MACHINE = lathe_test
DEBUG = 0

[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/nardini/linuxcnc/nc_files
PYVCP = pyvcp-panel.xml
INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in
LATHE = 1
POSITION_FEEDBACK = ACTUAL
DEFAULT_LINEAR_VELOCITY = 0.250000
MAX_LINEAR_VELOCITY = 1.000000
MIN_LINEAR_VELOCITY = 0.010000
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=5i25

[HAL]
HALUI = halui
HALFILE = lathe_test.hal
HALFILE = custom.hal
POSTGUI_HALFILE = postgui_call_list.hal
SHUTDOWN = shutdown.hal

[HALUI]

[TRAJ]
AXES = 3
COORDINATES = X Z
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 0.10
MAX_LINEAR_VELOCITY = 1.00
NO_FORCE_HOMING = 1

[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl

#********************
# Axis X
#********************
[AXIS_0]
TYPE = LINEAR
HOME = 0.0
FERROR = 0.5
MIN_FERROR = 0.05
MAX_VELOCITY = 1.0
MAX_ACCELERATION = 30.0
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
ENCODER_SCALE = 41615.3587
OUTPUT_SCALE = -10.0
OUTPUT_MIN_LIMIT = -10.0
OUTPUT_MAX_LIMIT = 10.0
MIN_LIMIT = -0.001
MAX_LIMIT = 8.0
HOME_OFFSET = 0.000000
HOME_SEARCH_VEL = -0.050000
HOME_LATCH_VEL = -0.016667
HOME_FINAL_VEL = 0.000000
HOME_USE_INDEX = NO

#********************
# Axis Z
#********************
[AXIS_2]
TYPE = LINEAR
HOME = 0.0
FERROR = 0.5
MIN_FERROR = 0.05
MAX_VELOCITY = 1.0
MAX_ACCELERATION = 30.0
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
ENCODER_SCALE = -41615.3587
OUTPUT_SCALE = 10.0
OUTPUT_MIN_LIMIT = -10.0
OUTPUT_MAX_LIMIT = 10.0
MIN_LIMIT = -4.0
MAX_LIMIT = 0.001
HOME_OFFSET = 0.000000
HOME_SEARCH_VEL = -0.050000
HOME_LATCH_VEL = -0.016667
HOME_FINAL_VEL = 0.000000
HOME_USE_INDEX = NO

#********************
# Spindle 
#********************
[SPINDLE_9]
P = 100.0
I = 0.0
D = 0.0
FF0 = 0.0
FF1 = 0.0
FF2 = 0.0
BIAS = 0.0
DEADBAND = 0.0001
MAX_OUTPUT = 500.0
ENCODER_SCALE = -4096.0
OUTPUT_SCALE = 500
OUTPUT_MIN_LIMIT = -500
OUTPUT_MAX_LIMIT = 500

.hal:
# Generated by PNCconf at Thu May 31 16:58:19 2018
# 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=" num_encoders=6 num_pwmgens=0 num_stepgens=0 sserial_port_0=000xxx" 
setp    hm2_5i25.0.watchdog.timeout_ns 5000000
loadrt pid names=pid.x,pid.z,pid.s
loadrt abs names=abs.spindle
loadrt lowpass names=lowpass.spindle
loadrt scale names=scale.spindle
loadrt near
loadrt classicladder_rt numPhysInputs=15 numPhysOutputs=15 numS32in=10 numS32out=10 numFloatIn=10 numFloatOut=10 numBits=50 numWords=50
loadrt mux16 names=jogincr

addf hm2_5i25.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 classicladder.0.refresh servo-thread
addf jogincr                  servo-thread
addf scale.spindle            servo-thread
addf abs.spindle              servo-thread
addf lowpass.spindle          servo-thread
addf near.0                   servo-thread
addf hm2_5i25.0.write         servo-thread

# external output signals


# --- SPINDLE-BRAKE ---
net spindle-brake hm2_5i25.0.7i77.0.0.output-12

# --- COOLANT-FLOOD ---
net coolant-flood hm2_5i25.0.7i77.0.0.output-13

# --- DOUT-00 ---
net dout-00 hm2_5i25.0.7i77.0.0.output-14

# external input signals


# --- DIN-00 ---
net din-00     <=  hm2_5i25.0.7i77.0.0.input-04

# --- DIN-01 ---
net din-01     <=  hm2_5i25.0.7i77.0.0.input-05

# --- DIN-02 ---
net din-02     <=  hm2_5i25.0.7i77.0.0.input-06

# --- DIN-03 ---
net din-03     <=  hm2_5i25.0.7i77.0.0.input-07

# --- HOME-Z ---
net home-z     <=  hm2_5i25.0.7i77.0.0.input-21

# --- HOME-X ---
net home-x     <=  hm2_5i25.0.7i77.0.0.input-22

#*******************
#  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

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

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout1-scalemax  [AXIS_0]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout1-minlim    [AXIS_0]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout1-maxlim    [AXIS_0]OUTPUT_MAX_LIMIT

net x-output                             => hm2_5i25.0.7i77.0.1.analogout1
net x-pos-cmd    axis.0.motor-pos-cmd
net x-enable     axis.0.amp-enable-out
# enable _all_ sserial pwmgens
net x-enable   hm2_5i25.0.7i77.0.1.analogena

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.01.counter-mode 0
setp    hm2_5i25.0.encoder.01.filter 1
setp    hm2_5i25.0.encoder.01.index-invert 0
setp    hm2_5i25.0.encoder.01.index-mask 0
setp    hm2_5i25.0.encoder.01.index-mask-invert 0
setp    hm2_5i25.0.encoder.01.scale  [AXIS_0]ENCODER_SCALE

net x-pos-fb               <=  hm2_5i25.0.encoder.01.position
net x-vel-fb               <=  hm2_5i25.0.encoder.01.velocity
net x-pos-fb               =>  axis.0.motor-pos-fb
net x-index-enable    axis.0.index-enable  <=>  hm2_5i25.0.encoder.01.index-enable
net x-pos-rawcounts        <=  hm2_5i25.0.encoder.01.rawcounts

# ---setup home / limit switch signals---

net home-x     =>  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

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

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout0-scalemax  [AXIS_2]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout0-minlim    [AXIS_2]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout0-maxlim    [AXIS_2]OUTPUT_MAX_LIMIT

net z-output                             => hm2_5i25.0.7i77.0.1.analogout0
net z-pos-cmd    axis.2.motor-pos-cmd
net z-enable     axis.2.amp-enable-out

# ---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_2]ENCODER_SCALE

net z-pos-fb               <=  hm2_5i25.0.encoder.00.position
net z-vel-fb               <=  hm2_5i25.0.encoder.00.velocity
net z-pos-fb               =>  axis.2.motor-pos-fb
net z-index-enable    axis.2.index-enable  <=>  hm2_5i25.0.encoder.00.index-enable
net z-pos-rawcounts        <=  hm2_5i25.0.encoder.00.rawcounts

# ---setup home / limit switch signals---

net home-z     =>  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

# ---PWM Generator signals/setup---

setp   hm2_5i25.0.7i77.0.1.analogout5-scalemax  [SPINDLE_9]OUTPUT_SCALE
setp   hm2_5i25.0.7i77.0.1.analogout5-minlim    [SPINDLE_9]OUTPUT_MIN_LIMIT
setp   hm2_5i25.0.7i77.0.1.analogout5-maxlim    [SPINDLE_9]OUTPUT_MAX_LIMIT

net spindle-output      => hm2_5i25.0.7i77.0.1.analogout5
net spindle-enable      => hm2_5i25.0.7i77.0.1.spinena

# ---Encoder feedback signals/setup---

setp    hm2_5i25.0.encoder.05.counter-mode 0
setp    hm2_5i25.0.encoder.05.filter 1
setp    hm2_5i25.0.encoder.05.index-invert 0
setp    hm2_5i25.0.encoder.05.index-mask 0
setp    hm2_5i25.0.encoder.05.index-mask-invert 0
setp    hm2_5i25.0.encoder.05.scale  [SPINDLE_9]ENCODER_SCALE

net spindle-revs             <=   hm2_5i25.0.encoder.05.position
net spindle-vel-fb-rps       <=   hm2_5i25.0.encoder.05.velocity
net spindle-index-enable     <=>  hm2_5i25.0.encoder.05.index-enable

# ---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---

net spindle-vel-cmd-rps    =>  near.0.in1
net spindle-vel-fb-rps         =>  near.0.in2
net spindle-at-speed       <=  near.0.out
setp near.0.scale 1.000000
setp near.0.difference 0.166667

#  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 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

# ---jogwheel signals to mesa encoder - x axis MPG---

net x-jog-count          <=  hm2_5i25.0.encoder.04.count

#  ---mpg signals---

setp    axis.0.jog-vel-mode 0
net x-jog-enable         =>  axis.0.jog-enable
net x-jog-count          =>  axis.0.jog-counts
net selected-jog-incr    =>  axis.0.jog-scale
sets x-jog-enable    true

# ---jogwheel signals to mesa encoder - z axis MPG---

net z-jog-count          <=  hm2_5i25.0.encoder.03.count

#  ---mpg signals---

setp    axis.2.jog-vel-mode 0
net z-jog-enable         =>  axis.2.jog-enable
net z-jog-count          =>  axis.2.jog-counts
net selected-jog-incr    =>  axis.2.jog-scale
sets z-jog-enable    true

sets selected-jog-incr     0.001000

#  ---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 din-00     =>  motion.digital-in-00
net din-01     =>  motion.digital-in-01
net din-02     =>  motion.digital-in-02
net din-03     =>  motion.digital-in-03
#  ---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


# Load Classicladder without GUI (can reload LADDER GUI in AXIS GUI

loadusr classicladder --nogui custom.clp

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

More
02 Jun 2018 02:32 #111432 by PCW
I would start with open loop spindle control first:

FF0 = 1, all other PID parameters =0

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

More
02 Jun 2018 21:02 #111478 by andypugh
Maybe the spindle encoder scale is backwards and the PID is running away.

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

More
03 Jun 2018 19:57 #111543 by fungus
PCW, that does allow me to command a speed. Questions:
1. In order to get my full speed range, I need to use two gear sets. One of them allows a range from 37.5 RPM to 500 RPM, the other from 237-3000RPM. The PnCConf page for the spindle does have a section for max RPM range 1, max RPM range 2. But the system seems to only command for the low gear range. I cannot seem to find info for setting range 1 & 2 in AXIS so it knows which one to use during open-loop spindle control. Any thoughts on this?
2. Will threading still observe the encoder even if the spindle is open loop? Mostly asking just for sanity's sake, prior searches seem to indicate that it will utilize the spindle encoder in order to modify the commands for the axes.

andypugh,
I believe the spindle encoder direction is set correctly, as M03 = CW (downward) rotation, and increases the spindle encoder counts as well as velocity (as reported by HALscope & HALmeter). I had tried inverting the encoder direction before posting, but with the same results. Another thing that makes me think it is not the encoder direction is that I could put spindle override on 1%, command M03 S10 and it would rotate in the CW direction at ~50RPM. If it was an inverted encoder, I would expect it to completely ignore the speed commands (but I could be entirely wrong about this!)

I'm still very confused why it responds differently from the axes regarding the max outputs and such. Running in closed-loop would be ideal, if I can get it set up...

I really appreciate any help. I'm constantly blown away at how much LinuxCNC can do.

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

More
03 Jun 2018 20:14 - 03 Jun 2018 20:48 #111547 by PCW
A couple general notes:

The spindle speed control does not need to be closed loop for spindle synchronized motions
(the axis motion is "geared" to the spindle position when spindle synchronized motion is used)

Your closed loop setup may well have the proper directions but with a P gain of 100 and no feed forward
and a slow to respond VFD it will be about as stable as a pig on stilts. If you consider that a P gain of 100 means to change the commanded speed by 100 RPM for a speed error of 1 RPM you can see this cannot possibly be stable. I think most closed loop
spindle PID loops are FF0=1 some (small P) and some I

I think there is a gearchange component for multi speed spindles
Last edit: 03 Jun 2018 20:48 by PCW.

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

More
03 Jun 2018 22:37 #111567 by andypugh

Your closed loop setup may well have the proper directions but with a P gain of 100 and no feed forward
and a slow to respond VFD it will be about as stable as a pig on stilts. If you consider that a P gain of 100 means to change the commanded speed by 100 RPM for a speed error of 1 RPM you can see this cannot possibly be stable.


Indeed.

I would suggest starting with a P-Gain of 0 and an FF0 of 1. Then try adding some I-Gain to compensate for non-linearity.

You might never need any P Gain for a spindle, but it might make it stiffer to sudden disturbances.

Fot the two gears, look at: linuxcnc.org/docs/2.7/html/man/man9/gearchange.9.html

(Though there are other ways to do it. I have a mill that auto-detects each of the 8 gears, and a lathe with a high-low electrically controlled gearbox that chooses the gear according to commanded speed.)

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

More
04 Jun 2018 02:56 #111572 by fungus
PCW, I (foolishly) had not even considered the response rate of the VFD. I even configured that in the menu options. That makes perfect sense.

Oddly enough, for my axes I am using DMM DYN4 drivers and DMM AC servos (0.75kW). I tuned the supposed PID parameters (for the velocity loop) in the drivers (they are more of a suggestion than running a real PID algorithm), and everything I could read regarding closing the position loop in LinuxCNC said to use only P & FF1, FF2. I fought with this for DAYS. I finally just gave up on recommendation and did my normal PID tuning method, and they hold very close to command now. FeedForward is something new to me.

I'll try tuning it with only FF1 & a little bit of Integral gain and see what happens. It is constantly running 10+ RPM above setpoint, so some Ki should do it some good.

andypugh, that is perfect. I assume GEARCHANGE is what PnCConf was trying to implement, so I'll go through and see what's missing. I have two forks that I have to change in order to get the correct ranges, so I'm planning to use some optical gates to read their positions automatically. I might have to implement that in ClassicLadder though.

Thanks again everyone. She's closer to running than she's been in several years!

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

More
04 Jun 2018 10:10 #111587 by andypugh
If you have VFD speed and spindle speed then you can use the automatic gear detection that I use on my 8-speed gearbox (though for a two-speed a simple switch is probably easier).

forum.linuxcnc.org/forum/47-hal-examples...gear-detection#39583

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

More
04 Jun 2018 13:53 #111602 by PCW

I'll try tuning it with only FF1 & a little bit of Integral gain and see what happens. It is constantly running 10+ RPM above setpoint, so some Ki should do it some good.
!


Note that you want FF0 (not FF1) in this case since the PID command and output are the same (velocity)

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

More
09 Jun 2018 21:16 #112086 by fungus
Just to follow up:

Even a tiny (0.001) Ki caused the spindle to exponentially increase in RPM. I ended up using a FF0 of 0.9, and it's right on target (PCW, I was thinking of the first FeedForward in my last post, but I guess the saying about programmers not being able to count is true :laugh:)

As for the gearchange, after setting it up you can look back and see in the I/O configuration that there is a "Spindle" > "Gear Change A" available. I ended up just making a pyVCP toggle for this for now, but it will be very easy to set up with a single optical gate and a couple labels. I have a couple virtual LEDs configured as idiot lights so I know if I'm in HIGH or LOW.

Thanks for the help gentlemen.

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

Moderators: cmorley
Time to create page: 0.087 seconds
Powered by Kunena Forum