Generating RPM from simple high/low switch- possible?

More
28 Jan 2017 03:05 #86821 by nigel-tufnel
My goal is to get my spindle RPM from a simple high/low optical sensor I have connected to my spindle. I just want a RPM reading of the spindle, not for threading. I get a high/low transition once per rev. I have the signal connected to IDX- and ENCA- on my Mesa 7i76 board based on someone's suggestion. I can see the signals on the corresponding pins on the Hal Meter. I added the suggested sections to my custom HAL file based on this thread:

forum.linuxcnc.org/forum/26-turning/17960-pyvcp-tachometer

It did not work. Nearly every line had an error starting with the second line. I would comment out the line that had an error and then would get another error, etc, etc.

So Is this code in the link good code for what I am trying to do? I can post the errors if need be.

Good code or suggestions appreciated.

Thanks!

Please Log in or Create an account to join the conversation.

More
28 Jan 2017 15:13 #86843 by PCW
You should be able to get a decent velocity signal by setting the encoder counter to velocity mode
so instead of the encoder setup section on the example you can use the hardware encoder:

setp hm2_5i25.0.encoder.00.counter-mode 1 # set counter to up/down mode
setp hm2_5i25.0.encoder.00.vel-timeout 2 # go down to 1/2 RPS before we give up and report 0 velocity
setp hm2_5i25.0.encoder.00.scale 1 # set scale to 1 turn per count (may need to be -1 to get direction right)

net spindle-velocity hm2_5i25.0.encoder.00.velocity

Then the pyvcp/filter stuff remains the same:

loadrt scale count=1
loadrt abs count=1
loadrt lowpass count=1

addf scale.0 servo-thread
addf abs.0 servo-thread
addf lowpass.0 servo-thread

setp lowpass.0.gain 0.01
###############################################
# Display spindle speed in pyvcp bar
###############################################
setp scale.0.gain 60.0 #convert velocity per sec into rpm
net spindle-velocity => lowpass.0.in
net filtered-spindle-velocity <= lowpass.0.out => abs.1.in
net absolute-spindle-velocity <= abs.1.out => scale.1.in
net scaled-spindle-velocity <= scale.1.out => pyvcp.spindle-speed
The following user(s) said Thank You: BigJohnT

Please Log in or Create an account to join the conversation.

More
28 Jan 2017 17:32 #86845 by nigel-tufnel
Thanks for the info. The HAL portion seems to work. I see a highly variable output when I use Hal Meter on the 'spindle-velocity' signal. I'm assuming this is prior to any filtering.

Getting errors on the pyvcp side. I originally enabled the show spindle speed pyvcp add-on when I set things up using PNCconfig wizard if that matters. I was not sure where to add the above pyvcp code, so I tried custom_postgui.hal and also tried adding it to pyvcp_option.hal (not simultaneously). Pretty much get the same error shown below:

Debug file information:
.
Error: could not insert module /usr/realtime-3.4-9-rtai-686-pae/modules/linuxcnc/abs.ko: File exists
pyvcp_options.hal:13: exit value: 1
pyvcp_options.hal:13: insmod for abs failed, returned -1
See the output of 'dmesg' for more information.
4124
PID TTY STAT TIME COMMAND
4168
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components

Thoughts on what's causing this? Thanks

Please Log in or Create an account to join the conversation.

More
28 Jan 2017 19:25 #86852 by PCW
That shows that your config already has a "abs" component so the fix is to
add another instance of "abs" in the existing loadrt abs line in your hal file

Please Log in or Create an account to join the conversation.

More
29 Jan 2017 01:58 #86875 by nigel-tufnel
Not making much progress. Input on what's wrong with my HAL file would be greatly appreciated. I added the count=1 to the abs and lowpass lines.

Debug file information:
.
Error: could not insert module /usr/realtime-3.4-9-rtai-686-pae/modules/linuxcnc/lowpass.ko: Invalid parameters
./Axis_LinuxCNC_machine.hal:12: exit value: 1
./Axis_LinuxCNC_machine.hal:12: insmod for lowpass failed, returned -1
See the output of 'dmesg' for more information.
5566
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components



