I wanted to open up a discussion about ways to improve pressure advance functionality in the future, especially for bowden based printers.
I'll describe my experience and setup first. I am running a custom extruder drive that uses a 5:1 geared stepper, driving a set of Bondtech dual drive gears. It has been relocated high and central, embedded in a bearing mount to allow rotation. This has let me minimize the bowden length to 450mm of Capricorn tubing. From there it goes through an E3D V6.
With everything I can think of done mechanically to improve extrusion response, I worked on tuning pressure advance. Adapting code from the Marlin linear advance calibration print (https://marlinfw.org/tools/lin_advance/k-factor.html), I honed in on S values for my printer. Even using "fast" and "slow" values that aren't very extreme (25 mm/s & 65 mm/s), I need S values around 1.4 to achieve a constant extrusion width through these speed changes.
While the test print looks great, getting real world prints to work with M572 S1.4 (or even S0.5 for that matter) has been an unsuccessful challenge so far. There seems to be some combination of factors in real prints that upsets the pressure advance algorithm. You have a lot of influence in tuning motion, with pressure advance enabled, using E axis jerk and acceleration. I found the best balance to be a fairly high max E_accel (8000 mm/s/s), and lower E_jerk (4 mm/s), for a max E_speed of 40 mm/s.
For certain prints, like cylindrical shells, where everything is concentric walls and you have long periods between acceleration and deceleration, this can work very well. But, once you get into normal infill, with lots of reversals and direction changes, it seems to lose control of extrusion rate and tend towards over-extrusion.
From watching the extruder action when it is not working well, I noticed some things. Mainly, that corrections can come in such rapid succession that the hope of having their affect time with the nozzle seems unlikely.
I don't know the details of the current implementation, but this is my understanding: Any given extrusion rate is associated with a certain nozzle pressure, which requires a certain amount of filament/extruder preload to achieve (determined with the S value). This amount is added at the beginning of any acceleration (as fast as the extruder axis settings allow), and the print head motion is bounded in acceleration/jerk to prevent it from outpacing the extruder. Everything is reversed during deceleration. This approach of forcing synchronization probably works pretty well with very small S values (direct drive printers). But I think it falls apart at larger values.
One question I have: Is pressure advance taking into account XY jerk and net XY acceleration, when deciding whether to act? I swear I have seen it taking action during print head direction changes that appear to keep the nozzle at a constant velocity, either through jerk, or by X deceleration being made up for by Y acceleration. Maybe I am mistaken.
My best ideas at the moment:
try to look ahead in the motion planning and determine the amount of time where extrusion rate will not match print head speed; choosing to stay inactive unless that time exceeds a user defined value. My gut says that if the mismatch time is under say 50 ms, there wouldn't be an observable quality difference with or without PA, and staying inactive could save a lot of E axis "chatter".
acknowledge that there is a time delay between a PA compensation and a change in nozzle pressure / extrusion rate. Ideally, through another user defined parameter, you attempt to correct for this delay. But, it's possible that this is very difficult to implement.
allow de-synchronization of the print head and the extruder. The more time the print head spends accelerating or decelerating, the more opportunity we have for extrusion rate mismatch. With no pressure advance, I tend to get the best results when XY accel and jerk allow for very crisp motion. Allowing the print head to move unrestricted and have the extruder just "do its best" for E max values defined, may offer some improvement. Maybe just an M572 flag to enable this behavior.
I definitely don't think that I have this all figured out. So, I'd love to hear from other people and their bowden pressure advance experiences, where I might be wrong, and what other ideas are out there!