Jump to content
Ultimaker Community of 3D Printing Experts
gr5

UM2 extrusion rates

Recommended Posts

I did another test tonight. I wanted to determine max extrusion rates. I don't know how to adjust the "trimpot current".

See daid's new M907 and M908 codes here:

https://github.com/Ultimaker/SecretMarlin

I don't know how they work and I don't know if I can increase the stepper current for the extruder. But for now, with Marlin 13.10-5, these appear to be the maximum extrusion rates for the UM2:

default throughput rates for UM2 with default trimpot current settings using ultimaker light blue PLA

 

Here they are in table form:

temp max volume max speed with .2mm layers

180C 1.59 mm³/sec 20mm/sec

190C 2.97 mm³/sec 37mm/sec

200C 4.24 mm³/sec 53mm/sec

210C 5.59 mm³/sec* 70mm/sec

220C 7.00 mm³/sec 87mm/sec

230C 8.25 mm³/sec* 103mm/sec

240C 9.54 mm³/sec 120mm/sec

* means it was derived but you can see from the graph that it is VERY linear. I got these values by sending extrude commands to the printer. Typically I extruded 5mm to 10mm of filament at different temps and speeds until I found the max speed with no "clicking". For example:

G1 F67 E7

Was the max speed I could go with no skipping at 220C. F67 is 67mm per minute or 7mm³/sec.

DO NOT TRY TO PRINT OVER THESE VALUES! At least I strongly discourage it. So if you are printing .1mm layer height (and um2 has .4mm nozzle) and you want to print at 220C your max print speed is 7/.1/.4=175mm/sec. But if you are printing .2mm layers your max speed 87mm/sec.

If you go over these values you will get lots of under extrusion.

This was for the blue ultimaker PLA that came with my UM2. I know I can print a bit faster than this with my UM original so people who are trying to print just as fast a throughput of PLA may have underextrusion issues. Note that at 240C, .1mm layer height you can print up to 240mm/sec without any underextrusion.

Other brands and colors of PLA will vary. Plus I think there is a way to mess with the current to the E-stepper (increase it) but I don't know anything about this yet. Daid?

The formula to derive these values for any nozzle temperature is:

mm³/sec = (temp - 168)*.133

mm/sec = Volume (mm³/sec) / layer height / .4mm (nozzle width)

 

  • Like 1

Share this post


Link to post
Share on other sites

Afaik you can change the stepper current with the "trimpot" = trimmer potentiometer on the driver boards. This will change the hardware-setting. There is no scale or display of what's set there exactly, so you have to measure manually.

/edit: by the way, that's for the UM1. Don't know if it's the same with UM2!

I don't know if there is a software-setting, too. With sw-setting, you should only be able to lower the maximum current, but not increase beyond what's set in hardware. Again, I don't have a clue on how the stepper firmware works, that's just an assumption based on how it's usually done.

 

Share this post


Link to post
Share on other sites

I did a little bit of digging around those stepper current controls. Not sure if it's any help to you but maybe it's a starting point?

Comments above each section is "filename - line number"

 


/*************************************
Marlin_main.cpp - 207
*************************************/
const char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'};
/*************************************
Configuration_adv.h - 203
*************************************/
// Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards)
#define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
// Default motor current for XY,Z,E in mA
#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250}
/*************************************
pins.h - 1217
*************************************/
//Motor current PWM conversion, PWM value = MotorCurrentSetting * Range / 255
#define MOTOR_CURRENT_PWM_RANGE 2000
/*************************************
Marlin_main.cpp - 1965
*************************************/
case 907: // M907 Set digital trimpot motor current using axis codes.
{
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) digipot_current(i,code_value());
if(code_seen('B')) digipot_current(4,code_value());
if(code_seen('S')) for(int i=0;i<=4;i++) digipot_current(i,code_value());
#endif
}
break;
case 908: // M908 Control digital trimpot directly.
{
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
uint8_t channel,current;
if(code_seen('P')) channel=code_value();
if(code_seen('S')) current=code_value();
digitalPotWrite(channel, current);
#endif
}
/*************************************
stepper.cpp - 961
*************************************/
void digipot_current(uint8_t driver, int current)
{
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
const uint8_t digipot_ch[] = DIGIPOT_CHANNELS;
digitalPotWrite(digipot_ch[driver], current);
#endif
#if MOTOR_CURRENT_PWM_XY_PIN > -1
if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
#endif
}
/*************************************
UltiLCD2_menu_first_run.cpp - 382
*************************************/
digipot_current(2, motor_current_setting[2]*2/3);//Set E motor power lower so the motor will skip instead of grind.
/*************************************
ConfigurationStore.cpp - 278
*************************************/
float tmp_motor_current_setting[]=DEFAULT_PWM_MOTOR_CURRENT;
motor_current_setting[0] = tmp_motor_current_setting[0];
motor_current_setting[1] = tmp_motor_current_setting[1];
motor_current_setting[2] = tmp_motor_current_setting[2];

Share this post


Link to post
Share on other sites

Okay. So if the code works, then:

