(SOLVED) Max Velocity Selector Switch

More
4 years 10 months ago #229875 by spumco
I'd like to use a selector switch to set different max velocity values and could use some assistance.

I realize that I'll have to change the values in hal if/when I change the INI file setting, but I want the end result to be the equivalent of:

Position #1 - 0 ipm
Position #2 - 5 ipm
Position #3 - 10 ipm
Position #4 - 50 ipm
Position #5 - 100 ipm (same value as MAX in INI file)

Since I'm sure it'll be suggested...I've tried an encoder connected up as max-vel override, but there were two problems:
1. halui.max-velocity is an absolute value, not a percentage, and this drove me nuts.  Maybe I'm odd, but it was hard to think in ipm values and not just 'half-speed.'
2. I'm tired of having so many different voltages in the cabinet and I don't want to re-wire my 7i84 to be half 5v / half 24v just to use a single encoder.

I have a 5-position selector switch connected to 5 inputs.  So far, so good; I'm not trying to get clever and minimize the number of inputs.

Do I need to use a mux.N function, or is there some other way to accomplish a direct value input?

Thx,
Ralph

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

More
4 years 10 months ago #229903 by Michael
I just worked through something similar to this for an MPG but wanted my selector switch to also change the jog value and be useful for my jog increment buttons. I used mux16 because it was the easiest way to select 5 values without using a complex set of or2 statements. I did use an encoder for my max velocity but the mpg selector portion should be what you are looking for. I have yet to test my hal since I finished it right before leaving for work.

Some thoughts on implementing it for max-velocity would be to use the selector to manipulate the halui.max-velocity.scale as I didn't see anything other than halui.max-velocity.counts that was an input value. To do this you would need to use the halui.max-velocity.direct-value true. Thsi causes the input logic for the value to be (.counts * .scale)

If you did that then you could:
setp halui.max-velocity.counts 1

and then mux 16 different scale values for the selector switch. These values would be in percent of max ini value I believe:
setp mux16.0.in0 0.05 # this would be 5 ipm using your example.

Any way here is my relevant code I used:
Code:
# --- Max-Velocity Override --- setp encoder.3.x4-mode 1 net max-vel-chA        <=  hm2_7i92.0.7i84.0.2.input-30 net max-vel-chA        =>  encoder.3.phase-A net max-vel-chB        <=  hm2_7i92.0.7i84.0.2.input-31 net max-vel-chB        =>  encoder.3.phase-B net max-vel-output    <=  encoder.3.counts net max-vel-output    =>  halui.max-velocity.counts setp halui.max-velocity.count-enable 1 setp halui.max-velocity.scale .1 # --- Jogging --- net select-x-axis    <=  hm2_7i92.0.7i84.0.2.input-05 net select-x-axis    =>  halui.axis.x.select  =>  halui.joint.0.select net select-x-axis    =>  axis.x.jog-enable  =>  joint.0.jog-enable net select-y-axis    <=  hm2_7i92.0.7i84.0.2.input-06 net select-y-axis    =>  halui.axis.y.select  =>  halui.joint.1.select net select-y-axis    =>  axis.y.jog-enable  =>  joint.1.jog-enable net select-z-axis    <=  hm2_7i92.0.7i84.0.2.input-07 net select-z-axis    =>  halui.axis.z.select  =>  halui.joint.2.select net select-z-axis    =>  axis.z.jog-enable  =>  joint.2.jog-enable net sel-inc-plus    <=  hm2_7i92.0.7i84.0.2.input-22 net sel-inc-plus    =>  halui.axis.selected.increment-plus  =>  halui.joint.selected.increment-plus net sel-inc-minus    <=  hm2_7i92.0.7i84.0.2.input-23 net sel-inc-minus    =>  halui.axis.selected.increment-minus  =>  halui.joint.selected.increment-minus net sel-jog-plus    <=  hm2_7i92.0.7i84.0.2.input-20 net sel-jog-plus    =>  halui.axis.selected.plus  =>  halui.joint.selected.plus net sel-jog-minus    <=  hm2_7i92.0.7i84.0.2.input-21 net sel-jog-minus    =>  halui.axis.selected.minus  =>  halui.joint.selected.minus net sel-jog-vel        <=  scale.jog.out net sel-jog-vel        =>  halui.axis.jog-speed  =>  halui.joint.jog-speed #setp scale.jog.gain 10000 setp scale.jog.gain 10 # --- MPG --- setp mux16.inc.in00 0.0001 setp mux16.inc.in01 0.0005 setp mux16.inc.in02 0.0010 setp mux16.inc.in04 0.0050 setp mux16.inc.in08 0.0100 setp mux16.inc.debounce-time 0.200 setp axis.x.jog-vel-mode 1 setp axis.y.jog-vel-mode 1 setp axis.z.jog-vel-mode 1 setp joint.0.jog-vel-mode 1 setp joint.1.jog-vel-mode 1 setp joint.2.jog-vel-mode 1 net mpg-count        <=  hm2_7i92.0.7i84.0.2.enc0.count net mpg-count        =>  axis.x.jog-counts  =>  joint.0.jog-counts net mpg-count        =>  axis.y.jog-counts  =>  joint.1.jog-counts net mpg-count        =>  axis.z.jog-counts  =>  joint.2.jog-counts net mpg-scale        <=  mux16.inc.out-f net mpg-scale        =>  axis.x.jog-scale  =>  joint.0.jog-scale net mpg-scale        =>  axis.y.jog-scale  =>  joint.1.jog-scale net mpg-scale        =>  axis.z.jog-scale  =>  joint.2.jog-scale net mpg-scale        =>  scale.jog.in #No increment switch needed for .0001 net inc-select-b    <=  hm2_7i92.0.7i84.0.2.input-01 net inc-select-b    =>  mux16.inc.sel0 net inc-select-c    <=  hm2_7i92.0.7i84.0.2.input-02 net inc-select-c    =>  mux16.inc.sel1 net inc-select-d    <=  hm2_7i92.0.7i84.0.2.input-03 net inc-select-d    =>  mux16.inc.sel2 net inc-select-e    <=  hm2_7i92.0.7i84.0.2.input-04 net inc-select-e    =>  mux16.inc.sel3
The following user(s) said Thank You: spumco

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

