Search Results (Searched for: stepper spindle)
- 10K
30 Dec 2024 15:58
Replied by 10K on topic Threading Index Varies With Speed
Threading Index Varies With Speed
Category: General LinuxCNC Questions
This problem, and this forum thread, all started when I was getting gouging when making a 1"-8 thread. After analysis, I believe that the lathe was bogging down slightly when making later passes in the increasingly deep thread. I've confirmed that the position of the thread changes with speed. The slight decrease in speed made the cutter take a larger bite, which caused further bogging down and then an even larger bite. Eventually, the lathe reached stability and was able to speed up and quit gouging.
Today, I tried making the thread again. I kept thinking that the Monarch lathe motor is large (7HP), and should be able to power through the threading cuts. My lathe has a back gear (speed reduced, torque increased), which I have never used. I put the lathe in the back gear and tried the thread cut. The gouging stopped completely. So that problem is solved to my satisfaction.
The contributing problem, thread position varies with spindle speed, seems to be built in to the LinuxCNC code. Spindle speed should not be changed during the threading operation. I'm not convinced that replacing the Z stepper with a more powerful motor, which would allow me more acceleration, would change this behavior very much. I'm also not convinced that having more pulses per spindle revolution, either through making a new gear with more teeth or using software to synthesize more pulses, would make much difference.
Please let me know if my logic is flawed.
Today, I tried making the thread again. I kept thinking that the Monarch lathe motor is large (7HP), and should be able to power through the threading cuts. My lathe has a back gear (speed reduced, torque increased), which I have never used. I put the lathe in the back gear and tried the thread cut. The gouging stopped completely. So that problem is solved to my satisfaction.
The contributing problem, thread position varies with spindle speed, seems to be built in to the LinuxCNC code. Spindle speed should not be changed during the threading operation. I'm not convinced that replacing the Z stepper with a more powerful motor, which would allow me more acceleration, would change this behavior very much. I'm also not convinced that having more pulses per spindle revolution, either through making a new gear with more teeth or using software to synthesize more pulses, would make much difference.
Please let me know if my logic is flawed.
- 10K
27 Dec 2024 19:58
Replied by 10K on topic Threading Index Varies With Speed
Threading Index Varies With Speed
Category: General LinuxCNC Questions
Here's the values for Z:
MAX_VELOCITY = 1.8
MAX_ACCELERATION = 2.0
These were set after a lot of experimentation. Higher values stall the stepper motor. I could try increasing the acceleration somewhat, but probably in the 10-20% range. Not sure this would make much difference. Let me know if you think I should try it anyway.
You mentioned that the 200 RPM plot is broken. Are you referring to the change of slope in the velocity before it starts oscillating?
Is it likely that the 10 pulse/revolution pulses are causing the problem? I could redo that part of the lathe. Getting greater acceleration will require a new stepper or servo motor and a lot of work.
I have two choices for the encoder-
1) I have some encoders in my junk drawer. They're both quadrature. One is a US Digital 1000 pulses/rev with a separate index signal, and the other is a more robust looking Accu-coder 2500 pulses/rev. Both are designed for small shafts, so I'd need a belt or gearing to connect them.
2) I could machine a gear to bolt on the spindle pulley. It'd be about 7 1/4" or so in diameter, so how ever many teeth I could fit on it. Maybe about 90 1/8" teeth? Or 180 1/16" teeth? I don't have any feel for how many pulses/revolution is appropriate, so maybe this would not work.
Here's a photo of the two pulse generators. The 1 pulse/rev is magnetic and the other one is proximity. The teeth are for locking the spindle.
MAX_VELOCITY = 1.8
MAX_ACCELERATION = 2.0
These were set after a lot of experimentation. Higher values stall the stepper motor. I could try increasing the acceleration somewhat, but probably in the 10-20% range. Not sure this would make much difference. Let me know if you think I should try it anyway.
You mentioned that the 200 RPM plot is broken. Are you referring to the change of slope in the velocity before it starts oscillating?
Is it likely that the 10 pulse/revolution pulses are causing the problem? I could redo that part of the lathe. Getting greater acceleration will require a new stepper or servo motor and a lot of work.
I have two choices for the encoder-
1) I have some encoders in my junk drawer. They're both quadrature. One is a US Digital 1000 pulses/rev with a separate index signal, and the other is a more robust looking Accu-coder 2500 pulses/rev. Both are designed for small shafts, so I'd need a belt or gearing to connect them.
2) I could machine a gear to bolt on the spindle pulley. It'd be about 7 1/4" or so in diameter, so how ever many teeth I could fit on it. Maybe about 90 1/8" teeth? Or 180 1/16" teeth? I don't have any feel for how many pulses/revolution is appropriate, so maybe this would not work.
Here's a photo of the two pulse generators. The 1 pulse/rev is magnetic and the other one is proximity. The teeth are for locking the spindle.
- slowpoke
- slowpoke
26 Dec 2024 10:01 - 26 Dec 2024 10:10
7i96S MPG input was created by slowpoke
7i96S MPG input
Category: Basic Configuration
I'm anticipating reception of my 7196S card shortly. (The Canada Post strike is finally on hold)
This is for a lathe; I have a stepper (for now) mated to the Z-axis leadscrew, and a servo mated to the cross-slide
The Spindle encoder (A,B,Z signals) will interface to the fast encoder inputs on TB2:7,10,13
I plan to configure this so that the lathe can operate either in old fashioned manual mode, or in LinuxCNC mode. When in manual mode a separate ELS controller drives the Z-axis leadscrew, and because I have eliminated the hand crank for the cross-slide (it's now mated to a servo), I want to add a MPG to emulate the old cross-slide hand crank when I want to manipulate the cross-slide manually.
My question is about interfacing the 600 pulse/Rev rotary encoder intended for use as the cross-slide MPG. I have spare isolated inputs on TB3 that I would prefer to use because of the isolation. Manual states 5kHz max for these isolated inputs which seems fast enough, I can't imagine being able to rotate that knob 8 times in a second. So assuming the rate is okay, can I simply add a few lines to my HAL file to get a couple of those spare inputs to decode the A/B signals to get counts and direction from the encoder? or do I need to re-FLASH the FPGA on the 7196S?
This is for a lathe; I have a stepper (for now) mated to the Z-axis leadscrew, and a servo mated to the cross-slide
The Spindle encoder (A,B,Z signals) will interface to the fast encoder inputs on TB2:7,10,13
I plan to configure this so that the lathe can operate either in old fashioned manual mode, or in LinuxCNC mode. When in manual mode a separate ELS controller drives the Z-axis leadscrew, and because I have eliminated the hand crank for the cross-slide (it's now mated to a servo), I want to add a MPG to emulate the old cross-slide hand crank when I want to manipulate the cross-slide manually.
My question is about interfacing the 600 pulse/Rev rotary encoder intended for use as the cross-slide MPG. I have spare isolated inputs on TB3 that I would prefer to use because of the isolation. Manual states 5kHz max for these isolated inputs which seems fast enough, I can't imagine being able to rotate that knob 8 times in a second. So assuming the rate is okay, can I simply add a few lines to my HAL file to get a couple of those spare inputs to decode the A/B signals to get counts and direction from the encoder? or do I need to re-FLASH the FPGA on the 7196S?
- 10K
24 Dec 2024 22:18 - 24 Dec 2024 22:39
Replied by 10K on topic Threading Index Varies With Speed
Threading Index Varies With Speed
Category: General LinuxCNC Questions
These are some great questions. I spent some time collecting information to address them.
cakeslob question: I ran the 1"-8 scratch threads again. I tried hand turning the spindle, then ran it at 100, 150, and 200 RPM. I found the following:
1) Yes, you can run the threading G-code and cut the thread by turning the spindle by hand
2) The hand turned scratch wobbles a bit compared to the ones at set speeds
3) The hand turned scratch is the leftmost one in the photo, then the 100 RPM to its right, then the 150 and the rightmost thread at 200 RPM.
4) The spacing of the scratches, measured as best as I can from the hand turned scratch line, is
a) 0-100RPM -0.025"
b) 0-150 RPM -0.055"
c) 0-200 RPM -0.085"
This supports andypugh's comment about the Y axis having to catch up the position after it detects the index pulse. The faster the speed, the more the thread falls behind the desired position.
PCW question:
I've attached my INI and HAL files.
Here's the section for the Z axis
I used HALSCOPE and watched hm2_7i92.0.gpio.014.in_not (spindle index) and hm2_7i92.0.gpio.016.in (spindle A). That was working as expected, as I got one index pulse per 10 "A" pulses.
I then watched the spindle index and hm2_7i92.0.stepgen.02.position-1b (Z axis position) while running the threading program.
For 100 RPM:
For 200 RPM:
This looks to me like it's working as expected, where the falling index pulse begins the carriage Z movement. Note that I have steppers and this is not a real feedback signal on the position..That leads me to believe that LincxCNC is working correctly and that my problem is a physical one with my lathe.
M4MazakUser question:
Yes, both the index and "A" spindle signals are driven directly off the spindle.
andypugh question:
I'm using the threading program from the O-code section of the forum (and which I wrote). Before issuing the G76 code, the program moves the tool to the starting X and Z position. I think that there's validity to your comment about the axis acceleration perhaps affecting the spindle synch point. I'm not sure what to do about it, though. The carriage on my lathe probably weighs nearly 100 lbs, and the stepper motor is probably undersized. I've had to limit my Z acceleration to 2 i/s^2, or it loses steps.
I ran the calcs you suggested (v = sqrt(2as)) for the 8 tpi thread I'm trying to cut. For the final velocity, I need to cut 1/8" per revolution at the set RPM.
For 100 RPM, v = 100 r/m / 60 s/m / 8 r/i = 0.208 i/s
And the distance to reach that speed s = v^2 / 2a, or 0.208^2 / (2 * 2) = 0.011"
For 200 RPM, s = 0.043"
The takeaway here is that the calculated distance is exponential with speed. When I measured the scratch marks from the hand turned (very slow RPM) values I got 0-100 RPM was 0.25" and 0-200 RPM was 0.085", which is exponential behavior. They're also about twice the values calculated in the formula.
So, I'm still not sure there's a path forward to correct this. A larger stepper, able to accelerate the heavy carriage would likely help, in that I could increase the maximum acceleration. But I'm not losing steps, so the program should be able to handle this. Perhaps a servo motor with closed loop control would fix it.
cakeslob question: I ran the 1"-8 scratch threads again. I tried hand turning the spindle, then ran it at 100, 150, and 200 RPM. I found the following:
1) Yes, you can run the threading G-code and cut the thread by turning the spindle by hand
2) The hand turned scratch wobbles a bit compared to the ones at set speeds
3) The hand turned scratch is the leftmost one in the photo, then the 100 RPM to its right, then the 150 and the rightmost thread at 200 RPM.
4) The spacing of the scratches, measured as best as I can from the hand turned scratch line, is
a) 0-100RPM -0.025"
b) 0-150 RPM -0.055"
c) 0-200 RPM -0.085"
This supports andypugh's comment about the Y axis having to catch up the position after it detects the index pulse. The faster the speed, the more the thread falls behind the desired position.
PCW question:
I've attached my INI and HAL files.
Here's the section for the Z axis
#********************
# Axis Z
#********************
[AXIS_Z]
MIN_LIMIT = 0.001
MAX_LIMIT = 19.5
MAX_VELOCITY = 1.8
MAX_ACCELERATION = 2.0
[JOINT_1]
TYPE = LINEAR
HOME_SEARCH_VEL = 0.8
# overshoot switch if too high
HOME_LATCH_VEL = 0.1
#HOME_FINAL_VEL = 1.0
HOME_IGNORE_LIMITS = YES
HOME_USE_INDEX = NO
HOME_OFFSET = 19.95
HOME = 9
HOME_IS_SHARED = 1
HOME_SEQUENCE = 0
VOLATILE_HOME = 1
# STARTING VALUES FERROR 0.001 0.0005
FERROR = 0.01
MIN_FERROR = 0.001
# MAX_VELOCITY = STEPGEN_MAXVEL / 1.25. STEPGEN_MAXVEL = experimental maximum
# If BACKLASH is not set:
# MAX_ACCELERATION = STEPGEN_MAXACCEL / 1.25. STEPGEN_MAXACCEL = MAX_ACCELERATION * 2.5
# If BACKLASH is set:
# MAX_ACCELERATION = experimental maximum acceleration / 1.25. STEPGEN_MAXACCEL = MAX_ACCELERATION * 2.5
# STARTING VALUES FERROR 1.8 2.25 2.5 3.2
MAX_VELOCITY = 1.8
MAX_ACCELERATION = 2.0
# These should match values above in [AXIS_Z]
STEPGEN_MAXVEL = 2.5
# If set too low, STEPGEN_MAXACCEL will cause massive joint follow errors!
STEPGEN_MAXACCEL = 5.0
P = 1000.0
I = 0.0
D = 0.0
FF0 = 0.0
FF1 = 1.0
FF2 = 0.0
BIAS = 0.0
DEADBAND = 0.0
MAX_OUTPUT = 0
# these are in nanoseconds
DIRSETUP = 100000
DIRHOLD = 100000
STEPLEN = 2000
STEPSPACE = 2000
STEP_SCALE = 12825.0
MIN_LIMIT = 0.001
MAX_LIMIT = 19.5
BACKLASH = 0.008
I used HALSCOPE and watched hm2_7i92.0.gpio.014.in_not (spindle index) and hm2_7i92.0.gpio.016.in (spindle A). That was working as expected, as I got one index pulse per 10 "A" pulses.
I then watched the spindle index and hm2_7i92.0.stepgen.02.position-1b (Z axis position) while running the threading program.
For 100 RPM:
For 200 RPM:
This looks to me like it's working as expected, where the falling index pulse begins the carriage Z movement. Note that I have steppers and this is not a real feedback signal on the position..That leads me to believe that LincxCNC is working correctly and that my problem is a physical one with my lathe.
M4MazakUser question:
Yes, both the index and "A" spindle signals are driven directly off the spindle.
andypugh question:
I'm using the threading program from the O-code section of the forum (and which I wrote). Before issuing the G76 code, the program moves the tool to the starting X and Z position. I think that there's validity to your comment about the axis acceleration perhaps affecting the spindle synch point. I'm not sure what to do about it, though. The carriage on my lathe probably weighs nearly 100 lbs, and the stepper motor is probably undersized. I've had to limit my Z acceleration to 2 i/s^2, or it loses steps.
I ran the calcs you suggested (v = sqrt(2as)) for the 8 tpi thread I'm trying to cut. For the final velocity, I need to cut 1/8" per revolution at the set RPM.
For 100 RPM, v = 100 r/m / 60 s/m / 8 r/i = 0.208 i/s
And the distance to reach that speed s = v^2 / 2a, or 0.208^2 / (2 * 2) = 0.011"
For 200 RPM, s = 0.043"
The takeaway here is that the calculated distance is exponential with speed. When I measured the scratch marks from the hand turned (very slow RPM) values I got 0-100 RPM was 0.25" and 0-200 RPM was 0.085", which is exponential behavior. They're also about twice the values calculated in the formula.
So, I'm still not sure there's a path forward to correct this. A larger stepper, able to accelerate the heavy carriage would likely help, in that I could increase the maximum acceleration. But I'm not losing steps, so the program should be able to handle this. Perhaps a servo motor with closed loop control would fix it.
- Sternfox
- Sternfox
24 Dec 2024 18:25
Replied by Sternfox on topic Timed delay
Timed delay
Category: Advanced Configuration
Thanks for the code, im getting this error on startup ./main.hal:239: Pin 'xor.0.in0' does not exist
here is my hal file
# This file was created with the Mesa Configuration Tool on Nov 26 2024 15:50:59
# If you make changes to this file DO NOT run the configuration tool again!
# This file will be replaced with a new file if you do!
# kinematics
loadrt [KINS](KINEMATICS)
# motion controller
loadrt [EMCMOT](EMCMOT) servo_period_nsec=[EMCMOT](SERVO_PERIOD) num_joints=[KINS]JOINTS num_dio=30 num_aio=30
# hostmot2 driver
loadrt hostmot2
loadrt [HM2](DRIVER) board_ip=[HM2](ADDRESS) config="sserial_port_0=00000000"
loadrt oneshot count=1
setp hm2_[MESA](BOARD).0.watchdog.timeout_ns 10000000
loadrt timedelay count=1
loadrt xor2
loadrt pid names=pid.x,pid.y,pid.z,pid.s
# PID Information for Stepper Boards
# Mesa hardware step generators at every servo thread invocation, the step
# generator hardware is given a new velocity. Without feedback from the PID
# controller the hardware position would slowly drift because of clock speed and
# timing differences between LinuxCNC and the step generator hardware.
# The PID controller gets feedback from the actual (fractional) step position and
# corrects for these small differences.
# THREADS
addf hm2_[MESA](BOARD).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_[MESA](BOARD).0.write servo-thread
addf timedelay.0 servo-thread
addf xor2.0 servo-thread
# DPLL TIMER
setp hm2_[MESA](BOARD).0.dpll.01.timer-us -50
setp hm2_[MESA](BOARD).0.stepgen.timer-number 1
# amp enable
#net motion-enable <= motion.motion-enabled => hm2_7i95.0.ssr.00.out-02
# Spindle Air Oil solenoid
# Board: 7i95
# Axis: X Joint: 0 Output: 0
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.x.maxerror [JOINT_0](MAX_ERROR)
# joint-0 enable chain
net joint-0-index-enable <=> pid.x.index-enable
net joint-0-index-enable <=> joint.0.index-enable
net joint-0-enable <= joint.0.amp-enable-out
net joint-0-enable => pid.x.enable
net joint-0-enable => hm2_[MESA](BOARD).0.stepgen.00.enable
# Joint 0 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.00.dirsetup [JOINT_0](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.00.dirhold [JOINT_0](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.00.steplen [JOINT_0](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.00.stepspace [JOINT_0](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.00.position-scale [JOINT_0](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.00.maxvel [JOINT_0](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.00.maxaccel [JOINT_0](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.00.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.00.control-type 1
# position command and feedback
net joint-0-pos-cmd <= joint.0.motor-pos-cmd
net joint-0-pos-cmd => pid.x.command
net joint-0-pos-fb <= hm2_[MESA](BOARD).0.stepgen.00.position-fb
net joint-0-pos-fb => joint.0.motor-pos-fb
net joint-0-pos-fb => pid.x.feedback
# PID Output
net joint.0.output <= pid.x.output
net joint.0.output => hm2_[MESA](BOARD).0.stepgen.00.velocity-cmd
# Axis: Y Joint: 1 Output: 1
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.y.maxerror [JOINT_1](MAX_ERROR)
# joint-1 enable chain
net joint-1-index-enable <=> pid.y.index-enable
net joint-1-index-enable <=> joint.1.index-enable
net joint-1-enable <= joint.1.amp-enable-out
net joint-1-enable => pid.y.enable
net joint-1-enable => hm2_[MESA](BOARD).0.stepgen.01.enable
# Joint 1 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.01.dirsetup [JOINT_1](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.01.dirhold [JOINT_1](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.01.steplen [JOINT_1](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.01.stepspace [JOINT_1](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.01.position-scale [JOINT_1](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.01.maxvel [JOINT_1](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.01.maxaccel [JOINT_1](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.01.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.01.control-type 1
# position command and feedback
net joint-1-pos-cmd <= joint.1.motor-pos-cmd
net joint-1-pos-cmd => pid.y.command
net joint-1-pos-fb <= hm2_[MESA](BOARD).0.stepgen.01.position-fb
net joint-1-pos-fb => joint.1.motor-pos-fb
net joint-1-pos-fb => pid.y.feedback
# PID Output
net joint.1.output <= pid.y.output
net joint.1.output => hm2_[MESA](BOARD).0.stepgen.01.velocity-cmd
# Axis: Z Joint: 2 Output: 2
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.z.maxerror [JOINT_2](MAX_ERROR)
# joint-2 enable chain
net joint-2-index-enable <=> pid.z.index-enable
net joint-2-index-enable <=> joint.2.index-enable
net joint-2-enable <= joint.2.amp-enable-out
net joint-2-enable => pid.z.enable
net joint-2-enable => hm2_[MESA](BOARD).0.stepgen.02.enable
# Joint 2 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.02.dirsetup [JOINT_2](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.02.dirhold [JOINT_2](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.02.steplen [JOINT_2](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.02.stepspace [JOINT_2](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.02.position-scale [JOINT_2](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.02.maxvel [JOINT_2](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.02.maxaccel [JOINT_2](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.02.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.02.control-type 1
# position command and feedback
net joint-2-pos-cmd <= joint.2.motor-pos-cmd
net joint-2-pos-cmd => pid.z.command
net joint-2-pos-fb <= hm2_[MESA](BOARD).0.stepgen.02.position-fb
net joint-2-pos-fb => joint.2.motor-pos-fb
net joint-2-pos-fb => pid.z.feedback
# PID Output
net joint.2.output <= pid.z.output
net joint.2.output => hm2_[MESA](BOARD).0.stepgen.02.velocity-cmd
# 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
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
# # Load Classicladder without GUI
loadrt classicladder_rt
addf classicladder.0.refresh servo-thread 1
# E-Stop Chain
loadrt estop_latch count=1
addf estop-latch.0 servo-thread
# E-Stop Loop
net estop-loopin iocontrol.0.user-enable-out => estop-latch.0.ok-in
net estop-loopout estop-latch.0.ok-out => iocontrol.0.emc-enable-in
# E-Stop Reset
net estop-reset iocontrol.0.user-request-enable
net estop-reset => estop-latch.0.reset
net remote-estop0 estop-latch.0.fault-in <= hm2_7i95.0.inmux.00.input-01-not
# Input and output configuration
net button-press <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3
setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay
# Timedelay connections
net button-press => timedelay.0.in xor.0.in0 # Link button-press to timedelay and logic
net relay-1-control <= timedelay.0.out xor.0.in1 # Link timedelay output to relay-1-control and logic
net relay-2-control <= xor.0.out # Link xor out to relay-2-control
#*******************
# SPINDLE
#*******************
setp pid.s.Pgain [SPINDLE_0]P
setp pid.s.Igain [SPINDLE_0]I
setp pid.s.Dgain [SPINDLE_0]D
setp pid.s.bias [SPINDLE_0]BIAS
setp pid.s.FF0 [SPINDLE_0]FF0
setp pid.s.FF1 [SPINDLE_0]FF1
setp pid.s.FF2 [SPINDLE_0]FF2
setp pid.s.deadband [SPINDLE_0]DEADBAND
setp pid.s.maxoutput [SPINDLE_0]MAX_OUTPUT
setp pid.s.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.s.maxerror 0.012700
net spindle-index-enable => pid.s.index-enable
net spindle-enable => pid.s.enable
net spindle-vel-cmd-rpm => pid.s.command
net spindle-vel-fb-rpm => pid.s.feedback
net spindle-output <= pid.s.output
# Step Gen signals/setup
setp hm2_[MESA](BOARD).0.stepgen.03.dirsetup [SPINDLE_0]DIRSETUP
setp hm2_[MESA](BOARD).0.stepgen.03.dirhold [SPINDLE_0]DIRHOLD
setp hm2_[MESA](BOARD).0.stepgen.03.steplen [SPINDLE_0]STEPLEN
setp hm2_[MESA](BOARD).0.stepgen.03.stepspace [SPINDLE_0]STEPSPACE
setp hm2_[MESA](BOARD).0.stepgen.03.position-scale [SPINDLE_0]SCALE
setp hm2_[MESA](BOARD).0.stepgen.03.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.03.control-type 1
setp hm2_[MESA](BOARD).0.stepgen.03.maxaccel [SPINDLE_0]STEPGEN_MAX_ACC
setp hm2_[MESA](BOARD).0.stepgen.03.maxvel [SPINDLE_0]STEPGEN_MAX_VEL
net machine-is-on => hm2_[MESA](BOARD).0.stepgen.03.enable
net spindle-vel-cmd-rps => hm2_[MESA](BOARD).0.stepgen.03.velocity-cmd
net spindle-vel-fb-rps <= hm2_[MESA](BOARD).0.stepgen.03.velocity-fb
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= spindle.0.speed-out-rps
net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs
net spindle-vel-cmd-rpm <= spindle.0.speed-out
net spindle-vel-cmd-rpm-abs <= spindle.0.speed-out-abs
net spindle-enable <= spindle.0.on
net spindle-cw <= spindle.0.forward
net spindle-ccw <= spindle.0.reverse
net spindle-brake <= spindle.0.brake
net spindle-revs => spindle.0.revs
net spindle-at-speed => spindle.0.at-speed
net spindle-vel-fb-rps => spindle.0.speed-in
net spindle-index-enable <=> spindle.0.index-enable
# ---Setup spindle at speed signals---
sets spindle-at-speed true
net spindle-manual-cw halui.spindle.0.forward
net spindle-manual-ccw halui.spindle.0.reverse
net spindle-manual-stop halui.spindle.0.stop
here is my hal file
# This file was created with the Mesa Configuration Tool on Nov 26 2024 15:50:59
# If you make changes to this file DO NOT run the configuration tool again!
# This file will be replaced with a new file if you do!
# kinematics
loadrt [KINS](KINEMATICS)
# motion controller
loadrt [EMCMOT](EMCMOT) servo_period_nsec=[EMCMOT](SERVO_PERIOD) num_joints=[KINS]JOINTS num_dio=30 num_aio=30
# hostmot2 driver
loadrt hostmot2
loadrt [HM2](DRIVER) board_ip=[HM2](ADDRESS) config="sserial_port_0=00000000"
loadrt oneshot count=1
setp hm2_[MESA](BOARD).0.watchdog.timeout_ns 10000000
loadrt timedelay count=1
loadrt xor2
loadrt pid names=pid.x,pid.y,pid.z,pid.s
# PID Information for Stepper Boards
# Mesa hardware step generators at every servo thread invocation, the step
# generator hardware is given a new velocity. Without feedback from the PID
# controller the hardware position would slowly drift because of clock speed and
# timing differences between LinuxCNC and the step generator hardware.
# The PID controller gets feedback from the actual (fractional) step position and
# corrects for these small differences.
# THREADS
addf hm2_[MESA](BOARD).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_[MESA](BOARD).0.write servo-thread
addf timedelay.0 servo-thread
addf xor2.0 servo-thread
# DPLL TIMER
setp hm2_[MESA](BOARD).0.dpll.01.timer-us -50
setp hm2_[MESA](BOARD).0.stepgen.timer-number 1
# amp enable
#net motion-enable <= motion.motion-enabled => hm2_7i95.0.ssr.00.out-02
# Spindle Air Oil solenoid
# Board: 7i95
# Axis: X Joint: 0 Output: 0
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.x.maxerror [JOINT_0](MAX_ERROR)
# joint-0 enable chain
net joint-0-index-enable <=> pid.x.index-enable
net joint-0-index-enable <=> joint.0.index-enable
net joint-0-enable <= joint.0.amp-enable-out
net joint-0-enable => pid.x.enable
net joint-0-enable => hm2_[MESA](BOARD).0.stepgen.00.enable
# Joint 0 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.00.dirsetup [JOINT_0](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.00.dirhold [JOINT_0](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.00.steplen [JOINT_0](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.00.stepspace [JOINT_0](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.00.position-scale [JOINT_0](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.00.maxvel [JOINT_0](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.00.maxaccel [JOINT_0](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.00.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.00.control-type 1
# position command and feedback
net joint-0-pos-cmd <= joint.0.motor-pos-cmd
net joint-0-pos-cmd => pid.x.command
net joint-0-pos-fb <= hm2_[MESA](BOARD).0.stepgen.00.position-fb
net joint-0-pos-fb => joint.0.motor-pos-fb
net joint-0-pos-fb => pid.x.feedback
# PID Output
net joint.0.output <= pid.x.output
net joint.0.output => hm2_[MESA](BOARD).0.stepgen.00.velocity-cmd
# Axis: Y Joint: 1 Output: 1
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.y.maxerror [JOINT_1](MAX_ERROR)
# joint-1 enable chain
net joint-1-index-enable <=> pid.y.index-enable
net joint-1-index-enable <=> joint.1.index-enable
net joint-1-enable <= joint.1.amp-enable-out
net joint-1-enable => pid.y.enable
net joint-1-enable => hm2_[MESA](BOARD).0.stepgen.01.enable
# Joint 1 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.01.dirsetup [JOINT_1](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.01.dirhold [JOINT_1](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.01.steplen [JOINT_1](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.01.stepspace [JOINT_1](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.01.position-scale [JOINT_1](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.01.maxvel [JOINT_1](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.01.maxaccel [JOINT_1](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.01.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.01.control-type 1
# position command and feedback
net joint-1-pos-cmd <= joint.1.motor-pos-cmd
net joint-1-pos-cmd => pid.y.command
net joint-1-pos-fb <= hm2_[MESA](BOARD).0.stepgen.01.position-fb
net joint-1-pos-fb => joint.1.motor-pos-fb
net joint-1-pos-fb => pid.y.feedback
# PID Output
net joint.1.output <= pid.y.output
net joint.1.output => hm2_[MESA](BOARD).0.stepgen.01.velocity-cmd
# Axis: Z Joint: 2 Output: 2
# PID Setup
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
# limit stepgen velocity corrections caused by position feedback jitter
setp pid.z.maxerror [JOINT_2](MAX_ERROR)
# joint-2 enable chain
net joint-2-index-enable <=> pid.z.index-enable
net joint-2-index-enable <=> joint.2.index-enable
net joint-2-enable <= joint.2.amp-enable-out
net joint-2-enable => pid.z.enable
net joint-2-enable => hm2_[MESA](BOARD).0.stepgen.02.enable
# Joint 2 Step Generator Settings
setp hm2_[MESA](BOARD).0.stepgen.02.dirsetup [JOINT_2](DIRSETUP)
setp hm2_[MESA](BOARD).0.stepgen.02.dirhold [JOINT_2](DIRHOLD)
setp hm2_[MESA](BOARD).0.stepgen.02.steplen [JOINT_2](STEPLEN)
setp hm2_[MESA](BOARD).0.stepgen.02.stepspace [JOINT_2](STEPSPACE)
setp hm2_[MESA](BOARD).0.stepgen.02.position-scale [JOINT_2](SCALE)
setp hm2_[MESA](BOARD).0.stepgen.02.maxvel [JOINT_2](STEPGEN_MAX_VEL)
setp hm2_[MESA](BOARD).0.stepgen.02.maxaccel [JOINT_2](STEPGEN_MAX_ACC)
setp hm2_[MESA](BOARD).0.stepgen.02.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.02.control-type 1
# position command and feedback
net joint-2-pos-cmd <= joint.2.motor-pos-cmd
net joint-2-pos-cmd => pid.z.command
net joint-2-pos-fb <= hm2_[MESA](BOARD).0.stepgen.02.position-fb
net joint-2-pos-fb => joint.2.motor-pos-fb
net joint-2-pos-fb => pid.z.feedback
# PID Output
net joint.2.output <= pid.z.output
net joint.2.output => hm2_[MESA](BOARD).0.stepgen.02.velocity-cmd
# 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
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
# # Load Classicladder without GUI
loadrt classicladder_rt
addf classicladder.0.refresh servo-thread 1
# E-Stop Chain
loadrt estop_latch count=1
addf estop-latch.0 servo-thread
# E-Stop Loop
net estop-loopin iocontrol.0.user-enable-out => estop-latch.0.ok-in
net estop-loopout estop-latch.0.ok-out => iocontrol.0.emc-enable-in
# E-Stop Reset
net estop-reset iocontrol.0.user-request-enable
net estop-reset => estop-latch.0.reset
net remote-estop0 estop-latch.0.fault-in <= hm2_7i95.0.inmux.00.input-01-not
# Input and output configuration
net button-press <= hm2_7i95.0.inmux.00.input-05 # Connect input pin 5 to signal button-press
net relay-1-control => hm2_7i95.0.ssr.00.out-01 # Connect signal relay-1-control to relay output 1
net relay-2-control => hm2_7i95.0.ssr.00.out-03 # Connect signal relay-2-control to relay output 3
setp timedelay.0.on-delay 1.0 # 1-second delay
setp timedelay.0.off-delay 0.0 # No off delay
# Timedelay connections
net button-press => timedelay.0.in xor.0.in0 # Link button-press to timedelay and logic
net relay-1-control <= timedelay.0.out xor.0.in1 # Link timedelay output to relay-1-control and logic
net relay-2-control <= xor.0.out # Link xor out to relay-2-control
#*******************
# SPINDLE
#*******************
setp pid.s.Pgain [SPINDLE_0]P
setp pid.s.Igain [SPINDLE_0]I
setp pid.s.Dgain [SPINDLE_0]D
setp pid.s.bias [SPINDLE_0]BIAS
setp pid.s.FF0 [SPINDLE_0]FF0
setp pid.s.FF1 [SPINDLE_0]FF1
setp pid.s.FF2 [SPINDLE_0]FF2
setp pid.s.deadband [SPINDLE_0]DEADBAND
setp pid.s.maxoutput [SPINDLE_0]MAX_OUTPUT
setp pid.s.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.s.maxerror 0.012700
net spindle-index-enable => pid.s.index-enable
net spindle-enable => pid.s.enable
net spindle-vel-cmd-rpm => pid.s.command
net spindle-vel-fb-rpm => pid.s.feedback
net spindle-output <= pid.s.output
# Step Gen signals/setup
setp hm2_[MESA](BOARD).0.stepgen.03.dirsetup [SPINDLE_0]DIRSETUP
setp hm2_[MESA](BOARD).0.stepgen.03.dirhold [SPINDLE_0]DIRHOLD
setp hm2_[MESA](BOARD).0.stepgen.03.steplen [SPINDLE_0]STEPLEN
setp hm2_[MESA](BOARD).0.stepgen.03.stepspace [SPINDLE_0]STEPSPACE
setp hm2_[MESA](BOARD).0.stepgen.03.position-scale [SPINDLE_0]SCALE
setp hm2_[MESA](BOARD).0.stepgen.03.step_type 0
setp hm2_[MESA](BOARD).0.stepgen.03.control-type 1
setp hm2_[MESA](BOARD).0.stepgen.03.maxaccel [SPINDLE_0]STEPGEN_MAX_ACC
setp hm2_[MESA](BOARD).0.stepgen.03.maxvel [SPINDLE_0]STEPGEN_MAX_VEL
net machine-is-on => hm2_[MESA](BOARD).0.stepgen.03.enable
net spindle-vel-cmd-rps => hm2_[MESA](BOARD).0.stepgen.03.velocity-cmd
net spindle-vel-fb-rps <= hm2_[MESA](BOARD).0.stepgen.03.velocity-fb
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= spindle.0.speed-out-rps
net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs
net spindle-vel-cmd-rpm <= spindle.0.speed-out
net spindle-vel-cmd-rpm-abs <= spindle.0.speed-out-abs
net spindle-enable <= spindle.0.on
net spindle-cw <= spindle.0.forward
net spindle-ccw <= spindle.0.reverse
net spindle-brake <= spindle.0.brake
net spindle-revs => spindle.0.revs
net spindle-at-speed => spindle.0.at-speed
net spindle-vel-fb-rps => spindle.0.speed-in
net spindle-index-enable <=> spindle.0.index-enable
# ---Setup spindle at speed signals---
sets spindle-at-speed true
net spindle-manual-cw halui.spindle.0.forward
net spindle-manual-ccw halui.spindle.0.reverse
net spindle-manual-stop halui.spindle.0.stop
- Mitch66
- Mitch66
12 Dec 2024 15:11
Improving Base Thread Jitter was created by Mitch66
Improving Base Thread Jitter
Category: Installing LinuxCNC
I would like some advice please on how to proceed with the computer I am using to run LinuxCNC. I have just installed the latest version of LinuxCNC (2.9.3 Debian12 Bookworm Preempt -RT) and have run the Stress Test for an hour - the figures are not encouraging: 85953ns max jitter. I know this is way too high, and if I were to use this computer I would have to make some changes, or it might be that no matter what I do it will not be suitable for software stepping. If so I might have to save-up for a Mesa Board and do the stepping there. The problem is that I have no real feel for what scale of improvement various changes might have.
The computer is a Dell Optiplex 745 with an Intel(R) core (TM)2 CPU 4300@1.8GHz. It has 6GB of DDR2 SDRAM and is using the on-board graphics card. I know the graphics card is the first place I should look to make an improvement, and I have the opportunity to buy an AMD Radeon 450 with 4GB GDDR5 - but it is not that cheap. I have a simple 3 axis cnc mill with just 3 Nema 23 stepper motors, but I would like to upgrade it at some future point.
My first question is: in very general figures, is it realistic to think that a new graphics card might reduce the jitter figure by, say 60000ns, or is this too optimistic - is it even worth a try? If any new graphics card could not make this scale of improvement it might be better not to buy the Radeon and put the money towards a Mesa board.
My second question is: if I were to buy the Mesa board would I still need to upgrade the graphics card anyway, or could I stick with the on-board card?
Finally,(preparing my self for the worst !), I have been looking at the range of Mesa boards available and it is a little confusing for a novice. The advice on this site seems to be a year or 2 old, and so I would be most grateful if you could recommend the most suitable board for me. I cannot imagine I will ever require more than 5 axis - I probably will stick with 3, but I might double up the motors on Y. I need the ability to control the spindle (1500Kw 24000rpm currently using a Chinese VFD), and the mist (just a compressed air feed).
Grateful for any pointers
Mitch
The computer is a Dell Optiplex 745 with an Intel(R) core (TM)2 CPU 4300@1.8GHz. It has 6GB of DDR2 SDRAM and is using the on-board graphics card. I know the graphics card is the first place I should look to make an improvement, and I have the opportunity to buy an AMD Radeon 450 with 4GB GDDR5 - but it is not that cheap. I have a simple 3 axis cnc mill with just 3 Nema 23 stepper motors, but I would like to upgrade it at some future point.
My first question is: in very general figures, is it realistic to think that a new graphics card might reduce the jitter figure by, say 60000ns, or is this too optimistic - is it even worth a try? If any new graphics card could not make this scale of improvement it might be better not to buy the Radeon and put the money towards a Mesa board.
My second question is: if I were to buy the Mesa board would I still need to upgrade the graphics card anyway, or could I stick with the on-board card?
Finally,(preparing my self for the worst !), I have been looking at the range of Mesa boards available and it is a little confusing for a novice. The advice on this site seems to be a year or 2 old, and so I would be most grateful if you could recommend the most suitable board for me. I cannot imagine I will ever require more than 5 axis - I probably will stick with 3, but I might double up the motors on Y. I need the ability to control the spindle (1500Kw 24000rpm currently using a Chinese VFD), and the mist (just a compressed air feed).
Grateful for any pointers
Mitch
- SOLD
- SOLD
07 Dec 2024 06:08
Replied by SOLD on topic AX58100
AX58100
Category: EtherCAT
I have an idea to add M19 function inside STM32 so that it can manage the Orientation process by itself, receiving M19 command or just 1 button from lcnc.
I tried to let Ai create a sample code according to my needs. It came out as follows. Of course, it still doesn't work. And the Obj variable that can't handle it. I don't have the knowledge to create a new program.
Functions to be included
- Use DAC1 as analog +-10V to control servo spindle
- Receive M19 command and degree variables such as R0 R45 R90 from Hal " net spindle_orientation => ecat.0.command "
- Check if the current position is the same as the desired target
- Calculate the nearest rotation direction
- Add edge, near function
- Timer to turn off DAC if no target is found
- Confirm operation or error back to Master
Other if necessary
I tried to let Ai create a sample code according to my needs. It came out as follows. Of course, it still doesn't work. And the Obj variable that can't handle it. I don't have the knowledge to create a new program.
#include "OrientationHandler.h"
#include <Arduino.h>
#include "MyEncoder.h"
extern HardwareSerial Serial1;
extern MyEncoder Encoder1;
extern double spindleTargetPos; // ตัวแปรใหม่ที่ใช้เก็บตำแหน่งเป้าหมายสำหรับสปินเดิล
extern const byte DAC1_pin; // ขาสำหรับเชื่อมต่อสัญญาณอนาล็อก (0-10V)
extern _Objects Obj;
// ฟังก์ชันคำนวณทิศทางที่สั้นที่สุดในการหมุน
int calculateShortestAngle(int currentAngle, int targetAngle)
{
// ทำให้มุมทั้งหมดอยู่ในช่วง 0-360 องศา
currentAngle = currentAngle % 360;
targetAngle = targetAngle % 360;
// คำนวณความแตกต่างระหว่างมุม
int deltaAngle = targetAngle - currentAngle;
// ถ้าความแตกต่างมากกว่า 180 องศา ให้เลือกหมุนทางที่สั้นที่สุด
if (deltaAngle > 180)
deltaAngle -= 360;
else if (deltaAngle < -180)
deltaAngle += 360;
return deltaAngle; // ผลลัพธ์เป็นมุมที่ใกล้ที่สุดในการหมุน
}
// ฟังก์ชันสำหรับการหมุนสปินเดิลไปยังมุมที่กำหนด
void spindleOrientation(int targetAngle)
{
Serial1.println("คำสั่ง M19 ได้รับแล้ว กำลังหมุนสปินเดิลไปยังมุมเป้าหมาย...");
int currentAngle = Encoder1.currentPos(); // อ่านมุมปัจจุบันของสปินเดิล
int deltaAngle = calculateShortestAngle(currentAngle, targetAngle); // คำนวณมุมที่ใกล้ที่สุดที่ควรหมุน
Serial1.print("มุมที่ใกล้ที่สุด: ");
Serial1.println(deltaAngle);
// ถ้ามุมที่ต้องการคือ 0 หรือใกล้เคียง (ไม่ต้องหมุน)
if (fabs(deltaAngle) <= 0.01)
{
Serial1.println("ตำแหน่งปัจจุบันตรงกับตำแหน่งที่ต้องการ ไม่ต้องหมุน");
analogWrite(DAC1_pin, 0); // หยุดการหมุน
Obj.SpindleStatus = 1; // หมายเลข 1 สำหรับสำเร็จ
return; // ออกจากฟังก์ชัน
}
// คำนวณค่าอนาล็อกเพื่อควบคุมแรงดัน 0-10V (ใช้ map แปลงจากมุมที่ต้องหมุนเป็นค่าที่ใช้กับ analogWrite)
int analogValue = map(abs(deltaAngle), 0, 360, 0, 255);
if (analogValue > 255) analogValue = 255; // ตรวจสอบให้ค่าไม่เกิน 255
// กำหนดทิศทางการหมุนและควบคุมมอเตอร์
if (deltaAngle > 0) // หมุนไปทางขวา (clockwise)
{
analogWrite(DAC1_pin, analogValue);
Serial1.println("หมุนไปทางขวา (clockwise)");
}
else if (deltaAngle < 0) // หมุนไปทางซ้าย (counterclockwise)
{
analogWrite(DAC1_pin, analogValue);
Serial1.println("หมุนไปทางซ้าย (counterclockwise)");
}
// ตั้งเวลาหมุนสูงสุด (timeout) เช่น 5 วินาที
unsigned long startTime = millis();
unsigned long timeout = 5000; // เวลา 5 วินาที
// รอจนกว่าสปินเดิลจะถึงตำแหน่งเป้าหมาย หรือจนถึงเวลาหมด
while (fabs(Encoder1.currentPos() - targetAngle) > 0.01)
{
// ตรวจจับ rising edge ของสัญญาณ encoder index pulse เพื่อยืนยันการหมุนถึงตำแหน่งศูนย์
if (Encoder1.indexHappened())
{
Serial1.println("ตรวจจับ index pulse แล้ว.");
}
// ลดความเร็วเมื่อเข้าใกล้ตำแหน่งเป้าหมาย
if (fabs(Encoder1.currentPos() - targetAngle) < 5.0)
{
Serial1.println("ใกล้ถึงตำแหน่งเป้าหมาย ลดความเร็วลง...");
analogValue = map(abs(deltaAngle), 0, 360, 0, 100); // ลดค่าควบคุมแรงดันเพื่อหมุนช้าลง
analogWrite(DAC1_pin, analogValue);
}
// อัพเดตการทำงานของมอเตอร์
updateStepperGenerators();
// ตรวจสอบเวลา timeout
if (millis() - startTime > timeout)
{
Serial1.println("เวลาหมุนหมดแล้ว, ไม่สามารถหาตำแหน่งได้!");
analogWrite(DAC1_pin, 0); // หยุดการหมุน
// ส่งสถานะกลับไปยัง Master ว่าการหมุนไม่สำเร็จ
Obj.SpindleStatus = 2; // หมายเลข 2 สำหรับ Timeout
return; // ออกจากฟังก์ชัน
}
}
// เมื่อถึงตำแหน่งเป้าหมาย, หยุดจ่ายไฟ (หรือปรับค่าผลลัพธ์เป็น 0)
analogWrite(DAC1_pin, 0); // หยุดการหมุนโดยการส่งค่าแรงดัน 0
// ส่งสถานะกลับไปยัง Master ว่าการหมุนสำเร็จ
Obj.SpindleStatus = 1; // หมายเลข 1 สำหรับสำเร็จ
Serial1.println("สปินเดิลได้ถูกออเรียนเทชันไปยังมุมที่กำหนดแล้ว.");
}
Functions to be included
- Use DAC1 as analog +-10V to control servo spindle
- Receive M19 command and degree variables such as R0 R45 R90 from Hal " net spindle_orientation => ecat.0.command "
- Check if the current position is the same as the desired target
- Calculate the nearest rotation direction
- Add edge, near function
- Timer to turn off DAC if no target is found
- Confirm operation or error back to Master
Other if necessary
- slowpoke
- slowpoke
06 Dec 2024 14:23
Hardware required for Lathe Macros was created by slowpoke
Hardware required for Lathe Macros
Category: Basic Configuration
I'm trying to determine both minimum and nice to have hardware requirements when using the lathe macros.
Assume I already have the following:
Assume I already have the following:
- Suitable PC with touchscreen
- MESA 7i96s
- Stepper/Servo for both Z and X axis
- Encoder linked to spindle with A,B,Z outputs
- Manual Start/Stop & Fwd/Rev switches
- Pot presently controlling spindle speed.
- Scales on X & Z not sure the lathe macros need the actual position data but I definitely want the actual position displayed because my leadscrews have a lot of backlash. My assumption at this point is that I will (hopefully) be able to use the macros in a way that actual cutting occurs in one direction only and then the tool retracts, re-positions (including required backlash) and then continues on the next cutting pass, does that sound like a reasonable expectation?
- Pretty sure I need a cycle start button, not sure about a cycle stop?
- Do the lathe macros need Linux control of the spindle speed, or can I control that manually via the existing potentiometer?
- Are limit switches required?
- I will make a control panel so any nice to have features would be good to know about now so I can included them, perhaps a couple of rotary encoders? what else would be good to have?
- spumco
- spumco
05 Dec 2024 22:25
Replied by spumco on topic Probe Basic - ATC sim parameter question
Probe Basic - ATC sim parameter question
Category: QtPyVCP
Chris,
I'll fire up the mill later tonight and get a config dump for you. And yes, I'm using a step/dir non-axis output to drive the ATC stepper.
Once you've had a look - it's complicated - I'll walk you through any of the atc-specific stuff that isn't clear.
Agree - the tool DB would be nice. There are a number of features I'd really like to have that could be automated via a DB value:
I'll fire up the mill later tonight and get a config dump for you. And yes, I'm using a step/dir non-axis output to drive the ATC stepper.
Once you've had a look - it's complicated - I'll walk you through any of the atc-specific stuff that isn't clear.
Agree - the tool DB would be nice. There are a number of features I'd really like to have that could be automated via a DB value:
- lathe front tool/back-tool backplot flips
- lathe main/sub spindle backplot flips
- multiple offsets for a multi-function tool like Siemens does
- Max RPM
- "Big" or 'Heavy" tools for carousels (nothing allowed next to oversized tools, or slow down carousel for high inertia)
- DeckelCNC
- DeckelCNC
30 Nov 2024 21:42
Replied by DeckelCNC on topic Leadshine EL8 Servo Drives - EtherCAT
Leadshine EL8 Servo Drives - EtherCAT
Category: Advanced Configuration
Thank you for the reply's
Kworm : i think i have the pdo's right in the drive Vs the terminal output Vs the .xml ? please let me know if i am not understanding correctly. Thank you for your time.
Aciera (sorry i thought it was better to upload files that made no errors, but not actually working)
i have been reading and come across a post about a Youtuber called Marco Reps ? i thought it would be a idea to apply some of the methods i found in these files. so i have changed things from my first post, and i am now getting errors again / LinuxCNC is not opening. this looks to be the main issue ? EL8_machine.hal:41: Pin 'lcec.0.0.cia-statusword' does not exist
i have included the Error report + the .xml + .hal + .ini
.XML File
.HAL
.ini
Kworm : i think i have the pdo's right in the drive Vs the terminal output Vs the .xml ? please let me know if i am not understanding correctly. Thank you for your time.
Warning: Spoiler!
$ ethercat pdos
=== Master 0, Slave 1 ===
SM0: PhysAddr 0x1000, DefaultSize 0, ControlRegister 0x00, Enable 0
TxPDO 0x1a00 "Channel 1"
PDO entry 0x6000:01, 1 bit, "Input"
TxPDO 0x1a01 "Channel 2"
PDO entry 0x6010:01, 1 bit, "Input"
TxPDO 0x1a02 "Channel 3"
PDO entry 0x6020:01, 1 bit, "Input"
TxPDO 0x1a03 "Channel 4"
PDO entry 0x6030:01, 1 bit, "Input"
TxPDO 0x1a04 "Channel 5"
PDO entry 0x6040:01, 1 bit, "Input"
TxPDO 0x1a05 "Channel 6"
PDO entry 0x6050:01, 1 bit, "Input"
TxPDO 0x1a06 "Channel 7"
PDO entry 0x6060:01, 1 bit, "Input"
TxPDO 0x1a07 "Channel 8"
PDO entry 0x6070:01, 1 bit, "Input"
=== Master 0, Slave 2 ===
SM0: PhysAddr 0x1000, DefaultSize 0, ControlRegister 0x00, Enable 0
TxPDO 0x1a00 "Channel 1"
PDO entry 0x6000:01, 1 bit, "Input"
TxPDO 0x1a01 "Channel 2"
PDO entry 0x6010:01, 1 bit, "Input"
TxPDO 0x1a02 "Channel 3"
PDO entry 0x6020:01, 1 bit, "Input"
TxPDO 0x1a03 "Channel 4"
PDO entry 0x6030:01, 1 bit, "Input"
TxPDO 0x1a04 "Channel 5"
PDO entry 0x6040:01, 1 bit, "Input"
TxPDO 0x1a05 "Channel 6"
PDO entry 0x6050:01, 1 bit, "Input"
TxPDO 0x1a06 "Channel 7"
PDO entry 0x6060:01, 1 bit, "Input"
TxPDO 0x1a07 "Channel 8"
PDO entry 0x6070:01, 1 bit, "Input"
=== Master 0, Slave 3 ===
SM0: PhysAddr 0x0f00, DefaultSize 0, ControlRegister 0x44, Enable 9
RxPDO 0x1600 "Channel 1"
PDO entry 0x7000:01, 1 bit, "Output"
RxPDO 0x1601 "Channel 2"
PDO entry 0x7010:01, 1 bit, "Output"
RxPDO 0x1602 "Channel 3"
PDO entry 0x7020:01, 1 bit, "Output"
RxPDO 0x1603 "Channel 4"
PDO entry 0x7030:01, 1 bit, "Output"
=== Master 0, Slave 4 ===
SM0: PhysAddr 0x1000, DefaultSize 124, ControlRegister 0x26, Enable 1
SM1: PhysAddr 0x1100, DefaultSize 124, ControlRegister 0x22, Enable 1
SM2: PhysAddr 0x1200, DefaultSize 0, ControlRegister 0x64, Enable 1
RxPDO 0x1600 ""
PDO entry 0x6040:00, 16 bit, ""
PDO entry 0x6060:00, 8 bit, ""
PDO entry 0x607a:00, 32 bit, ""
PDO entry 0x60ff:00, 32 bit, ""
SM3: PhysAddr 0x1400, DefaultSize 0, ControlRegister 0x20, Enable 1
TxPDO 0x1a00 ""
PDO entry 0x6041:00, 16 bit, ""
PDO entry 0x6061:00, 8 bit, ""
PDO entry 0x6064:00, 32 bit, ""
PDO entry 0x606c:00, 32 bit, ""
PDO entry 0x6077:00, 16 bit, ""
=== Master 0, Slave 1 ===
SM0: PhysAddr 0x1000, DefaultSize 0, ControlRegister 0x00, Enable 0
TxPDO 0x1a00 "Channel 1"
PDO entry 0x6000:01, 1 bit, "Input"
TxPDO 0x1a01 "Channel 2"
PDO entry 0x6010:01, 1 bit, "Input"
TxPDO 0x1a02 "Channel 3"
PDO entry 0x6020:01, 1 bit, "Input"
TxPDO 0x1a03 "Channel 4"
PDO entry 0x6030:01, 1 bit, "Input"
TxPDO 0x1a04 "Channel 5"
PDO entry 0x6040:01, 1 bit, "Input"
TxPDO 0x1a05 "Channel 6"
PDO entry 0x6050:01, 1 bit, "Input"
TxPDO 0x1a06 "Channel 7"
PDO entry 0x6060:01, 1 bit, "Input"
TxPDO 0x1a07 "Channel 8"
PDO entry 0x6070:01, 1 bit, "Input"
=== Master 0, Slave 2 ===
SM0: PhysAddr 0x1000, DefaultSize 0, ControlRegister 0x00, Enable 0
TxPDO 0x1a00 "Channel 1"
PDO entry 0x6000:01, 1 bit, "Input"
TxPDO 0x1a01 "Channel 2"
PDO entry 0x6010:01, 1 bit, "Input"
TxPDO 0x1a02 "Channel 3"
PDO entry 0x6020:01, 1 bit, "Input"
TxPDO 0x1a03 "Channel 4"
PDO entry 0x6030:01, 1 bit, "Input"
TxPDO 0x1a04 "Channel 5"
PDO entry 0x6040:01, 1 bit, "Input"
TxPDO 0x1a05 "Channel 6"
PDO entry 0x6050:01, 1 bit, "Input"
TxPDO 0x1a06 "Channel 7"
PDO entry 0x6060:01, 1 bit, "Input"
TxPDO 0x1a07 "Channel 8"
PDO entry 0x6070:01, 1 bit, "Input"
=== Master 0, Slave 3 ===
SM0: PhysAddr 0x0f00, DefaultSize 0, ControlRegister 0x44, Enable 9
RxPDO 0x1600 "Channel 1"
PDO entry 0x7000:01, 1 bit, "Output"
RxPDO 0x1601 "Channel 2"
PDO entry 0x7010:01, 1 bit, "Output"
RxPDO 0x1602 "Channel 3"
PDO entry 0x7020:01, 1 bit, "Output"
RxPDO 0x1603 "Channel 4"
PDO entry 0x7030:01, 1 bit, "Output"
=== Master 0, Slave 4 ===
SM0: PhysAddr 0x1000, DefaultSize 124, ControlRegister 0x26, Enable 1
SM1: PhysAddr 0x1100, DefaultSize 124, ControlRegister 0x22, Enable 1
SM2: PhysAddr 0x1200, DefaultSize 0, ControlRegister 0x64, Enable 1
RxPDO 0x1600 ""
PDO entry 0x6040:00, 16 bit, ""
PDO entry 0x6060:00, 8 bit, ""
PDO entry 0x607a:00, 32 bit, ""
PDO entry 0x60ff:00, 32 bit, ""
SM3: PhysAddr 0x1400, DefaultSize 0, ControlRegister 0x20, Enable 1
TxPDO 0x1a00 ""
PDO entry 0x6041:00, 16 bit, ""
PDO entry 0x6061:00, 8 bit, ""
PDO entry 0x6064:00, 32 bit, ""
PDO entry 0x606c:00, 32 bit, ""
PDO entry 0x6077:00, 16 bit, ""
Aciera (sorry i thought it was better to upload files that made no errors, but not actually working)
i have been reading and come across a post about a Youtuber called Marco Reps ? i thought it would be a idea to apply some of the methods i found in these files. so i have changed things from my first post, and i am now getting errors again / LinuxCNC is not opening. this looks to be the main issue ? EL8_machine.hal:41: Pin 'lcec.0.0.cia-statusword' does not exist
i have included the Error report + the .xml + .hal + .ini
RUN_IN_PLACE=no
LINUXCNC_DIR=
LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_SCRIPT_DIR=
LINUXCNC_RTLIB_DIR=/usr/lib/linuxcnc/modules
LINUXCNC_CONFIG_DIR=
LINUXCNC_LANG_DIR=/usr/lib/tcltk/linuxcnc/msgs
INIVAR=inivar
HALCMD=halcmd
LINUXCNC_EMCSH=/usr/bin/wish8.6
LINUXCNC - 2.9.3
Machine configuration directory is '/home/edmuser/linuxcnc/configs/sim.axis-3'
Machine configuration file is 'EL8_machine.ini'
INIFILE=/home/edmuser/linuxcnc/configs/sim.axis-3/EL8_machine.ini
VERSION=1.1
PARAMETER_FILE=linuxcnc.var
TPMOD=
HOMEMOD=
TASK=milltask
HALUI=halui
DISPLAY=axis
COORDINATES=X Y Z
KINEMATICS=trivkins coordinates=XYZ
Starting LinuxCNC...
Starting LinuxCNC server program: linuxcncsvr
Loading Real Time OS, RTAPI, and HAL_LIB modules
Starting LinuxCNC IO program: io
libnml/buffer/shmem.cc 320: Shared memory buffers toolCmd and toolCmd may conflict. (key=1004(0x3EC))
libnml/buffer/shmem.cc 320: Shared memory buffers toolSts and toolSts may conflict. (key=1005(0x3ED))
libnml/buffer/shmem.cc 320: Shared memory buffers emcError and emcError may conflict. (key=1003(0x3EB))
emc/iotask/ioControl.cc 786: can't load tool table.
Starting HAL User Interface program: halui
linuxcnc TPMOD=tpmod HOMEMOD=homemod EMCMOT=motmod
Found file(REL): ./EL8_machine.hal
Shutting down and cleaning up LinuxCNC...
Removing HAL_LIB, RTAPI, and Real Time OS modules
Removing NML shared memory segments
Debug file information:
Note: Using POSIX realtime
./EL8_machine.hal:41: Pin 'lcec.0.0.cia-statusword' does not exist
55850
Stopping realtime threads
Unloading hal components
Note: Using POSIX realtime
.XML File
Warning: Spoiler!
<masters>
<master idx="0" appTimePeriod="1000000" refClockSyncCycles="5">
<slave idx="0" type="EK1100"/>
<slave idx="1" type="EL1008"/>
<slave idx="2" type="EL1008"/>
<slave idx="3" type="EL2004"/>
<!-- X axis EL8 Servo Drive -->
<slave idx="4" type="generic" vid="00004321" pid="000010c2" configPdos="true">
<dcConf assignActivate="300" sync0Cycle="*1" sync0Shift="0"/>
<syncManager idx="2" dir="out">
<pdo idx="1600">
<pdoEntry idx="6040" subIdx="00" bitLen="16" halPin="cia-controlword" halType="u32"/>
<pdoEntry idx="6060" subIdx="00" bitLen="8" halPin="opmode" halType="s32"/>
<pdoEntry idx="607A" subIdx="00" bitLen="32" halPin="target-position" halType="s32"/>
<pdoEntry idx="60FF" subIdx="00" bitLen="32" halPin="target-velocity" halType="s32" />
</pdo>
</syncManager>
<syncManager idx="3" dir="in">
<pdo idx="1a00">
<pdoEntry idx="6041" subIdx="00" bitLen="16" halPin="cia-statusword" halType="u32"/>
<pdoEntry idx="6061" subIdx="00" bitLen="8" halPin="opmode-display" halType="s32"/>
<pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actual-position" halType="s32"/>
<pdoEntry idx="606C" subIdx="00" bitLen="32" halPin="actual-velocity" halType="s32"/>
<pdoEntry idx="6077" subIdx="00" bitLen="16" halPin="actual-torque" halType="s32"/>
</pdo>
</syncManager>
</slave>
</master>
</masters>
<master idx="0" appTimePeriod="1000000" refClockSyncCycles="5">
<slave idx="0" type="EK1100"/>
<slave idx="1" type="EL1008"/>
<slave idx="2" type="EL1008"/>
<slave idx="3" type="EL2004"/>
<!-- X axis EL8 Servo Drive -->
<slave idx="4" type="generic" vid="00004321" pid="000010c2" configPdos="true">
<dcConf assignActivate="300" sync0Cycle="*1" sync0Shift="0"/>
<syncManager idx="2" dir="out">
<pdo idx="1600">
<pdoEntry idx="6040" subIdx="00" bitLen="16" halPin="cia-controlword" halType="u32"/>
<pdoEntry idx="6060" subIdx="00" bitLen="8" halPin="opmode" halType="s32"/>
<pdoEntry idx="607A" subIdx="00" bitLen="32" halPin="target-position" halType="s32"/>
<pdoEntry idx="60FF" subIdx="00" bitLen="32" halPin="target-velocity" halType="s32" />
</pdo>
</syncManager>
<syncManager idx="3" dir="in">
<pdo idx="1a00">
<pdoEntry idx="6041" subIdx="00" bitLen="16" halPin="cia-statusword" halType="u32"/>
<pdoEntry idx="6061" subIdx="00" bitLen="8" halPin="opmode-display" halType="s32"/>
<pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actual-position" halType="s32"/>
<pdoEntry idx="606C" subIdx="00" bitLen="32" halPin="actual-velocity" halType="s32"/>
<pdoEntry idx="6077" subIdx="00" bitLen="16" halPin="actual-torque" halType="s32"/>
</pdo>
</syncManager>
</slave>
</master>
</masters>
.HAL
Warning: Spoiler!
loadrt [KINS]KINEMATICS
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
loadusr -W lcec_conf /home/edmuser/linuxcnc/configs/sim.axis-3/ethercat-conf.xml
loadrt lcec
loadrt cia402 count=1
loadrt mult2
addf lcec.read-all servo-thread
addf cia402.0.read-all servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf cia402.0.write-all servo-thread
addf lcec.write-all servo-thread
setp iocontrol.0.emc-enable-in 1
#*******************
# AXIS X
#*******************
# --- joint signals for motion
net x-pos-cmd <= joint.0.motor-pos-cmd
net x-vel-cmd <= joint.0.vel-cmd
net x-pos-fb <= joint.0.motor-pos-fb
net x-enable <= joint.0.amp-enable-out
net all-home => joint.0.home-sw-in
# --- connect stepper driver to joint
net x-pos-cmd => cia402.0.pos-cmd
net x-pos-fb => cia402.0.pos-fb
net x-enable => cia402.0.enable
# --- Drive settings
setp cia402.0.csp-mode 1
setp cia402.0.pos-scale 10000
# --- from Drive(ethercat) to cia402
net x-statusword lcec.0.0.cia-statusword => cia402.0.statusword
net x-opmode-display lcec.0.0.opmode-display => cia402.0.opmode-display
net x-drv-act-pos lcec.0.0.actual-position => cia402.0.drv-actual-position
net x-drv-act-velo lcec.0.0.actual-velocity => cia402.0.drv-actual-velocity
# --- from cia402 to Drive(ethercat)
net x-controlword cia402.0.controlword => lcec.0.0.cia-controlword
net x-modes-of-operation cia402.0.opmode => lcec.0.0.opmode
net x-drv-target-pos cia402.0.drv-target-position => lcec.0.0.target-position
net x-drv-target-velo cia402.0.drv-target-velocity => lcec.0.0.target-velocity
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
loadusr -W lcec_conf /home/edmuser/linuxcnc/configs/sim.axis-3/ethercat-conf.xml
loadrt lcec
loadrt cia402 count=1
loadrt mult2
addf lcec.read-all servo-thread
addf cia402.0.read-all servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf cia402.0.write-all servo-thread
addf lcec.write-all servo-thread
setp iocontrol.0.emc-enable-in 1
#*******************
# AXIS X
#*******************
# --- joint signals for motion
net x-pos-cmd <= joint.0.motor-pos-cmd
net x-vel-cmd <= joint.0.vel-cmd
net x-pos-fb <= joint.0.motor-pos-fb
net x-enable <= joint.0.amp-enable-out
net all-home => joint.0.home-sw-in
# --- connect stepper driver to joint
net x-pos-cmd => cia402.0.pos-cmd
net x-pos-fb => cia402.0.pos-fb
net x-enable => cia402.0.enable
# --- Drive settings
setp cia402.0.csp-mode 1
setp cia402.0.pos-scale 10000
# --- from Drive(ethercat) to cia402
net x-statusword lcec.0.0.cia-statusword => cia402.0.statusword
net x-opmode-display lcec.0.0.opmode-display => cia402.0.opmode-display
net x-drv-act-pos lcec.0.0.actual-position => cia402.0.drv-actual-position
net x-drv-act-velo lcec.0.0.actual-velocity => cia402.0.drv-actual-velocity
# --- from cia402 to Drive(ethercat)
net x-controlword cia402.0.controlword => lcec.0.0.cia-controlword
net x-modes-of-operation cia402.0.opmode => lcec.0.0.opmode
net x-drv-target-pos cia402.0.drv-target-position => lcec.0.0.target-position
net x-drv-target-velo cia402.0.drv-target-velocity => lcec.0.0.target-velocity
.ini
Warning: Spoiler!
[EMC]
MACHINE = EL8_machines
DEBUG = 0
VERSION = 1.1
[DISPLAY]
DISPLAY = axis
EDITOR = gedit
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
ARCDIVISION = 64
GRIDS = 10mm 20mm 50mm 100mm 1in 2in 5in 10in
MAX_FEED_OVERRIDE = 1.2
MIN_SPINDLE_OVERRIDE = 0.5
MAX_SPINDLE_OVERRIDE = 1.2
DEFAULT_LINEAR_VELOCITY = 2.50
MIN_LINEAR_VELOCITY = 0
MAX_LINEAR_VELOCITY = 25.00
CYCLE_TIME = 0.100
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 1
PROGRAM_PREFIX = /home/cnc/linuxcnc/nc_files
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
PYVCP = pyvcp_panel.xml
[KINS]
JOINTS = 1
KINEMATICS = trivkins coordinates=XYZ
[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
PROGRAM_EXTENSION = .nc,.tap G-Code File
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[RS274NGC]
PARAMETER_FILE = linuxcnc.var
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
SERVO_PERIOD = 1000000
#HOMEMOD=el8_homecomp
[HAL]
HALFILE = EL8_machine.hal
#HALFILE = xhc-whb04b.hal
POSTGUI_HALFILE = pyvcp_panel.hal
HALUI = halui
[TRAJ]
COORDINATES = X Y Z
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 2.50
MAX_LINEAR_VELOCITY = 25.00
[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
#*** AXIS_X *******************************
[AXIS_X]
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
MIN_LIMIT = -200.0
MAX_LIMIT = 200.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.0
MIN_LIMIT = -200.0
MAX_LIMIT = 200.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
SCALE = 80.0
FERROR = 1000
MIN_FERROR = 1000
HOME_ABSOLUTE_ENCODER = 2
#HOME = 0
HOME_OFFSET = 0
HOME_SEARCH_VEL = 20.000000
HOME_LATCH_VEL = 10.000
HOME_SEQUENCE = 1
HOME_USE_INDEX = False
HOME_IGNORE_LIMITS = False
HOME_IS_SHARED = 1
#******************************************
MACHINE = EL8_machines
DEBUG = 0
VERSION = 1.1
[DISPLAY]
DISPLAY = axis
EDITOR = gedit
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
ARCDIVISION = 64
GRIDS = 10mm 20mm 50mm 100mm 1in 2in 5in 10in
MAX_FEED_OVERRIDE = 1.2
MIN_SPINDLE_OVERRIDE = 0.5
MAX_SPINDLE_OVERRIDE = 1.2
DEFAULT_LINEAR_VELOCITY = 2.50
MIN_LINEAR_VELOCITY = 0
MAX_LINEAR_VELOCITY = 25.00
CYCLE_TIME = 0.100
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 1
PROGRAM_PREFIX = /home/cnc/linuxcnc/nc_files
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
PYVCP = pyvcp_panel.xml
[KINS]
JOINTS = 1
KINEMATICS = trivkins coordinates=XYZ
[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
PROGRAM_EXTENSION = .nc,.tap G-Code File
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[RS274NGC]
PARAMETER_FILE = linuxcnc.var
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
SERVO_PERIOD = 1000000
#HOMEMOD=el8_homecomp
[HAL]
HALFILE = EL8_machine.hal
#HALFILE = xhc-whb04b.hal
POSTGUI_HALFILE = pyvcp_panel.hal
HALUI = halui
[TRAJ]
COORDINATES = X Y Z
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 2.50
MAX_LINEAR_VELOCITY = 25.00
[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
#*** AXIS_X *******************************
[AXIS_X]
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
MIN_LIMIT = -200.0
MAX_LIMIT = 200.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.0
MIN_LIMIT = -200.0
MAX_LIMIT = 200.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
SCALE = 80.0
FERROR = 1000
MIN_FERROR = 1000
HOME_ABSOLUTE_ENCODER = 2
#HOME = 0
HOME_OFFSET = 0
HOME_SEARCH_VEL = 20.000000
HOME_LATCH_VEL = 10.000
HOME_SEQUENCE = 1
HOME_USE_INDEX = False
HOME_IGNORE_LIMITS = False
HOME_IS_SHARED = 1
#******************************************
- timo
- timo
30 Nov 2024 05:27
Tip on how to plan a machine was created by timo
Tip on how to plan a machine
Category: General LinuxCNC Questions
Hello,
i was quite fed up with undocumented components on my 2nd hand machine.
That is why I ripped it apart and decided to re-do the complete electric syste.
Now I was thinking it is a good idea to make some sort of wiring diagram, before starting the actual work.
This is to help adding more functions in the future, helps with repair. ( I want to avoid to have to reverse engineer my own installation )
From another thread I learned that this kind of plan might become also helpful to create a structured .hal and .ini file
Just to give an idea what I am up to.
A simple x-y-z mill, optional rotary axis a or c, (maybe rigid tapping, given the low torque spindle probably useless), MPG
Components that I have so far:
Greetings Timo
i was quite fed up with undocumented components on my 2nd hand machine.
That is why I ripped it apart and decided to re-do the complete electric syste.
Now I was thinking it is a good idea to make some sort of wiring diagram, before starting the actual work.
This is to help adding more functions in the future, helps with repair. ( I want to avoid to have to reverse engineer my own installation )
From another thread I learned that this kind of plan might become also helpful to create a structured .hal and .ini file
Just to give an idea what I am up to.
A simple x-y-z mill, optional rotary axis a or c, (maybe rigid tapping, given the low torque spindle probably useless), MPG
Components that I have so far:
- PC
- Mesa Card
- 3 open loop stepper drivers
- 3 stepper motors from old system
- 1 closed loop stepper with integrated driver (for rotary axis)
- Power supply 80V DC
- MPG (wires single switches, "no brain")
- BLDC spindle with driver (from old system) 0-10V speed control (can be pluged to MESA card)
- x-y-z proximity switches
- Temp switch for spindle overheat
- (optional) coolant pump
- (optional) spindle encoder
Greetings Timo
- natholego11
22 Nov 2024 20:29
N/O Probe issue was created by natholego11
N/O Probe issue
Category: HAL
Im not sure what happened as of late. but I recently have been getting an error with my probe when probing. I keep getting the error "probe is already tripped when starting G38.2 or G38.3 move" blah blah blah.
with the probe plugged in the HALmeter is showing that its "TRUE" and when I actuate the probe it goes to "FALSE"
and here is a link to the probe I have.
here is my HAL code.
with the probe plugged in the HALmeter is showing that its "TRUE" and when I actuate the probe it goes to "FALSE"
and here is a link to the probe I have.
here is my HAL code.
# Generated by PNCconf at Tue Jan 18 09:12:59 2022
# Using LinuxCNC version: 2.8
# 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 #num_dio=30 num_aio=30
loadrt hostmot2
loadrt hm2_eth board_ip="10.10.10.10" config=" num_encoders=1 num_pwmgens=1 num_stepgens=5 sserial_port_0=00xxxx"
setp hm2_7i96.0.watchdog.timeout_ns 5000000
loadrt pid names=pid.x,pid.y,pid.z,pid.a,pid.s
loadrt abs names=abs.0,abs.spindle
loadrt lowpass names=lowpass.spindle
loadrt scale names=scale.spindle
loadrt near
loadrt or2 names=tool_probe, names=E_stop_comb
loadrt mux16 names=jogincr
addf hm2_7i96.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.a.do-pid-calcs servo-thread
addf pid.s.do-pid-calcs servo-thread
addf scale.spindle servo-thread
addf abs.spindle servo-thread
addf lowpass.spindle servo-thread
addf near.0 servo-thread
addf hm2_7i96.0.write servo-thread
addf abs.0 servo-thread
addf tool_probe servo-thread
addf E_stop_comb servo-thread
addf jogincr servo-thread
# external output signals
# --- COOLANT-MIST ---
net coolant-mist => hm2_7i96.0.ssr.00.out-01
# --- Probe Blast---
#net probe-blast => hm2_7i96.0.ssr.00.out-02
# external input signals
# --- MACHINE-ON ---
net external-machine-on <= hm2_7i96.0.gpio.003.in_not
# --- ESTOP-EXT ---
net estop-ext <= hm2_7i96.0.gpio.000.in #=> E_stop_comb.in0
# --- PROBE-IN ---
#net probe-in <= hm2_7i96.0.gpio.001.in
net toolsetter-in <= hm2_7i96.0.gpio.001.in => tool_probe.in0
net probe-in <= hm2_7i96.0.gpio.002.in_not => tool_probe.in1
# --- ESTOP-EXT ---
#net estop-pendant <= hm2_7i96.0.gpio.045.in_not #=> E_stop_comb.in1
net tool-or-probe tool_probe.out
#net comb_E_stop E_stop_comb.out
#*******************
# 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.000500
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_7i96.0.stepgen.00.dirsetup [JOINT_0]DIRSETUP
setp hm2_7i96.0.stepgen.00.dirhold [JOINT_0]DIRHOLD
setp hm2_7i96.0.stepgen.00.steplen [JOINT_0]STEPLEN
setp hm2_7i96.0.stepgen.00.stepspace [JOINT_0]STEPSPACE
setp hm2_7i96.0.stepgen.00.position-scale [JOINT_0]STEP_SCALE
setp hm2_7i96.0.stepgen.00.step_type 0
setp hm2_7i96.0.stepgen.00.control-type 1
setp hm2_7i96.0.stepgen.00.maxaccel [JOINT_0]STEPGEN_MAXACCEL
setp hm2_7i96.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_7i96.0.stepgen.00.velocity-cmd
net x-pos-fb <= hm2_7i96.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_7i96.0.stepgen.00.enable
# ---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.000500
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_7i96.0.stepgen.01.dirsetup [JOINT_1]DIRSETUP
setp hm2_7i96.0.stepgen.01.dirhold [JOINT_1]DIRHOLD
setp hm2_7i96.0.stepgen.01.steplen [JOINT_1]STEPLEN
setp hm2_7i96.0.stepgen.01.stepspace [JOINT_1]STEPSPACE
setp hm2_7i96.0.stepgen.01.position-scale [JOINT_1]STEP_SCALE
setp hm2_7i96.0.stepgen.01.step_type 0
setp hm2_7i96.0.stepgen.01.control-type 1
setp hm2_7i96.0.stepgen.01.maxaccel [JOINT_1]STEPGEN_MAXACCEL
setp hm2_7i96.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_7i96.0.stepgen.01.velocity-cmd
net y-pos-fb <= hm2_7i96.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_7i96.0.stepgen.01.enable
# ---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.000500
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_7i96.0.stepgen.02.dirsetup [JOINT_2]DIRSETUP
setp hm2_7i96.0.stepgen.02.dirhold [JOINT_2]DIRHOLD
setp hm2_7i96.0.stepgen.02.steplen [JOINT_2]STEPLEN
setp hm2_7i96.0.stepgen.02.stepspace [JOINT_2]STEPSPACE
setp hm2_7i96.0.stepgen.02.position-scale [JOINT_2]STEP_SCALE
setp hm2_7i96.0.stepgen.02.step_type 0
setp hm2_7i96.0.stepgen.02.control-type 1
setp hm2_7i96.0.stepgen.02.maxaccel [JOINT_2]STEPGEN_MAXACCEL
setp hm2_7i96.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_7i96.0.stepgen.02.velocity-cmd
net z-pos-fb <= hm2_7i96.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_7i96.0.stepgen.02.enable
# ---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
#*******************
# AXIS A JOINT 3
#*******************
setp pid.a.Pgain [JOINT_3]P
setp pid.a.Igain [JOINT_3]I
setp pid.a.Dgain [JOINT_3]D
setp pid.a.bias [JOINT_3]BIAS
setp pid.a.FF0 [JOINT_3]FF0
setp pid.a.FF1 [JOINT_3]FF1
setp pid.a.FF2 [JOINT_3]FF2
setp pid.a.deadband [JOINT_3]DEADBAND
setp pid.a.maxoutput [JOINT_3]MAX_OUTPUT
setp pid.a.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.a.maxerror 0.000500
net a-index-enable <=> pid.a.index-enable
net a-enable => pid.a.enable
net a-pos-cmd => pid.a.command
net a-pos-fb => pid.a.feedback
net a-output <= pid.a.output
# Step Gen signals/setup
setp hm2_7i96.0.stepgen.04.dirsetup [JOINT_3]DIRSETUP
setp hm2_7i96.0.stepgen.04.dirhold [JOINT_3]DIRHOLD
setp hm2_7i96.0.stepgen.04.steplen [JOINT_3]STEPLEN
setp hm2_7i96.0.stepgen.04.stepspace [JOINT_3]STEPSPACE
setp hm2_7i96.0.stepgen.04.position-scale [JOINT_3]STEP_SCALE
setp hm2_7i96.0.stepgen.04.step_type 0
setp hm2_7i96.0.stepgen.04.control-type 1
setp hm2_7i96.0.stepgen.04.maxaccel [JOINT_3]STEPGEN_MAXACCEL
setp hm2_7i96.0.stepgen.04.maxvel [JOINT_3]STEPGEN_MAXVEL
# ---closedloop stepper signals---
net a-pos-cmd <= joint.3.motor-pos-cmd
net a-vel-cmd <= joint.3.vel-cmd
net a-output <= hm2_7i96.0.stepgen.04.velocity-cmd
net a-pos-fb <= hm2_7i96.0.stepgen.04.position-fb
net a-pos-fb => joint.3.motor-pos-fb
net a-enable <= joint.3.amp-enable-out
net a-enable => hm2_7i96.0.stepgen.04.enable
# ---setup home / limit switch signals---
net a-home-sw => joint.3.home-sw-in
net a-neg-limit => joint.3.neg-lim-sw-in
net a-pos-limit => joint.3.pos-lim-sw-in
#*******************
# SPINDLE
#*******************
setp pid.s.Pgain [SPINDLE_0]P
setp pid.s.Igain [SPINDLE_0]I
setp pid.s.Dgain [SPINDLE_0]D
setp pid.s.bias [SPINDLE_0]BIAS
setp pid.s.FF0 [SPINDLE_0]FF0
setp pid.s.FF1 [SPINDLE_0]FF1
setp pid.s.FF2 [SPINDLE_0]FF2
setp pid.s.deadband [SPINDLE_0]DEADBAND
setp pid.s.maxoutput [SPINDLE_0]MAX_OUTPUT
setp pid.s.error-previous-target true
# This setting is to limit bogus stepgen
# velocity corrections caused by position
# feedback sample time jitter.
setp pid.s.maxerror 0.000500
net spindle-index-enable <=> pid.s.index-enable
net spindle-enable => pid.s.enable
net spindle-vel-cmd-rpm => pid.s.command
net spindle-vel-fb-rpm => pid.s.feedback
net spindle-output <= pid.s.output
# Step Gen signals/setup
setp hm2_7i96.0.stepgen.03.dirsetup [SPINDLE_0]DIRSETUP
setp hm2_7i96.0.stepgen.03.dirhold [SPINDLE_0]DIRHOLD
setp hm2_7i96.0.stepgen.03.steplen [SPINDLE_0]STEPLEN
setp hm2_7i96.0.stepgen.03.stepspace [SPINDLE_0]STEPSPACE
setp hm2_7i96.0.stepgen.03.position-scale [SPINDLE_0]STEP_SCALE
setp hm2_7i96.0.stepgen.03.step_type 0
setp hm2_7i96.0.stepgen.03.control-type 1
setp hm2_7i96.0.stepgen.03.maxaccel [SPINDLE_0]MAX_ACCELERATION
setp hm2_7i96.0.stepgen.03.maxvel [SPINDLE_0]MAX_VELOCITY
net spindle-vel-cmd-rps => hm2_7i96.0.stepgen.03.velocity-cmd
#(enables the DMM drive with the power button)
net machine-is-on <= halui.machine.is-on
net machine-is-on => hm2_7i96.0.ssr.00.out-00
#(enables the spindle stepgen)
net machine-is-enabled <= motion.motion-enabled
net machine-is-enabled => hm2_7i96.0.stepgen.03.enable
# ---Encoder feedback signals/setup---
setp hm2_7i96.0.encoder.00.counter-mode 0
setp hm2_7i96.0.encoder.00.filter 1
setp hm2_7i96.0.encoder.00.index-invert 0
setp hm2_7i96.0.encoder.00.index-mask 0
setp hm2_7i96.0.encoder.00.index-mask-invert 0
setp hm2_7i96.0.encoder.00.scale [SPINDLE_0]ENCODER_SCALE
net spindle-revs <= hm2_7i96.0.encoder.00.position
net spindle-vel-fb-rps <= hm2_7i96.0.encoder.00.velocity
net spindle-index-enable <=> hm2_7i96.0.encoder.00.index-enable
# ---setup spindle control signals---
net spindle-vel-cmd-rps <= spindle.0.speed-out-rps
net spindle-vel-cmd-rps-abs <= spindle.0.speed-out-rps-abs
net spindle-vel-cmd-rpm <= spindle.0.speed-out
net spindle-vel-cmd-rpm-abs <= spindle.0.speed-out-abs
net spindle-enable <= spindle.0.on
net spindle-cw <= spindle.0.forward
net spindle-ccw <= spindle.0.reverse
net spindle-brake <= spindle.0.brake
net spindle-revs => spindle.0.revs
net spindle-at-speed => spindle.0.at-speed
net spindle-vel-fb-rps => spindle.0.speed-in
net spindle-index-enable <=> spindle.0.index-enable
# ---Setup spindle at speed signals---
net spindle-vel-cmd-rps => near.0.in1
net spindle-vel-fb-rps-abs => near.0.in2
net spindle-at-speed <= near.0.out
net spindle-vel-fb-rps => abs.0.in
net spindle-vel-fb-rps-abs abs.0.out
setp near.0.scale 1.000000
setp near.0.difference 2.00
# Use ACTUAL spindle velocity from spindle encoder
# spindle-velocity bounces around so we filter it with lowpass
# spindle-velocity is signed so we use absolute component to remove sign
# ACTUAL velocity is in RPS not RPM so we scale it.
setp scale.spindle.gain 60
setp lowpass.spindle.gain 1.000000
net spindle-vel-fb-rps => scale.spindle.in
net spindle-fb-rpm scale.spindle.out => abs.spindle.in
net spindle-fb-rpm-abs abs.spindle.out => lowpass.spindle.in
net spindle-fb-rpm-abs-filtered lowpass.spindle.out
#******************************
# 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 axis-select-a halui.axis.a.select
net jog-a-pos halui.axis.a.plus
net jog-a-neg halui.axis.a.minus
net jog-a-analog halui.axis.a.analog
net a-is-homed halui.joint.3.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
net tool-or-probe => 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 comb_E_stop => iocontrol.0.emc-enable-in
net estop-ext => iocontrol.0.emc-enable-in
#net estop-pendant => 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
- bruno84
- bruno84
16 Nov 2024 04:32
7i96s, 3 axis mill conversion, servo spindle, probe basic almost full function was created by bruno84
7i96s, 3 axis mill conversion, servo spindle, probe basic almost full function
Category: Basic Configuration
Hey guys. I wonder if someone could assist me in nutting a problem in my configuration. I know the layout of the config has more than one problem, and i plan to learn better how to fix this myself, however as long as i have the axis' dialled in and the servo spindle controlled through the software i am a-ok with not having spindle orientation and extras setup until I better understand the Hal configurations.
I have been running Probe Basic as a 3 axis stepper driven mill configuration, 3 homing switches for a year using the standard mill motor spindle and that has worked fine. I have just installed a Servo Motor to drive the spindle and now for some reason I am getting a joint following error when homing any axis.
I have had the servo spindle working in a test file, (both Axis and probe basic GUIs),but when combined together in the previously working Probe Basic config I have issues.
I have a feeling it might be something that is related to the post-gui file, as in an attempt to chase errors I was getting I have consolidated a not task that was conflicting, and I have reached to end of my limited knowledge.
I am working regularly to better understand the control flow within linuxcnc, but for now, if i was just able to get a minimal running configuration sorted I could at least use the machine whilst i gain that better knowledge.
Thanks very much,
Bruno
I have been running Probe Basic as a 3 axis stepper driven mill configuration, 3 homing switches for a year using the standard mill motor spindle and that has worked fine. I have just installed a Servo Motor to drive the spindle and now for some reason I am getting a joint following error when homing any axis.
I have had the servo spindle working in a test file, (both Axis and probe basic GUIs),but when combined together in the previously working Probe Basic config I have issues.
I have a feeling it might be something that is related to the post-gui file, as in an attempt to chase errors I was getting I have consolidated a not task that was conflicting, and I have reached to end of my limited knowledge.
I am working regularly to better understand the control flow within linuxcnc, but for now, if i was just able to get a minimal running configuration sorted I could at least use the machine whilst i gain that better knowledge.
Thanks very much,
Bruno
- spumco
- spumco
15 Nov 2024 20:16
Replied by spumco on topic LinuxCNC for lathe questions
LinuxCNC for lathe questions
Category: General LinuxCNC Questions
I won't comment on GUI choice(s) here - those are personal preferences. Regarding your other questions:Bunch of questions, Hopefully someone can fill in a few blanks as I formulate a plan for the lathe.
I'm using Axis for my mill and I'm completely happy with it. I'm now considering using LinuxCNC for my lathe. I definitely want to maintain manual operation capability.
Presently I have a derivative of the Clough42 ELS with feedback from the spindle and a stepper driving the leadscrew for threading. I like the simplicity of selecting various thread pitches metric and SAE electronically.
1) I don't suppose LinuxCNC has this "ELS" capability?
2) I also have DRO scales. Assuming I will use a MESA board, is it possible to connect the scales to the MESA board and use LinuxCNC as a glorified DRO without actually driving any steppers/servos?
3) Assuming for the moment I can use LinuxCNC simply as a DRO, what MESA board(s) would be a good fit for say max 3 encoder inputs and possibly up to 3 steppers later?
I have a RaspberryPi of some sort and I might try using it for the LinuxCNC for both space and $.
4) What RaspberryPI's are likely to have acceptable latency and what versions should I avoid?
I find the Axis GUI a good fit for my needs on the mill, what GUI is a good fit for lathe control?
Much appreciated.
- Yes, LCNC has "ELS" capability. Not in a turn-key configuration, but there's no reason you can't set LCNC up to act like your ELS. All the elements are present: spindle encoder + Z-axis positioning motor + configurable logic.
- Yes. And LCNC already has a "DRO" mode. See linuxcnc.org/docs/devel/html/gui/mdro.html
- You can read my long-winded post here:
forum.linuxcnc.org/27-driver-boards/5160...i-buy?start=0#292576
- I'm not an expert, but I think the absolute cheapest Mesa combination to get an FPGA card (required) and 3 axis/spindle encoder inputs & step/dir outputs is a 7i92 (any variant) and a 7i85s. You'd still need something else for IO, but that depends on your particular setup.
- If your IO needs are moderate, a 7i96s and 7i85s would get you the IO and keep packaging to two (vs three) boards.
- Based on very little personal experience, Rpi's usually have decent to very good latency and potentially not-so-good user-interface response. i.e. 'laggy' if using a power-hungry GUI. If you are using Mesa hardware you don't have to worry about latency with an Rpi.
- I've got an Rpi5 and while I'm not using it (right now), it was just fine when I tested it with LCNC and Probe Basic (no interface lag).
- Lathe GUI - any GUI is fine except Axis.
- slowpoke
- slowpoke
15 Nov 2024 14:44 - 15 Nov 2024 18:28
LinuxCNC for lathe questions was created by slowpoke
LinuxCNC for lathe questions
Category: General LinuxCNC Questions
Bunch of questions, Hopefully someone can fill in a few blanks as I formulate a plan for the lathe.
I'm using Axis for my mill and I'm completely happy with it. I'm now considering using LinuxCNC for my lathe. I definitely want to maintain manual operation capability.
Presently I have a derivative of the Clough42 ELS with feedback from the spindle and a stepper driving the leadscrew for threading. I like the simplicity of selecting various thread pitches metric and SAE electronically.
1) I don't suppose LinuxCNC has this "ELS" capability?
2) I also have DRO scales. Assuming I will use a MESA board, is it possible to connect the scales to the MESA board and use LinuxCNC as a glorified DRO without actually driving any steppers/servos?
3) Assuming for the moment I can use LinuxCNC simply as a DRO, what MESA board(s) would be a good fit for say max 3 encoder inputs and possibly up to 3 steppers later?
I have a RaspberryPi of some sort and I might try using it for the LinuxCNC for both space and $.
4) What RaspberryPI's are likely to have acceptable latency and what versions should I avoid?
I find the Axis GUI a good fit for my needs on the mill, what GUI is a good fit for lathe control?
Much appreciated.
I'm using Axis for my mill and I'm completely happy with it. I'm now considering using LinuxCNC for my lathe. I definitely want to maintain manual operation capability.
Presently I have a derivative of the Clough42 ELS with feedback from the spindle and a stepper driving the leadscrew for threading. I like the simplicity of selecting various thread pitches metric and SAE electronically.
1) I don't suppose LinuxCNC has this "ELS" capability?
2) I also have DRO scales. Assuming I will use a MESA board, is it possible to connect the scales to the MESA board and use LinuxCNC as a glorified DRO without actually driving any steppers/servos?
3) Assuming for the moment I can use LinuxCNC simply as a DRO, what MESA board(s) would be a good fit for say max 3 encoder inputs and possibly up to 3 steppers later?
I have a RaspberryPi of some sort and I might try using it for the LinuxCNC for both space and $.
4) What RaspberryPI's are likely to have acceptable latency and what versions should I avoid?
I find the Axis GUI a good fit for my needs on the mill, what GUI is a good fit for lathe control?
Much appreciated.
Time to create page: 1.580 seconds