1250ma is default stepper current - in another post, Daid said that higher currents than 1250ma didn't pull any harder on the filament.

2/3 of this is applied for when feeding filament (833ma)

2000ma is the max current

M907 S255

Sets XY,Z,E currents all to 2000ma

M907 E255

Should set just E axis

M907 B255 set's some "other" stepper current to 2 amps? WTF? B=Bed? B=Burner? Oh! Maybe this is extruder B?

edit: confirmed that "B" is the second extruder when UM gets around to selling this.

There is also M908 (not sure why) where you can do more complete control:

M908 P1 S255 which sets something to full value but I don't know the "P" (pin) values as Robert didn't include that part. M908 seems dangerous so I wouldn't mess with it.

edit: with more info from Robert I see that

M908 P0 S255

M908 P1 S200

is the same as

M907 X255 Y200

 

Share this post


Link to post
Share on other sites

that mai vary on a real print..

 

Yes. So if your print has lots of corners and short line segments then obviously it is printing much slower than the requested speed. In every case I could print quite a long distance before pressure got high enough for it to "click" (loose steps). When it *does* lose steps it loses a lot!

Also this was in open air. When you press the nozzle close to the print and are trying to extrude into a small area the pressures might be even higher and you might have to print even slower. But I think this is probably not as serious a factor. So you can probably print fully up to the speeds I published.

 

Share this post


Link to post
Share on other sites

M908 P1 S255 which sets something to full value but I don't know the "P" (pin) values as Robert didn't include that part. M908 seems dangerous so I wouldn't mess with it.

 

Sorry, missed that one.

 


/*************************************

pins.h - 1769

*************************************/

#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping

Share this post


Link to post
Share on other sites

Well the M907 and M908 commands don't affect the extruder in any way.

I tried:

M907 E20

M907 E0

M907 E255

M907 S20

M907 S0

M908 P0 S0

M908 P1 S0

M908 P2 S0

M908 P3 S0

M908 P4 S0

Nothing affected the current to the extruder motor. At least it had the same amount of power before it skips regardless. I did all this through pronterface. Maybe you have to put it on the SD card for it to work?

Share this post


Link to post
Share on other sites

Here they are in table form:

temp max volume max speed with .2mm layers

180C 1.59 mm³/sec 20mm/sec

190C 2.97 mm³/sec 37mm/sec

200C 4.24 mm³/sec 53mm/sec

210C 5.59 mm³/sec* 70mm/sec

220C 7.00 mm³/sec 87mm/sec

230C 8.25 mm³/sec* 103mm/sec

240C 9.54 mm³/sec 120mm/sec

 

Nice one, good job!

Just to put in some tolerances here:

I need 235°C for 65mm/s, same configuration as yours...

At least for me, the new, "no manual operation" material feeder is one of the biggest

disadvantages of the UM2, it lacks the tactile feedback...

Time for a tear down ;-)

 

Share this post


Link to post
Share on other sites

Well the M907 and M908 commands don't affect the extruder in any way.

...

Nothing affected the current to the extruder motor. At least it had the same amount of power before it skips regardless. I did all this through pronterface. Maybe you have to put it on the SD card for it to work?

 

DIGIPOTSS_PIN is not defined for this board, so you can't change the motor currents via M907/908:

 


case 907: // M907 Set digital trimpot motor current using axis codes.

{

#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1

for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes)) digipot_current(i,code_value());

if(code_seen('B')) digipot_current(4,code_value());

if(code_seen('S')) for(int i=0;i<=4;i++) digipot_current(i,code_value());

#endif

}

They obviously did it the cheap way, via a filtered PWM on pins 44, 45 and 46:

 


#define MOTOR_CURRENT_PWM_XY_PIN 44

#define MOTOR_CURRENT_PWM_Z_PIN 45

#define MOTOR_CURRENT_PWM_E_PIN 46

...

//Set timer5 to 31khz so the PWM of the motor power is as constant as possible.

TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);

...

void digipot_current(uint8_t driver, int current)

{

#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1

const uint8_t digipot_ch[] = DIGIPOT_CHANNELS;

digitalPotWrite(digipot_ch[driver], current);

#endif

#if MOTOR_CURRENT_PWM_XY_PIN > -1

if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);

if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);

if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);

#endif

}

Hopefully that timer never stops :wink:

 

Share this post


Link to post
Share on other sites

He didn't... he just looked for the point at which the extruder started clicking, to indicate a hard limit had been reached. It's a quick and dirty test, but pretty useful nonetheless. It's possible that the extruder was also under-extruding immediately prior to totally failing and clicking (as I found in my http://www.extrudable.me/2013/04/18/exploring-extrusion-variability-and-limits/ on the UM1... but in order to test that you would have to check the volume of extrusion or, at least, the amount of filament fed in to the extruder. But as I found out, that's a much more painful test to do.

 

Share this post


Link to post
Share on other sites

1) Where did you get the UM2 schematic?

2) Good detective work on the DIGIPOTSS_PIN define. Do you think this is a bug? Do you think I could mess with this and rebuild UM2 Marlin?

 