More
4 years 10 months ago #229915 by spumco
Thanks a ton.  It'll take me a bit to digest but I'll have a go at it shortly.

-R

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

More
4 years 10 months ago #229921 by cmorley
halui.max-velocity.direct-value option was purposely added to allow the maxvelocity to be set with a selector switch.
that option, with a mux and setting the scale appropriately will work as you described.
Yes it's awkward to not use percent, but you could use percent on rapid and feed override.

linuxcnc.org/docs/devel/html/gui/halui.html#_max_velocity
The following user(s) said Thank You: spumco

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

More
4 years 10 months ago - 4 years 10 months ago #229943 by spumco
Thanks for the guidance.

I've had a go at it using the above as a template, but not really successful yet.  I don't really understand the mux thing - hasn't sunk in yet.

It appears to only have 4 outputs (mux16.0.sel0 through .sel3) so I had to comment out one of them to stop error messages.  Am I missing something in the setup/arrangement that permits me to have 5 values?

[note - max velocity is set to 150ipm (2.5 in INI)]

setp halui.max-velocity.direct-value true
setp halui.max-velocity.counts 1
setp mux16.0.in00 0.0
setp mux16.0.in01 0.125
setp mux16.0.in02 0.25
setp mux16.0.in03 1.250
setp mux16.0.in04 2.5
net MAXVEL_0            <=  [HMOT](CARD0).7i84.0.1.input-24
net MAXVEL_0            =>  mux16.0.sel0
net MAXVEL_1            <=  [HMOT](CARD0).7i84.0.1.input-23
net MAXVEL_1            =>  mux16.0.sel1
net MAXVEL_2            <=  [HMOT](CARD0).7i84.0.1.input-22
net MAXVEL_2            =>  mux16.0.sel2
net MAXVEL_3            <=  [HMOT](CARD0).7i84.0.1.input-21
net MAXVEL_3            =>  mux16.0.sel3

#commented out mux16.0.sel4 doesn't exist
#net MAXVEL_4            <=  [HMOT](CARD0).7i84.0.1.input-20
#net MAXVEL_4            =>  mux16.0.sel4

net MAXVEL_IN           <=  mux16.0.out-f
net MAXVEL_IN           =>  halui.max-velocity.scale

This works enough so I can see the mux16 values change in halshow, but I think I need to put this in postgui.hal to have an effect.

Comments or corrections?

EDIT - still not working right; it's clear I don't grasp how mux works as switching the selector changes the values, but not as expected.
Results in halshow:
input 24 = 0
input 23 = 2.5
input 22 = .25
input 21 = .125
input 20 = 0
Last edit: 4 years 10 months ago by spumco. Reason: Tested postgui.hal

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

More
4 years 10 months ago #229944 by cmorley
mux16 uses multiplexing to get 16 outputs from 4 inputs
If you don't multiplex the select lines then:

no select true: output will be = to in00
just .sel0 true: output will be = to in01
just .sel1 true: output will be = to in02
just .sel2 true: output will be = to in04
just .sel3 true: output will be = to in08

There is mux_generic that could be used to make a mux32 - 32 outputs with 5 inputs - or any pther amount of inputs.

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

Time to create page: 0.300 seconds
Powered by Kunena Forum