I have a reasonable idea on how the circuit should look like. However there are a few points, where one has to decide what is really aimed for. The main points to choose are:
1) Reference. This might be something like 1 x LM399, 2 x LM399, 2 x 1N825, ... 2 x LTZ1000 ?
Here the main point is starting from about 7 V or 14 V. Starting from 14 V would be more stable as there would be no amplification set by resistors and still affordable with LM399 or 1N825
2) Output stage with gain, or without. Without gain would be easier, but the maximum voltage would be some 11 or 12 V.
With gain one could get something like twice the voltage as a second range.
3) How much output power is needed. A higher current output stage might want some extra protection, like a variable current / power limit.
4) Especially with gain, there is the question on how to realize gain switching and maybe polarity reversal would be done.
Switching could be with something like max327 (expensive CMOS switches), JFETs or relays or maybe mechanical switches.
5) For the version with gain, the question is if gain check needs an external reference or not.
6) Which µC to choose to create the PWM and how to enter the values. Not really critical - more like hard to get consensus because of personal preferences.
7) provisions for smaller voltages, especially below 1 V. Should be something like a divider and buffer - so this could be separate.
how to do the negative side sensing: This could use an extra amplifier, which would be the circuit that is easier to understand. Alternatively one might use a floating reference circuit, which slightly depends on the reference used: The circuit would be a little more tricky, but could be less critical parts.
9) how much ADC resolution for zero sensing, maybe other uses. Here it's mainly µC internal (e.g. 10 Bit) or maybe an SD-ADC chip like MCP3421.
10) how much input / output protection: Especially the output is hard to protect very well against external higher voltage
My preference so far would be:
- Starting from 2xLM399 or 2x1N825A (optional footprint, slightly lower voltage)
- Output stage for some 100 mA max with limits at about 1 mA , 10 mA , 100 mA via mechanical switch, limited sink capability.
- Output stage likely with optional gain (e.g. x 2), but no polarity reversal
- Gain switching with JFETs ( 2 Settings)
- Sense lines with not very high input impedance - so kind of a slight compromise here.
- Floating reference for negative side sense
- PWM from AVR (e.g. Mega88), directly coupled. Control via isolated UART from PC. Only minimal function in the AVR , CAL etc. on the PC side.
- PWM switching with 2x DG419 for the main part and 74HC4053 for the fine part.
- external supply with some +25-30 V (if with gain), + 15 V, + 5 V, -10 V
- not sure about zero sense ADC
The point however is that I currently don't have much time and an other project to go first.