The power supply comprises a toroidal transformer and three PCBs, with their functions illustrated in a simplified block diagrams.
From a circuitry standpoint, the power supply is designed as a linear analog system with two control loops regulated by a 16-bit DAC AD5663 (initially, a 12-bit DAC LTC2632 was used, and the new DAC is wired in). A 16-bit ADC LTC1865 is used to measure voltage and current. Both the ADC and DAC communicate with the MCU via an optically isolated SPI bus. As error amplifiers, I used OPA140 operational amplifiers, whose outputs are merged through diodes to control MJE15030A power transistors in a Darlington configuration with BDW93 and BC846. To minimize thermal losses on the transistors, a toroidal transformer with four windings was used, which switches according to the set output voltage.
The output current is measured as the voltage drop across a 10-milliohm resistor, which is further amplified by an OPA228 operational amplifier with a gain of 50. An IC REF5040, providing a 4.096V output, is used as the voltage reference for both ADC and DAC.
The power supply is controlled by a PIC32MM0256GPM028 microcontroller, with firmware written entirely in C (including graphic libraries) in the MPLAB X environment. Eagle CAD was used for PCB design, and the enclosure was created in Fusion 360.