After 6 months of basically living in fear (flaming motor controller episode), I have finished the DC + Encoder printhead controller.
The theory of operation is that the dotline (~800 12-bit dots) is stored in the ATmega328’s RAM, and the printhead is starts a velocity controlled (not position controlled) movement across the plate.
Every 1ms, the controller queries the position, looks up the ink pattern in the table, and fires an ink dotline (12 dots). Velocity control mostly eliminates the jerkyness of position control, and is easier to program. It’s pretty fast (for an ATmega325) right now, and there’s much room for improvement. (Ie using integer math instead of multiple mm to DPI conversions).
The controller allows both single-pass bi-directional and double-pass bi-directional support.
This technique (velocity control instead of position control for DC + Encoder) should allow for much faster printing with a faster head. The HP C6602 is very slow (1ms per dot) when driven according to spec, and the ATmega328 can’t go much faster than that without losing encoder ticks.
A Arduino UNO and a faster head should allow for much faster printing, but that will have to wait for the someone else – I am planning on using a ‘stock’ Canon PIXMA i9900 for the next iteration, using standard printer drivers to render each ‘page’, with a ATmega328 faking the page-present/page-out/encoder-tick signals – more to come on that project later.