Import LinuxCNC source tree

This commit is contained in:
Wang Dequan
2026-08-20 06:17:39 +08:00
commit 2c814634c3
9429 changed files with 10556013 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
Pico Systems
www.pico-systems.com

View File

@@ -0,0 +1 @@
A configuration for the Universal Stepper card from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. ini file parameters INPUT_SCALE are for the encoder counts/user unit, OUTPUT_SCALE is the scaling for the drive steps per user unit (which can be different).

View File

@@ -0,0 +1,244 @@
# ini file for Universal Stepper Controller with encoders
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = UNIVSTEP_Encoder
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = univstep.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = univstep_load.hal
HALFILE = univstep_servo.hal
HALFILE = univstep_motion.hal
HALFILE = univstep_io.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z A
HOME = 0 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.0167
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 15.0
MAX_LINEAR_ACCELERATION = 20.0
# Axes sections ---------------------------------------------------------------
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = univstep.tbl
[KINS]
KINEMATICS = trivkins
JOINTS = 4
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
# INPUT_SCALE sets the resolution of the encoder in user units
# for instance a 500 line encoder directly connected to a 5 TPI leadscrew
# would give 500 * 4 (for quadrature) * 5 = 10000
INPUT_SCALE = 10000
# OUTPUT_SCALE sets the resolution of the step generator
# for a Gecko320 with no pulse multiplier, it should be the same magnitude
# as INPUT_SCALE, but the arithmetic sign might need to be opposite
# if it runs away.
# if you have an encoder on a stepper motor, then this should be calculated
# by number of (micro)steps/rev X the leadscrew pitch, and may not match the
# INPUT_SCALE.
OUTPUT_SCALE = 10000.0
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
FERROR = 0.0100
MIN_FERROR = 0.1
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 4000.0
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 4000.0
MIN_LIMIT = -10.0
MAX_LIMIT = 30.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Fourth axis
[AXIS_A]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 66
BACKLASH = 0.000
INPUT_SCALE = 11.11111111
OUTPUT_SCALE = 11.1111111
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
FERROR = 0.1
MIN_FERROR = 0.2
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.046
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# section for main IO controller parameters -----------------------------------

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,82 @@
# HAL config file for Pico Systems USC board
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
net Xminlim <= ppmc.0.din.01.in
net Xminlim => joint.0.neg-lim-sw-in
net Xmaxlim <= ppmc.0.din.02.in
net Xmaxlim => joint.0.pos-lim-sw-in
net Xhome <= ppmc.0.din.00.in
net Xhome => joint.0.home-sw-in
net Yminlim <= ppmc.0.din.05.in
net Yminlim => joint.1.neg-lim-sw-in
net Ymaxlim <= ppmc.0.din.06.in
net Ymaxlim => joint.1.pos-lim-sw-in
net Yhome <= ppmc.0.din.04.in
net Yhome => joint.1.home-sw-in
net Zminlim <= ppmc.0.din.09.in
net Zminlim => joint.2.neg-lim-sw-in
net Zmaxlim <= ppmc.0.din.10.in
net Zmaxlim => joint.2.pos-lim-sw-in
net Zhome <= ppmc.0.din.08.in
net Zhome => joint.2.home-sw-in
net Aminlim <= ppmc.0.din.12.in
net Aminlim => joint.3.neg-lim-sw-in
net Amaxlim <= ppmc.0.din.13.in
net Amaxlim => joint.3.pos-lim-sw-in
net Ahome <= ppmc.0.din.11.in
net Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# uncomment these lines only if you have a Rev 2 USC board
#newsig Xindex bit
#newsig Yindex bit
#newsig Zindex bit
#linksp Xindex <= ppmc.0.encoder.00.index-enable
#linksp Xindex => joint.0.index-enable
#linksp Yindex <= ppmc.0.encoder.01.index-enable
#linksp Yindex => joint.1.index-enable
#linksp Zindex <= ppmc.0.encoder.02.index-enable
#linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and univstep's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from univstep from holding FF cleared
net ppmcEstop ppmc.0.din.15.in-not
net ppmcEstop and2.0.in0
net EstopOkIn estop-latch.0.fault-in
net EstopOkIn and2.0.out
net EstopOkOut <= ppmc.0.dout.07.out
net EstopOkOut iocontrol.0.emc-enable-in
net EstopOkOut estop-latch.0.ok-out
net EstopOkOut and2.0.in1
net emc-estop-out iocontrol.0.user-enable-out
net emc-estop-out estop-latch.0.ok-in
net emc-estop-reset iocontrol.0.user-request-enable
net emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
net SpindleFwd <= ppmc.0.dout.00.out
net SpindleFwd => spindle.0.forward
net SpindleRev <= ppmc.0.dout.01.out
net SpindleRev => spindle.0.reverse
# connect spindle brake to I/O controller
net SpindleBrakeOn <= ppmc.0.dout.02.out
net SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
net MistOn <= ppmc.0.dout.03.out
net MistOn => iocontrol.0.coolant-mist
net FloodOn <= ppmc.0.dout.04.out
net FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,41 @@
# sample file pulls all load commands into a single file
# when emc2 starts it loads iocontrol
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install driver
# if the stepper controller is not connected to the standard parallel port
# at address 0x378 add port_addr="0x1234" after a space to the following line
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc
# make some signals for the scope for tuning.
loadrt ddt count=4
# add components for E-stop logic
loadrt estop_latch count=1
loadrt and2 count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,47 @@
# HAL config file for Pico Systems USC board with encoders
# set sane pulse timing - these are basically Gecko numbers
# both pulse width and space are set to 3.5 uS, to prevent
# problems if the outputs are inverted externally
setp ppmc.0.stepgen.00-03.pulse-width-ns 3500
setp ppmc.0.stepgen.00-03.pulse-space-min-ns 3500
# setup time is set to 1 uS
setp ppmc.0.stepgen.00-03.setup-time-ns 1000
# connect position feedback signals to encoders
net Xpos-fb <= ppmc.0.encoder.00.position
net Ypos-fb <= ppmc.0.encoder.01.position
net Zpos-fb <= ppmc.0.encoder.02.position
net Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale [JOINT_3]INPUT_SCALE
# connect PID output signals to step generators
net Xoutput => ppmc.0.stepgen.00.velocity
net Youtput => ppmc.0.stepgen.01.velocity
net Zoutput => ppmc.0.stepgen.02.velocity
net Aoutput => ppmc.0.stepgen.03.velocity
# connect axis enables to step generators
net Xenable => ppmc.0.stepgen.00.enable
net Yenable => ppmc.0.stepgen.01.enable
net Zenable => ppmc.0.stepgen.02.enable
net Aenable => ppmc.0.stepgen.03.enable
# set output scaling from ini file
# input and output scales should (normally) be the same for a USC
setp ppmc.0.stepgen.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.stepgen.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.stepgen.02.scale [JOINT_2]OUTPUT_SCALE
setp ppmc.0.stepgen.03.scale [JOINT_3]OUTPUT_SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
net Xoutput ddt.0.in
net Xpos-fb ddt.1.in

View File

@@ -0,0 +1,95 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
# connect position feedback to PID loop
net Xpos-fb => pid.0.feedback
net Ypos-fb => pid.1.feedback
net Zpos-fb => pid.2.feedback
net Apos-fb => pid.3.feedback
# connect position feedback to motion module
net Xpos-fb => joint.0.motor-pos-fb
net Ypos-fb => joint.1.motor-pos-fb
net Zpos-fb => joint.2.motor-pos-fb
net Apos-fb => joint.3.motor-pos-fb
# create PID to DAC output signals
# connect output signals to output of PID loops
net Xoutput <= pid.0.output
net Youtput <= pid.1.output
net Zoutput <= pid.2.output
net Aoutput <= pid.3.output
# set PID loop output limits to +/-1.00
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
setp pid.3.maxoutput [JOINT_3]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
setp pid.3.Pgain [JOINT_3]P
setp pid.3.Igain [JOINT_3]I
setp pid.3.Dgain [JOINT_3]D
setp pid.3.bias [JOINT_3]BIAS
setp pid.3.FF0 [JOINT_3]FF0
setp pid.3.FF1 [JOINT_3]FF1
setp pid.3.FF2 [JOINT_3]FF2
setp pid.3.deadband [JOINT_3]DEADBAND
# create four position command signals
# connect position commands to motion controller
net Xpos-cmd <= joint.0.motor-pos-cmd
net Ypos-cmd <= joint.1.motor-pos-cmd
net Zpos-cmd <= joint.2.motor-pos-cmd
net Apos-cmd <= joint.3.motor-pos-cmd
# connect position commands to PID input
net Xpos-cmd => pid.0.command
net Ypos-cmd => pid.1.command
net Zpos-cmd => pid.2.command
net Apos-cmd => pid.3.command
# create bit signals to enable/disable the PID loops
# connect the signals to the motion controller
net Xenable <= joint.0.amp-enable-out
net Yenable <= joint.1.amp-enable-out
net Zenable <= joint.2.amp-enable-out
net Aenable <= joint.3.amp-enable-out
# connect the signals to the PID blocks
net Xenable => pid.0.enable
net Yenable => pid.1.enable
net Zenable => pid.2.enable
net Aenable => pid.3.enable

