Getting Encoder Reading with 7i96s + 7i85s
18 Mar 2024 00:34 #296163
by ltcnc
Getting Encoder Reading with 7i96s + 7i85s was created by ltcnc
I'm working through PnCConf for a new build but I can't seem to get any kind of encoder readings when I test my stepper motors. I'm using a 7i96s + 7i85s card. The encoders are technically differential and have QAX, QAX/, QBX, and QBX/ signals. (No index pulse.) I was reading odd pulse voltages (only 1-2V with respect to ground) when I tried using the differential pulse, so now I'm running them as TTL (disconnected QAX/ and QBX/ signals) and changed the jumpers on the 7i85s to the "up" position. This gives 0 and 5 volt readings on both QAX and QBX when I rotate the encoder, but I'm still just seeing encoder readings of zero on the hal probe when I test the motor.
I'm pretty sure I'm using the correct firmware (downloaded from mesa). I flashed the 7i96s_7i85sd.bin, which PnCConf seems to be discovering correctly (at least, I have the option to choose the encoders on the P1 tab). I'm also pretty sure everything is wired correctly, I'm testing encoder 0 on the TB3 connector of the 7i85s and have double checked the wiring multiple times. Also, I can get the 7i96s to drive the stepper, but again only seeing 0's on the encoder reading.
Here's my rough HAL file (I haven't really tuned anything in, mostly trying to get this issued solved first):
Anyone know what I'm doing wrong?
I'm pretty sure I'm using the correct firmware (downloaded from mesa). I flashed the 7i96s_7i85sd.bin, which PnCConf seems to be discovering correctly (at least, I have the option to choose the encoders on the P1 tab). I'm also pretty sure everything is wired correctly, I'm testing encoder 0 on the TB3 connector of the 7i85s and have double checked the wiring multiple times. Also, I can get the 7i96s to drive the stepper, but again only seeing 0's on the encoder reading.
Here's my rough HAL file (I haven't really tuned anything in, mostly trying to get this issued solved first):
# Generated by PNCconf at Sun Mar 17 19:57:24 2024
# Using LinuxCNC version: Master (2.9)
# If you make changes to this file, they will be
# overwritten when you run PNCconf again
loadrt [KINS]KINEMATICS
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config="num_encoders=6 num_pwmgens=1 num_stepgens=9 sserial_port_0=00xxxxxx"
setp hm2_7i96s.0.pwmgen.pwm_frequency 20000
setp hm2_7i96s.0.pwmgen.pdm_frequency 6000000
setp hm2_7i96s.0.watchdog.timeout_ns 5000000
loadrt pid names=pid.x,pid.y,pid.z,pid.s
addf hm2_7i96s.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 hm2_7i96s.0.write servo-thread
setp hm2_7i96s.0.dpll.01.timer-us -50
setp hm2_7i96s.0.stepgen.timer-number 1
# external output signals
# external input signals
#*******************
# AXIS X JOINT 0
#*******************
setp pid.x.Pgain [JOINT_0]P
setp pid.x.Igain [JOINT_0]I
setp pid.x.Dgain [JOINT_0]D
setp pid.x.bias [JOINT_0]BIAS
setp pid.x.FF0 [JOINT_0]FF0
setp pid.x.FF1 [JOINT_0]FF1
setp pid.x.FF2 [JOINT_0]FF2
setp pid.x.deadband [JOINT_0]DEADBAND
setp pid.x.maxoutput [JOINT_0]MAX_OUTPUT
setp pid.x.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.x.maxerror 0.012700
net x-index-enable => pid.x.index-enable
net x-enable => pid.x.enable
net x-pos-cmd => pid.x.command
net x-pos-fb => pid.x.feedback
net x-output <= pid.x.output
# Step Gen signals/setup
setp hm2_7i96s.0.stepgen.00.dirsetup [JOINT_0]DIRSETUP
setp hm2_7i96s.0.stepgen.00.dirhold [JOINT_0]DIRHOLD
setp hm2_7i96s.0.stepgen.00.steplen [JOINT_0]STEPLEN
setp hm2_7i96s.0.stepgen.00.stepspace [JOINT_0]STEPSPACE
setp hm2_7i96s.0.stepgen.00.position-scale [JOINT_0]STEP_SCALE
setp hm2_7i96s.0.stepgen.00.step_type 0
setp hm2_7i96s.0.stepgen.00.control-type 1
setp hm2_7i96s.0.stepgen.00.maxaccel [JOINT_0]STEPGEN_MAXACCEL
setp hm2_7i96s.0.stepgen.00.maxvel [JOINT_0]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net x-pos-cmd <= joint.0.motor-pos-cmd
net x-vel-cmd <= joint.0.vel-cmd
net x-output => hm2_7i96s.0.stepgen.00.velocity-cmd
net x-pos-fb <= hm2_7i96s.0.stepgen.00.position-fb
net x-pos-fb => joint.0.motor-pos-fb
net x-enable <= joint.0.amp-enable-out
net x-enable => hm2_7i96s.0.stepgen.00.enable
# ---Encoder feedback signals/setup---
setp hm2_7i96s.0.encoder.00.counter-mode 0
setp hm2_7i96s.0.encoder.00.filter 1
setp hm2_7i96s.0.encoder.00.index-invert 0
setp hm2_7i96s.0.encoder.00.index-mask 0
setp hm2_7i96s.0.encoder.00.index-mask-invert 0
setp hm2_7i96s.0.encoder.00.scale [JOINT_0]ENCODER_SCALE
net x-pos-fb <= hm2_7i96s.0.encoder.00.position
net x-vel-fb <= hm2_7i96s.0.encoder.00.velocity
net x-pos-fb => joint.0.motor-pos-fb
net x-index-enable joint.0.index-enable <=> hm2_7i96s.0.encoder.00.index-enable
net x-pos-rawcounts <= hm2_7i96s.0.encoder.00.rawcounts
# ---setup home / limit switch signals---
net x-home-sw => joint.0.home-sw-in
net x-neg-limit => joint.0.neg-lim-sw-in
net x-pos-limit => joint.0.pos-lim-sw-in
#*******************
# AXIS Y JOINT 1
#*******************
setp pid.y.Pgain [JOINT_1]P
setp pid.y.Igain [JOINT_1]I
setp pid.y.Dgain [JOINT_1]D
setp pid.y.bias [JOINT_1]BIAS
setp pid.y.FF0 [JOINT_1]FF0
setp pid.y.FF1 [JOINT_1]FF1
setp pid.y.FF2 [JOINT_1]FF2
setp pid.y.deadband [JOINT_1]DEADBAND
setp pid.y.maxoutput [JOINT_1]MAX_OUTPUT
setp pid.y.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.y.maxerror 0.012700
net y-index-enable => pid.y.index-enable
net y-enable => pid.y.enable
net y-pos-cmd => pid.y.command
net y-pos-fb => pid.y.feedback
net y-output <= pid.y.output
# Step Gen signals/setup
setp hm2_7i96s.0.stepgen.01.dirsetup [JOINT_1]DIRSETUP
setp hm2_7i96s.0.stepgen.01.dirhold [JOINT_1]DIRHOLD
setp hm2_7i96s.0.stepgen.01.steplen [JOINT_1]STEPLEN
setp hm2_7i96s.0.stepgen.01.stepspace [JOINT_1]STEPSPACE
setp hm2_7i96s.0.stepgen.01.position-scale [JOINT_1]STEP_SCALE
setp hm2_7i96s.0.stepgen.01.step_type 0
setp hm2_7i96s.0.stepgen.01.control-type 1
setp hm2_7i96s.0.stepgen.01.maxaccel [JOINT_1]STEPGEN_MAXACCEL
setp hm2_7i96s.0.stepgen.01.maxvel [JOINT_1]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net y-pos-cmd <= joint.1.motor-pos-cmd
net y-vel-cmd <= joint.1.vel-cmd
net y-output => hm2_7i96s.0.stepgen.01.velocity-cmd
net y-pos-fb <= hm2_7i96s.0.stepgen.01.position-fb
net y-pos-fb => joint.1.motor-pos-fb
net y-enable <= joint.1.amp-enable-out
net y-enable => hm2_7i96s.0.stepgen.01.enable
# ---Encoder feedback signals/setup---
setp hm2_7i96s.0.encoder.01.counter-mode 0
setp hm2_7i96s.0.encoder.01.filter 1
setp hm2_7i96s.0.encoder.01.index-invert 0
setp hm2_7i96s.0.encoder.01.index-mask 0
setp hm2_7i96s.0.encoder.01.index-mask-invert 0
setp hm2_7i96s.0.encoder.01.scale [JOINT_1]ENCODER_SCALE
net y-pos-fb <= hm2_7i96s.0.encoder.01.position
net y-vel-fb <= hm2_7i96s.0.encoder.01.velocity
net y-pos-fb => joint.1.motor-pos-fb
net y-index-enable joint.1.index-enable <=> hm2_7i96s.0.encoder.01.index-enable
net y-pos-rawcounts <= hm2_7i96s.0.encoder.01.rawcounts
# ---setup home / limit switch signals---
net y-home-sw => joint.1.home-sw-in
net y-neg-limit => joint.1.neg-lim-sw-in
net y-pos-limit => joint.1.pos-lim-sw-in
#*******************
# AXIS Z JOINT 2
#*******************
setp pid.z.Pgain [JOINT_2]P
setp pid.z.Igain [JOINT_2]I
setp pid.z.Dgain [JOINT_2]D
setp pid.z.bias [JOINT_2]BIAS
setp pid.z.FF0 [JOINT_2]FF0
setp pid.z.FF1 [JOINT_2]FF1
setp pid.z.FF2 [JOINT_2]FF2
setp pid.z.deadband [JOINT_2]DEADBAND
setp pid.z.maxoutput [JOINT_2]MAX_OUTPUT
setp pid.z.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.z.maxerror 0.012700
net z-index-enable => pid.z.index-enable
net z-enable => pid.z.enable
net z-pos-cmd => pid.z.command
net z-pos-fb => pid.z.feedback
net z-output <= pid.z.output
# Step Gen signals/setup
setp hm2_7i96s.0.stepgen.02.dirsetup [JOINT_2]DIRSETUP
setp hm2_7i96s.0.stepgen.02.dirhold [JOINT_2]DIRHOLD
setp hm2_7i96s.0.stepgen.02.steplen [JOINT_2]STEPLEN
setp hm2_7i96s.0.stepgen.02.stepspace [JOINT_2]STEPSPACE
setp hm2_7i96s.0.stepgen.02.position-scale [JOINT_2]STEP_SCALE
setp hm2_7i96s.0.stepgen.02.step_type 0
setp hm2_7i96s.0.stepgen.02.control-type 1
setp hm2_7i96s.0.stepgen.02.maxaccel [JOINT_2]STEPGEN_MAXACCEL
setp hm2_7i96s.0.stepgen.02.maxvel [JOINT_2]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net z-pos-cmd <= joint.2.motor-pos-cmd
net z-vel-cmd <= joint.2.vel-cmd
net z-output => hm2_7i96s.0.stepgen.02.velocity-cmd
net z-pos-fb <= hm2_7i96s.0.stepgen.02.position-fb
net z-pos-fb => joint.2.motor-pos-fb
net z-enable <= joint.2.amp-enable-out
net z-enable => hm2_7i96s.0.stepgen.02.enable
# ---Encoder feedback signals/setup---
setp hm2_7i96s.0.encoder.02.counter-mode 0
setp hm2_7i96s.0.encoder.02.filter 1
setp hm2_7i96s.0.encoder.02.index-invert 0
setp hm2_7i96s.0.encoder.02.index-mask 0
setp hm2_7i96s.0.encoder.02.index-mask-invert 0
setp hm2_7i96s.0.encoder.02.scale [JOINT_2]ENCODER_SCALE
net z-pos-fb <= hm2_7i96s.0.encoder.02.position
net z-vel-fb <= hm2_7i96s.0.encoder.02.velocity
net z-pos-fb => joint.2.motor-pos-fb
net z-index-enable joint.2.index-enable <=> hm2_7i96s.0.encoder.02.index-enable
net z-pos-rawcounts <= hm2_7i96s.0.encoder.02.rawcounts
# ---setup home / limit switch signals---
net z-home-sw => joint.2.home-sw-in
net z-neg-limit => joint.2.neg-lim-sw-in
net z-pos-limit => joint.2.pos-lim-sw-in
#******************************
# connect miscellaneous signals
#******************************
# ---HALUI signals---
net axis-select-x halui.axis.x.select
net jog-x-pos halui.axis.x.plus
net jog-x-neg halui.axis.x.minus
net jog-x-analog halui.axis.x.analog
net x-is-homed halui.joint.0.is-homed
net axis-select-y halui.axis.y.select
net jog-y-pos halui.axis.y.plus
net jog-y-neg halui.axis.y.minus
net jog-y-analog halui.axis.y.analog
net y-is-homed halui.joint.1.is-homed
net axis-select-z halui.axis.z.select
net jog-z-pos halui.axis.z.plus
net jog-z-neg halui.axis.z.minus
net jog-z-analog halui.axis.z.analog
net z-is-homed halui.joint.2.is-homed
net jog-selected-pos halui.axis.selected.plus
net jog-selected-neg halui.axis.selected.minus
net spindle-manual-cw halui.spindle.0.forward
net spindle-manual-ccw halui.spindle.0.reverse
net spindle-manual-stop halui.spindle.0.stop
net machine-is-on halui.machine.is-on
net jog-speed halui.axis.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-out => iocontrol.0.emc-enable-in
# ---manual tool change signals---
net tool-change-request <= iocontrol.0.tool-change
net tool-change-confirmed => iocontrol.0.tool-changed
net tool-number <= iocontrol.0.tool-prep-number
# ---Use external manual tool change dialog---
loadusr -W hal_manualtoolchange
net tool-change-request => hal_manualtoolchange.change
net tool-change-confirmed <= hal_manualtoolchange.changed
net tool-number => hal_manualtoolchange.number
# ---ignore tool prepare requests---
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
Anyone know what I'm doing wrong?
Please Log in or Create an account to join the conversation.
18 Mar 2024 03:25 #296171
by PCW
Replied by PCW on topic Getting Encoder Reading with 7i96s + 7i85s
Could be a cable or 5V power option issue
Valid Power options:
7I96S supplies 5V power:
7I96S W6 UP
7I85S W3 UP
7I85S P1 unconnected
External 7I85S 5V power
7I96S W6 DOWN
7I85S W3 DOWN
5V supplied to 7I85S P1
Valid Power options:
7I96S supplies 5V power:
7I96S W6 UP
7I85S W3 UP
7I85S P1 unconnected
External 7I85S 5V power
7I96S W6 DOWN
7I85S W3 DOWN
5V supplied to 7I85S P1
Please Log in or Create an account to join the conversation.
19 Mar 2024 00:48 - 19 Mar 2024 00:58 #296278
by ltcnc
Replied by ltcnc on topic Getting Encoder Reading with 7i96s + 7i85s
I checked the cable with a multimeter and it seems like the pinout is correct (DB25 matches this link ccm.net/computing/hardware/10101-db25-connector/, IDC 26 seems like typical IDC pinout, assuming pin 1 is marked by the white box on the silkscreen.)
I've been powering the board with a separate 5V line. I also tested with cable power from the FPGA board, but still didn't get the encoder reading. (For whatever it's worth, I don't see the LED light on the 7i85s when I use cable power instead.)
I also tried connecting the encoder to the encoder input of the 7i96s but still no reading. I also tried a separate motor through the 7i85s, but again no reading. This is the motor www.omc-stepperonline.com/ts-series-1-ax...-supply-1-clts48-v41
I've been powering the board with a separate 5V line. I also tested with cable power from the FPGA board, but still didn't get the encoder reading. (For whatever it's worth, I don't see the LED light on the 7i85s when I use cable power instead.)
I also tried connecting the encoder to the encoder input of the 7i96s but still no reading. I also tried a separate motor through the 7i85s, but again no reading. This is the motor www.omc-stepperonline.com/ts-series-1-ax...-supply-1-clts48-v41
Last edit: 19 Mar 2024 00:58 by ltcnc.
Please Log in or Create an account to join the conversation.
19 Mar 2024 02:08 #296283
by PCW
Replied by PCW on topic Getting Encoder Reading with 7i96s + 7i85s
If you don't get the 7I85 power LED illuminated with cable power, that
is:
7I96S supplies 5V power:
7I96S W6 UP
7I85S W3 UP
7I85S P1 unconnected
That really suggests a cable issue.
is:
7I96S supplies 5V power:
7I96S W6 UP
7I85S W3 UP
7I85S P1 unconnected
That really suggests a cable issue.
Please Log in or Create an account to join the conversation.
19 Mar 2024 11:39 #296311
by ltcnc
Replied by ltcnc on topic Getting Encoder Reading with 7i96s + 7i85s
Are you able to confirm that the pinout I mentioned in the previous post is correct? I'm not able to tell from the data sheet what the expected pinout is supposed to be, but it seems to me that the cable I'm using is standard for both IDC 26 and DB25. I confirmed that all the pins are good with a multimeter. (Pin 1 DB25 is connected to pin1 IDC26, Pin2 is connected to pin2, etc.) Probably not very helpful, but this is the cable: www.ebay.com/itm/234451277144
Please Log in or Create an account to join the conversation.
19 Mar 2024 16:08 #296330
by PCW
Replied by PCW on topic Getting Encoder Reading with 7i96s + 7i85s
That's not an IDC DB25 and appears to have the incorrect pinout.
It should be:
HDR26 DB25
1 1
2 14
3 2
4 15
etc
It should be:
HDR26 DB25
1 1
2 14
3 2
4 15
etc
Please Log in or Create an account to join the conversation.
19 Mar 2024 17:26 #296333
by ltcnc
Replied by ltcnc on topic Getting Encoder Reading with 7i96s + 7i85s
Resoldered the connector and I can finally see the encoders! (And power the 7i85s from the 7i96s.) I was definitely confused about how the pinout on that cable should work. Thanks a million!
Please Log in or Create an account to join the conversation.
19 Mar 2024 18:15 #296335
by PCW
Replied by PCW on topic Getting Encoder Reading with 7i96s + 7i85s
Yeah, unfortunately there are 2 "standards"
The cable you have (well the female version)
is often used for motherboard parallel ports.
While the IDC pinout (that works with Mesa cards)
is more often used for add-in cards.
The cable you have (well the female version)
is often used for motherboard parallel ports.
While the IDC pinout (that works with Mesa cards)
is more often used for add-in cards.
Please Log in or Create an account to join the conversation.
Moderators: cmorley
Time to create page: 0.475 seconds