HAL FILE

# Generated by PNCconf at Sun Jan 1 03:39:54 2017
# If you make changes to this file, they will be
# overwritten when you run PNCconf again

loadrt trivkins
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt hostmot2
loadrt hm2_pci config=" num_encoders=1 num_pwmgens=0 num_stepgens=3 sserial_port_0=00xxxx"
setp hm2_5i25.0.watchdog.timeout_ns 5000000
loadrt pid names=pid.x,pid.y,pid.z,pid.s
loadrt abs names=abs.spindle,count=1
loadrt lowpass names=lowpass.spindle,count=1


#############################
Tach setup
#############################
loadrt scale count=1
#loadrt abs count=1
#loadrt lowpass count=1

addf scale.0 servo-thread
addf abs.0 servo-thread
addf lowpass.0 servo-thread

setp lowpass.0.gain 0.01
###############################################
# Display spindle speed in pyvcp bar
###############################################
setp scale.0.gain 60.0 #convert velocity per sec into rpm
net spindle-velocity => lowpass.0.in
net filtered-spindle-velocity <= lowpass.0.out => abs.1.in
net absolute-spindle-velocity <= abs.1.out => scale.1.in
net scaled-spindle-velocity <= scale.1.out => pyvcp.spindle-speed
###############################################


addf hm2_5i25.0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf pid.x.do-pid-calcs servo-thread
addf pid.y.do-pid-calcs servo-thread
addf pid.z.do-pid-calcs servo-thread
addf pid.s.do-pid-calcs servo-thread
addf abs.spindle servo-thread
addf lowpass.spindle servo-thread
addf hm2_5i25.0.write servo-thread

# external output signals

# --- COOLANT-MIST ---
net coolant-mist hm2_5i25.0.7i76.0.0.output-00

# external input signals


# --- ESTOP-EXT ---
net estop-ext <= hm2_5i25.0.7i76.0.0.input-00

# --- BOTH-HOME-X ---
net both-home-x <= hm2_5i25.0.7i76.0.0.input-01-not

# --- BOTH-HOME-Y ---
net both-home-y <= hm2_5i25.0.7i76.0.0.input-02-not

# --- BOTH-Z ---
net both-z <= hm2_5i25.0.7i76.0.0.input-03-not

# --- HOME-Z ---
net home-z <= hm2_5i25.0.7i76.0.0.input-04-not

#*******************
# AXIS X
#*******************

setp pid.x.Pgain [AXIS_0]P
setp pid.x.Igain [AXIS_0]I
setp pid.x.Dgain [AXIS_0]D
setp pid.x.bias [AXIS_0]BIAS
setp pid.x.FF0 [AXIS_0]FF0
setp pid.x.FF1 [AXIS_0]FF1
setp pid.x.FF2 [AXIS_0]FF2
setp pid.x.deadband [AXIS_0]DEADBAND
setp pid.x.maxoutput [AXIS_0]MAX_OUTPUT
setp pid.x.error-previous-target true
setp pid.x.maxerror .0005

net x-index-enable <=> pid.x.index-enable
net x-enable => pid.x.enable
net x-pos-cmd => pid.x.command
net x-vel-cmd => pid.x.command-deriv
net x-pos-fb => pid.x.feedback
net x-output => pid.x.output

# Step Gen signals/setup