View File

@@ -0,0 +1 @@
A configuration for the PPMC board set from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. The IO configuration in ppmc_io.hal DOES include signal connections for some bridgeportio like signal handling.

View File

@@ -0,0 +1,260 @@
# EMC controller parameters for generic controller. Make these what you need
# for your system.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-PPMC
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = ppmc.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = ppmc_load.hal
HALFILE = ppmc_servo.hal
HALFILE = ppmc_motion.hal
HALFILE = ppmc_io.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z A
HOME = 0 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.15
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 1.5
MAX_LINEAR_ACCELERATION = 1.5
# Axes sections ---------------------------------------------------------------
# Scaling: The OUTPUT_SCALE should be the speed
# in UNITS/second (inches/sec or mm/sec) that would be
# reached if the PWM duty cycle was 100%. It depends on
# the power supply voltage, motor RPM/Volt factor, and
# gearing/screw pitch. For example:
#
# Power supply voltage 50V
# Motor RPM/V 1000RPM/24V
# Gearing: 2 motor revs per 1 screw rev
# Screw pitch: 0.2" per turn
#
# Max motor speed = 50V * 1000RPM/24V = 2083 RPM
# Max screw speed = 2083RPM * 1(screw)/2(motor) = 1041RPM
# Max table speed = 1041RPM * 0.2"/turn = 208 in/min
# Max table speed = 208 in/min / 60 seconds = 3.47 inches/sec
#
# Since max speed is reached at 100% duty cycle, OUTPUT_SCALE
# should be 3.47
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = ppmc.tbl
# section for external NML server parameters ----------------------------------
[KINS]
KINEMATICS = trivkins
JOINTS = 4
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = -128000.0
OUTPUT_SCALE = -1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 1e-06
P = 800.0
I = 25.0
D = 20.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = -128000.0
OUTPUT_SCALE = -1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 1e-06
P = 800.0
I = 25.0
D = 10.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = 128000.0
OUTPUT_SCALE = 1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 8e-05
P = 800.0
I = 25.0
D = 10.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Fourth axis
[AXIS_A]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 66.0
BACKLASH = 0.000
INPUT_SCALE = 1111.111
OUTPUT_SCALE = 5.0
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
FERROR = 1.010
MIN_FERROR = 1.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.046
P = 150.0
I = 100.0
D = 0.1
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 1.0
# section for main IO controller parameters -----------------------------------
[EMCSERVER]
# Uncomment the following line if you need to run a remote GUI.
# EMCSERVER = emcsvr

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,88 @@
# HAL config file for Pico Systems USC board
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
net Xminlim <= ppmc.0.din.01.in
net Xminlim => joint.0.neg-lim-sw-in
net Xmaxlim <= ppmc.0.din.02.in
net Xmaxlim => joint.0.pos-lim-sw-in
net Xhome <= ppmc.0.din.00.in
net Xhome => joint.0.home-sw-in
net Yminlim <= ppmc.0.din.05.in
net Yminlim => joint.1.neg-lim-sw-in
net Ymaxlim <= ppmc.0.din.06.in
net Ymaxlim => joint.1.pos-lim-sw-in
net Yhome <= ppmc.0.din.04.in
net Yhome => joint.1.home-sw-in
net Zminlim <= ppmc.0.din.09.in
net Zminlim => joint.2.neg-lim-sw-in
net Zmaxlim <= ppmc.0.din.10.in
net Zmaxlim => joint.2.pos-lim-sw-in
net Zhome <= ppmc.0.din.08.in
net Zhome => joint.2.home-sw-in
net Aminlim <= ppmc.0.din.12.in
net Aminlim => joint.3.neg-lim-sw-in
net Amaxlim <= ppmc.0.din.13.in
net Amaxlim => joint.3.pos-lim-sw-in
net Ahome <= ppmc.0.din.11.in
net Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# uncomment if you have encoder index signals
#linksp Xindex <= ppmc.0.encoder.00.index-enable
#linksp Xindex => joint.0.index-enable
#linksp Yindex <= ppmc.0.encoder.01.index-enable
#linksp Yindex => joint.1.index-enable
#linksp Zindex <= ppmc.0.encoder.02.index-enable
#linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and ppmc's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from ppmc from holding FF cleared
net ppmcEstop ppmc.0.din.estop.in
net ppmcEstop and2.0.in0
net EstopOkIn estop-latch.0.fault-in
net EstopOkIn and2.0.out
net EstopOkOut ppmc.0.dout.07.out
net EstopOkOut ppmc.0.dout.Estop.out
net EstopOkOut iocontrol.0.emc-enable-in
net EstopOkOut estop-latch.0.ok-out
net EstopOkOut and2.0.in1
net emc-estop-out iocontrol.0.user-enable-out
net emc-estop-out estop-latch.0.ok-in
net emc-estop-reset iocontrol.0.user-request-enable
net emc-estop-reset estop-latch.0.reset
#newsig EstopSense bit
#newsig EstopWrite bit
#linksp EstopSense <= ppmc.0.din.estop.in-not
#linksp EstopSense => iocontrol.0.emc-enable-in
#linksp EstopWrite <= ppmc.0.dout.07.out
#linksp EstopWrite => iocontrol.0.user-enable-out
#estop may need to be inverted
# connect spindle fwd/rev to I/O controller
net SpindleFwd <= ppmc.0.dout.00.out
net SpindleFwd => spindle.0.forward
net SpindleRev <= ppmc.0.dout.01.out
net SpindleRev => spindle.0.reverse
# connect spindle brake to I/O controller
net SpindleBrakeOn <= ppmc.0.dout.02.out
net SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
net MistOn <= ppmc.0.dout.03.out
net MistOn => iocontrol.0.coolant-mist
net FloodOn <= ppmc.0.dout.04.out
net FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,39 @@
# sample file pulls all load commands into a single file
# kinematics
loadrt [KINS]KINEMATICS
#motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install Universal PWM Controller driver
# if the parallel port the PPMC is connected to is not the standard 0x378, add
# port_addr="0x1234" to the end of the following line, separated by a space
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc
# make some signals for the scope for tuning.
loadrt ddt count=4
loadrt estop_latch count=1
loadrt and2 count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,32 @@
# HAL config file for Pico Systems UPC board
#
# connect position feedback signals to encoders
net Xpos-fb <= ppmc.0.encoder.00.position
net Ypos-fb <= ppmc.0.encoder.01.position
net Zpos-fb <= ppmc.0.encoder.02.position
net Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale [JOINT_3]INPUT_SCALE
# connect PID output signals to step generators
net Xoutput => ppmc.0.DAC.00.value
net Youtput => ppmc.0.DAC.01.value
net Zoutput => ppmc.0.DAC.02.value
net Aoutput => ppmc.0.DAC.03.value
# set output scaling from ini file
setp ppmc.0.DAC.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.DAC.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.DAC.02.scale [JOINT_2]OUTPUT_SCALE
setp ppmc.0.DAC.03.scale [JOINT_3]OUTPUT_SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
net Xoutput ddt.0.in
net Xpos-fb ddt.1.in

View File

@@ -0,0 +1,95 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
# connect position feedback to PID loop
net Xpos-fb => pid.0.feedback
net Ypos-fb => pid.1.feedback
net Zpos-fb => pid.2.feedback
net Apos-fb => pid.3.feedback
# connect position feedback to motion module
net Xpos-fb => joint.0.motor-pos-fb
net Ypos-fb => joint.1.motor-pos-fb
net Zpos-fb => joint.2.motor-pos-fb
net Apos-fb => joint.3.motor-pos-fb
# create PID to DAC output signals
# connect output signals to output of PID loops
net Xoutput <= pid.0.output
net Youtput <= pid.1.output
net Zoutput <= pid.2.output
net Aoutput <= pid.3.output
# set PID loop output limits to +/-1.00
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
setp pid.3.maxoutput [JOINT_3]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
setp pid.3.Pgain [JOINT_3]P
setp pid.3.Igain [JOINT_3]I
setp pid.3.Dgain [JOINT_3]D
setp pid.3.bias [JOINT_3]BIAS
setp pid.3.FF0 [JOINT_3]FF0
setp pid.3.FF1 [JOINT_3]FF1
setp pid.3.FF2 [JOINT_3]FF2
setp pid.3.deadband [JOINT_3]DEADBAND
# create four position command signals
# connect position commands to motion controller
net Xpos-cmd <= joint.0.motor-pos-cmd
net Ypos-cmd <= joint.1.motor-pos-cmd
net Zpos-cmd <= joint.2.motor-pos-cmd
net Apos-cmd <= joint.3.motor-pos-cmd
# connect position commands to PID input
net Xpos-cmd => pid.0.command
net Ypos-cmd => pid.1.command
net Zpos-cmd => pid.2.command
net Apos-cmd => pid.3.command
# create bit signals to enable/disable the PID loops
# connect the signals to the motion controller
net Xenable <= joint.0.amp-enable-out
net Yenable <= joint.1.amp-enable-out
net Zenable <= joint.2.amp-enable-out
net Aenable <= joint.3.amp-enable-out
# connect the signals to the PID blocks
net Xenable => pid.0.enable
net Yenable => pid.1.enable
net Zenable => pid.2.enable
net Aenable => pid.3.enable

