← Back to Portfolio

Reverse-Engineering a Server PSU into a High-Current BMW Charger

Date: August 2026 | Tech: Delta/Dell DPS-1100BB Server PSU, dsPIC33FJ64GS606, Analog Feedback Loops, Multimeter & Oscilloscope Reverse Engineering


🎥 Watch the Build — 4-Part Video Series

Part 1 video thumbnail
Part 1 — Turning ON
Part 2 video thumbnail
Part 2 — Increasing the Output Voltage
Part 3 video thumbnail
Part 3 — Reassembly and Testing
Part 4 video thumbnail
Part 4 — How I Figured Out How to Increase Voltage

Overview

I picked up a Dell/Delta Electronics D1100E-S0 (DPS-1100BB) server power supply — a 1100 W, 80 PLUS Platinum unit that outputs a fixed 12.2 V and actively regulates that voltage while delivering up to 90 A. These show up used for about $30 on eBay, a small fraction of the cost of a purpose-built bench supply with a similar current rating.

The label on the underside of the D1100E-S0: 12.2 V @ 90.16 A, 1100 W, 80 PLUS Platinum.
The label on the underside of the D1100E-S0: 12.2 V @ 90.16 A, 1100 W, 80 PLUS Platinum.

My goal was to modify the output so I could use it as a high-current supply for keeping my BMW's battery topped up while I flash its ECUs — a process that can pull the battery down and cause a flash to fail if the supply voltage sags. That meant two things had to happen: the supply had to turn its main output on without a server motherboard telling it to, and its regulated voltage had to be pushed from 12.2 V up toward the ~13.8–14 V a car's alternator would normally provide.

There are already a handful of guides online for doing this kind of hack to common HP server supplies, but this particular Dell/Delta unit turned out to be electrically quite different and considerably more involved to reverse-engineer, since none of the existing writeups line up with its pinout or feedback topology. In the absence of a datasheet, everything below was worked out with a multimeter, an oscilloscope, and a lot of continuity testing.

Step 1: Turning the Power Supply On

Simply plugging in mains power isn't enough to get a usable output — server PSUs like this one expect a motherboard to assert several control signals over a multi-pin header before they'll enable their main output. Plugging it in only lights the status LED green:

Status LED turns green as soon as mains power is connected.
Status LED turns green as soon as mains power is connected.

That green light doesn't mean the main +12 V output is live, though — at this point it reads next to nothing (about 1.8 mV) at the main output terminals.

Main output terminals reading ~1.8 mV with only mains power applied — the main rail isn't enabled yet.
Main output terminals reading ~1.8 mV with only mains power applied — the main rail isn't enabled yet.

The large terminal on the edge is the main +12 V output, and the terminal in the center is ground. What is already live at this stage is standby power, available from a smaller terminal in the center when the unit is flipped over — it reads a solid 12 V, but can only source about 3 A, nowhere near enough for what I needed.

Standby power already reads 12 V before the main output is enabled (max ~3 A).
Standby power already reads 12 V before the main output is enabled (max ~3 A).
Flip side: the edge terminal is main +12 V, the center terminal is ground, reading 0 V for now.
Flip side: the edge terminal is main +12 V, the center terminal is ground, reading 0 V for now.

Enabling the main output meant working out the control header. It's a 24-pin connector, twelve pins on each side.

The 24-pin control header, 12 pins per side.
The 24-pin control header, 12 pins per side.
Control header, opposite angle.
Control header, opposite angle.

Mapping the Control Pins

With no datasheet, I had to reverse-engineer the header pin by pin. First, with a multimeter in continuity mode, I found which pins are grounded by default: pins 6 and 10 on the top row, and pins 16, 18, 20, and 22 on the bottom row.

Next, I measured which pins carry voltage while the unit is only in standby (main output still off):

PinVoltage in Standby (V)Purpose
10
20
30
40
53.3
60GND
70
80
90
100GND
110
120
132.1Possibly a PWM or feedback pin (output of a resistive divider)
143.3
1512Potentially indicates standby power
160GND
173.3
180GND
193.3
200GND
210
220GND
230
240

Based on the pattern — two pins that looked like they might be logic enables sitting near 2–3.3 V — I tried shorting pins 13 and 14 together and then to ground (a technique suggested by a resource describing a similar, unrelated supply), and that turned out to be exactly right. The cooling fan spins up immediately and the main output jumps to 12.2 V.

