I disagree... If I had high res scales available that could keep up
with the slew rates of the axes, I would try to incorporate them into
the system.
They could compensate for pitch errors in the screws or worn screws. I
still think that any backlash may still cause big problems, but you can
oftentimes tighten or replace nuts
to get rid of that.
Here is one axis (see below) that is used in a closed position loop system:
This axis drives a feed roller which feeds a strip into a machine. The
feedback device - an encoder, has a knurled wheel on the encoder shaft
and the encoder wheel is in contact with the strip.
We went to a closed loop system since the strip drive is friction driven
and tends to slip a little.. With the encoder and the closed position
loop, position control is very good even with high feed rates up to 30
inches per second.
This setup uses Mesa hardware...and the Hostmot2 driver. This system
uses a 5i20 PCI board a 7i47 board since using a LPT port at these
speeds is not possible.
I think you could do the same thing using an LPT port interface but you
would have to go much slower and use the hal components for Stepgen and
the encoder counter, etc but I suspect it would work.
Dave (Dave911 on the IRC)
>>>>>>>>>>>>>> Section of the INI file <<<<<<<<<<<<<<<<
[AXIS_0]
#
# Step timing is 2.2 us steplen + 3.3 us stepspace
# That gives 5.5 us step period = 181 khz KHz step freq
#
#5.25 in diameter roller x 3.1415 = 16.485 inches of feed per rev
#16.485/15:1 gearbox = 1.099 inches of feed per rev
#
# at 2500 pulses per rev on the motor encoder, turns out to be 1819.83
pulses per inch of travel
#
# was 25 max vel and 60 accel
#
#A corrected value is entered below.
TYPE = LINEAR
MAX_VELOCITY = 30
MAX_ACCELERATION = 80
BACKLASH = 0.000
# scale is pulses ouput from EMC2 per inch of material travel
SCALE = 2274
MIN_LIMIT = -9999999.99
MAX_LIMIT = 9999999.99
#old value
#FERROR = 0.050
#MIN_FERROR = 0.005
FERROR = 10.00
#HOME = 0.000
#HOME_OFFSET = 0.10
#HOME_SEARCH_VEL = 0.0
#HOME_LATCH_VEL = 0.0
#HOME_USE_INDEX = NO
#HOME_IGNORE_LIMITS = YES
# these are in nanoseconds
DIRSETUP = 3300
DIRHOLD = 3300
STEPLEN = 2200
STEPSPACE = 3300
Here is the hal file section for that axis:
# #######################################
#
# HAL file for HostMot2 with 3 steppers
#
# Derived from Ted Hyde's original hm2-servo config
#
# Based up work and discussion with Seb & Peter & Jeff
# GNU license references - insert here. www.linuxcnc.org
#
#
# ########################################
# ###################################
# Core EMC/HAL Loads
# ###################################
# kinematics
loadrt trivkins
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD
num_joints=[TRAJ]AXES
# only the 7i43 needs this, but it doesnt hurt the others
#loadrt probe_parport
# hostmot2 driver
loadrt hostmot2
# load low-level driver
loadrt [HOSTMOT2](DRIVER) config=[HOSTMOT2](CONFIG)
setp hm2_[HOSTMOT2](BOARD).0.watchdog.timeout_ns 10000000
# Load Classic ladder module that runs in real time
loadrt classicladder_rt numPhysInputs=32 numPhysOutputs=20 numS32in=10
numS32out=10 numFloatIn=10 numFloatOut=10
# load one "not" hal component
loadrt not count=1
addf not.0 servo-thread
# load one mux2 hal component
loadrt mux2 count=1
addf mux2.0 servo-thread
loadrt toggle count=1
addf toggle.0 servo-thread
loadrt scale count=1
addf scale.0 servo-thread
# ################################################
# THREADS
# ################################################
addf hm2_[HOSTMOT2](BOARD).0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
### 1 PID added for closed loop control of velocity of motor via step gen
loadrt pid num_chan=1
addf pid.0.do-pid-calcs servo-thread
alias pin pid.0.Pgain pid.x.Pgain
alias pin pid.0.Igain pid.x.Igain
alias pin pid.0.Dgain pid.x.Dgain
alias pin pid.0.bias pid.x.bias
alias pin pid.0.FF0 pid.x.FF0
alias pin pid.0.FF1 pid.x.FF1
alias pin pid.0.FF2 pid.x.FF2
alias pin pid.0.deadband pid.x.deadband
alias pin pid.0.maxoutput pid.x.maxoutput
alias pin pid.0.enable pid.x.enable
alias pin pid.0.command pid.x.command
alias pin pid.0.feedback pid.x.feedback
alias pin pid.0.output pid.x.output
setp pid.x.Pgain 4.0 # was 4.0
setp pid.x.Igain 0.0
setp pid.x.Dgain 0.0
setp pid.x.bias 0.0
setp pid.x.FF0 0.0
setp pid.x.FF1 .9 # was 2.5
setp pid.x.FF2 0.0 # not implemented
setp pid.x.deadband 0.0
setp pid.x.maxoutput 3000.0
### End of PID add
addf hm2_[HOSTMOT2](BOARD).0.write servo-thread
addf hm2_[HOSTMOT2](BOARD).0.pet_watchdog servo-thread
addf classicladder.0.refresh servo-thread
# ######################################################
# Axis-of-motion Specific Configs (not the GUI)
# ######################################################
# ################
# X [0] Axis
# ################
# axis enable chain
newsig emcmot.00.enable bit
sets emcmot.00.enable FALSE
net emcmot.00.enable <= axis.0.amp-enable-out
net emcmot.00.enable => hm2_[HOSTMOT2](BOARD).0.stepgen.00.enable
# Enable the PID loop here also
net emcmot.00.enable => pid.0.enable
# Set stepgen to velocity mode
newsig vel_mode bit
sets vel_mode TRUE
net vel_mode => hm2_[HOSTMOT2](BOARD).0.stepgen.00.control-type
# position command from EMC to the PID loop cmd
net pid_cmd <= axis.0.motor-pos-cmd
net pid_cmd => pid.0.command
# PID output drive the stepgen
net pid_out <= pid.0.output
net pid_out => hm2_[HOSTMOT2](BOARD).0.stepgen.00.velocity-cmd
setp hm2_5i20.0.encoder.00.counter-mode 0
setp hm2_5i20.0.encoder.00.filter 1
setp hm2_5i20.0.encoder.00.index-invert 0
setp hm2_5i20.0.encoder.00.index-mask 0
setp hm2_5i20.0.encoder.00.index-mask-invert 0
# The encoder is a 4096 counts per rev with quadrature
# Wheel circumfrence is 12 was 341 counts per inch but is 30/29.75
short so
# 30/29.75 * 341 = 344
setp hm2_5i20.0.encoder.00.scale 345
net pid_feedback <= hm2_5i20.0.encoder.00.position
net pid_feedback => pid.0.feedback
net pid_feedback => axis.0.motor-pos-fb
# timing parameters
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.steplen [AXIS_0]STEPLEN
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.position-scale [AXIS_0]SCALE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.maxvel 0
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.maxaccel 0
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.step_type 0
_____________________________________________________________________________________
On 8/18/2010 11:38 AM, Kirk Wallace wrote:
> On Tue, 2010-08-17 at 18:11 -0400, Don Stanley wrote:
> ... snip
>
>> Did you recognise it is a CNC converted mill that I
>> wanted to move to EMC2?
>> Thanks again
>> Don
>>
> I still contend that encoder feedback on a stepper system has no proven
> advantage, unless you have a very special stepper driver that drives the
> stepper as a high pole count brushless DC servo with a very high count
> encoder on the motor shaft. Encoders would only be useful for a stepper
> machine with hand wheels, while being used as a manual machine with a
> DRO. EMC2 can be configured to do it, but I consider it an academic
> endeavor, since a plain stepper system would work just as well as is, or
> a standard servo would work just as well, only faster.
>
> I may be wrong, but this is my current understanding.
>
------------------------------------------------------------------------------
This SF.net email is sponsored by
Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev
_______________________________________________
Emc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-users