7i77 > Huanyang GT series VFD issues

More
8 years 4 months ago #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:
Code:
# 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:
Code:
# 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 to join the conversation.

More
8 years 4 months ago #111432 by PCW
I would start with open loop spindle control first:

FF0 = 1, all other PID parameters =0

Please Log in to join the conversation.

More
8 years 4 months ago #111478 by andypugh
Maybe the spindle encoder scale is backwards and the PID is running away.

Please Log in to join the conversation.

More
8 years 4 months ago #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 to join the conversation.

More
8 years 4 months ago #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

Please Log in to join the conversation.

More
8 years 4 months ago #111567 by andypugh

PCW wrote: 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 to join the conversation.

More
8 years 4 months ago #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 to join the conversation.

More
8 years 4 months ago #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 to join the conversation.

More
8 years 4 months ago #111602 by PCW

fungus wrote: 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 to join the conversation.

More
8 years 4 months ago #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 to join the conversation.

Time to create page: 0.192 seconds
Powered by Kunena Forum