Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 0 additions & 30 deletions 144.ngc

This file was deleted.

29 changes: 0 additions & 29 deletions 145.ngc

This file was deleted.

199 changes: 78 additions & 121 deletions 2x_Laser.hal
Original file line number Diff line number Diff line change
Expand Up @@ -2,109 +2,123 @@
# If you make changes to this file, they will be
# overwritten when you run stepconf again

loadrt threads name1=laser-thread period1=[EMCMOT]BASE_PERIOD
loadrt threads name1=base-thread period1=[EMCMOT]BASE_PERIOD fp1=0 name2=charge-pump-thread period2=100000 fp2=0

loadrt trivkins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hal_parport cfg="0x378 out"
setp parport.0.reset-time 1000
# setp parport.0.reset-time 1200
loadrt stepgen step_type=0,0,0
loadrt pwmgen output_type=0
loadrt charge_pump
loadrt laserraster linear_units=[TRAJ]LINEAR_UNITS axis_scale=[AXIS_0]SCALE axis_min_limit=[AXIS_0]MIN_LIMIT axis_max_limit=[AXIS_0]MAX_LIMIT
loadrt laserfreq

addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
# need capture-position in laser-thread for raster engraving:
addf stepgen.capture-position laser-thread
addf laserraster.0.make-pulses base-thread
addf laserfreq.0.make-pulses base-thread
addf pwmgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
# addf parport.0.reset base-thread

addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
addf laserraster.0.update servo-thread
addf laserfreq.0.update servo-thread
addf pwmgen.update servo-thread

addf charge-pump charge-pump-thread

net laser-power-cmd <= motion.analog-out-00 => pwmgen.0.value
net laser-pwm <= pwmgen.0.pwm
# or tie pwmgen.0.enable to dout-00??
setp pwmgen.0.enable 1
# pwm-freq 0 means PDM (pulse density modulation)
setp pwmgen.0.pwm-freq 0
setp pwmgen.0.scale 1
setp pwmgen.0.offset 0
setp pwmgen.0.max-dc 0.6
setp pwmgen.0.scale 200
setp pwmgen.0.offset 0.1
setp pwmgen.0.dither-pwm true

net dout-02 <= motion.digital-out-02
net din-02 => motion.digital-in-02
net coolant-mist <= iocontrol.0.coolant-mist
net estop-out <= iocontrol.0.user-enable-out
net estop-out => iocontrol.0.emc-enable-in

net laser-chiller => parport.0.pin-01-out
net estop-out => parport.0.pin-01-out
net xstep => parport.0.pin-02-out
setp parport.0.pin-02-out-reset 1
# setp parport.0.pin-02-out-reset 1
net xdir => parport.0.pin-03-out
setp parport.0.pin-03-out-invert 1
setp parport.0.pin-03-out-invert 0
net ystep => parport.0.pin-04-out
setp parport.0.pin-04-out-reset 1
# setp parport.0.pin-04-out-reset 1
net ydir => parport.0.pin-05-out
setp parport.0.pin-05-out-invert 1
net ustep => parport.0.pin-06-out
setp parport.0.pin-06-out-reset 1
net udir => parport.0.pin-07-out
net wstep => parport.0.pin-06-out
# setp parport.0.pin-06-out-reset 1
net wdir => parport.0.pin-07-out
setp parport.0.pin-07-out-invert 1
net dout-02 => parport.0.pin-08-out
net xenable => parport.0.pin-08-out
setp parport.0.pin-08-out-invert 1
net laser-pwm => parport.0.pin-14-out
net xenable => parport.0.pin-16-out
net coolant-mist => parport.0.pin-16-out
net laser-final => parport.0.pin-17-out

net home-x <= parport.0.pin-10-in-not
net home-y <= parport.0.pin-11-in-not
net both-w <= parport.0.pin-12-in-not
net max-home-y <= parport.0.pin-13-in-not
net min-home-x <= parport.0.pin-15-in-not