Share this post


Link to post
Share on other sites

Hopefully that timer never stops :wink:

 

As that timer also controls the heater, and the heater is under watchdog, if that timer stops, the printer will disable everything and halt.

I'm adding M907 for the next UM2 firmware version. https://github.com/Ultimaker/SecretMarlin/commit/38de4aa8b88e2907444a247c0bf81d8cd12a2d41

Note that more then 1.25A on the extruder did not have any effect in our tests.

(As for building the firmware, it can be done with the Arduino IDE, but you have to edit the twi.c file in Arduino. As it uses an interrupt that the new O-LED display code also uses, causing a conflict)

 

Share this post


Link to post
Share on other sites

Is it possible to do this also with ABS?

 

Some day. It's a pretty easy test for anyone to try. I was going to try nylon last night but ran out of time. Possibly tonight but I have lots of things on the schedule for tonight.

 

Share this post


Link to post
Share on other sites

1) Where did you get the UM2 schematic?

 

https://github.com/Ultimaker/Ultimaker2

 

Do you think this is a bug?

Do you think I could mess with this and rebuild UM2 Marlin?

 

1) No, I guess Dhaid (*1*) left it out intentionally.

2) Yes. The code is already about to hit the last stages of entropy. You won't break it (no offense, here !-)

===

(*1*)

Neither I am, nor I know the guy who posted this, but I can't get this out of my head (-;

I very much apologize for this...

 

Share this post


Link to post
Share on other sites

I very much apologize for this...

 

Are you talking about the spelling "Dhaid"? His name is actually "David" but he goes by Daid on the forum. You are welcome to call him David if that is easier. I call him "Daid" so that people who don't know his name don't get confused.

 

Share this post


Link to post
Share on other sites

Yes, I know all of this (and more 8)

But I don't want to hijack your thread, so back to the topic:

I increased the filament driver current a bit and it's definitely working better now,

but I still, really miss the tactile feedback.

I guess I will replace the filament driver with a one that can be used manually.

Also, I tried to exchange a 250°C filament with a 180°C type and vice versa.

Not (safely) possible without a PC attached to the serial port...

 

Share this post


Link to post
Share on other sites

Hey Gr5

Great post here. I am wondering whats the math behind mm3/s and temperature. Is it empirical or is it some how derived based on your graph?

 

The reason i ask should i be doing this for each material spool i have?

 

Uma

gr5 edit: removed massive quote of entire first post.

Share this post


Link to post
Share on other sites

I am wondering whats the math behind mm3/s and temperature. Is it empirical or is it some how derived based on your graph?

 

No math. I just told the extruder to extrude into thin air faster and faster until the stepper started skipping. Unfortunately this doesn't account for additonal pressure of having the nozzle partly blocked .2mm away by the part being printed. So I repeated the test during a real print here:

http://umforum.ultimaker.com/index.php?/topic/4127-um2-extrusion-rates-revisited/

And got slightly lower values for max print speed. You should cut the values in this table in half anyway.

 

The reason i ask should i be doing this for each material spool i have?

 

Seems like a lot of work. If you are running a business and have 10 printers going all day then maybe. But some steppers seem to be stronger than others plus you might have a 10% nozzle clog yet it prints fine but your max speed is lower because of this so really it's going to vary a lot. I just take the max speed from my tests and cut it by 2X or more.

Part of the purpose of this graph is so that people understand that raising the temp by 10C might make their underextrusion problem go away. Or lowering by 10C might cause other problems if they don't slow it down a bit. Also some people claimed the um2 extrusion was worse than the um original (it is for some people but for most printers it's about the same). Also when people post that they printed something at 60mm/sec .2mm layers at 200C and wonder why there is holes in the side I refer them to this graph and show how they are trying to print faster than this graph says you can. They might say "but I printed 75mm/sec just fine before" and I'll say "not at 200C, .2mm layers you didn't".

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Our picks

    • Introducing Ultimaker Cura 3.6 | Beta
      Ultimaker Cura 3.6 | Beta is available. It comes with new features, bug fixes, and UX improvements. We would really like to have your feedback on it to make our stable release as good as it can be. As always, you can download the beta for free from our website, for Windows, MacOS, and Linux.
        • Like
      • 82 replies
    • Print Core CC | Red for Ruby
      Q: For some users, abrasive materials may be a new subject matter. Can you explain what it is that makes a material abrasive when you are not sure which print core to use?
      A: Materials which are hard in a solid piece (like metals, ceramics and carbon fibers) will generally also wear down the nozzle. In general one should assume...
        • Like
      • 30 replies
    • "Back To The Future" using Generative Design & Investment Casting
      Designing for light-weight parts is becoming more important, and I’m a firm believer in the need to produce lighter weight, less over-engineered parts for the future. This is for sustainability reasons because we need to be using less raw materials and, in things like transportation, it impacts the energy usage of the product during it’s service life.
        • Like
      • 12 replies
×

Important Information

Welcome to the Ultimaker Community of 3D printing experts. Visit the following links to read more about our Terms of Use or our Privacy Policy. Thank you!