View File

@@ -0,0 +1,8 @@
A configuration for the PPMC board set from Pico
systems. This configuration includes motion connections
and an IO set for handling estop within HAL. The IO
configuration in ppmc_io.hal DOES include signal
connections for some bridgeportio like signal handling.
This configs set includes the option for encoder
velocity estimation via timestamping, and tells how to
change the encoder digital filter frequency.

View File

@@ -0,0 +1,260 @@
# EMC controller parameters for generic controller. Make these what you need
# for your system.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-PPMC
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = ppmc.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = ppmc_load.hal
HALFILE = ppmc_servo.hal
HALFILE = ppmc_motion.hal
HALFILE = ppmc_io.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z A
HOME = 0 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.15
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 1.5
MAX_LINEAR_ACCELERATION = 1.5
# Axes sections ---------------------------------------------------------------
# Scaling: The OUTPUT_SCALE should be the speed
# in UNITS/second (inches/sec or mm/sec) that would be
# reached if the PWM duty cycle was 100%. It depends on
# the power supply voltage, motor RPM/Volt factor, and
# gearing/screw pitch. For example:
#
# Power supply voltage 50V
# Motor RPM/V 1000RPM/24V
# Gearing: 2 motor revs per 1 screw rev
# Screw pitch: 0.2" per turn
#
# Max motor speed = 50V * 1000RPM/24V = 2083 RPM
# Max screw speed = 2083RPM * 1(screw)/2(motor) = 1041RPM
# Max table speed = 1041RPM * 0.2"/turn = 208 in/min
# Max table speed = 208 in/min / 60 seconds = 3.47 inches/sec
#
# Since max speed is reached at 100% duty cycle, OUTPUT_SCALE
# should be 3.47
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = ppmc.tbl
# section for external NML server parameters ----------------------------------
[KINS]
KINEMATICS = trivkins
JOINTS = 4
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = -128000.0
OUTPUT_SCALE = -1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 1e-06
P = 800.0
I = 25.0
D = 20.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = -128000.0
OUTPUT_SCALE = -1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 1e-06
P = 800.0
I = 25.0
D = 10.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 1.25
PID_MAX_VEL = 1.2
BACKLASH = 0.000
INPUT_SCALE = 128000.0
OUTPUT_SCALE = 1.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.001
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 8e-05
P = 800.0
I = 25.0
D = 10.0
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
# Fourth axis
[AXIS_A]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 66.0
BACKLASH = 0.000
INPUT_SCALE = 1111.111
OUTPUT_SCALE = 5.0
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
FERROR = 1.010
MIN_FERROR = 1.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.046
P = 150.0
I = 100.0
D = 0.1
BIAS = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 1.0
# section for main IO controller parameters -----------------------------------
[EMCSERVER]
# Uncomment the following line if you need to run a remote GUI.
# EMCSERVER = emcsvr

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,78 @@
# HAL config file for Pico Systems USC board
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
net Xminlim <= ppmc.0.din.01.in
net Xminlim => joint.0.neg-lim-sw-in
net Xmaxlim <= ppmc.0.din.02.in
net Xmaxlim => joint.0.pos-lim-sw-in
net Xhome <= ppmc.0.din.00.in
net Xhome => joint.0.home-sw-in
net Yminlim <= ppmc.0.din.05.in
net Yminlim => joint.1.neg-lim-sw-in
net Ymaxlim <= ppmc.0.din.06.in
net Ymaxlim => joint.1.pos-lim-sw-in
net Yhome <= ppmc.0.din.04.in
net Yhome => joint.1.home-sw-in
net Zminlim <= ppmc.0.din.09.in
net Zminlim => joint.2.neg-lim-sw-in
net Zmaxlim <= ppmc.0.din.10.in
net Zmaxlim => joint.2.pos-lim-sw-in
net Zhome <= ppmc.0.din.08.in
net Zhome => joint.2.home-sw-in
net Aminlim <= ppmc.0.din.12.in
net Aminlim => joint.3.neg-lim-sw-in
net Amaxlim <= ppmc.0.din.13.in
net Amaxlim => joint.3.pos-lim-sw-in
net Ahome <= ppmc.0.din.11.in
net Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# uncomment if you have encoder index signals
#net Xindex <= ppmc.0.encoder.00.index-enable => joint.0.index-enable
#net Yindex <= ppmc.0.encoder.01.index-enable => joint.1.index-enable
#net Zindex <= ppmc.0.encoder.02.index-enable => joint.2.index-enable
#net Aindex <= ppmc.0.encoder.03.index-enable => joint.3.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and ppmc's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from ppmc from holding FF cleared
net ppmcEstop ppmc.0.din.estop.in
net ppmcEstop and2.0.in0
net EstopOkIn estop-latch.0.fault-in
net EstopOkIn and2.0.out
net EstopOkOut ppmc.0.dout.07.out
net EstopOkOut ppmc.0.dout.Estop.out
net EstopOkOut iocontrol.0.emc-enable-in
net EstopOkOut estop-latch.0.ok-out
net EstopOkOut and2.0.in1
net emc-estop-out iocontrol.0.user-enable-out
net emc-estop-out estop-latch.0.ok-in
net emc-estop-reset iocontrol.0.user-request-enable
net emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
net SpindleFwd <= ppmc.0.dout.00.out
net SpindleFwd => spindle.0.forward
net SpindleRev <= ppmc.0.dout.01.out
net SpindleRev => spindle.0.reverse
# connect spindle brake to I/O controller
net SpindleBrakeOn <= ppmc.0.dout.02.out
net SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
net MistOn <= ppmc.0.dout.03.out
net MistOn => iocontrol.0.coolant-mist
net FloodOn <= ppmc.0.dout.04.out
net FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,54 @@
# sample file pulls all load commands into a single file
# when emc2 starts it loads iocontrol
# this file enables encoder velocity timestamping
# it will only work on PPMC encoder boards with
# rev 4 or later firmware. In addition to the timestamp
# feature, rev 4 and above boards also have the ability to
# select the encoder digital filter frequeincy. Append
# enc_clock="n" to the loadrt hal_ppmc line. N can be
# 1, 2, 5 or 10 for 1, 2 5 or 10 MHz frequency. Any other
# value will default to the standard 1 MHz.
# it is best to use the lowest rate that allows your encoders
# to be read, as this gives the greatest suppression of
# electrical noise on the encoder inputs.
# kinematics
loadrt [KINS]KINEMATICS
#motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install Universal PWM Controller driver
#if the PPMC is not connected to the standard parallel port at 0x378
# add port_addr="0x1234" to the following command line
# timestamp="0x00" turns on timestamp encoder velocity estimation on the
# first encoder board of the PPMC system.
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc timestamp="0x00"
# make some signals for the scope for tuning.
loadrt ddt count=4
loadrt estop_latch count=1
loadrt and2 count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,44 @@
# HAL config file for Pico Systems UPC board
#
# connect position feedback signals to encoders
net Xpos-fb <= ppmc.0.encoder.00.position
net Ypos-fb <= ppmc.0.encoder.01.position
net Zpos-fb <= ppmc.0.encoder.02.position
net Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale [JOINT_3]INPUT_SCALE
# connect PID output signals to step generators
net Xoutput => ppmc.0.DAC.00.value
net Youtput => ppmc.0.DAC.01.value
net Zoutput => ppmc.0.DAC.02.value
net Aoutput => ppmc.0.DAC.03.value
# set output scaling from ini file
setp ppmc.0.DAC.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.DAC.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.DAC.02.scale [JOINT_2]OUTPUT_SCALE
setp ppmc.0.DAC.03.scale [JOINT_3]OUTPUT_SCALE
# set slowest velocity for estimation
setp ppmc.0.encoder.00.min-speed-estimate 0.001
setp ppmc.0.encoder.01.min-speed-estimate 0.001
setp ppmc.0.encoder.02.min-speed-estimate 0.001
setp ppmc.0.encoder.03.min-speed-estimate 0.001
# Here's the part that connects the encoder velocity to the PID
net Xfbderiv ppmc.0.encoder.00.velocity pid.0.feedback-deriv
net Yfbderiv ppmc.0.encoder.01.velocity pid.1.feedback-deriv
net Zfbderiv ppmc.0.encoder.02.velocity pid.2.feedback-deriv
net Afbderiv ppmc.0.encoder.03.velocity pid.3.feedback-deriv
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
net Xoutput ddt.0.in
net Xpos-fb ddt.1.in