net din-02 <= parport.0.pin-13-in
# charge pump output on pin 9
net charge-pump-out-09 charge-pump.out => parport.0.pin-09-out

# based on Pololu drivers with Allegro drivers (1us ea hi/lo step, 200ns dir setup/hold)
# Keling 4030 driver 1.2us step, 5us dir setup
setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1000
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 200
setp stepgen.0.dirsetup 200
setp stepgen.0.steplen 1200
setp stepgen.0.stepspace 1200
setp stepgen.0.dirhold 1000
setp stepgen.0.dirsetup 5000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step
net xdir <= stepgen.0.dir
net xenable axis.0.amp-enable-out => stepgen.0.enable
net home-x => axis.0.home-sw-in
net min-home-x => axis.0.home-sw-in
net min-home-x => axis.0.neg-lim-sw-in

setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.1.steplen 1000
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 200
setp stepgen.1.dirsetup 200
setp stepgen.1.steplen 1200
setp stepgen.1.stepspace 1200
setp stepgen.1.dirhold 1000
setp stepgen.1.dirsetup 5000
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
net ystep <= stepgen.1.step
net ydir <= stepgen.1.dir
net yenable axis.1.amp-enable-out => stepgen.1.enable
net home-y => axis.1.home-sw-in

setp stepgen.2.position-scale [AXIS_6]SCALE
setp stepgen.2.steplen 1000
setp stepgen.2.stepspace 0
setp stepgen.2.dirhold 200
setp stepgen.2.dirsetup 200
setp stepgen.2.maxaccel [AXIS_6]STEPGEN_MAXACCEL
net upos-cmd axis.6.motor-pos-cmd => stepgen.2.position-cmd
net upos-fb stepgen.2.position-fb => axis.6.motor-pos-fb
net ustep <= stepgen.2.step
net udir <= stepgen.2.dir
net uenable axis.6.amp-enable-out => stepgen.2.enable
net max-home-y => axis.1.home-sw-in
net max-home-y => axis.1.pos-lim-sw-in

setp stepgen.2.position-scale [AXIS_8]SCALE
setp stepgen.2.steplen 1200
setp stepgen.2.stepspace 1200
setp stepgen.2.dirhold 1000
setp stepgen.2.dirsetup 5000
setp stepgen.2.maxaccel [AXIS_8]STEPGEN_MAXACCEL
net wpos-cmd axis.8.motor-pos-cmd => stepgen.2.position-cmd
net wpos-fb stepgen.2.position-fb => axis.8.motor-pos-fb
net wstep <= stepgen.2.step
net wdir <= stepgen.2.dir
net wenable axis.8.amp-enable-out => stepgen.2.enable
net both-w => axis.8.neg-lim-sw-in
net both-w => axis.8.pos-lim-sw-in

net zpos-cmd-fb <= axis.2.motor-pos-cmd => axis.2.motor-pos-fb

net estop-out <= iocontrol.0.user-enable-out
net estop-out => iocontrol.0.emc-enable-in

net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
net tool-prepare-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Expand All @@ -118,89 +132,30 @@ net laser-dout <= motion.digital-out-00

########################

loadrt laserfreq
addf laserfreq.0.make-pulses laser-thread
addf laserfreq.0.update servo-thread
setp laserraster.0.enable 1
setp laserraster.0.laser-on-delay [LASER]TRIGGER_DELAY
net raster-data-index <= motion.analog-out-01 => laserraster.0.data-index
net raster-data-1 <= motion.analog-out-02 => laserraster.0.data-1
net xstep => laserraster.0.stepgen-step
net xdir => laserraster.0.stepgen-dir
net laser-raster <= laserraster.0.laser-on

########################

setp laserfreq.0.duration [LASER]PULSED_CUT_DURATION
net current-vel motion.current-vel => laserfreq.0.velocity
net laser-freq motion.spindle-speed-out => laserfreq.0.pulse-per-unit
net laser-freq-speed motion.spindle-speed-out => laserfreq.0.pulse-per-unit
net laser-freq-trick-axis-rev motion.spindle-reverse
#net laser-dout => laserfreq.0.enable
setp laserfreq.0.enable 1
net laser-pulsed <= laserfreq.0.pulse