setp hm2_5i25.0.stepgen.00.dirsetup [AXIS_0]DIRSETUP
setp hm2_5i25.0.stepgen.00.dirhold [AXIS_0]DIRHOLD
setp hm2_5i25.0.stepgen.00.steplen [AXIS_0]STEPLEN
setp hm2_5i25.0.stepgen.00.stepspace [AXIS_0]STEPSPACE
setp hm2_5i25.0.stepgen.00.position-scale [AXIS_0]STEP_SCALE
setp hm2_5i25.0.stepgen.00.step_type 0
setp hm2_5i25.0.stepgen.00.control-type 1
setp hm2_5i25.0.stepgen.00.maxaccel [AXIS_0]STEPGEN_MAXACCEL
setp hm2_5i25.0.stepgen.00.maxvel [AXIS_0]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net x-pos-cmd <= axis.0.motor-pos-cmd
net x-vel-cmd <= axis.0.joint-vel-cmd
net x-output <= hm2_5i25.0.stepgen.00.velocity-cmd
net x-pos-fb <= hm2_5i25.0.stepgen.00.position-fb
net x-pos-fb => axis.0.motor-pos-fb
net x-enable <= axis.0.amp-enable-out
net x-enable => hm2_5i25.0.stepgen.00.enable

# ---setup home / limit switch signals---

net both-home-x => axis.0.home-sw-in
net both-home-x => axis.0.neg-lim-sw-in
net both-home-x => axis.0.pos-lim-sw-in

#*******************
# AXIS Y
#*******************

setp pid.y.Pgain [AXIS_1]P
setp pid.y.Igain [AXIS_1]I
setp pid.y.Dgain [AXIS_1]D
setp pid.y.bias [AXIS_1]BIAS
setp pid.y.FF0 [AXIS_1]FF0
setp pid.y.FF1 [AXIS_1]FF1
setp pid.y.FF2 [AXIS_1]FF2
setp pid.y.deadband [AXIS_1]DEADBAND
setp pid.y.maxoutput [AXIS_1]MAX_OUTPUT
setp pid.y.error-previous-target true
setp pid.y.maxerror .0005

net y-index-enable <=> pid.y.index-enable
net y-enable => pid.y.enable
net y-pos-cmd => pid.y.command
net y-vel-cmd => pid.y.command-deriv
net y-pos-fb => pid.y.feedback
net y-output => pid.y.output

# Step Gen signals/setup

setp hm2_5i25.0.stepgen.01.dirsetup [AXIS_1]DIRSETUP
setp hm2_5i25.0.stepgen.01.dirhold [AXIS_1]DIRHOLD
setp hm2_5i25.0.stepgen.01.steplen [AXIS_1]STEPLEN
setp hm2_5i25.0.stepgen.01.stepspace [AXIS_1]STEPSPACE
setp hm2_5i25.0.stepgen.01.position-scale [AXIS_1]STEP_SCALE
setp hm2_5i25.0.stepgen.01.step_type 0
setp hm2_5i25.0.stepgen.01.control-type 1
setp hm2_5i25.0.stepgen.01.maxaccel [AXIS_1]STEPGEN_MAXACCEL
setp hm2_5i25.0.stepgen.01.maxvel [AXIS_1]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net y-pos-cmd <= axis.1.motor-pos-cmd
net y-vel-cmd <= axis.1.joint-vel-cmd
net y-output <= hm2_5i25.0.stepgen.01.velocity-cmd
net y-pos-fb <= hm2_5i25.0.stepgen.01.position-fb
net y-pos-fb => axis.1.motor-pos-fb
net y-enable <= axis.1.amp-enable-out
net y-enable => hm2_5i25.0.stepgen.01.enable

# ---setup home / limit switch signals---

net both-home-y => axis.1.home-sw-in
net both-home-y => axis.1.neg-lim-sw-in
net both-home-y => axis.1.pos-lim-sw-in

#*******************
# AXIS Z
#*******************

setp pid.z.Pgain [AXIS_2]P
setp pid.z.Igain [AXIS_2]I
setp pid.z.Dgain [AXIS_2]D
setp pid.z.bias [AXIS_2]BIAS
setp pid.z.FF0 [AXIS_2]FF0
setp pid.z.FF1 [AXIS_2]FF1
setp pid.z.FF2 [AXIS_2]FF2
setp pid.z.deadband [AXIS_2]DEADBAND
setp pid.z.maxoutput [AXIS_2]MAX_OUTPUT
setp pid.z.error-previous-target true
setp pid.z.maxerror .0005