I soldered pins 13 and 14 together, and added a small switch between that joined pair and ground so I could turn the main output on and off at will. Since I knew I'd need reliable ground and +12 V tap points later, I also soldered dedicated ground and power leads directly onto the output copper at this stage.

Pins 13 and 14 bridged together, with a switch wired from the joined pair to ground.
Pins 13 and 14 bridged together, with a switch wired from the joined pair to ground.

A word of advice here: use flux when soldering onto the large copper output pads. They're a big thermal mass and tend to have surface oxidation, so without flux it's genuinely difficult to get solder to wet the pad.

Dedicated ground tap soldered onto the output copper.
Dedicated ground tap soldered onto the output copper.
Dedicated +12 V power tap soldered on alongside it.
Dedicated +12 V power tap soldered on alongside it.

With the switch wired up, flipping it turns the main output on:

Main output live and drawing a load after closing the switch between pins 13/14 and ground.
Main output live and drawing a load after closing the switch between pins 13/14 and ground.

Re-measuring the header with the main output now enabled filled in the rest of the picture:

PinStandby (V)Main Power On (V)Purpose
10
20
30
40
53.3
600GND
70
80
90
1000GND
110
120
132.10Must connect to GND to enable main power
143.30Must connect to GND to enable main power
151212Potentially indicates standby power
1600GND
173.33.3
1800GND
193.33.3
200
210
2200GND
230V_OUTRemote Sense (+)
2400Remote Sense (−)

Part 2: Raising the Output Voltage

With the supply turning on reliably, the next problem was voltage: I needed roughly 13.8–14 V, and the supply is hard-regulated to 12.2 V. My first approach followed the same trick used on similar HP supplies: exploit the remote-sense input.

Pins 23 and 24 turned out to be Remote Sense (+) and Remote Sense (−). The idea behind remote sensing is that the supply measures its own output voltage right at the load (compensating for cable drop) rather than at its own terminals. If you feed the sense pin a voltage lower than what's actually present at the output, the control loop "thinks" the output has sagged and cranks the real output voltage up to compensate.

Since the remote-sense (+) pin already sat at the full 12.2 V, it had to be pulled up to the output through some internal resistance. Grounding it through an external resistor would form a voltage divider with that internal resistance, pulling the sensed voltage down and, in theory, pushing the real output up. I tried a range of resistor values from the sense pin to ground and logged the resulting output voltage:

Resistor to GNDOutput Voltage (V)
Open circuit12.34
120 kΩ12.36
17 kΩ12.39
10 kΩ12.59
5 kΩ12.67
570 Ω12.67
100 Ω12.67

The output voltage plateaued at 12.67 V no matter how low I pushed the external resistance — a gain of only about 0.4 V, far short of the 13.8 V+ I needed. That plateau is the signature of a fixed internal resistance in series with whatever I add externally: even at 0 Ω external resistance, there's still a finite internal resistance holding the divider ratio, and hence the sensed voltage, above a floor. The remote-sense trick that works on other supplies had hit a hard limit on this one.

Opening the Case and Tracing the Feedback Network

With remote sense maxed out, the only path left was to find the actual voltage-feedback network inside the supply and modify it directly. That meant opening the case.

Safety note: the primary-side bulk capacitor in a supply like this can hold a lethal charge well after it's unplugged — up to roughly 400 V on a 230 VAC mains input, or about 200 V on a 120 VAC input (VRMS × √2). Let it discharge on its own, or discharge it manually, before opening anything up.

After removing all the case screws, the outer shell comes off:

Outer casing removed.
Outer casing removed.

and the main board can be separated from the housing:

Separating the main circuit board from the housing.
Separating the main circuit board from the housing.
Board free of the housing.
Board free of the housing.

With everything exposed, it's worth being deliberate about not letting bare connections touch — I covered the terminals I'd already soldered to with electrical tape to guard against accidental shorts while probing around.

Exposed terminals covered in electrical tape to prevent accidental shorts.
Exposed terminals covered in electrical tape to prevent accidental shorts.

Here's the overall layout and major ICs inside — starting with the reverse side of the main board:

Reverse side of the main board.
Reverse side of the main board.

