# HAL config file for MAX NC test machine ####################################################### # first load all the HAL modules we're going to need ####################################################### # kinematics loadrt trivkins # main motion controller module loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD traj_period_nsec=[EMCMOT]TRAJ_PERIOD key=[EMCMOT]SHMEM_KEY num_joints=[TRAJ]AXES # using steppers.... loadrt stepgen step_type=0,0,0,0 # I/O thru the parport loadrt hal_parport cfg="0x0378" # counting the spindle encoder in software loadrt encoder num_chan=2 # simulate the encoder loadrt sim_encoder num_chan=1 # misc blocks needed to do fun things loadrt ddt count=8 ####################################################### # add realtime functions to the threads # first the high speed thread ####################################################### # first we read parport inputs addf parport.0.read base-thread addf sim-encoder.make-pulses base-thread # update encoder counter addf encoder.update-counters base-thread # generate step and dir signals addf stepgen.make-pulses base-thread # write to outputs addf parport.0.write base-thread # now the servo thread ######################################################## # capture axis and spindle positions addf stepgen.capture-position servo-thread addf encoder.capture-position servo-thread # process motion commands coming from user space addf motion-command-handler servo-thread # run main motion controller addf motion-controller servo-thread # differentiators to make vel and acc signals addf ddt.0 servo-thread addf ddt.1 servo-thread addf ddt.2 servo-thread addf ddt.3 servo-thread addf ddt.4 servo-thread addf ddt.5 servo-thread addf ddt.6 servo-thread addf ddt.7 servo-thread # update output info, axis and spindle addf stepgen.update-freq servo-thread addf sim-encoder.update-speed servo-thread ####################################################### # interconnections # # first, the basic stepper machine connections ####################################################### # connect position commands from motion module to step generator newsig Xpos-cmd float linksp Xpos-cmd <= axis.0.motor-pos-cmd linksp Xpos-cmd => stepgen.0.position-cmd newsig Ypos-cmd float linksp Ypos-cmd <= axis.1.motor-pos-cmd linksp Ypos-cmd => stepgen.1.position-cmd newsig Zpos-cmd float linksp Zpos-cmd <= axis.2.motor-pos-cmd linksp Zpos-cmd => stepgen.2.position-cmd newsig Apos-cmd float linksp Apos-cmd <= axis.3.motor-pos-cmd linksp Apos-cmd => stepgen.3.position-cmd # connect position feedback from step generators # to motion module newsig Xpos-fb float linksp Xpos-fb <= stepgen.0.position-fb linksp Xpos-fb => axis.0.motor-pos-fb newsig Ypos-fb float linksp Ypos-fb <= stepgen.1.position-fb linksp Ypos-fb => axis.1.motor-pos-fb newsig Zpos-fb float linksp Zpos-fb <= stepgen.2.position-fb linksp Zpos-fb => axis.2.motor-pos-fb newsig Apos-fb float linksp Apos-fb <= stepgen.3.position-fb linksp Apos-fb => axis.3.motor-pos-fb # connect enable signals for step generators newsig Xen bit linksp Xen <= axis.0.amp-enable-out linksp Xen => stepgen.0.enable newsig Yen bit linksp Yen <= axis.1.amp-enable-out linksp Yen => stepgen.1.enable newsig Zen bit linksp Zen <= axis.2.amp-enable-out linksp Zen => stepgen.2.enable newsig Aen bit linksp Aen <= axis.3.amp-enable-out linksp Aen => stepgen.3.enable # connect signals to step pulse generator outputs newsig Xstep bit newsig Xdir bit newsig Ystep bit newsig Ydir bit newsig Zstep bit newsig Zdir bit newsig Astep bit newsig Adir bit linkps stepgen.0.step => Xstep linkps stepgen.0.dir => Xdir linkps stepgen.1.step => Ystep linkps stepgen.1.dir => Ydir linkps stepgen.2.step => Zstep linkps stepgen.2.dir => Zdir linkps stepgen.3.step => Astep linkps stepgen.3.dir => Adir # 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 # create a signal for "spindle on" newsig spindle_on bit linksp spindle_on <= motion.spindle-on # connect physical pins to the signals linksp Xstep => parport.0.pin-03-out linksp Xdir => parport.0.pin-02-out linksp Ystep => parport.0.pin-05-out linksp Ydir => parport.0.pin-04-out linksp Zstep => parport.0.pin-07-out linksp Zdir => parport.0.pin-06-out linksp Astep => parport.0.pin-09-out linksp Adir => parport.0.pin-08-out # amp enable (active lo) linksp Xen => parport.0.pin-01-out setp parport.0.pin-01-out-invert 1 # spindle enable (active lo) linksp spindle_on => parport.0.pin-14-out setp parport.0.pin-14-out-invert 1 ####################################################### # set scaling and other parameters of the basic machine # set stepgen module scaling - get values from ini file setp stepgen.0.position-scale [AXIS_0]SCALE setp stepgen.1.position-scale [AXIS_1]SCALE setp stepgen.2.position-scale [AXIS_2]SCALE setp stepgen.3.position-scale [AXIS_3]SCALE # set stepgen module accel limits - get values from ini file # jmk said to set these to ini value + 5% to avoid stepgen bug setp stepgen.0.maxaccel [AXIS_0]HAL_MAXACCEL setp stepgen.1.maxaccel [AXIS_1]HAL_MAXACCEL setp stepgen.2.maxaccel [AXIS_2]HAL_MAXACCEL setp stepgen.3.maxaccel [AXIS_3]HAL_MAXACCEL # end of basic machine ####################################################### # Beginning of threading related stuff ####################################################### # spindle speed control newsig spindle-speed-cmd float linkps motion.spindle-speed-out => spindle-speed-cmd linksp spindle-speed-cmd => sim-encoder.0.speed # spindle encoder # connect encoder signals to encoder counter newsig spindle-phase-A bit newsig spindle-phase-B bit newsig spindle-phase-Z bit linksp spindle-phase-A => encoder.0.phase-A linksp spindle-phase-B => encoder.0.phase-B linksp spindle-phase-Z => encoder.0.phase-Z linkps sim-encoder.0.phase-A => spindle-phase-A linkps sim-encoder.0.phase-B => spindle-phase-B linkps sim-encoder.0.phase-Z => spindle-phase-Z # assume 120 ppr = 480 counts/rev for the spindle setp sim-encoder.0.ppr 120 # iocontrol output is in rpm, but sim-encoder speed is rps setp sim-encoder.0.scale 60 # scale encoder output to read in revolutions # (that way thread pitches can be straightforward, # a 20 tpi thread would multiply the encoder output # by 1/20, etc) setp encoder.0.position-scale 480 # encoder reset control newsig spindle-index-enable bit linkps motion.spindle-index-enable <=> spindle-index-enable linksp spindle-index-enable <=> encoder.0.index-enable # report our revolution count to the motion controller newsig spindle-pos float linkps encoder.0.position => spindle-pos linksp spindle-pos => motion.spindle-revs ####################################################### # make vel and accel sigs for testing ####################################################### # send the position commands thru differentiators to # generate velocity and accel signals (for testing) # define the signals, and hook them up newsig Xvel float newsig Xacc float linksp Xpos-cmd => ddt.0.in linkps ddt.0.out => Xvel linksp Xvel => ddt.1.in linkps ddt.1.out => Xacc newsig Yvel float newsig Yacc float linksp Ypos-cmd => ddt.2.in linkps ddt.2.out => Yvel linksp Yvel => ddt.3.in linkps ddt.3.out => Yacc newsig Zvel float newsig Zacc float linksp Zpos-cmd => ddt.4.in linkps ddt.4.out => Zvel linksp Zvel => ddt.5.in linkps ddt.5.out => Zacc newsig Avel float newsig Aacc float linksp Apos-cmd => ddt.6.in linkps ddt.6.out => Avel linksp Avel => ddt.7.in linkps ddt.7.out => Aacc # for spindle velocity estimate loadrt lowpass count=1 newsig spindle-rpm-raw float newsig spindle-rpm-filtered float linksp spindle-rpm-raw encoder.0.velocity linksp spindle-rpm-raw lowpass.0.in linksp spindle-rpm-filtered lowpass.0.out setp lowpass.0.gain .03 addf lowpass.0 servo-thread