My setup
In this example the samples 2500 at a rate of 2500 will trigger the reset.
My setup
In this example the samples 2500 at a rate of 2500 will trigger the reset.
@ketirange
just 3.
CAN
1 MB6HC - 120 Ohm -----------|
1 HCL Closed loop -----------|
1 HCL closed loop - 120 Ohm -|
that is not specific to 3.6 - I can reproduce it in 3.5.3 SBC setup.
I think it is triggered when the acceleration is to high (back emf), the sample rate is to high (sbc spi timeout) or too many samples are taken (again spi timeout).
@AndyE3D
Hi, thank you for sharing this alternative method for calibrating the non-linear extrusion with the MFM based on quadratic regression. In any case, your macro looks quite clean and well thought out.
It seems that the macro collects the errors only once, without reevaluating the applied coefficients. Based on my experience, I can say that this approach is insufficient to achieve good values that result in an error of less than 1% across the entire speed range. That’s why I follow this process with my macro:
Regarding your concerns about die swell or foaming, I can clarify that this is simply an extrusion multiplier in the slicer or filament profile when the non-linear extrusion is calculated using that method.
I am excited to see where the development of the MFM will lead.
Btw. you can find the latest macro of my MFM calibration at https://github.com/Meltingplot/BigPrint/blob/duet-3.5.3-sbc/duet-config/macros/meltingplot/filament-extrusion-calibration
@droftarts
I have updated the description so that it hopefully becomes clearer how much material has to be extruded and why you should aim for a 20% plus error margin and that you should use the temp_base for slicing.
@droftarts
Hi @droftarts
I use the following tuning method:
Temp_base
for the filament, e.g. extrude with F30 (0.5 mm/sec Speed_base
) so that the filament is melting and will bond to each otherSpeed_desired
) for 2.85mm filament -> F330Temp_required
. The extrusion length should be at least two times your hotend length. The 20% increase is some kind of error margin for non linear extrusion and when the fan is on.Temp_boost = (Temp_required - Temp_base) / (Speed_desired - Speed_base)
For Example PLA
Temp_base = 190
Temp_required = 230
Speed_base = 0.5 mm/s
Speed_desired = 5.5 mm/s
Temp_boost = 40 / 5 => 8 => T8
Edit: Temp_base
will be the temperature you set in your slicer for that material.
I came up with the following solution:
content of driver-warning.g
; driver-warning.g
; driver warning - 51.0 : 1024 ,Driver 51.0 warning: position tolerance exceeded
if param.B > 0 && param.D == 0 && param.P == 1024 && move.axes[0].homed == false && move.axes[1].homed == false
M99 ; ignore warning when drives are not homed
echo "driver warning - "^{param.B}^"."^{param.D}^" : "^{param.P}^" ,"^{param.S}
if state.status == "paused" || state.status == "pausing" || state.status == "resuming"
M99 ; ignore this event - it is already handled
if !exists(global.event_driver_stall)
global event_driver_stall = true
; check if a printjob is running
; if it is a can connected driver in closed loop mode with error position tolerance exceeded (param.B > 0 && param.D == 0 && param.P == 1024)
if job.file.fileName != null
if param.B > 0 && param.D == 0 && param.P == 1024
set global.event_driver_stall = true
M25 ; pause print and rehome X and Y
M207 Z{tools[0].retraction.zHop+0.2} ; raise z-hop 0.2mm to prevent further crashes
set global.resume_deferred = state.upTime + 5 ; resume print after 5 seconds
else
set global.event_driver_stall = false ; do not rehome while pausing
G91 ; relative positioning
G1 H2 Z0.5 F600 ; lift Z relative to current position
M568 P0 R0 S0 A0 ; disable hotend
M25 ; pause print
content of driver-error.g
; driver-error.g
; called to home x and y after stall detection
; driver error - 51.0 : 3072 ,Driver 51.0 error: failed to maintain position
if param.B > 0 && param.D == 0 && param.P == 3072 && move.axes[0].homed == false && move.axes[1].homed == false
M99 ; ignore warning when drives are not homed
echo "driver error - "^{param.B}^"."^{param.D}^" : "^{param.P}^" ,"^{param.S}
if !exists(global.event_driver_stall)
global event_driver_stall = true
if state.status == "paused" || state.status == "pausing" || state.status == "resuming"
set global.resume_deferred = 0 ; reset resume_deferred
M99 ; ignore this event - it is already handled
; check if a printjob is running
; if it is a can connected driver in closed loop mode with failed to maintain position (param.B > 0 && param.D == 0 && param.P == 3072)
if job.file.fileName != null
if param.B > 0 && param.D == 0 && param.P == 3072
set global.event_driver_stall = true
M207 Z{tools[0].retraction.zHop+0.2} ; raise z-hop 0.2mm to prevent further crashes
else
set global.event_driver_stall = false ; do not rehome while pausing
G91 ; relative positioning
G1 H2 Z0.5 F600 ; lift Z relative to current position
M568 P0 R0 S0 A0 ; disable hotend
M25 ; pause print
content of daemon.g
if exists(global.resume_deferred) && global.resume_deferred > 0 && global.resume_deferred < state.upTime
if state.status == "paused"
set global.resume_deferred = 0
M24 ; resume print
The magic is done by the global.resume_deferred
. It is set to state.upTime + 5
which means 5 second delay.
The flow looks like the following
driver-warning event -> check if it is already paused if so, exit else set resume_deferred
driver-error event -> check if it is already paused, if so, reset resume_deferred to 0 to disable it and exit
daemon.g -> Check whether the delay for resume_deferred has already passed, if so resume the print.
Hello, I am having the following issue with my closed-loop printer in an SBC configuration using CoreXY when a ‘position error’ occurs. I get a motor driver-warning event for each motor, 2 in total, and 1 driver-error event for each motor, again 2 in total, for a total of 4 events for a full crash.
content of driver-warning.g
; driver warning - 51.0 : 1024 ,Driver 51.0 warning: position tolerance exceeded
if param.B > 0 && param.D == 0 && param.P == 1024 && move.axes[0].homed == false && move.axes[1].homed == false
M99 ; ignore warning when drives are not homed
echo "driver warning - "^{param.B}^"."^{param.D}^" : "^{param.P}^" ,"^{param.S}
if !exists(global.event_driver_stall)
global event_driver_stall = true
; check if a printjob is running
; if it is a can connected driver in closed loop mode with error position tolerance exceeded (param.B > 0 && param.D == 0 && param.P == 1024)
if job.file.fileName != null
if param.B > 0 && param.D == 0 && param.P == 1024
set global.event_driver_stall = true
M25 ; pause print and rehome X and Y
M207 Z{tools[0].retraction.zHop+0.2} ; raise z-hop 0.2mm to prevent further crashes
M24 ; resume print
else
set global.event_driver_stall = false ; do not rehome while pausing
G91 ; relative positioning
G1 H2 Z0.5 F600 ; lift Z relative to current position
M568 P0 R0 S0 A0 ; disable hotend
M25 ; pause print
content of driver-error.g
; driver-stall.g
; called to home x and y after stall detection
; driver error - 51.0 : 3072 ,Driver 51.0 error: failed to maintain position
if param.B > 0 && param.D == 0 && param.P == 3072 && move.axes[0].homed == false && move.axes[1].homed == false
M99 ; ignore warning when drives are not homed
echo "driver error - "^{param.B}^"."^{param.D}^" : "^{param.P}^" ,"^{param.S}
if !exists(global.event_driver_stall)
global event_driver_stall = true
; check if a printjob is running
; if it is a can connected driver in closed loop mode with failed to maintain position (param.B > 0 && param.D == 0 && param.P == 3072)
if job.file.fileName != null
if param.B > 0 && param.D == 0 && param.P == 3072
set global.event_driver_stall = true
M207 Z{tools[0].retraction.zHop+0.2} ; raise z-hop 0.2mm to prevent further crashes
else
set global.event_driver_stall = false ; do not rehome while pausing
G91 ; relative positioning
G1 H2 Z0.5 F600 ; lift Z relative to current position
M568 P0 R0 S0 A0 ; disable hotend
M25 ; pause print
I have already tried to check if the printer is in the ‘pausing’ or ‘paused’ state to prevent further pauses, but the events are deferred and the first event is processed completely, including the resume print, before the second is processed.
if state.status == "paused" || state.status == "pausing" || state.status == "resuming"
M99 ; ignore this event - it is already handled
How can I cancle pending events? or what else should I do?
@Marcossf these sensors are around 1k€?
e.g. if you use the Baumer OXM with Modbus RTU you can look in the forum on how to communicate with an RS485 modbus inverter. You will find some examples.
I'm in contact with baumer to get my hands on one of these OXP sensors with an SBC setup. The P sensor will give you a point cloud over TCP, so I need to do the curve fitting and so on. The OXM is doing the fitting internally and can give you the results.
@dc42 @chrishamm @T3P3Tony and the whole Duet3D Team! Thank you!
3.5.2 Closed loop SBC Setup Duet3 6HC 2x 1HCL with Magnetic Encoder on NEMA 17 1.8° LDO Motor
I have the Closed Loop System running for a week now and have been printing continuously 24/7 on a job that I had to abort six times before. Without the Closed Loop System, I would not be able to print the job!
Thanks a lot for this! After initial difficulties in tuning the system, because the instructions were written for quadrature shaft encoders, I was able to achieve a high-performance tuning. The Closed Loop System even has a better print quality e.g. because the backlash is compensated. I can run the steppers at full current, higher accelerations, higher speeds and the steppers are even cooler.
Btw. the printer is loosing the position about every 15 minutes on that print, due to the material. It's our PA6 CF HT which is very stiff and strong, so even the smallest amount of residues will stop/crash the print head. The print takes around 5.5 kg, where the material is around 89€/kg.
Please find attached a picture in which you can hardly see the misalignments.
Chris, after the hard work you put in the SBC setup it runs pretty stable now not rock solid, as I can still crash it - but mostly solid
Keep up the great work!
@curieos do you use firmware retraction?
@Tinchus, it's the extrusion speed. So I use 2.85 mm filament and if I use an extrusion speed of 1 mm/s, for example, it is about 6.38 mm³/s, regardless of the nozzle size. The only difference between extrusion speed and volume speed is the area of the filament, e.g. for 2.85 mm filament 6.38 mm² and thus only a factor.
@Tinchus it is extruder speed e.g. movement of filament per sec, not travel speed so it is accounting for that. I print with 0.8mm to 1.2mm nozzles.
@Tinchus said in [feature] Adaptive / Feedforward Temperature setpoint:
And regarding where: I think the oposite. It should be the formware the one in charge of that because the slicer never knows the real speed of a path. Final real speed is decided by firmware, the slciewr never knows the real printing speed (and that is the reason why the time calculation on slicer are allways really off)
Thats a good point!
I made a PR for this https://github.com/Duet3D/RepRapFirmware/pull/1036
But due to memory contrains, it will not fit in the ROM of a regular Duet2 combined firmware. You need to disable other not important features to make it work e.g. Telnet and FTP.
@p8blr was the extended delay able to get rid of the unknown driver messages?
the M122 looks normal to me.
@p8blr hi sorry to here that it is not working!
I've looked at the config and maybe you can increase the wait delay for the startup of the can connected boards.
; Wait a moment for the CAN expansion boards to start
G4 S2
just increase it for test purpose e.g. to 10 sec. as you can query the boards after startup without an issue but the drive setup fails. I use 5 seconds for one connected expansion board.
Can you also post the content of the daemon.g , as it appears, that there is a problem in line 8. Edit: only different output e.g. bedStripTempMax
, isn't it supposed to be global.bedStripTempMax
?set global.unknownVar
or echo {global.unknownVar}
Do you run your printer mainboard and expansion boards at 24V or more than that? If so, there is a feature in the FW that reduces the voltage via PWM for the breaks and that may create EMV problems. EDIT: it is only activated when M569.7 V is provided, which is not the case.
Maybe you can show the output of M122
btw.
thanks for sharing!
sudo rpi-eeprom-config --edit
PSU_MAX_CURRENT=5000
EDIT
from this screenshot https://forum.duet3d.com/assets/uploads/files/1725041834892-m115.jpg
it is not clear which version runs on the 6XD can you please show the whole line of M115 B0
@Kittifix you are maybe able to use it, but RRF is able to create a spindle with an PWM output for the speed control.
If you use a PWM to Freqency Converter PCB you will maybe able to use the pulse input.
@p8blr thank you for the files, but can you just make a screenshot of the output when you send the command M98 P"config.g"
in the console.
@Kittifix
I think that the encoder input/pulse input from an encoder should be used as a feedback loop and not as a control input.
If you are referring to the following datasheet https://assets.danfoss.com/documents/latest/271209/AQ276736419659en-000101.pdf
you may have a look into https://files.danfoss.com/download/Drives/MG02K402.pdf
And you could either use RS485 or use the 0-10V Interface with an PWM to Voltage Converter PCB.
@p8blr
can you send us the output of
M98 P"config.g"
maybe there is a bug in the config, as it appears to me, that was created for an older version of RRF. As stated in the config, it was created for Firmware Version 3.5.0 Release Candidate 1
, since then there have been a few incompatible changes.