View File

@@ -0,0 +1,95 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
# connect position feedback to PID loop
net Xpos-fb => pid.0.feedback
net Ypos-fb => pid.1.feedback
net Zpos-fb => pid.2.feedback
net Apos-fb => pid.3.feedback
# connect position feedback to motion module
net Xpos-fb => joint.0.motor-pos-fb
net Ypos-fb => joint.1.motor-pos-fb
net Zpos-fb => joint.2.motor-pos-fb
net Apos-fb => joint.3.motor-pos-fb
# create PID to DAC output signals
# connect output signals to output of PID loops
net Xoutput <= pid.0.output
net Youtput <= pid.1.output
net Zoutput <= pid.2.output
net Aoutput <= pid.3.output
# set PID loop output limits to +/-1.00
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
setp pid.3.maxoutput [JOINT_3]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
setp pid.3.Pgain [JOINT_3]P
setp pid.3.Igain [JOINT_3]I
setp pid.3.Dgain [JOINT_3]D
setp pid.3.bias [JOINT_3]BIAS
setp pid.3.FF0 [JOINT_3]FF0
setp pid.3.FF1 [JOINT_3]FF1
setp pid.3.FF2 [JOINT_3]FF2
setp pid.3.deadband [JOINT_3]DEADBAND
# create four position command signals
# connect position commands to motion controller
net Xpos-cmd <= joint.0.motor-pos-cmd
net Ypos-cmd <= joint.1.motor-pos-cmd
net Zpos-cmd <= joint.2.motor-pos-cmd
net Apos-cmd <= joint.3.motor-pos-cmd
# connect position commands to PID input
net Xpos-cmd => pid.0.command
net Ypos-cmd => pid.1.command
net Zpos-cmd => pid.2.command
net Apos-cmd => pid.3.command
# create bit signals to enable/disable the PID loops
# connect the signals to the motion controller
net Xenable <= joint.0.amp-enable-out
net Yenable <= joint.1.amp-enable-out
net Zenable <= joint.2.amp-enable-out
net Aenable <= joint.3.amp-enable-out
# connect the signals to the PID blocks
net Xenable => pid.0.enable
net Yenable => pid.1.enable
net Zenable => pid.2.enable
net Aenable => pid.3.enable

View File

@@ -0,0 +1 @@
A configuration for the Universal PWM card from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. The IO configuration in univpwm_io.hal does not include signal connections for other bridgeportio like signal handling.

View File

@@ -0,0 +1,35 @@
loadrt mux4 count=1
loadrt ilowpass
loadrt encoder num_chan=1
setp ilowpass.0.scale 100
setp ilowpass.0.gain 0.01
addf mux4.0 servo-thread
addf ilowpass.0 servo-thread
addf encoder.update-counters servo-thread
addf encoder.capture-position servo-thread
net jog-x ppmc.0.din.06.in => axis.0.jog-enable
net jog-y ppmc.0.din.07.in => axis.1.jog-enable
net jog-z ppmc.0.din.08.in => axis.2.jog-enable
net x10 ppmc.0.din.09.in => mux4.0.sel0
net x100 ppmc.0.din.10.in => mux4.0.sel1
setp mux4.0.in1 .00000025
setp mux4.0.in0 .0000025
setp mux4.0.in2 .000025
setp mux4.0.in3 0
net jogscale mux4.0.out => axis.0.jog-scale
net jogscale => axis.1.jog-scale
net jogscale => axis.2.jog-scale
net mpg-a ppmc.0.din.04.in => encoder.0.phase-A
net mpg-b ppmc.0.din.05.in => encoder.0.phase-B
net mpg-out encoder.0.rawcounts => ilowpass.0.in
net jogcounts ilowpass.0.out => axis.0.jog-counts
net jogcounts => axis.1.jog-counts
net jogcounts => axis.2.jog-counts

View File

@@ -0,0 +1 @@
net SpindleRPM pyvcp.SpindleRPM

View File

@@ -0,0 +1,9 @@
<pyvcp>
<label>
<text>"Spindle Speed:"</text>
</label>
<bar>
<halpin>"SpindleRPM"</halpin>
<max_>5000</max_>
</bar>
</pyvcp>

View File

@@ -0,0 +1,258 @@
# EMC controller parameters for generic controller. Make these what you need
# for your system.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-UNIVPWM
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = univpwm.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = univpwm_load.hal
HALFILE = univpwm_servo.hal
HALFILE = univpwm_motion.hal
HALFILE = univpwm_io.hal
#uncomment the following line to enable the pendant function
#HALFILE = pendant.hal
#uncomment the following line to enable the spindle speed display
#POSTGUI_HALFILE = spindle.hal
#You need to remove axis 3 or provide another path for a spindle encoder to
# feed into EMC for this to work.
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z A
HOME = 0 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.0167
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 15.0
MAX_LINEAR_ACCELERATION = 20.0
# Axes sections ---------------------------------------------------------------
# Scaling: The OUTPUT_SCALE should be the speed
# in UNITS/second (inches/sec or mm/sec) that would be
# reached if the PWM duty cycle was 100%. It depends on
# the power supply voltage, motor RPM/Volt factor, and
# gearing/screw pitch. For example:
#
# Power supply voltage 50V
# Motor RPM/V 1000RPM/24V
# Gearing: 2 motor revs per 1 screw rev
# Screw pitch: 0.2" per turn
#
# Max motor speed = 50V * 1000RPM/24V = 2083 RPM
# Max screw speed = 2083RPM * 1(screw)/2(motor) = 1041RPM
# Max table speed = 1041RPM * 0.2"/turn = 208 in/min
# Max table speed = 208 in/min / 60 seconds = 3.47 inches/sec
#
# Since max speed is reached at 100% duty cycle, OUTPUT_SCALE
# should be 3.47
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = univpwm.tbl
[KINS]
KINEMATICS = trivkins
JOINTS = 4
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 5.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.0100
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 5.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 5.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Fourth axis
[AXIS_A]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 66
BACKLASH = 0.000
INPUT_SCALE = 11.11111111
OUTPUT_SCALE = 5.0
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.046
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# section for main IO controller parameters -----------------------------------

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,84 @@
# HAL config file for Pico Systems USC board
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
net Xminlim <= ppmc.0.din.01.in
net Xminlim => joint.0.neg-lim-sw-in
net Xmaxlim <= ppmc.0.din.02.in
net Xmaxlim => joint.0.pos-lim-sw-in
net Xhome <= ppmc.0.din.00.in
net Xhome => joint.0.home-sw-in
net Yminlim <= ppmc.0.din.05.in
net Yminlim => joint.1.neg-lim-sw-in
net Ymaxlim <= ppmc.0.din.06.in
net Ymaxlim => joint.1.pos-lim-sw-in
net Yhome <= ppmc.0.din.04.in
net Yhome => joint.1.home-sw-in
net Zminlim <= ppmc.0.din.09.in
net Zminlim => joint.2.neg-lim-sw-in
net Zmaxlim <= ppmc.0.din.10.in
net Zmaxlim => joint.2.pos-lim-sw-in
net Zhome <= ppmc.0.din.08.in
net Zhome => joint.2.home-sw-in
net Aminlim <= ppmc.0.din.12.in
net Aminlim => joint.3.neg-lim-sw-in
net Amaxlim <= ppmc.0.din.13.in
net Amaxlim => joint.3.pos-lim-sw-in
net Ahome <= ppmc.0.din.11.in
net Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# uncomment these lines only if you have a Rev 3 UPC board
# The ppmc.x.encoder.xx.index-enable pin is ONLY exported by the driver
# if the UPC has rev 3 or above firmware
#newsig Xindex bit
#newsig Yindex bit
#newsig Zindex bit
#linksp Xindex <= ppmc.0.encoder.00.index-enable
#linksp Xindex => joint.0.index-enable
#linksp Yindex <= ppmc.0.encoder.01.index-enable
#linksp Yindex => joint.1.index-enable
#linksp Zindex <= ppmc.0.encoder.02.index-enable
#linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and univpwm's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from univpwm from holding FF cleared
net ppmcEstop ppmc.0.din.15.in-not
net ppmcEstop and2.0.in0
net EstopOkIn estop-latch.0.fault-in
net EstopOkIn and2.0.out
net EstopOkOut <= ppmc.0.dout.07.out
net EstopOkOut iocontrol.0.emc-enable-in
net EstopOkOut estop-latch.0.ok-out
net EstopOkOut and2.0.in1
net emc-estop-out iocontrol.0.user-enable-out
net emc-estop-out estop-latch.0.ok-in
net emc-estop-reset iocontrol.0.user-request-enable
net emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
net SpindleFwd <= ppmc.0.dout.00.out
net SpindleFwd => spindle.0.forward
net SpindleRev <= ppmc.0.dout.01.out
net SpindleRev => spindle.0.reverse
# connect spindle brake to I/O controller
net SpindleBrakeOn <= ppmc.0.dout.02.out
net SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
net MistOn <= ppmc.0.dout.03.out
net MistOn => iocontrol.0.coolant-mist
net FloodOn <= ppmc.0.dout.04.out
net FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,41 @@
# sample file pulls all load commands into a single file
# when emc2 starts it loads iocontrol
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install Universal PWM Controller driver
# if the PWM controller is not connected to the standard parallel port
# at address 0x378, add port_addr="0x1234" to the following line, separated
# by a space
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc
# make some signals for the scope for tuning.
loadrt ddt count=4
loadrt estop_latch count=1
loadrt and2 count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,55 @@
# HAL config file for Pico Systems UPC board
#
# set the PWM frequency to suit Pico's PWM amps (50KHz)
# users with other amps may need to change this
setp ppmc.0.pwm.00-03.freq 50000
# turn on bootstrapping for the MOSFET drivers
# this also depends on the amplifiers
setp ppmc.0.pwm.00.bootstrap TRUE
setp ppmc.0.pwm.01.bootstrap TRUE
setp ppmc.0.pwm.02.bootstrap TRUE
setp ppmc.0.pwm.03.bootstrap TRUE
# set max duty cycle to 95% for the MOSFET drives
# at 50KHz this corresponds to 1 us
setp ppmc.0.pwm.00.max-dc 0.95
setp ppmc.0.pwm.01.max-dc 0.95
setp ppmc.0.pwm.02.max-dc 0.95
setp ppmc.0.pwm.03.max-dc 0.95
# connect position feedback signals to encoders
net Xpos-fb <= ppmc.0.encoder.00.position
net Ypos-fb <= ppmc.0.encoder.01.position
net Zpos-fb <= ppmc.0.encoder.02.position
net Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale [JOINT_3]INPUT_SCALE
# connect PID output signals to step generators
net Xoutput => ppmc.0.pwm.00.value
net Youtput => ppmc.0.pwm.01.value
net Zoutput => ppmc.0.pwm.02.value
net Aoutput => ppmc.0.pwm.03.value
# connect axis enables to step generators
net Xenable => ppmc.0.pwm.00.enable
net Yenable => ppmc.0.pwm.01.enable
net Zenable => ppmc.0.pwm.02.enable
net Aenable => ppmc.0.pwm.03.enable
# set output scaling from ini file
setp ppmc.0.pwm.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.pwm.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.pwm.02.scale [JOINT_2]OUTPUT_SCALE
setp ppmc.0.pwm.03.scale [JOINT_3]OUTPUT_SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
net Xoutput ddt.0.in
net Xpos-fb ddt.1.in