net z-index-enable <=> pid.z.index-enable
net z-enable => pid.z.enable
net z-pos-cmd => pid.z.command
net z-vel-cmd => pid.z.command-deriv
net z-pos-fb => pid.z.feedback
net z-output => pid.z.output

# Step Gen signals/setup

setp hm2_5i25.0.stepgen.02.dirsetup [AXIS_2]DIRSETUP
setp hm2_5i25.0.stepgen.02.dirhold [AXIS_2]DIRHOLD
setp hm2_5i25.0.stepgen.02.steplen [AXIS_2]STEPLEN
setp hm2_5i25.0.stepgen.02.stepspace [AXIS_2]STEPSPACE
setp hm2_5i25.0.stepgen.02.position-scale [AXIS_2]STEP_SCALE
setp hm2_5i25.0.stepgen.02.step_type 0
setp hm2_5i25.0.stepgen.02.control-type 1
setp hm2_5i25.0.stepgen.02.maxaccel [AXIS_2]STEPGEN_MAXACCEL
setp hm2_5i25.0.stepgen.02.maxvel [AXIS_2]STEPGEN_MAXVEL

# ---closedloop stepper signals---

net z-pos-cmd <= axis.2.motor-pos-cmd
net z-vel-cmd <= axis.2.joint-vel-cmd
net z-output <= hm2_5i25.0.stepgen.02.velocity-cmd
net z-pos-fb <= hm2_5i25.0.stepgen.02.position-fb
net z-pos-fb => axis.2.motor-pos-fb
net z-enable <= axis.2.amp-enable-out
net z-enable => hm2_5i25.0.stepgen.02.enable

# ---setup home / limit switch signals---

net home-z => axis.2.home-sw-in
net both-z => axis.2.neg-lim-sw-in
net both-z => axis.2.pos-lim-sw-in

#*******************
# SPINDLE S
#*******************

setp pid.s.Pgain [SPINDLE_9]P
setp pid.s.Igain [SPINDLE_9]I
setp pid.s.Dgain [SPINDLE_9]D
setp pid.s.bias [SPINDLE_9]BIAS
setp pid.s.FF0 [SPINDLE_9]FF0
setp pid.s.FF1 [SPINDLE_9]FF1
setp pid.s.FF2 [SPINDLE_9]FF2
setp pid.s.deadband [SPINDLE_9]DEADBAND
setp pid.s.maxoutput [SPINDLE_9]MAX_OUTPUT
setp pid.s.error-previous-target true

net spindle-index-enable <=> pid.s.index-enable
net spindle-enable => pid.s.enable
net spindle-vel-cmd-rpm-abs => pid.s.command
net spindle-vel-fb-rpm-abs => pid.s.feedback
net spindle-output <= pid.s.output

# ---digital potentionmeter output signals/setup---

setp hm2_5i25.0.7i76.0.0.spinout-minlim [SPINDLE_9]OUTPUT_MIN_LIMIT
setp hm2_5i25.0.7i76.0.0.spinout-maxlim [SPINDLE_9]OUTPUT_MAX_LIMIT
setp hm2_5i25.0.7i76.0.0.spinout-scalemax [SPINDLE_9]OUTPUT_SCALE

net spindle-vel-cmd-rpm-abs => hm2_5i25.0.7i76.0.0.spinout
net spindle-enable => hm2_5i25.0.7i76.0.0.spinena
net spindle-ccw => hm2_5i25.0.7i76.0.0.spindir

# ---setup spindle control signals---

net spindle-vel-cmd-rps <= motion.spindle-speed-out-rps
net spindle-vel-cmd-rps-abs <= motion.spindle-speed-out-rps-abs
net spindle-vel-cmd-rpm <= motion.spindle-speed-out
net spindle-vel-cmd-rpm-abs <= motion.spindle-speed-out-abs
net spindle-enable <= motion.spindle-on
net spindle-cw <= motion.spindle-forward
net spindle-ccw <= motion.spindle-reverse
net spindle-brake <= motion.spindle-brake
net spindle-revs => motion.spindle-revs
net spindle-at-speed => motion.spindle-at-speed
net spindle-vel-fb-rps => motion.spindle-speed-in
net spindle-index-enable <=> motion.spindle-index-enable

