Spindle Control{Spindle Control}

0-10v Spindle Speed{0-10v Spindle Speed}

If your spindle is controlled by a VFD with a 0 to 10 volt signal and your using a DAC card like the m5i20 to output the control signal.

First you need to figure the scale of spindle speed to control signal. For this example the spindle top speed of 5000 RPM is equal to 10 volts. :math:$10/5000=0.002$ so our scale factor is 0.002

We have to add a scale component to the hal file to scale the motion.spindle-speed-out to the 0 to 10 needed by the VFD if your DAC card does not do scaling.

loadrt scale count=1 
addf scale.0 servo-thread 
setp scale.0.gain 0.002 
net spindle-speed-scale motion.spindle-speed-out => scale.0.in 
net spindle-speed-DAC scale.0.out => <your DAC pin name>

PWM Spindle Speed{PWM Spindle Speed}

If your spindle can be controlled by a PWM signal, use the pwmgen component to create the signal:

loadrt pwmgen output\_type=0  
addf pwmgen.update servo-thread 
addf pwmgen.make-pulses base-thread 
net spindle-speed-cmd motion.spindle-speed-out => pwmgen.0.value 
net spindle-on motion.spindle-on => pwmgen.0.enable 
net spindle-pwm pwmgen.0.pwm => parport.0.pin-09-out 
# Set the spindle's top speed in RPM  
setp pwmgen.0.scale 1800

This assumes that the spindle controller’s response to PWM is simple: 0% PWM gives 0RPM, 10% PWM gives 180 RPM, etc. If there is a minimum PWM required to get the spindle to turn, follow the example in the nist-lathe sample configuration to use a scale component.

Spindle Enable{Spindle Enable}

If you need a spindle enable signal link your output pin to motion.spindle-on. To link these pins to a parallel port pin put something like the following in your .hal file making sure you pick the pin that is connected to your control device.

net spindle-enable motion.spindle-on => parport.0.pin-14-out

Spindle Direction{Spindle Direction}

If you have direction control of your spindle the hal pins motion.spindle-forward and motion.spindle-reverse are controlled by M3 and M4. Spindle speed Snmust be set to a positive non zero value for M3/4 to turn on spindle motion.

To link these pins to a parallel port pin put something like the following in your .hal file making sure you pick the pin that is connected to your control device.

net spindle-fwd motion.spindle-forward => parport.0.pin-16-out 
net spindle-rev motion.spindle-reverse => parport.0.pin-17-out

Spindle Soft Start

If you need to ramp your spindle speed command and your control does not have that feature it can be done in HAL. Basically you need to hijack the output of motion.spindle-speed-out and run it through a limit2 component with the scale set so it will ramp the rpm from motion.spindle-speed-out to your device that receives the rpm. The second part is to let EMC know when the spindle is at speed so motion can begin.

In the 0-10 volt example the line net spindle-speed-scale motion.spindle-speed-out ⇒ scale.0.inis changed as shown in the following example.

# load real time a limit2 and a near with names so it is easier to follow 
loadrt limit2 names=spindle-ramp 
loadrt near names=spindle-at-speed
# add the functions to a thread 
addf spindle-ramp servo-thread 
addf spindle-at-speed servo-thread
# set the parameter for max velocity 
setp spindle-ramp.maxv 60
# hijack the spindle speed out and send it to spindle ramp in 
net spindle-cmd <= motion.spindle-speed-out => spindle-ramp.in
# the output of spindle ramp is sent to the scale in 
net spindle-ramped <= spindle-ramp.out => scale.0.in
# to know when to start the motion we send the near component  
# (named spindle-at-speed) to the spindle commanded speed from 
# the signal spindle-cmd and the actual spindle speed 
# provided your spindle can accelerate at the maxv setting. 
net spindle-cmd => spindle-at-speed.in1 
net spindle-ramped => spindle-at-speed.in2
# the output from spindle-at-speed is sent to motion.spindle-at-speed 
# and when this is true motion will start 
net spindle-ready <= spindle-at-speed.out => motion.spindle-at-speed

Spindle Feedback{Spindle Feedback}

Spindle Synchronized Motion{Spindle Synchronized Motion}

Spindle feedback is needed by EMC to perform any spindle coordinated motions like threading and constant surface speed. The StepConf Wizard can perform the connections for you if you select Encoder Phase A and Encoder Index as inputs.

Hardware assumptions:

  • An encoder is connected to the spindle and puts out 100 pulses per revolution on phase A

  • The encoder A phase is connected to the parallel port pin 10

  • The encoder index pulse is connected to the parallel port pin 11

Basic Steps to add the components and configure them:

loadrt encoder num\_chan=1 
addf encoder.update-counters base-thread 
addf encoder.capture-position servo-thread 
setp encoder.0.position-scale 100  
net spindle-position encoder.0.position => motion.spindle-revs 
net spindle-velocity encoder.0.velocity => motion.spindle-speed-in 
net spindle-index-enable encoder.0.index-enable <=> motion.spindle-index-enable 
net spindle-phase-a encoder.0.phase-A 
net spindle-phase-b encoder.0.phase-B 
net spindle-index encoder.0.phase-Z 
net spindle-phase-a <= parport.0.pin-10-in 
net spindle-index <= parport.0.pin-11-in

Spindle At Speed{Spindle At Speed}

To enable EMC to wait for the spindle to be at speed before executing a series of moves you need to set motion.spindle-at-speed to true when the spindle is at the commanded speed. To do this you need spindle feedback from an encoder. Since the feedback and the commanded speed are not usually exactly the same you need to use the nearcomponent to say that the two numbers are close enough. The connections needed are from the spindle velocity command signal to near.n.in1 and from the spindle velocity from the encoder to near.n.in2. Then the near.n.out is connected to motion.spindle-at-speed. The near.n.scale needs to be set to say how close the two numbers must be before turning on the output. Depending on your setup you may need to adjust the scale to work with your hardware. The following is typical of the additions needed to your hal file to enable Spindle At Speed. If you already have near in your hal file then increase the count and adjust code to suit. Check to make sure the signal names are the same in your hal file.

loadrt near
addf near.0 servo-thread
net spindle-cmd near.0.in1
net spindle-velocity near.0.in2
net spindle-at-speed motion.spindle-at-speed <= near.0.out
setp near.0.scale 1.01