View File

@@ -0,0 +1,95 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
# connect position feedback to PID loop
net Xpos-fb => pid.0.feedback
net Ypos-fb => pid.1.feedback
net Zpos-fb => pid.2.feedback
net Apos-fb => pid.3.feedback
# connect position feedback to motion module
net Xpos-fb => joint.0.motor-pos-fb
net Ypos-fb => joint.1.motor-pos-fb
net Zpos-fb => joint.2.motor-pos-fb
net Apos-fb => joint.3.motor-pos-fb
# create PID to DAC output signals
# connect output signals to output of PID loops
net Xoutput <= pid.0.output
net Youtput <= pid.1.output
net Zoutput <= pid.2.output
net Aoutput <= pid.3.output
# set PID loop output limits to +/-1.00
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
setp pid.3.maxoutput [JOINT_3]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
setp pid.3.Pgain [JOINT_3]P
setp pid.3.Igain [JOINT_3]I
setp pid.3.Dgain [JOINT_3]D
setp pid.3.bias [JOINT_3]BIAS
setp pid.3.FF0 [JOINT_3]FF0
setp pid.3.FF1 [JOINT_3]FF1
setp pid.3.FF2 [JOINT_3]FF2
setp pid.3.deadband [JOINT_3]DEADBAND
# create four position command signals
# connect position commands to motion controller
net Xpos-cmd <= joint.0.motor-pos-cmd
net Ypos-cmd <= joint.1.motor-pos-cmd
net Zpos-cmd <= joint.2.motor-pos-cmd
net Apos-cmd <= joint.3.motor-pos-cmd
# connect position commands to PID input
net Xpos-cmd => pid.0.command
net Ypos-cmd => pid.1.command
net Zpos-cmd => pid.2.command
net Apos-cmd => pid.3.command
# create bit signals to enable/disable the PID loops
# connect the signals to the motion controller
net Xenable <= joint.0.amp-enable-out
net Yenable <= joint.1.amp-enable-out
net Zenable <= joint.2.amp-enable-out
net Aenable <= joint.3.amp-enable-out
# connect the signals to the PID blocks
net Xenable => pid.0.enable
net Yenable => pid.1.enable
net Zenable => pid.2.enable
net Aenable => pid.3.enable

View File

@@ -0,0 +1 @@
A configuration for the Universal PWM COntroller board from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. The IO configuration in univpwm_io.hal does not include signal connections for other bridgeportio like signal handling. This version takes advantage of the new UPC feature of velocity estimation to provide smoother motion, especially the functioning of the D term of the PID component.

View File

@@ -0,0 +1,35 @@
loadrt mux4 count=1
loadrt ilowpass
loadrt encoder num_chan=1
setp ilowpass.0.scale 100
setp ilowpass.0.gain 0.01
addf mux4.0 servo-thread
addf ilowpass.0 servo-thread
addf encoder.update-counters servo-thread
addf encoder.capture-position servo-thread
net jog-x ppmc.0.din.06.in => joint.0.jog-enable
net jog-y ppmc.0.din.07.in => joint.1.jog-enable
net jog-z ppmc.0.din.08.in => joint.2.jog-enable
net x10 ppmc.0.din.09.in => mux4.0.sel0
net x100 ppmc.0.din.10.in => mux4.0.sel1
setp mux4.0.in1 .00000025
setp mux4.0.in0 .0000025
setp mux4.0.in2 .000025
setp mux4.0.in3 0
net jogscale mux4.0.out => joint.0.jog-scale
net jogscale => joint.1.jog-scale
net jogscale => joint.2.jog-scale
net mpg-a ppmc.0.din.04.in => encoder.0.phase-A
net mpg-b ppmc.0.din.05.in => encoder.0.phase-B
net mpg-out encoder.0.rawcounts => ilowpass.0.in
net jogcounts ilowpass.0.out => joint.0.jog-counts
net jogcounts => joint.1.jog-counts
net jogcounts => joint.2.jog-counts

View File

@@ -0,0 +1 @@
linksp SpindleRPM pyvcp.SpindleRPM

View File

@@ -0,0 +1,9 @@
<pyvcp>
<label>
<text>"Spindle Speed:"</text>
</label>
<bar>
<halpin>"SpindleRPM"</halpin>
<max_>5000</max_>
</bar>
</pyvcp>

View File

