# Converting a range on high side to a range on low side for very precise voltage sensing in ultra low power application

I have an ultra low power design running on CR2032 where it is critical to monitor precisely the current usage and the primary cell voltage during dev.

So I added a second MCU dedicated to instrumentation, it is powered by its own rechargeable battery and shares GND with the DUT, it also gets the current range from the auto scaling circuit.

Current sensing is done via an auto scaling circuit made of op amps and P MOS (9mR) switching automatically a shunt ladder ranging from 1K to 1R according to the power usage. The operation is standalone and the MCU gets the current range on a GPIO for each range.

Scaling from mV is done by an high side instrumentation amplifier MAX9938.

Conversion is done by the MCU ADC.

This provides a very good precision and is perfect for the current, effectively ranging from nA to uA and mA (can reach A if needed).

The problem is for voltage sensing. The discharge curve of CR2032 is very flat until it drops abruptly at the end of life, thus a sub-millivolt accuracy is a must. Also the useful voltage range is limited, 2.8V to 3.2V at the very most. So with ADC accuracy (12bit) it would make sense to scale 2.7-3.2 to 0-3.3V, for 400/4096=0.09mV steps precision (in a noise free ideal world).

I can do it with opamp in simulation, but it takes a 2.5V voltage ref, a bunch of resistors, a -1V and a +4V rail, all that feels bad and I am pretty sure it will only works in the simulation, I expect it to be off in real world.

So I wonder if anyone has an idea, or knows some trick, to basically scale 2.7 to 3.2V range into 0 to 3.3V, cleanly, with few parts and not too much funny stuffs (I admit that a voltage reference of 3.2V may be necessary).

All that, provided that the DUT and the instrumentation share a GND, so there is no possibility for virtual ground or at least the 0 to 3.3V final signal has to be referenced to GND and scale down to 0V (or close). I wish it could be done with rail to rail single supply opamp. I already have two "special" rails: -8V, -7 (after an LDO) and -2V. I also have 4.0V from the MCU LiP0, and 3.3V from another LDO.

Also, due to the scenario it is mandatory that the impedance to the battery is very high, I can always use the same MAX9938 (25x to 200x) to sense millivolt on high side, but the problem is to introduce this offset so that 2.8V at the battery sense gives 0V at the output.

• You defined a problem and accepted an answer without energy consumption specs for the monitor, device, the battery, nor the communication interface. Why is that? The CR2032 has an energy capacity of 235 mAh and an average effective series resistance, ESR of about 1Kohm. Commented Dec 11, 2021 at 1:15
• Not sure to undersatnd the comment. The "monitor device" consumption is out ofthe scope of this question. As mentioned it is powered by ot own LiPo are we are not interested in monitoring it consumption, the device energy budget is also out of the scope of this question which was only related to high side "span" voltage monitoring. Commented Dec 13, 2021 at 6:23
• In other words you are saying all the discussion of current sensing , and MCU is irrelevant and the 3.3V has 0 error Commented Dec 15, 2021 at 22:51
• Well, i provided enough context information to reply the question, which was : how to get a span on high side. Brhans answered it perfectly. I am not sure what is the purpose of passive agressive comments nor putting words in my mouth. The question is answered and other peoples looking for te same problem will find a clear question and good answer, looks good enough to me. Commented Dec 17, 2021 at 19:45
• A clear question is , How to optimize analog voltage scaling 2.7 to 3.2V input range into 0 to Vref=3.3V with <x % accuracy.? Then a simple answer can be = Compute Gain & Offset from ΔMean and ΔRange Commented Dec 18, 2021 at 11:25