########################

# XXX configurable axis 0

# Compute motion-offset by observing how it affects the cmd so we can
# apply it manually to the fb. That allows us to use axis.0.position-fb
# directly (at base-thread rate) rather than waiting for servo-thread
# do do the same math and give us axis.N.joint-pos-fb
loadrt sum2 names=motion-offset-sub,motion-offset-apply
addf motion-offset-sub servo-thread
setp motion-offset-sub.gain1 -1
net xpos-jcmd axis.0.joint-pos-cmd => motion-offset-sub.in0
net xpos-cmd axis.0.motor-pos-cmd => motion-offset-sub.in1
net motion-offset <= motion-offset-sub.out

addf motion-offset-apply laser-thread
net xpos-fb => motion-offset-apply.in0
net motion-offset => motion-offset-apply.in1
net raster-pos-fb <= motion-offset-apply.out


loadrt comp names=raster-pos-gt-comp,laser-magic-z-comp
loadrt lut5 names=raster-read-lut,raster-fire-lut,laser-final-lut

loadrt streamer depth=256 cfg=bbf

# The order of addf determines the order of execution.
# Order these so that the inputs cascade correctly to the outputs:
addf raster-pos-gt-comp laser-thread
addf raster-read-lut laser-thread
addf streamer.0 laser-thread
addf raster-fire-lut laser-thread
addf laser-final-lut laser-thread

net raster-fire <= streamer.0.pin.0
net raster-rev <= streamer.0.pin.1
net raster-pos <= streamer.0.pin.2
net raster-empty <= streamer.0.empty
net raster-read => streamer.0.enable

# has the raster reached the target?
# raster-pos-gt := raster-pos-fb > raster-pos
net raster-pos => raster-pos-gt-comp.in0
net raster-pos-fb => raster-pos-gt-comp.in1
net raster-pos-gt <= raster-pos-gt-comp.out

# equation for reading the stream:
# 1) XXX you can't avoid reading when empty or the state never changes
# 2) flush (read all) when not running (M5 / laser-master off)
# 3) when the laser position passes the target position in the right direction
# raster-read := (~laser-master | (raster-pos-gt ^ raster-rev))
#setp raster-read-lut.function 0x15511551 (with raster-empty)
setp raster-read-lut.function 0x3ff33ff3
net raster-empty => raster-read-lut.in-0
net laser-master => raster-read-lut.in-1
net raster-pos-gt => raster-read-lut.in-2
net raster-rev => raster-read-lut.in-3
net raster-read <= raster-read-lut.out

# equation for firing the laser:
# 1) never fire when empty (underflow or job finished)
# 2) fire when raster-fire enabled
# laser-raster := ~raster-empty & raster-fire
setp raster-fire-lut.function 0x44444444
net raster-empty => raster-fire-lut.in-0
net raster-fire => raster-fire-lut.in-1
net laser-raster <= raster-fire-lut.out

########################

loadrt comp names=laser-magic-z-comp
addf laser-magic-z-comp servo-thread
net zpos-fb <= axis.2.joint-pos-fb => laser-magic-z-comp.in0
setp laser-magic-z-comp.in1 0.0
setp laser-magic-z-comp.in1 -0.0001
net laser-magic-z <= laser-magic-z-comp.out

########################
Expand All @@ -212,6 +167,8 @@ net laser-magic-z <= laser-magic-z-comp.out
# (laser-raster |
# ((laser-magic-z | laser-dout) & laser-pulsed))

loadrt lut5 names=laser-final-lut
addf laser-final-lut base-thread
setp laser-final-lut.function 0xfeaa0000
net laser-raster => laser-final-lut.in-0
net laser-dout => laser-final-lut.in-1
Expand Down
Loading