@@ -0,0 +1,252 @@
# EMC controller parameters for UPC with threading and pendant
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-UPC-Thread-Pendant
# Name of NML file to use, default is emc.nml
#NML_FILE = emc.nml
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0x00000001
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = doc/help.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
#spindle speed VCP
PYVCP = spindle.xml
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = univpwm.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Key for real OS shared memory, e.g., for simulated motion
SHMEM_KEY = 111
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Base task period, in nanoseconds - this is the fastest thread in the machine
BASE_PERIOD = 1000000
# Servo task period, in nanoseconds - will be rounded to an integer multiple
# of BASE_PERIOD
SERVO_PERIOD = 1000000
# Trajectory Planner task period, in nanoseconds - will be rounded to an
# integer multiple of SERVO_PERIOD
TRAJ_PERIOD = 10000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., bridgeporttask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = univpwm_load.hal
HALFILE = univpwm_servo.hal
HALFILE = univpwm_io.hal
HALFILE = univpwm_motion.hal
HALFILE = pendant.hal
POSTGUI_HALFILE = spindle.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z
HOME = 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.15
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 5.0
MAX_LINEAR_ACCELERATION = 5.0
PROBE_INDEX = 0
PROBE_POLARITY = 1
# Axes sections ---------------------------------------------------------------
# Important note about OUTPUT_SCALE and PWM_OUTPUT_SCALE
# For this configuration, OUTPUT_SCALE is not used, because
# EMC always overwrites it on shutdown. So PWM_OUTPUT_SCALE
# was added to hold the scaling. Someday the OUTPUT_SCALE
# issue may be fixed, and PWM_OUTPUT_SCALE will go away.
# Scaling: The PWM_OUTPUT_SCALE should be the speed
# in UNITS/second (inches/sec or mm/sec) that would be
# reached if the PWM duty cycle was 100%. It depends on
# the power supply voltage, motor RPM/Volt factor, and
# gearing/screw pitch. For example:
#
# Power supply voltage 50V
# Motor RPM/V 1000RPM/24V
# Gearing: 2 motor revs per 1 screw rev
# Screw pitch: 0.2" per turn
#
# Max motor speed = 50V * 1000RPM/24V = 2083 RPM
# Max screw speed = 2083RPM * 1(screw)/2(motor) = 1041RPM
# Max table speed = 1041RPM * 0.2"/turn = 208 in/min
# Max table speed = 208 in/min / 60 seconds = 3.47 inches/sec
#
# Since max speed is reached at 100% duty cycle, PWM_OUTPUT_SCALE
# should be 3.47
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = univpwm.tbl
# section for external NML server parameters ----------------------------------
[KINS]
KINEMATICS = trivkins
JOINTS = 3
[AXIS_X]
MIN_LIMIT = -12.0
MAX_LIMIT = 0.1
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 5.0
[JOINT_0]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 5.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = -128000
OUTPUT_SCALE = -1
MIN_LIMIT = -12.0
MAX_LIMIT = 0.1
FERROR = 0.1
MIN_FERROR = 1.0
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.5
HOME_LATCH_VEL = 0.1
HOME_USE_INDEX = YES
HOME_IGNORE_LIMITS = NO
DEADBAND = 2e-05
P = 1000
I = 2.5
D = 1
BIAS = 0
FF0 = 0
FF1 = 0.42
FF2 = 0.0125
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
[JOINT_1]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = -128000
OUTPUT_SCALE = -1
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.002
MIN_FERROR = 1.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 7e-06
P = 3000
I = 2.5
D = 40
BIAS = 0
FF0 = 0
FF1 = 0.6
FF2 = 0.001
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
[JOINT_2]
TYPE = LINEAR
UNITS = 0.03937007874016
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 3.0
PID_MAX_VEL = 1.2
BACKLASH = 0.000
CYCLE_TIME = 0.001000
INPUT_SCALE = 128000
OUTPUT_SCALE = 1
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.002
MIN_FERROR = 0.005
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000075
P = 1500
I = 10
D = 1.5
BIAS = 0
FF0 = 0
FF1 = 0.3
FF2 = 0.007
# section for main IO controller parameters -----------------------------------
[EMCSERVER]
# Uncomment the following line if you need to run a remote GUI.
# EMCSERVER = emcsvr

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,112 @@
# HAL config file for Pico Systems UPC board with threading
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
newsig Xminlim bit
newsig Xmaxlim bit
newsig Xhome bit
linksp Xminlim <= ppmc.0.din.01.in
linksp Xminlim => joint.0.neg-lim-sw-in
linksp Xmaxlim <= ppmc.0.din.02.in
linksp Xmaxlim => joint.0.pos-lim-sw-in
linksp Xhome <= ppmc.0.din.00.in
linksp Xhome => joint.0.home-sw-in
newsig Yminlim bit
newsig Ymaxlim bit
newsig Yhome bit
#linksp Yminlim <= ppmc.0.din.05.in
#linksp Yminlim => joint.1.neg-lim-sw-in
#linksp Ymaxlim <= ppmc.0.din.06.in
#linksp Ymaxlim => joint.1.pos-lim-sw-in
#linksp Yhome <= ppmc.0.din.04.in
#linksp Yhome => joint.1.home-sw-in
newsig Zminlim bit
newsig Zmaxlim bit
newsig Zhome bit
#linksp Zminlim <= ppmc.0.din.09.in
#linksp Zminlim => joint.2.neg-lim-sw-in
#linksp Zmaxlim <= ppmc.0.din.10.in
#linksp Zmaxlim => joint.2.pos-lim-sw-in
#linksp Zhome <= ppmc.0.din.08.in
#linksp Zhome => joint.2.home-sw-in
newsig Aminlim bit
newsig Amaxlim bit
newsig Ahome bit
linksp Aminlim <= ppmc.0.din.12.in
linksp Aminlim => joint.3.neg-lim-sw-in
linksp Amaxlim <= ppmc.0.din.13.in
linksp Amaxlim => joint.3.pos-lim-sw-in
linksp Ahome <= ppmc.0.din.11.in
linksp Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# do these when index pulsing is figured out
newsig Xindex bit
newsig Yindex bit
newsig Zindex bit
linksp Xindex <= ppmc.0.encoder.00.index-enable
linksp Xindex => joint.0.index-enable
linksp Yindex <= ppmc.0.encoder.01.index-enable
linksp Yindex => joint.1.index-enable
linksp Zindex <= ppmc.0.encoder.02.index-enable
linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and univpwm's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from univpwm from holding FF cleared
newsig ppmcEstop bit
linksp ppmcEstop ppmc.0.din.15.in-not
linksp ppmcEstop and2.0.in0
newsig EstopOkIn bit
linksp EstopOkIn estop-latch.0.fault-in
linksp EstopOkIn and2.0.out
newsig EstopOkOut bit
linksp EstopOkOut <= ppmc.0.dout.07.out
linksp EstopOkOut iocontrol.0.emc-enable-in
linksp EstopOkOut estop-latch.0.ok-out
linksp EstopOkOut and2.0.in1
newsig emc-estop-out bit
linksp emc-estop-out iocontrol.0.user-enable-out
linksp emc-estop-out estop-latch.0.ok-in
newsig emc-estop-reset bit
linksp emc-estop-reset iocontrol.0.user-request-enable
linksp emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
newsig SpindleFwd bit
newsig SpindleRev bit
linksp SpindleFwd <= ppmc.0.dout.00.out
linksp SpindleFwd => spindle.0.forward
linksp SpindleRev <= ppmc.0.dout.01.out
linksp SpindleRev => spindle.0.reverse
# connect spindle speed up/down to I/O controller
newsig SpindleUp bit
newsig SpindleDown bit
#linksp SpindleUp <= ppmc.0.dout.06.out
#linksp SpindleUp => motion.spindle-incr-speed
#linksp SpindleDown <= ppmc.0.dout.05.out
#linksp SpindleDown => motion.spindle-decr-speed
# connect spindle brake to I/O controller
newsig SpindleBrakeOn bit
linksp SpindleBrakeOn <= ppmc.0.dout.02.out
linksp SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
newsig MistOn bit
newsig FloodOn bit
linksp MistOn <= ppmc.0.dout.03.out
linksp MistOn => iocontrol.0.coolant-mist
linksp FloodOn <= ppmc.0.dout.04.out
linksp FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,58 @@
# loads all HAL modules for Universal PWM controller with threading
# this version activates velocity estimation in the PPMC driver
# with the timestamp=xx parameter in the loadrt line
# this will only work with rev 4 UPC firmware and EMC2.4.6 or later
# kinematics
loadrt [KINS]KINEMATICS
# 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 traj_period_nsec=[EMCMOT]SERVO_PERIOD key=[EMCMOT]SHMEM_KEY
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install Universal PWM Controller driver
# port_addr is the address of the parallel port data register
# timestamp="0x00" turns on the timestamped encoder velocity feature
# on the first PWM controller board
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc port_addr="0x378" timestamp="0x00"
# load realtime portion of scope, just to have it handy
loadrt scope_rt
# make some signals for the scope for tuning.
loadrt ddt count=4
loadrt not count=1
loadrt estop_latch count=1
loadrt and2 count=1
loadrt or2 count=1
loadrt conv_s32_float count=1
loadrt mult2 count=2
loadrt lowpass count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
addf not.0 servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# for spindle
addf or2.0 servo-thread
addf conv-s32-float.0 servo-thread
addf mult2.0 servo-thread
addf mult2.1 servo-thread
addf lowpass.0 servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,99 @@
# HAL config file for Pico Systems UPC board using Velocity Estimation
#
# set the PWM frequency to suit Pico's PWM amps (50KHz)
# users with other amps may need to change this
setp ppmc.0.pwm.00-03.freq 50000
# turn on bootstrapping for the MOSFET drivers
# this also depends on the amplifiers
setp ppmc.0.pwm.00.bootstrap TRUE
setp ppmc.0.pwm.01.bootstrap TRUE
setp ppmc.0.pwm.02.bootstrap TRUE
setp ppmc.0.pwm.03.bootstrap TRUE
# set max duty cycle to 95% for the MOSFET drives
# at 50KHz this corresponds to 1 us
setp ppmc.0.pwm.00.max-dc 0.95
setp ppmc.0.pwm.01.max-dc 0.95
setp ppmc.0.pwm.02.max-dc 0.95
setp ppmc.0.pwm.03.max-dc 0.95
setp ppmc.0.encoder.00.min-speed-estimate 0.001
setp ppmc.0.encoder.01.min-speed-estimate 0.001
setp ppmc.0.encoder.02.min-speed-estimate 0.001
setp ppmc.0.encoder.03.min-speed-estimate 0.001
# Here's the part that connects the encoder velocity to the PID
net Xfbderiv ppmc.0.encoder.00.velocity pid.0.feedback-deriv
net Yfbderiv ppmc.0.encoder.01.velocity pid.1.feedback-deriv
net Zfbderiv ppmc.0.encoder.02.velocity pid.2.feedback-deriv
# connect position feedback signals to encoders
linksp Xpos-fb <= ppmc.0.encoder.00.position
linksp Ypos-fb <= ppmc.0.encoder.01.position
linksp Zpos-fb <= ppmc.0.encoder.02.position
#linksp Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]INPUT_SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]INPUT_SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]INPUT_SCALE
setp ppmc.0.encoder.03.scale 6912
# connect PID output signals to PWM generators
linksp Xoutput => ppmc.0.pwm.00.value
linksp Youtput => ppmc.0.pwm.01.value
linksp Zoutput => ppmc.0.pwm.02.value
# connect axis enables to PWM generators
linksp Xenable => ppmc.0.pwm.00.enable
linksp Yenable => ppmc.0.pwm.01.enable
linksp Zenable => ppmc.0.pwm.02.enable
# set output scaling from ini file
setp ppmc.0.pwm.00.scale [JOINT_0]OUTPUT_SCALE
setp ppmc.0.pwm.01.scale [JOINT_1]OUTPUT_SCALE
setp ppmc.0.pwm.02.scale [JOINT_2]OUTPUT_SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
linkps ddt.0.in Xoutput
linkps ddt.1.in Xpos-fb
newsig spindle-sync bit
newsig spindle-index-en bit
linksp spindle-index-en => ppmc.0.encoder.03.index-enable
# hook up motion controller's sync output
linkps spindle.0.index-enable => spindle-index-en
# report rev count to motion controller
newsig spindle-pos float
linkps ppmc.0.encoder.03.position => spindle-pos
linksp spindle-pos => spindle.0.revs
# set up 4th PWM generator as a spindle speed control
newsig spindle-speed float
newsig spindle-pwm-cmd float
newsig spindle-pwm-filt float
linkps spindle.0.speed-out => spindle-speed
linksp spindle-speed => mult2.1.in0
setp mult2.1.in1 0.0009018
linkps mult2.1.out => spindle-pwm-cmd
linksp spindle-pwm-cmd => lowpass.0.in
linkps lowpass.0.out => spindle-pwm-filt
linksp spindle-pwm-filt => ppmc.0.pwm.03.value
setp lowpass.0.gain 0.005
newsig spindle-enable bit
# SpindleFwd and SpindleRev come from univpwm_io.hal
linksp SpindleFwd => or2.0.in0
linksp SpindleRev => or2.0.in1
linkps or2.0.out => spindle-enable
linksp spindle-enable ppmc.0.pwm.03.enable
# spindle speed display
net spinraw ppmc.0.encoder.03.delta conv-s32-float.0.in
net spinfloat conv-s32-float.0.out mult2.0.in0
setp mult2.0.in1 8.6805555
newsig SpindleRPM float
linkps mult2.0.out => SpindleRPM

