If my understanding of electronics is wrong, I'm willing to be corrected, provided there is justification provided. To answer your questions in turn:
I'm concerned about the range of amplifiers because I need to be able to precisely control voltage (very precisely, as some batteries have small mAh ratings and voltages) and if I am charging a dead Ni-Cd cell it could be at 0.7 something volts and so I need to be able to produce that voltage. What I have read is that amplifiers can't achieve rail voltage precisely... there's a couple of volts of buffer they need. The upper end is no problem. I can supply 100V to the amp if I want to. However I can't supply less than 0V without a split PS. Therefore the amp can never get close to 0V. I don't need exactly 0V but if I need 0.7 I still haven't seen an amp that can do that if your PS references ground.
As to what I am charging... everything: Ni-Cd, Ni-MH, Lithium, Alkaline, Lead Acid, you name it. Different algorithms for all of them. Different cell counts, different charge rates, discharge, exercise, the whole works.
Yes, I've built a fully completed prototype which at the moment requires my massive 20lb brick of a split power supply to run it. Unfortunately, the ground plane on my board is so tiny because the board itself is so tiny that the ground voltage is unstable and the FETs and amp are going crazy - it's sort of by luck whether or not they settle when I power the thing on or whether they try to supply infinite amps. I will have to rebuild the thing all over again.
Can't edit the schematic unfortunately because I lost it in a computer failure. This forum is the only repository of that picture now.
C1, R6 and the transistor that follows are meant to allow conversion of PWM from the AVR into DC voltage, which can still be instantly chopped at high frequency into a square wave if desired but without the disadvantage of charging effects, since the cap is before the resistor. It's basically signal conditioning so that I don't have to mess with the high voltage, high current side, where it would be hazardous and tricky to do so. I ran the values through a transfer function plotter to get the time constant I wanted and a level of ripple I could live with.