There are two daughterboards stacked on top of the main board: one built around a PIC microcontroller, and a second carrying the DAC and over-voltage-protection circuitry.

Daughterboard carrying the PIC microcontroller.
Daughterboard carrying the PIC microcontroller.
DAC section.
DAC section.
Over-voltage-protection section.
Over-voltage-protection section.

The whole board is a double-sided PCB with two daughterboards layered on top — considerably more complex than the single-board designs the existing HP writeups deal with. The obvious starting point was to trace pin 23 (remote sense +) and see which components it actually connects to.

Tracing continuity from pin 23 (remote sense +) into the board.
Tracing continuity from pin 23 (remote sense +) into the board.

That trace led to two resistors: one running from remote sense (+) straight to the 12 V output, and a second running to a pin on an unmarked comparator IC — unmarked, so no datasheet was going to help here. Since most of the logic on this board runs at 3.3 V, there had to be a third resistor tying that comparator input down to ground, forming a divider that scales the 12 V output down before it's sampled. Probing around confirmed a divider network that was consistent with everything I'd already observed by varying the remote-sense resistor.

Resistor divider network feeding the comparator input.
Resistor divider network feeding the comparator input.
Continuity-tracing the divider's ground return.
Continuity-tracing the divider's ground return.

Since the comparator IC itself was unmarked and unidentifiable, this path hit a dead end. I turned my attention to the over-voltage-protection circuit instead, on the theory that the supply might be hitting an OVP clamp that was independently limiting the output. That circuit is built around an LM393 dual comparator — but next to it sat a transistor-like component marked only “64” that I couldn't identify either (it wasn't a BJT: there was no pair of body diodes across its terminals, which you'd expect to see).

LM393 over-voltage-protection comparator, next to the unidentified “64”-marked component.
LM393 over-voltage-protection comparator, next to the unidentified “64”-marked component.

I ultimately set that theory aside: if the supply were actually hitting an OVP fault at 12.7 V, I'd expect to see a corresponding fault code on the PMBus (I did connect to the PMBus during this project, but lost the logged data, so I'm not including it here). More importantly, even if this LM393 circuit were what was clamping the output when I adjusted the remote-sense network, its output would still have to feed back into one of the two on-board microcontrollers — one of which handles the AC input and voltage downconversion side, the other of which handles output voltage feedback. Since the daughterboard microcontroller sits physically closest to the output circuitry, I assumed it was the one responsible for voltage regulation, and shifted my search there.

Finding the Feedback Pin on the Microcontroller

The main daughterboard is built around a PIC33FJ64GS606. Continuity testing couldn't find a direct path from the 12 V output into the daughterboard, which meant there had to be a buffer, resistor, or other component in between — so instead I powered the unit up and probed live, looking for a point on the daughterboard that read close to 12 V.

I pulled the microcontroller's datasheet to locate its ADC-capable pins:

Microchip dsPIC33FJ64GS606 product page
dsPIC33FJ64GSX06/X08/X10 family datasheet (PDF)

Locating the ADC-capable pins on the dsPIC33FJ64GS606 pinout.
Locating the ADC-capable pins on the dsPIC33FJ64GS606 pinout.

I then probed every one of those ADC pins, looking specifically for anything reading between 0 and 3.3 V — a candidate feedback-sense input. I had a specific target in mind: I'd read that this supply family has an over-voltage cutoff around 14.5 V, and if that's true, whatever ADC samples the output should read 3.3 V exactly at that 14.5 V cutoff. At the nominal 12.2 V output, that same ADC should read (12.2 / 14.5) × 3.3 V ≈ 2.77 V, so that's the value I was hunting for.

Probing ADC pins on the daughterboard, watching for a reading near 2.7 V.
Probing ADC pins on the daughterboard, watching for a reading near 2.7 V.

I found a pin reading right around 2.7 V — a strong candidate for the feedback input.

Candidate feedback pin reading ~2.7 V.
Candidate feedback pin reading ~2.7 V.
Confirming the reading with the meter.
Confirming the reading with the meter.

To confirm it, I repeated the remote-sense-resistor experiment while watching this pin directly. Grounding the remote-sense pin through a 5 kΩ resistor only pulled this candidate pin down to about 2.6 V, and a 570 Ω resistor pulled it down to about 2 V — moving in exactly the direction and magnitude I'd expect from a real feedback node.

