#####################################################################
# Spindel VFD closed loop with PID LOWPASS NEAR SCALE
#####################################################################
newinst pid pid-s # used for closed loop spindle
newinst lowpass lp-s-fb
newinst near near-s-fb # used for spindle at speed
newinst scale scale-spindle-rpm # used for display RPM to user
# maxerror is related to the Igain (max value possible to add by pid = Igain x maxerrorI)
setp pid-s.maxerrorI 30
setp pid-s.Pgain .01
setp pid-s.Igain 1
setp pid-s.Dgain 0
setp pid-s.bias 0
setp pid-s.FF0 1
setp pid-s.FF1 0
setp pid-s.FF2 0
setp pid-s.deadband 0
setp pid-s.maxoutput 60
setp near-s-fb.scale 1.01 # 1.01 Allow 1% / 1.1 Allow 10% for speed cmd vs real
setp lp-s-fb.gain 0.005
# --- Spindle encoder
setp hpg.encoder.00.chan.00.scale 400 # counts per revolution
setp hpg.encoder.00.chan.00.filter 1 # Currently unsupported, included for compatability with hm2. ????
setp hpg.encoder.00.chan.00.index-mask 1 # Currently unsupported, included for compatability with hm2. ????
# disable encoder index as it is not working in pru encoder (finally seems to be ok)
#setp hpg.encoder.00.chan.00.counter-mode 0 # Quadrature mode AB default
net spindle-index-enable motion.spindle-index-enable <=> hpg.encoder.00.chan.00.index-enable pid-s.index-enable # need testing
# ---Spindle VFD closed loop with PID and compensation
net spindle-pos hpg.encoder.00.chan.00.position => motion.spindle-revs # report our revolution count to the motion controller
net spindle-vel-fb hpg.encoder.00.chan.00.velocity =>
lp-s-fb.in pid-s.feedback # report encoder speed to pid and speed filter input
net spindle-vel-fb-lp lp-s-fb.out => near-s-fb.in2 motion.spindle-speed-in
scale-spindle-rpm.in # report speed filtered to motion controller + scale input
# +report speed filtered to near component = Yes/No allowed with 1% difference
net spindle-at-speed near-s-fb.out => motion.spindle-at-speed # connect the near output to motion spindle-at-speed = Yes/No
setp scale-spindle-rpm.gain 60 # scale filtered speed RPSx60 = asked RPM
net spindle-vel-rpm scale-spindle-rpm.out # create hal for user display asked RPM connected with scale
# ---"PWM 24v to opto-PNP to 0/5V" driven by pru pwmgen for now connected to speed potentiometer
# ---setup spindle control signals and soft start---
newinst limit2 lim-s-speed
setp lim-s-speed.min -3000
setp lim-s-speed.max 3000
setp lim-s-speed.maxv 12
setp hpg.pwmgen.00.out.00.scale 60
setp hpg.pwmgen.00.pwm_period 10000000 # spec du controler ACRF16
net spindle.is-on motion.spindle-on hpg.pwmgen.00.out.00.enable # active pwmgen only when spindle is on from motion
net spindle-vel-cmd-rps motion.spindle-speed-out-rps
lim-s-speed.in near-s-fb.in1
net spindle-vel-cmd-rps-lim lim-s-speed.out => pid-s.command
net spindle-output pid-s.output => hpg.pwmgen.00.out.00.value
net spindle-vel-cmd-rps-abs motion.spindle-speed-out-rps-abs => comp-s-cmd.in1
net spindle-vel-cmd <= motion.spindle-speed-out
net spindle-vel-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle.is-on => pid-s.enable fur.do-6 # output pin for enable VFD
net spindle.runs-reverse motion.spindle-reverse => fur.do-7 # output pin for reverse direction
#####################################################################
# THREADS
addf lp-s-fb servo-thread
addf near-s-fb servo-thread
#addf comp-s-cmd slow-thread #servo-thread
addf lim-s-speed servo-thread
addf pid-s.do-pid-calcs servo-thread
addf scale-spindle-rpm slow-thread