View File

@@ -0,0 +1,90 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
newsig Xpos-fb float
newsig Ypos-fb float
newsig Zpos-fb float
# connect position feedback to PID loop
linksp Xpos-fb => pid.0.feedback
linksp Ypos-fb => pid.1.feedback
linksp Zpos-fb => pid.2.feedback
# connect position feedback to motion module
linksp Xpos-fb => joint.0.motor-pos-fb
linksp Ypos-fb => joint.1.motor-pos-fb
linksp Zpos-fb => joint.2.motor-pos-fb
# create PID to DAC output signals
newsig Xoutput float
newsig Youtput float
newsig Zoutput float
# connect output signals to output of PID loops
linksp Xoutput <= pid.0.output
linksp Youtput <= pid.1.output
linksp Zoutput <= pid.2.output
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
# set PID loop output limits to +/-1.00
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
# create four position command signals
newsig Xpos-cmd float
newsig Ypos-cmd float
newsig Zpos-cmd float
# connect position commands to motion controller
linksp Xpos-cmd <= joint.0.motor-pos-cmd
linksp Ypos-cmd <= joint.1.motor-pos-cmd
linksp Zpos-cmd <= joint.2.motor-pos-cmd
# connect position commands to PID input
linksp Xpos-cmd => pid.0.command
linksp Ypos-cmd => pid.1.command
linksp Zpos-cmd => pid.2.command
# create bit signals to enable/disable the PID loops
newsig Xenable bit
newsig Yenable bit
newsig Zenable bit
# connect the signals to the motion controller
linksp Xenable <= joint.0.amp-enable-out
linksp Yenable <= joint.1.amp-enable-out
linksp Zenable <= joint.2.amp-enable-out
# connect the signals to the PID blocks
linksp Xenable => pid.0.enable
linksp Yenable => pid.1.enable
linksp Zenable => pid.2.enable

View File

@@ -0,0 +1 @@
A configuration for the Universal Stepper card from Pico systems. This configuration includes motion connections and an IO set for handling estop within HAL. The IO configuration in univstep_io.hal does not include signal connections for other bridgeportio like signal handling.

View File

@@ -0,0 +1,237 @@
# EMC controller parameters for generic controller. Make these what you need
# for your system.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = LinuxCNC-UNIVSTEP
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
DEBUG = 0
# DEBUG = 0x00000007
# DEBUG = 0x7FFFFFFF
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., axis
DISPLAY = axis
# DISPLAY = tklinuxcnc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
# Prefix to be used
PROGRAM_PREFIX = ../../nc_files/
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 2
# Enable popup balloon help
BALLOON_HELP = 1
# Task controller section -----------------------------------------------------
[FILTER]
#No Content
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = univstep.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = univstep_load.hal
HALFILE = univstep_servo.hal
HALFILE = univstep_motion.hal
HALFILE = univstep_io.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
# COORDINATES = X Y Z R P W
COORDINATES = X Y Z A
HOME = 0 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 0.0167
MAX_LINEAR_VELOCITY = 1.20
DEFAULT_LINEAR_ACCELERATION = 15.0
MAX_LINEAR_ACCELERATION = 20.0
# Axes sections ---------------------------------------------------------------
# First axis
[EMCIO]
# tool table file
TOOL_TABLE = univstep.tbl
[KINS]
KINEMATICS = trivkins
JOINTS = 4
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.0100
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Second axis
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Third axis
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 1.20
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 1.25
BACKLASH = 0.000
SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.010
MIN_FERROR = 0.001
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.000126
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# Fourth axis
[AXIS_A]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.0
MAX_VELOCITY = 65
MAX_ACCELERATION = 20.0
PID_MAX_VEL = 66
BACKLASH = 0.000
SCALE = 11.11111111
OUTPUT_SCALE = 1.000
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
FERROR = 0.1
MIN_FERROR = 0.2
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = NO
DEADBAND = 0.046
P = 150
I = 100
D = 0.1
BIAS = 0.0
FF0 = 0
FF1 = 1
FF2 = 0.0
# section for main IO controller parameters -----------------------------------

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,82 @@
# HAL config file for Pico Systems USC board
#
# Connect motion controller I/Os
#
# connect limit/home switch outputs to motion controller
net Xminlim <= ppmc.0.din.01.in
net Xminlim => joint.0.neg-lim-sw-in
net Xmaxlim <= ppmc.0.din.02.in
net Xmaxlim => joint.0.pos-lim-sw-in
net Xhome <= ppmc.0.din.00.in
net Xhome => joint.0.home-sw-in
net Yminlim <= ppmc.0.din.05.in
net Yminlim => joint.1.neg-lim-sw-in
net Ymaxlim <= ppmc.0.din.06.in
net Ymaxlim => joint.1.pos-lim-sw-in
net Yhome <= ppmc.0.din.04.in
net Yhome => joint.1.home-sw-in
net Zminlim <= ppmc.0.din.09.in
net Zminlim => joint.2.neg-lim-sw-in
net Zmaxlim <= ppmc.0.din.10.in
net Zmaxlim => joint.2.pos-lim-sw-in
net Zhome <= ppmc.0.din.08.in
net Zhome => joint.2.home-sw-in
net Aminlim <= ppmc.0.din.12.in
net Aminlim => joint.3.neg-lim-sw-in
net Amaxlim <= ppmc.0.din.13.in
net Amaxlim => joint.3.pos-lim-sw-in
net Ahome <= ppmc.0.din.11.in
net Ahome => joint.3.home-sw-in
# connect index pulses to motion controller
# uncomment these lines only if you have a Rev 2 USC board
#newsig Xindex bit
#newsig Yindex bit
#newsig Zindex bit
#linksp Xindex <= ppmc.0.encoder.00.index-enable
#linksp Xindex => joint.0.index-enable
#linksp Yindex <= ppmc.0.encoder.01.index-enable
#linksp Yindex => joint.1.index-enable
#linksp Zindex <= ppmc.0.encoder.02.index-enable
#linksp Zindex => joint.2.index-enable
#
# Connect I/O controller I/Os
#
# connect e-stop write/sense to I/O controller
# and univstep's fault with estop's output, so estop FF is reset, but
# prevent continued estop signal from univstep from holding FF cleared
net ppmcEstop ppmc.0.din.15.in-not
net ppmcEstop and2.0.in0
net EstopOkIn estop-latch.0.fault-in
net EstopOkIn and2.0.out
net EstopOkOut <= ppmc.0.dout.07.out
net EstopOkOut iocontrol.0.emc-enable-in
net EstopOkOut estop-latch.0.ok-out
net EstopOkOut and2.0.in1
net emc-estop-out iocontrol.0.user-enable-out
net emc-estop-out estop-latch.0.ok-in
net emc-estop-reset iocontrol.0.user-request-enable
net emc-estop-reset estop-latch.0.reset
# connect spindle fwd/rev to I/O controller
net SpindleFwd <= ppmc.0.dout.00.out
net SpindleFwd => spindle.0.forward
net SpindleRev <= ppmc.0.dout.01.out
net SpindleRev => spindle.0.reverse
# connect spindle brake to I/O controller
net SpindleBrakeOn <= ppmc.0.dout.02.out
net SpindleBrakeOn => spindle.0.brake
# connect mist/flood coolant to I/O controller
net MistOn <= ppmc.0.dout.03.out
net MistOn => iocontrol.0.coolant-mist
net FloodOn <= ppmc.0.dout.04.out
net FloodOn => iocontrol.0.coolant-flood