Feedback pin dropping to ~2.6 V with a 5 kΩ resistor on remote sense.
Feedback pin dropping to ~2.6 V with a 5 kΩ resistor on remote sense.
Feedback pin dropping to ~2 V with a 570 Ω resistor on remote sense.
Feedback pin dropping to ~2 V with a 570 Ω resistor on remote sense.

Right next to that pin on the microcontroller, I found a second pin that tracked the 12 V output directly — and, as expected, when I applied the remote-sense resistor and the real output voltage rose, this second pin's reading rose right along with it, confirming both pins were part of the same feedback path.

Adjacent pin tracking the main 12 V output on the daughterboard.
Adjacent pin tracking the main 12 V output on the daughterboard.
Reading rising alongside the output as remote-sense resistance is applied.
Reading rising alongside the output as remote-sense resistance is applied.
Confirming the correlation between the two pins.
Confirming the correlation between the two pins.

Tracing the Resistive Dividers

To actually change what the microcontroller reads as feedback, I needed to find the resistive divider(s) that scale the 12 V output down into the 3.3 V range the ADC expects, and modify them. I traced one end of a resistor (silkscreen-labeled 07C) back to the 12 V rail:

The 07C resistor traced back to the 12 V rail.
The 07C resistor traced back to the 12 V rail.

The other end of 07C connects to a resistor/capacitor pair in parallel, whose far sides both go to ground — the classic lower leg of a resistive divider.

07C's far side meeting a parallel resistor/capacitor pair.
07C's far side meeting a parallel resistor/capacitor pair.
Confirming the far side of that pair returns to ground.
Confirming the far side of that pair returns to ground.

Right next to it, a second resistor (labeled 54C) also connects to the 12 V rail, and its other end feeds into another resistor (02C) with a parallel capacitor, again returning to ground — a second, independent divider mirroring the first.

54C resistor, also tied to the 12 V rail.
54C resistor, also tied to the 12 V rail.
54C's other end feeding into 02C and a parallel capacitor.
54C's other end feeding into 02C and a parallel capacitor.

So there are two independent resistive-divider networks sensing the output voltage, and both happen to share almost the same divide ratio — roughly 0.22, putting each divider's midpoint at about 12.2 × 0.22 ≈ 2.68 V, which lines up neatly with everything I'd measured so far.

Both divider networks converging on the same ~0.22 divide ratio.
Both divider networks converging on the same ~0.22 divide ratio.

The midpoint of the first divider (50B and 07C) feeds pin 13 on the microcontroller (an ADC-capable pin), and the midpoint of the second divider feeds the tied-together pins 14 and 15.

First divider midpoint (50B/07C) landing on microcontroller pin 13.
First divider midpoint (50B/07C) landing on microcontroller pin 13.
Second divider midpoint landing on the tied pins 14/15.
Second divider midpoint landing on the tied pins 14/15.
Continuity-confirming the second divider's connection.
Continuity-confirming the second divider's connection.
Full picture of both dividers feeding the microcontroller.
Full picture of both dividers feeding the microcontroller.

Building the Trim Circuit

Earlier, I'd seen that adding external resistance at the remote-sense pin and raising the real output voltage caused the voltage at the resistive dividers to drop. That makes sense: to trick the microcontroller into regulating for a higher output, I need to reduce the voltage it sees at these divider midpoints directly, which means lowering the effective resistance of the lower leg of each divider. The straightforward way to do that is to solder an additional resistor in parallel with each existing lower-leg resistor.

Conveniently, there were already exposed test points at both divider midpoints, so I tacked fine tie-wire onto each one to bring the nodes out to somewhere I could work with them.

Tie-wire soldered onto the divider midpoint test points.
Tie-wire soldered onto the divider midpoint test points.

It's worth keeping the stripped ends of these wires as short as possible — both to avoid an exposed end shorting against a neighboring component, and because a shorter wire picks up less noise on what is, after all, a sensitive ADC input.

Tie-wires kept short to minimize the risk of shorts and ADC noise.
Tie-wires kept short to minimize the risk of shorts and ADC noise.

Bringing the nodes out this way let me try a range of parallel resistor values rather than committing to one. I worked out the target resistor values with a quick set of divider calculations:

