rendered paste body# #######################################
#
# HAL file for 9x20 lathe
#
# Servos on X, Z and Spindle
#
# Derived from 2.3 hm2-servo.hal
#
# #####################################################################
# ###################################
# Core EMC/HAL Loads
# ###################################
# kinematics
loadrt trivkins
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
# standard components
loadrt pid num_chan=3
# hostmot2 driver
loadrt hostmot2 debug_idrom=1 debug_module_descriptors=1 debug_pin_descriptors=1 debug_modules=1
# load low-level driver
loadrt [HOSTMOT2](DRIVER) config=[HOSTMOT2](CONFIG)
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.pwm_frequency 40000
setp hm2_[HOSTMOT2](BOARD).0.watchdog.timeout_ns 10000000
# ################################################
# THREADS
# ################################################
addf hm2_[HOSTMOT2](BOARD).0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf pid.0.do-pid-calcs servo-thread
addf pid.1.do-pid-calcs servo-thread
addf pid.2.do-pid-calcs servo-thread
addf hm2_[HOSTMOT2](BOARD).0.write servo-thread
addf hm2_[HOSTMOT2](BOARD).0.pet_watchdog servo-thread
# ######################################################
# Axis-of-motion Specific Configs (not the GUI)
# ######################################################
# ################
# X [0] Axis
# ################
# axis enable chain
newsig emcmot.00.enable bit
sets emcmot.00.enable FALSE
net emcmot.00.enable => pid.0.enable
net emcmot.00.enable => hm2_[HOSTMOT2](BOARD).0.pwmgen.00.enable
net emcmot.00.enable <= axis.0.amp-enable-out
# encoder feedback
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.counter-mode 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.filter 1
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.index-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.index-mask 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.index-mask-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.00.scale [AXIS_0]INPUT_SCALE
net motor.00.pos-fb hm2_[HOSTMOT2](BOARD).0.encoder.00.position => pid.0.feedback
net motor.00.pos-fb => axis.0.motor-pos-fb #push copy back to Axis GUI
# set PID loop gains from inifile
setp pid.0.Pgain [AXIS_0]P
setp pid.0.Igain [AXIS_0]I
setp pid.0.Dgain [AXIS_0]D
setp pid.0.bias [AXIS_0]BIAS
setp pid.0.FF0 [AXIS_0]FF0
setp pid.0.FF1 [AXIS_0]FF1
setp pid.0.FF2 [AXIS_0]FF2
setp pid.0.deadband [AXIS_0]DEADBAND
setp pid.0.maxoutput [AXIS_0]MAX_VELOCITY
# position command signals
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.00.output-type 1 #pwm on pin1, dir on pin2
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.00.scale [AXIS_0]OUTPUT_SCALE
net emcmot.00.pos-cmd axis.0.motor-pos-cmd => pid.0.command
net motor.00.command pid.0.output => hm2_[HOSTMOT2](BOARD).0.pwmgen.00.value
# ################
# Spindle [1] Axis
# Note, axis requires 0-X,1-Y,2-Z, so we map hm2_ devices 2 to 1
# ################
# spindle enable chain
loadrt near
addf near.0 servo-thread
setp near.0.difference 1
setp near.0.in1 0
loadrt not
addf not.0 servo-thread
net near_not near.0.out => not.0.in
loadrt or2
addf or2.0 servo-thread
net spindle_on motion.spindle-on => or2.0.in0
net near_on not.0.out => or2.0.in1
net and_on or2.0.out => pid.1.enable hm2_[HOSTMOT2](BOARD).0.pwmgen.02.enable
# encoder feedback
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.counter-mode 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.filter 1
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.index-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.index-mask 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.index-mask-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.02.scale [SPINDLE]INPUT_SCALE
# set PID loop gains from inifile
setp pid.1.Pgain [SPINDLE]P
setp pid.1.Igain [SPINDLE]I
setp pid.1.Dgain [SPINDLE]D
setp pid.1.bias [SPINDLE]BIAS
setp pid.1.FF0 [SPINDLE]FF0
setp pid.1.FF1 [SPINDLE]FF1
setp pid.1.FF2 [SPINDLE]FF2
setp pid.1.deadband [SPINDLE]DEADBAND
setp pid.1.maxoutput [SPINDLE]MAX_OUTPUT
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.02.output-type 1 #pwm on pin1, dir on pin2
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.02.scale [SPINDLE]OUTPUT_SCALE
# velocity command signals
loadrt limit3
addf limit3.0 servo-thread
setp limit3.0.min -1500
setp limit3.0.max 1500
setp limit3.0.maxv 500
setp limit3.0.maxa 150
net spindle_rpm_cmd motion.spindle-speed-out => limit3.0.in
net spindle_limit_rpm limit3.0.out => pid.1.command
net spindle_limit_rpm => near.0.in2
loadrt enc_idx_div
addf enc-idx-div.0 servo-thread
setp enc-idx-div.0.trigger-count 10000
setp enc-idx-div.0.counts-per-rev 12000
net motor_speed_cmd pid.1.output => hm2_[HOSTMOT2](BOARD).0.pwmgen.02.value
net spindle_enc_count hm2_[HOSTMOT2](BOARD).0.encoder.02.count => enc-idx-div.0.encoder-count-in
net spindle_index_en hm2_[HOSTMOT2](BOARD).0.encoder.02.index-enable <==> enc-idx-div.0.encoder-index-enable
net spindle_div_idx_en enc-idx-div.0.index-enable <==> motion.spindle-index-enable
loadrt scale
addf scale.0 servo-thread
setp scale.0.gain 60
loadrt lowpass
addf lowpass.0 servo-thread
setp lowpass.0.gain 0.1
net motor.01.vel-fb-hz hm2_[HOSTMOT2](BOARD).0.encoder.02.velocity => scale.0.in
net motor.01.vel-fb-rpm scale.0.out => lowpass.0.in
net motor.01.vel-fb-rpm-filtered lowpass.0.out => pid.1.feedback
#net motor.01.vel-fb-rpm scale.0.out => pid.1.feedback
net motor.01.vel-fb-rpm-filtered lowpass.0.out => motion.spindle-speed-in
#net motor.01.vel-fb-rpm-scale => motion.spindle-speed-in
net motor.01.pos-fb hm2_[HOSTMOT2](BOARD).0.encoder.02.position motion.spindle-revs
# ################
# Z [2] Axis, is hm2_ device 1
# ################
# axis enable chain
newsig emcmot.02.enable bit
sets emcmot.02.enable FALSE
net emcmot.02.enable => pid.2.enable
net emcmot.02.enable => hm2_[HOSTMOT2](BOARD).0.pwmgen.01.enable
net emcmot.02.enable <= axis.2.amp-enable-out
# encoder feedback
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.counter-mode 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.filter 1
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.index-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.index-mask 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.index-mask-invert 0
setp hm2_[HOSTMOT2](BOARD).0.encoder.01.scale [AXIS_2]INPUT_SCALE
net motor.02.pos-fb hm2_[HOSTMOT2](BOARD).0.encoder.01.position => pid.2.feedback
net motor.02.pos-fb => axis.2.motor-pos-fb #push copy back to Axis GUI
# set PID loop gains from inifile
setp pid.2.Pgain [AXIS_2]P
setp pid.2.Igain [AXIS_2]I
setp pid.2.Dgain [AXIS_2]D
setp pid.2.bias [AXIS_2]BIAS
setp pid.2.FF0 [AXIS_2]FF0
setp pid.2.FF1 [AXIS_2]FF1
setp pid.2.FF2 [AXIS_2]FF2
setp pid.2.deadband [AXIS_2]DEADBAND
setp pid.2.maxoutput [AXIS_2]MAX_VELOCITY
# position command signals
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.01.output-type 1 #pwm on pin1, dir on pin2
setp hm2_[HOSTMOT2](BOARD).0.pwmgen.01.scale [AXIS_2]OUTPUT_SCALE
net emcmot.02.pos-cmd axis.2.motor-pos-cmd => pid.2.command
net motor.02.command pid.2.output => hm2_[HOSTMOT2](BOARD).0.pwmgen.01.value
# ##################################################
# Standard I/O Block - EStop, Etc
# ##################################################
# create a signal for the estop loopback
net estop-loop iocontrol.0.user-enable-out => iocontrol.0.emc-enable-in
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
# X Home switch
setp hm2_[HOSTMOT2](BOARD).0.gpio.024.is_output 0
net x_home_switch hm2_[HOSTMOT2](BOARD).0.gpio.024.in => axis.0.home-sw-in
net x_home_index_enable axis.0.index-enable => hm2_[HOSTMOT2](BOARD).0.encoder.00.index-enable
# ##################################################
# Spindle
# ##################################################