View File

@@ -0,0 +1,41 @@
# sample file pulls all load commands into a single file
# when emc2 starts it loads iocontrol
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# next load the PID module, for four PID loops
loadrt pid num_chan=4
# install driver
#if the stepper controller is not connected to the standard parallel port
# at address 0x378, add port_addr="0x1234" to the following line after a space
# on LinuxCNC versions 2.7.9 and above, a parameter allows you to change the
# way the EPP port is controlled. For PCIe cards using the NetMos 990x
# chips, append epp_dir=1 to the end of the following line
loadrt hal_ppmc
# make some signals for the scope for tuning.
loadrt ddt count=4
# add components for E-stop logic
loadrt estop_latch count=1
loadrt and2 count=1
# set up the realtime thread
# read inputs first
addf ppmc.0.read servo-thread
# then run the motion controller
addf motion-command-handler servo-thread
addf and2.0 servo-thread
addf estop-latch.0 servo-thread
addf motion-controller servo-thread
# then the PID loops
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 pid.3.do-pid-calcs servo-thread
# write outputs last
addf ppmc.0.write servo-thread

View File

@@ -0,0 +1,47 @@
# HAL config file for Pico Systems USC board
# set sane pulse timing - these are basically Gecko numbers
# both pulse width and space are set to 3.5 uS, to prevent
# problems if the outputs are inverted externally
setp ppmc.0.stepgen.00-03.pulse-width-ns 3500
setp ppmc.0.stepgen.00-03.pulse-space-min-ns 3500
# setup time is set to 1 uS
setp ppmc.0.stepgen.00-03.setup-time-ns 1000
# connect position feedback signals to encoders
net Xpos-fb <= ppmc.0.encoder.00.position
net Ypos-fb <= ppmc.0.encoder.01.position
net Zpos-fb <= ppmc.0.encoder.02.position
net Apos-fb <= ppmc.0.encoder.03.position
# get feedback scaling from ini file
setp ppmc.0.encoder.00.scale [JOINT_0]SCALE
setp ppmc.0.encoder.01.scale [JOINT_1]SCALE
setp ppmc.0.encoder.02.scale [JOINT_2]SCALE
setp ppmc.0.encoder.03.scale [JOINT_3]SCALE
# connect PID output signals to step generators
net Xoutput => ppmc.0.stepgen.00.velocity
net Youtput => ppmc.0.stepgen.01.velocity
net Zoutput => ppmc.0.stepgen.02.velocity
net Aoutput => ppmc.0.stepgen.03.velocity
# connect axis enables to step generators
net Xenable => ppmc.0.stepgen.00.enable
net Yenable => ppmc.0.stepgen.01.enable
net Zenable => ppmc.0.stepgen.02.enable
net Aenable => ppmc.0.stepgen.03.enable
# set output scaling from ini file
# input and output scales should (normally) be the same for a USC
setp ppmc.0.stepgen.00.scale [JOINT_0]SCALE
setp ppmc.0.stepgen.01.scale [JOINT_1]SCALE
setp ppmc.0.stepgen.02.scale [JOINT_2]SCALE
setp ppmc.0.stepgen.03.scale [JOINT_3]SCALE
# add a couple of tuning test links
# if these are useful will want to add them to the other axes as well
# or make these setup with the tuning script
net Xoutput ddt.0.in
net Xpos-fb ddt.1.in

View File

@@ -0,0 +1,95 @@
# HAL config file for servos -- expanded from core_servo.hal
# for a full four axis setup
# create four position feedback signals
# connect position feedback to PID loop
net Xpos-fb => pid.0.feedback
net Ypos-fb => pid.1.feedback
net Zpos-fb => pid.2.feedback
net Apos-fb => pid.3.feedback
# connect position feedback to motion module
net Xpos-fb => joint.0.motor-pos-fb
net Ypos-fb => joint.1.motor-pos-fb
net Zpos-fb => joint.2.motor-pos-fb
net Apos-fb => joint.3.motor-pos-fb
# create PID to DAC output signals
# connect output signals to output of PID loops
net Xoutput <= pid.0.output
net Youtput <= pid.1.output
net Zoutput <= pid.2.output
net Aoutput <= pid.3.output
# set PID loop output limits to +/-1.00
setp pid.0.maxoutput [JOINT_0]PID_MAX_VEL
setp pid.1.maxoutput [JOINT_1]PID_MAX_VEL
setp pid.2.maxoutput [JOINT_2]PID_MAX_VEL
setp pid.3.maxoutput [JOINT_3]PID_MAX_VEL
# set PID loop gains
setp pid.0.Pgain [JOINT_0]P
setp pid.0.Igain [JOINT_0]I
setp pid.0.Dgain [JOINT_0]D
setp pid.0.bias [JOINT_0]BIAS
setp pid.0.FF0 [JOINT_0]FF0
setp pid.0.FF1 [JOINT_0]FF1
setp pid.0.FF2 [JOINT_0]FF2
setp pid.0.deadband [JOINT_0]DEADBAND
setp pid.1.Pgain [JOINT_1]P
setp pid.1.Igain [JOINT_1]I
setp pid.1.Dgain [JOINT_1]D
setp pid.1.bias [JOINT_1]BIAS
setp pid.1.FF0 [JOINT_1]FF0
setp pid.1.FF1 [JOINT_1]FF1
setp pid.1.FF2 [JOINT_1]FF2
setp pid.1.deadband [JOINT_1]DEADBAND
setp pid.2.Pgain [JOINT_2]P
setp pid.2.Igain [JOINT_2]I
setp pid.2.Dgain [JOINT_2]D
setp pid.2.bias [JOINT_2]BIAS
setp pid.2.FF0 [JOINT_2]FF0
setp pid.2.FF1 [JOINT_2]FF1
setp pid.2.FF2 [JOINT_2]FF2
setp pid.2.deadband [JOINT_2]DEADBAND
setp pid.3.Pgain [JOINT_3]P
setp pid.3.Igain [JOINT_3]I
setp pid.3.Dgain [JOINT_3]D
setp pid.3.bias [JOINT_3]BIAS
setp pid.3.FF0 [JOINT_3]FF0
setp pid.3.FF1 [JOINT_3]FF1
setp pid.3.FF2 [JOINT_3]FF2
setp pid.3.deadband [JOINT_3]DEADBAND
# create four position command signals
# connect position commands to motion controller
net Xpos-cmd <= joint.0.motor-pos-cmd
net Ypos-cmd <= joint.1.motor-pos-cmd
net Zpos-cmd <= joint.2.motor-pos-cmd
net Apos-cmd <= joint.3.motor-pos-cmd
# connect position commands to PID input
net Xpos-cmd => pid.0.command
net Ypos-cmd => pid.1.command
net Zpos-cmd => pid.2.command
net Apos-cmd => pid.3.command
# create bit signals to enable/disable the PID loops
# connect the signals to the motion controller
net Xenable <= joint.0.amp-enable-out
net Yenable <= joint.1.amp-enable-out
net Zenable <= joint.2.amp-enable-out
net Aenable <= joint.3.amp-enable-out
# connect the signals to the PID blocks
net Xenable => pid.0.enable
net Yenable => pid.1.enable
net Zenable => pid.2.enable
net Aenable => pid.3.enable