Divider calculation, page 1.
Divider calculation, page 1.
Divider calculation, page 2.
Divider calculation, page 2.
Divider calculation, page 3.
Divider calculation, page 3.
Divider calculation, page 4.
Divider calculation, page 4.
Divider calculation, page 5.
Divider calculation, page 5.
Divider calculation, page 6.
Divider calculation, page 6.

A 50 kΩ variable resistor turned out to be sufficient headroom for the first divider — at its maximum resistance, the divide ratio is already down to about 0.21, close enough to the stock 0.22 that it barely perturbs the loop at the low end of the pot's range.

50 kΩ potentiometer sized for the first divider.
50 kΩ potentiometer sized for the first divider.

Likewise, a 100 kΩ variable resistor was sufficient for the second divider, again landing around a 0.21 ratio at maximum resistance.

100 kΩ potentiometer sized for the second divider.
100 kΩ potentiometer sized for the second divider.

Dialing In the Voltage

With a variable resistor wired onto the first divider, the output climbed to 13.2 V:

Output voltage reaching 13.2 V with the trim pot adjusted.
Output voltage reaching 13.2 V with the trim pot adjusted.

Turning the pot further counterclockwise pushes the voltage higher still:

Output climbing further as the trim pot is rotated.
Output climbing further as the trim pot is rotated.

But there's a limit: keep reducing the resistance and eventually the over-voltage protection trips. When that happens, the status LED starts blinking yellow (fault mode), and simply toggling my manually-added on/off switch isn't enough to clear it — the supply needs a full power cycle to reset.

Over-voltage protection tripped: status LED blinking yellow.
Over-voltage protection tripped: status LED blinking yellow.

Adjusting only one of the two dividers, I could reach at most about 13.85 V before triggering OVP.

Maximum of ~13.85 V reachable while adjusting only one divider.
Maximum of ~13.85 V reachable while adjusting only one divider.

Adjusting both dividers together, though, pushes the ceiling higher, since neither ADC input alone reaches the microcontroller's trip threshold as quickly.

Higher output achievable once both dividers are trimmed together.
Higher output achievable once both dividers are trimmed together.

Rather than leaving two bare trimmer pots dead-bugged into the supply, I built a small dedicated board with two potentiometers — one per divider — to make the output voltage easy to tune after reassembly.

Small trim board with two potentiometers, one per divider, wired to the daughterboard.
Small trim board with two potentiometers, one per divider, wired to the daughterboard.

Load Testing

After reassembling the case, I soldered a pair of low-gauge (large-diameter) wires directly to the main output to handle real current, and set up a load test with a high-current DC motor.

Reassembled supply with heavy-gauge output leads for load testing.
Reassembled supply with heavy-gauge output leads for load testing.

The motor was pulled from the blower assembly of a 2014 BMW 750i with seized bearings — a known high-current draw, which made it a convenient stand-in for a real automotive load.

Blower motor from a 2014 BMW 750i used as the test load.
Blower motor from a 2014 BMW 750i used as the test load.

Current was measured with a clamp ammeter, which had a zero error of −2.6 A that needed to be accounted for in the readings.

Clamp ammeter zeroed out, showing a −2.6 A offset before any load is applied.
Clamp ammeter zeroed out, showing a −2.6 A offset before any load is applied.

With the trim pots set to bring the output to 13.91 V, I powered the motor:

Output set to 13.91 V immediately before energizing the motor.
Output set to 13.91 V immediately before energizing the motor.

The clamp ammeter read 17.8 A, which, correcting for the −2.6 A zero error, works out to roughly 21 A actually flowing into the motor. Under that load, the output sagged from 13.91 V to about 13.75 V — a drop of only 0.15 V, which is well within what I'd consider acceptable regulation for this application.

Ammeter reading 17.8 A (≈ 21 A corrected) while the motor runs at ~13.75 V.
Ammeter reading 17.8 A (≈ 21 A corrected) while the motor runs at ~13.75 V.

With the output holding steady at nearly 14 V under a 20 A+ load, the converted supply is now doing exactly what it needed to: acting as a stand-in alternator to keep the BMW's battery voltage up while its ECUs are being flashed.

Click text to edit it. Drag a photo's ≡ handle to reorder it within its row. Nothing saves until you hit Export — that downloads the edited file for you to drop back into your Drive folder.