Test index of rotary encoder with hal only
- JC10
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 45
- Thank you received: 0
06 Oct 2019 15:49 - 06 Oct 2019 15:53 #147253
by JC10
Test index of rotary encoder with hal only was created by JC10
Hello,
I am trying to test the index of a suspicious rotary encoder.
My idea is to use the pulse of the index as input of a HAL toggle and observe its output.
Any time the index pulses, the toggle output should change.
Underr halcmd, I load and start the following :
Then I do : halcmd :sets index-enable true thats sets hm2_7i92.0.encoder.00.index-enable to true.
Then rotate the shaft of the encoder to observe that hm2_7i92.0.encoder.00.index-enable comes false after some degrees of rotation and that no pulse occurs on the toggle.
That is the behavior observed in many posts of PCW or in John Thorton's Servo Tuning Tutorials/Encoders. Behavior I experienced running Linuxcnc.
I thought by using minimal HAL only and not launching linuxcnc that this behavior would not have existed.
Is there a way to manage to get my idea working ?
Thanks for help.
I am trying to test the index of a suspicious rotary encoder.
My idea is to use the pulse of the index as input of a HAL toggle and observe its output.
Any time the index pulses, the toggle output should change.
Underr halcmd, I load and start the following :
# components
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config=" num_encoders=1 num_pwmgens=0 num_stepgens=0 sserial_port_0=0000xx"
loadrt toggle
loadrt threads name1=test-thread period1=1000000
#loadrt __test-thread (not loaded by loadrt, no args saved)
# pin aliases
# param aliases
# signals
# nets
net index_enable hm2_7i92.0.encoder.00.index-enable
net pulse hm2_7i92.0.encoder.00.input-index => toggle.0.in
net step toggle.0.out
# parameter values
setp hm2_7i92.0.7i76.0.0.output-00-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-01-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-02-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-03-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-04-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-05-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-06-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-07-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-08-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-09-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-10-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-11-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-12-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-13-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-14-invert FALSE
setp hm2_7i92.0.7i76.0.0.output-15-invert FALSE
setp hm2_7i92.0.7i76.0.0.spindir-invert FALSE
setp hm2_7i92.0.7i76.0.0.spinena-invert FALSE
setp hm2_7i92.0.7i76.0.0.spinout-maxlim 100
setp hm2_7i92.0.7i76.0.0.spinout-minlim 0
setp hm2_7i92.0.7i76.0.0.spinout-scalemax 100
setp hm2_7i92.0.encoder.00.counter-mode FALSE
setp hm2_7i92.0.encoder.00.filter TRUE
setp hm2_7i92.0.encoder.00.index-invert FALSE
setp hm2_7i92.0.encoder.00.index-mask FALSE
setp hm2_7i92.0.encoder.00.index-mask-invert FALSE
setp hm2_7i92.0.encoder.00.scale 1
setp hm2_7i92.0.encoder.00.vel-timeout 0.5
setp hm2_7i92.0.gpio.000.invert_output FALSE
setp hm2_7i92.0.gpio.000.is_opendrain FALSE
setp hm2_7i92.0.gpio.000.is_output FALSE
setp hm2_7i92.0.gpio.001.invert_output FALSE
setp hm2_7i92.0.gpio.001.is_opendrain FALSE
setp hm2_7i92.0.gpio.001.is_output FALSE
setp hm2_7i92.0.gpio.002.invert_output FALSE
setp hm2_7i92.0.gpio.002.is_opendrain FALSE
setp hm2_7i92.0.gpio.002.is_output FALSE
setp hm2_7i92.0.gpio.003.invert_output FALSE
setp hm2_7i92.0.gpio.003.is_opendrain FALSE
setp hm2_7i92.0.gpio.003.is_output FALSE
setp hm2_7i92.0.gpio.004.invert_output FALSE
setp hm2_7i92.0.gpio.004.is_opendrain FALSE
setp hm2_7i92.0.gpio.004.is_output FALSE
setp hm2_7i92.0.gpio.005.invert_output FALSE
setp hm2_7i92.0.gpio.005.is_opendrain FALSE
setp hm2_7i92.0.gpio.005.is_output FALSE
setp hm2_7i92.0.gpio.006.invert_output FALSE
setp hm2_7i92.0.gpio.006.is_opendrain FALSE
setp hm2_7i92.0.gpio.006.is_output FALSE
setp hm2_7i92.0.gpio.007.invert_output FALSE
setp hm2_7i92.0.gpio.007.is_opendrain FALSE
setp hm2_7i92.0.gpio.007.is_output FALSE
setp hm2_7i92.0.gpio.008.invert_output FALSE
setp hm2_7i92.0.gpio.008.is_opendrain FALSE
setp hm2_7i92.0.gpio.008.is_output FALSE
setp hm2_7i92.0.gpio.009.invert_output FALSE
setp hm2_7i92.0.gpio.009.is_opendrain FALSE
setp hm2_7i92.0.gpio.009.is_output FALSE
setp hm2_7i92.0.gpio.010.invert_output FALSE
setp hm2_7i92.0.gpio.010.is_opendrain FALSE
setp hm2_7i92.0.gpio.012.invert_output FALSE
setp hm2_7i92.0.gpio.012.is_opendrain FALSE
setp hm2_7i92.0.gpio.012.is_output FALSE
setp hm2_7i92.0.gpio.013.invert_output FALSE
setp hm2_7i92.0.gpio.013.is_opendrain FALSE
setp hm2_7i92.0.gpio.013.is_output FALSE
setp hm2_7i92.0.gpio.017.invert_output FALSE
setp hm2_7i92.0.gpio.017.is_opendrain FALSE
setp hm2_7i92.0.gpio.017.is_output FALSE
setp hm2_7i92.0.gpio.018.invert_output FALSE
setp hm2_7i92.0.gpio.018.is_opendrain FALSE
setp hm2_7i92.0.gpio.018.is_output FALSE
setp hm2_7i92.0.gpio.019.invert_output FALSE
setp hm2_7i92.0.gpio.019.is_opendrain FALSE
setp hm2_7i92.0.gpio.019.is_output FALSE
setp hm2_7i92.0.gpio.020.invert_output FALSE
setp hm2_7i92.0.gpio.020.is_opendrain FALSE
setp hm2_7i92.0.gpio.020.is_output FALSE
setp hm2_7i92.0.gpio.021.invert_output FALSE
setp hm2_7i92.0.gpio.021.is_opendrain FALSE
setp hm2_7i92.0.gpio.021.is_output FALSE
setp hm2_7i92.0.gpio.022.invert_output FALSE
setp hm2_7i92.0.gpio.022.is_opendrain FALSE
setp hm2_7i92.0.gpio.022.is_output FALSE
setp hm2_7i92.0.gpio.023.invert_output FALSE
setp hm2_7i92.0.gpio.023.is_opendrain FALSE
setp hm2_7i92.0.gpio.023.is_output FALSE
setp hm2_7i92.0.gpio.024.invert_output FALSE
setp hm2_7i92.0.gpio.024.is_opendrain FALSE
setp hm2_7i92.0.gpio.024.is_output FALSE
setp hm2_7i92.0.gpio.025.invert_output FALSE
setp hm2_7i92.0.gpio.025.is_opendrain FALSE
setp hm2_7i92.0.gpio.025.is_output FALSE
setp hm2_7i92.0.gpio.026.invert_output FALSE
setp hm2_7i92.0.gpio.026.is_opendrain FALSE
setp hm2_7i92.0.gpio.026.is_output FALSE
setp hm2_7i92.0.gpio.027.invert_output FALSE
setp hm2_7i92.0.gpio.027.is_opendrain FALSE
setp hm2_7i92.0.gpio.027.is_output FALSE
setp hm2_7i92.0.gpio.028.invert_output FALSE
setp hm2_7i92.0.gpio.028.is_opendrain FALSE
setp hm2_7i92.0.gpio.028.is_output FALSE
setp hm2_7i92.0.gpio.029.invert_output FALSE
setp hm2_7i92.0.gpio.029.is_opendrain FALSE
setp hm2_7i92.0.gpio.029.is_output FALSE
setp hm2_7i92.0.gpio.030.invert_output FALSE
setp hm2_7i92.0.gpio.030.is_opendrain FALSE
setp hm2_7i92.0.gpio.030.is_output FALSE
setp hm2_7i92.0.gpio.031.invert_output FALSE
setp hm2_7i92.0.gpio.031.is_opendrain FALSE
setp hm2_7i92.0.gpio.031.is_output FALSE
setp hm2_7i92.0.gpio.032.invert_output FALSE
setp hm2_7i92.0.gpio.032.is_opendrain FALSE
setp hm2_7i92.0.gpio.032.is_output FALSE
setp hm2_7i92.0.gpio.033.invert_output FALSE
setp hm2_7i92.0.gpio.033.is_opendrain FALSE
setp hm2_7i92.0.gpio.033.is_output FALSE
setp hm2_7i92.0.io_error FALSE
setp hm2_7i92.0.packet-error-increment 2
setp hm2_7i92.0.packet-error-limit 10
setp hm2_7i92.0.packet-read-timeout 80
setp hm2_7i92.0.read-request.tmax 0
setp hm2_7i92.0.read.tmax 356949
setp hm2_7i92.0.sserial.port-0.fault-dec 0x00000001
setp hm2_7i92.0.sserial.port-0.fault-inc 0x0000000A
setp hm2_7i92.0.sserial.port-0.fault-lim 0x000000C8
setp hm2_7i92.0.watchdog.timeout_ns 0x004C4B40
setp hm2_7i92.0.write.tmax 43335
setp test-thread.tmax 401760
setp toggle.0.debounce 0x00000002
setp toggle.0.tmax 1593
# realtime thread/function links
addf toggle.0 test-thread
addf hm2_7i92.0.read test-thread
addf hm2_7i92.0.write test-thread
Then I do : halcmd :sets index-enable true thats sets hm2_7i92.0.encoder.00.index-enable to true.
Then rotate the shaft of the encoder to observe that hm2_7i92.0.encoder.00.index-enable comes false after some degrees of rotation and that no pulse occurs on the toggle.
That is the behavior observed in many posts of PCW or in John Thorton's Servo Tuning Tutorials/Encoders. Behavior I experienced running Linuxcnc.
I thought by using minimal HAL only and not launching linuxcnc that this behavior would not have existed.
Is there a way to manage to get my idea working ?
Thanks for help.
Last edit: 06 Oct 2019 15:53 by JC10. Reason: Typo
Please Log in or Create an account to join the conversation.
- pl7i92
- Offline
- Platinum Member
Less
More
- Posts: 1890
- Thank you received: 356
06 Oct 2019 17:45 #147275
by pl7i92
Replied by pl7i92 on topic Test index of rotary encoder with hal only
why not connecting it as it is suposed to and VIEW the Counts
Please Log in or Create an account to join the conversation.
- PCW
- Offline
- Moderator
Less
More
- Posts: 17868
- Thank you received: 4776
06 Oct 2019 21:56 #147294
by PCW
Replied by PCW on topic Test index of rotary encoder with hal only
In general its not useful to read the encoder index pin directly since with high resolution encoders, it will be a very narrow pulse and cannot be sampled reliably.
If you want to toggle a pin on index you need to use index enable, something like this:
loadrt not
loadrt tristate-bit
addf not.0 servo-thread
addf tristate-bit.0 servo-thread
setp tristate-bit.0.in 1
net enable hm2_somecard.0.encoder.00.index-enable tristate-bit.0.out not.0.in
net reset not.0.out tristate-bit.0.enable
The "reset" signal will be set for one servo thread period every detected index
If you want to toggle a pin on index you need to use index enable, something like this:
loadrt not
loadrt tristate-bit
addf not.0 servo-thread
addf tristate-bit.0 servo-thread
setp tristate-bit.0.in 1
net enable hm2_somecard.0.encoder.00.index-enable tristate-bit.0.out not.0.in
net reset not.0.out tristate-bit.0.enable
The "reset" signal will be set for one servo thread period every detected index
Please Log in or Create an account to join the conversation.
- JC10
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 45
- Thank you received: 0
07 Oct 2019 13:03 #147327
by JC10
Replied by JC10 on topic Test index of rotary encoder with hal only
PCW many thanks for your answer.
If I understand well, the 7i92 will always see the index and when it is observed, the 7i92 will reset the index-enable to 0.
With your code, if, in a given servo-thread, index-enable is observed as 0, it will be set to 1 in the next servo-thread by « reset « (you defined here above). So in all servo-threads except one, index-enable will be set to 1.
Therefore, I should be able to toggle on « reset ». Is this right ?
If I understand well, the 7i92 will always see the index and when it is observed, the 7i92 will reset the index-enable to 0.
With your code, if, in a given servo-thread, index-enable is observed as 0, it will be set to 1 in the next servo-thread by « reset « (you defined here above). So in all servo-threads except one, index-enable will be set to 1.
Therefore, I should be able to toggle on « reset ». Is this right ?
Please Log in or Create an account to join the conversation.
- PCW
- Offline
- Moderator
Less
More
- Posts: 17868
- Thank you received: 4776
07 Oct 2019 13:31 #147335
by PCW
Replied by PCW on topic Test index of rotary encoder with hal only
yep toggle or count indexes
Please Log in or Create an account to join the conversation.
- JC10
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 45
- Thank you received: 0
08 Oct 2019 15:07 - 08 Oct 2019 15:07 #147466
by JC10
Replied by JC10 on topic Test index of rotary encoder with hal only
I tried to toggle but was not successful with your code added as follows :
With halmeter, I observe that index-enabled is always set true so the code works.
But apparently toggle.0.out always stays false.
I also adjusted toggle.0.debounce to 0 but no success.
However I am apparently successful when I applied John Thorton tutorial : gnipsel.com/linuxcnc/tuning/encoder.html
or the same from many of your posts like here : forum.linuxcnc.org/10-advanced-configura...oder-index-questions
Is my toggle code incorrect ?
Is any of the pins provided by 7i92 on an encoder also related to the index apart index itself and index-enable ?
Thanks
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config=" num_encoders=1 num_pwmgens=0 num_stepgens=0 sserial_port_0=0000xx"
loadrt threads name1=servo-thread period1=1000000
loadrt not
loadrt tristate_bit
loadrt toggle
addf hm2_7i92.0.read servo-thread
addf hm2_7i92.0.write servo-thread
addf not.0 servo-thread
addf tristate-bit.0 servo-thread
addf toggle.0 servo-thread
setp tristate-bit.0.in 1
setp toggle.0.debounce 1
net enable hm2_7i92.0.encoder.00.index-enable tristate-bit.0.out not.0.in
net reset not.0.out tristate-bit.0.enable toggle.0.in
With halmeter, I observe that index-enabled is always set true so the code works.
But apparently toggle.0.out always stays false.
I also adjusted toggle.0.debounce to 0 but no success.
However I am apparently successful when I applied John Thorton tutorial : gnipsel.com/linuxcnc/tuning/encoder.html
or the same from many of your posts like here : forum.linuxcnc.org/10-advanced-configura...oder-index-questions
The way to check index operation is to "sets" the signal that carries the spindle index enable "true",
then hand rotate the spindle to see if this signal is cleared at the index position
Is my toggle code incorrect ?
Is any of the pins provided by 7i92 on an encoder also related to the index apart index itself and index-enable ?
Thanks
Last edit: 08 Oct 2019 15:07 by JC10.
Please Log in or Create an account to join the conversation.
- PCW
- Offline
- Moderator
Less
More
- Posts: 17868
- Thank you received: 4776
08 Oct 2019 16:41 - 08 Oct 2019 16:41 #147471
by PCW
Replied by PCW on topic Test index of rotary encoder with hal only
I could be a thread order issue (the hm2_card.0.write should always be the last thing done)
It also could be that toggle cannot count a single servo period long signal
I would first fix the thread order and then halscope the reset signal
if reset is ok then maybe the flip-flop component would be a better choice (than toggle)
It also could be that toggle cannot count a single servo period long signal
I would first fix the thread order and then halscope the reset signal
if reset is ok then maybe the flip-flop component would be a better choice (than toggle)
Last edit: 08 Oct 2019 16:41 by PCW.
Please Log in or Create an account to join the conversation.
- JC10
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 45
- Thank you received: 0
09 Oct 2019 12:14 - 09 Oct 2019 12:31 #147557
by JC10
Replied by JC10 on topic Test index of rotary encoder with hal only
Yes, hm2_7i92.0.write needs to be located in last position.
I removed the toggle to focus on the signal reset.
Here is the HAL corrected I ran including your code :
The "reset" signal observations with halscope show unexpected behavior.
I used halscope in Run mode : single and Trigger : normal + force.
I made a first record #1 where we observe that "reset" is raised to 1 but is not set back 0 after one cycle as expected.
Then I made a second record #2 where "reset" remains at 1 except when set back to 0 periodically for one cycle, I guess when the index is detected by 7i92 as i am rotating the rotary shaft.
I checked the code as follow and for me it should work, except some unexpected behavior on index-enable that is input and output for 7i92 or something else I ignored
I removed the toggle to focus on the signal reset.
Here is the HAL corrected I ran including your code :
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config=" num_encoders=1 num_pwmgens=0 num_stepgens=0 sserial_port_0=0000xx"
loadrt threads name1=servo-thread period1=1000000
loadrt not
loadrt tristate_bit
addf hm2_7i92.0.read servo-thread
addf not.0 servo-thread
addf tristate-bit.0 servo-thread
setp tristate-bit.0.in 1
addf hm2_7i92.0.write servo-thread
net enable hm2_7i92.0.encoder.00.index-enable tristate-bit.0.out not.0.in
net reset not.0.out tristate-bit.0.enable
The "reset" signal observations with halscope show unexpected behavior.
I used halscope in Run mode : single and Trigger : normal + force.
I made a first record #1 where we observe that "reset" is raised to 1 but is not set back 0 after one cycle as expected.
Then I made a second record #2 where "reset" remains at 1 except when set back to 0 periodically for one cycle, I guess when the index is detected by 7i92 as i am rotating the rotary shaft.
I checked the code as follow and for me it should work, except some unexpected behavior on index-enable that is input and output for 7i92 or something else I ignored
First cycle
index-enable = 0
not.0.in = 0
not.0.out = 1
tristate-bit.0.in = 1
tristate-bit.0.enable = 1
tristate-bit.0.out = 1
enable-index = 1
Cycles where 7i92 did not detect index
index-enable = 1
not.0.in = 1
not.0.out = 0
tristate-bit.0.in = 1
tristate-bit.0.enable = 0
tristate-bit.0.out = 1
enable-index = 1
Cycle following 7i92 detected index (exactly identical to First cycle)
index-enable = 0
not.0.in = 0
not.0.out = 1
tristate-bit.0.in = 1
tristate-bit.0.enable = 1
tristate-bit.0.out = 1
enable-index = 1
Last edit: 09 Oct 2019 12:31 by JC10. Reason: Typo
Please Log in or Create an account to join the conversation.
- PCW
- Offline
- Moderator
Less
More
- Posts: 17868
- Thank you received: 4776
09 Oct 2019 13:35 #147561
by PCW
Replied by PCW on topic Test index of rotary encoder with hal only
The middle plot looks as expected, what do you see thats wrong?
I think that there is possibility of missing indexes on reversals
(with less than a few servo periods between indexes)
but this is not an issue with normal index use
I think that there is possibility of missing indexes on reversals
(with less than a few servo periods between indexes)
but this is not an issue with normal index use
Please Log in or Create an account to join the conversation.
- JC10
- Topic Author
- Offline
- Senior Member
Less
More
- Posts: 45
- Thank you received: 0
09 Oct 2019 14:47 - 09 Oct 2019 14:49 #147564
by JC10
Replied by JC10 on topic Test index of rotary encoder with hal only
For me it looks inverted compared to what we expect according to what I determined by running your code on paper as in my previous post and especially according to your post here above :The middle plot looks as expected, what do you see thats wrong?
When I rotate the shaft, I only rotate in the same direction.The "reset" signal will be set for one servo thread period every detected index
Last edit: 09 Oct 2019 14:49 by JC10.
Please Log in or Create an account to join the conversation.
Moderators: PCW, jmelson
Time to create page: 0.095 seconds