# ---Setup spindle at speed signals---

sets spindle-at-speed true


#******************************
# connect miscellaneous signals
#******************************

# ---HALUI signals---

net joint-select-a halui.joint.0.select
net x-is-homed halui.joint.0.is-homed
net jog-x-pos halui.jog.0.plus
net jog-x-neg halui.jog.0.minus
net jog-x-analog halui.jog.0.analog
net joint-select-b halui.joint.1.select
net y-is-homed halui.joint.1.is-homed
net jog-y-pos halui.jog.1.plus
net jog-y-neg halui.jog.1.minus
net jog-y-analog halui.jog.1.analog
net joint-select-c halui.joint.2.select
net z-is-homed halui.joint.2.is-homed
net jog-z-pos halui.jog.2.plus
net jog-z-neg halui.jog.2.minus
net jog-z-analog halui.jog.2.analog
net jog-selected-pos halui.jog.selected.plus
net jog-selected-neg halui.jog.selected.minus
net spindle-manual-cw halui.spindle.forward
net spindle-manual-ccw halui.spindle.reverse
net spindle-manual-stop halui.spindle.stop
net machine-is-on halui.machine.is-on
net jog-speed halui.jog-speed
net MDI-mode halui.mode.is-mdi

# ---coolant signals---

net coolant-mist <= iocontrol.0.coolant-mist
net coolant-flood <= iocontrol.0.coolant-flood

# ---probe signal---

net probe-in => motion.probe-input

# ---motion control signals---

net in-position <= motion.in-position
net machine-is-enabled <= motion.motion-enabled

# ---digital in / out signals---

# ---estop signals---

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

# ---manual tool change signals---

loadusr -W hal_manualtoolchange
net tool-change-request iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-change-confirmed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Please Log in or Create an account to join the conversation.

More
31 Jan 2017 00:51 #87021 by andypugh
loadrt lowpass names=lowpass.spindle,count=1

You can't use names= and count=
You especially can't separate them with a comma.

Use one, or the other.

Also, I suspect that you need more than one of each, or there wouldn't be an extra "loadrt"somewhere else to cause trouble.

Please Log in or Create an account to join the conversation.

More
01 Feb 2017 03:41 #87113 by nigel-tufnel
I got encoder velocity to show but it is highly variable and the scaling seems way off. Changing the gain doesn't really help. Could this have something to do with it the servo-thread speed. I thought I recall reading that the servo-thread speed should be proportional to the encoder resolution. In this case I have a one count per rev resolution. Code to implement this if it's true would be greatly appreciated.

p.s. I noticed that my encA- and idx- are opposite. One is high when the other is low. Not sure if that has anything to do with it.

Thanks

Please Log in or Create an account to join the conversation.

More
01 Feb 2017 10:54 #87117 by andypugh
I don't see the source for your spindle-velocity signal. Where does it come from?

Please Log in or Create an account to join the conversation.

More
02 Feb 2017 01:46 #87141 by nigel-tufnel
Sorry. The code below was in an ancillary HAL file. It has since been moved to the main HAL file.

setp hm2_5i25.0.encoder.00.counter-mode 1 # set counter to up/down mode
setp hm2_5i25.0.encoder.00.vel-timeout 2 # go down to 1/2 RPS before we give up and report 0 velocity
setp hm2_5i25.0.encoder.00.scale 1 # set scale to 1 turn per count (may need to be -1 to get direction right)

net spindle-velocity hm2_5i25.0.encoder.00.velocity

Please Log in or Create an account to join the conversation.

More
02 Feb 2017 13:36 #87154 by andypugh
Curious. If it is a good encoder then the hm2_5i25.0.encoder.00.velocity value should be pretty accurate.

What does that pin look like in Halscope?

Please Log in or Create an account to join the conversation.

Time to create page: 0.117 seconds
Powered by Kunena Forum