The Problem
Batteries are weird.
I’m talking seriously weird, and worse, each battery type is weird in its own special ways. The basic facts of the CR2032 used in the R47 are:
- The “3 V” claim stamped into the positive anode is neither the starting voltage nor the ending one.
- ESR starts high — at least 10 Ω — and rises as the cell ages, especially near end-of-life.
- The voltage drops continuously, even with no load on it.
- That drop is nonlinear, being a function of:
- the specific chemistry used
- manufacturing variance
- recent current draw
- past abuses
- temperature
- corrosion
- The voltage recovers after a big draw, but only to a point.
“ESR” is an attempt to model a battery1 as a voltage source with a resistor in series, but it is an imperfect way of thinking about the real complexities involved, which is why chemical voltage cell manufacturers rarely specify ESR at all. It is more an empirical notion used in thinking through engineering problems.
Digital chips have a brownout voltage spec below which they will fail to work properly. The particular microcontroller used in this calculator has a brownout reset (BOR) feature to detect this condition and hold the CPU in the reset state as long as the supply voltage is too low. SwissMicros’s DMCP5 SDK publishes an opaque API only, not the actual source code, which leaves us to presume that they left the BOR threshold at its default settings. If true, the R47’s minimum supply voltage is about 1.7 VDC, but realize that this would be a hard minimum, leaving zero margin to cover unspecified supply drops between the coin cell holder and the actual VBAT pin on the CPU chip. Now add the fact that if the CPU cannot operate reliably due to a low-voltage condition, the firmware does not run and therefore cannot report this to the user! This is why the point where the R47 firmware begins warning is set at a conservative 2.5 V.
Finally, we must add in a calculator’s dynamic behaviors, which takes this static picture and makes it time-dependent.
The SwissMicros hardware platform underlying the R47 includes rail capacitors to combat these problems, effectively lowering ESR. Alas, they deplete quickly under load, causing the CPU’s power pin to “see” the cell’s raw ESR under prolonged loads, as occurs while holding a key down or executing a long-running program.
You may be aware of some or all of this already, intellectually, but it takes seeing the problems that result from all this to properly grok the problem space. This article’s core program will provide one such visual aid.
Methods of Measurement
Because CR2032 datasheets tend to be unsatisfying2 and good app notes both far between3 and at best partially applicable to our use cases, we find ourselves resorting to local measurements.
There are a number of ways to try determining whether a CR2032 cell is dead or about to die.
From worst to best, the common ones are:
Digital multimeter: If you pull the coin cell out of the holder and put it between a DMM’s probes, that puts roughly 10 MΩ across it, which is as close to infinite as matters in this type of measurement; there is no meaningful load on the coin cell. Since we have already pointed out that cell voltage is a function of load, this means as soon as you pop that cell back into the calculator and turn it on, you will get a different voltage, guaranteed.
What, then, does this test tell us?
Darn near nothing, is what. It can tell you that a cell is dead, dead, dead ☠️ but it cannot predict imminent failure in time to do anything about it. Worse, it can give a false indication of a healthy cell, because it is not testing anything like the working condition.
I was a DMM nerd long before I became a calculator nerd, but for this, they are very much the wrong tool.
Static load: To cope, some people then recommend putting a small load across the cell, such as a middling-big resistor chosen to give something in the milliamp range. (Our nominal 3 V ÷ 3 kΩ = 1 mA.) Another method I have seen is to use a galvanometer type analog meter, often called a volt-ohm-milliammeter (VOM) after the functions these typically provide. You may also see these called a “moving coil meter.”
The 20 kΩ/V a typical VOM puts across the circuit under test is significantly lower than the 10 MΩ likely of a DMM, producing a proportionately greater current burden at lower test voltage ranges. We can exploit that nonideality in cases like this to give a “loaded” test. For the 3.3 V maximum we can see from a fresh CR2032, let us say our meter’s closest range is 5 V, resulting in a 100 kΩ load.
Alas, this causes the cell to drive a mere 25 µA through the meter down at the critical 2.5 V point where we most want it to make a go/no-go distinction for us. That is scarcely more than the idle running current draw of the modern power-sipping microcontroller in the R47, making this test a poor model of real-world behavior. If we’re forced to a 10 V measurement range or worse, the burden resistance rises, causing the test current to drop below even this modest threshold.
While a VOM or resistor load test is better than a simplistic out-of-circuit DMM test, it still fails to account for the dynamic loads placed on the cell by the calculator.
Low battery indicator: Ideally, this option gives the circuit designers and the firmware implementors a chance to characterize their work products when powered by the chemical cell types they recommend, under their specified operating limits. This then allows a reasonable prediction of a low-voltage condition in time to arrange a swap.
In practice, even when the device’s design team do their jobs to the best of their abilities, there will be a segment of end users that then go out and pick whatever looks good while shopping, irrespective of manufacturer recommendations. These same users will ignore temperature ratings and more, heaping inaccuracies on the operating points specified by the device’s designers. The more adverse characteristics from the list at the top of this article, the less useful this measurement can be even in the best case.
(Incidentally, if you would like to know how the R47 firmware combats these realities, Jaco Mostert wrote it up.)
Dynamic out-of-circuit: For many years, I’ve been a fan of the ZTS MBT-1 tester because it avoids or mitigates the above problems. The dynamic load it puts on the cell coupled with a knowledge of general characteristics of particular cell types allows it to make reasonable predictions of remaining lifetime. It is not perfect, but it is less imperfect than the alternatives above.
Dynamic in-circuit: We can rescue the near-useless open-circuit DMM test idea by:
- removing the R47’s back plate;
- carefully clipping test leads to the CR2032 holder;
- running a program that puts a representative load onto our R47;
- capturing the resulting voltage data over time at regular intervals; and
- graphing these data
That gives us a realistic dynamic test load, and if we use a proper data logger or a fast DMM with logging features built-in, we get an accurate plot of how the coin cell behaves under this load, allowing us to make confident predictions of its near-term behavior.
Option 6: Better Living Through Programming
But what if we did not want to go through all the hassle of Option 5?
As it turns out, we can ask the calculator to make its own measurements, then automatically graph the results:
LBL ‘VolTest’
CLΣ ; clear prior stats
LocR 02
15 ; count of measurements to take
STO .00 ; loop control variable
STO .01 ; constant copy to be used below
GTO b ; take first measurement unloaded
LBL h ; (h)it the juice
PAUSE 09 ; let it recover from last iteration first
10 ; 10 reps = ~0.1s + PAUSE = ~1s per datum
STO 00
1.23456789 ; degrees, radians, or grads; doesn't matter
LBL d ; (d)raw cell voltage down by…
SIN ; …performing pointless busy-work
ARCSIN
DSZ 00
GTO d
DROPx ; clean up mess, then fall thru
LBL b ; record a (b)attery measurement
BATT?
RCL .01
RCL- .00 ; loop countdown to 0-based X index
Σ+ ; save data point
DSZ .00
GTO h ; more measurements wanted, so (h)it it
PLSTAT ; report results graphically
RTN
END
You may download that program here. Click the “Download” link, plug the R47 into your computer via USB-C, then go to 🟧 PREF ActUSB and then drag the VolTest.p47 file into the PROGRAMS folder that appears. Eject the USB disk from the OS, then on the R47 say 🟦 I/O READP to load that program into memory. To execute it, press XEQ, then go into the PROG menu and find VolTest.
If your calculator resets itself during the 15 seconds it takes to produce results, you have just learned it is time to change the coin cell, pronto. 😳
This program works on the same principle as that ZTS tester linked above, except that it allows us to vary the parameters of the test to suit our experience and desires, allowing us to make useful discernments.
Strong Coin Cell
Here is the result of running the above program shortly after I installed a fresh coin cell into my R47:
Notice that it drops nearly linearly under load, and that the drop from the initial no-load data point at X=0 to the first measurement taken under load isn’t far off that ideal, either. A reasonable person cannot ask for better given the many strange behaviors of chemical energy cells.
Weak Coin Cell
Now compare that to the coin cell that SwissMicros shipped with this same R47, after a few months of use had been put onto it:
The primary result is that sharp drop from the initial no-load measurement to the first loaded one. You are seeing high ESR, a proxy for low remaining capacity.
This cell will soon need to be replaced.
(Seeing this worried me enough that I began saving my work more often than I normally would have.)
Note the signs of quantized data measurements, all those flat sections. The ADC in the R47’s microcontroller boasts 14-bit resolution, but the datasheet then goes on to warn that because the battery voltage may be higher than the ADC’s reference voltage, it scales it down by ¼ to avoid blowing out the ADC’s front-end circuit. This effectively turns the ADC into a 12-bit design, good for no better than quarter-millivolt resolution, best case. Even worse, the R47’s microcontroller has a secondary 12-bit ADC which it can use for the same purpose, but the decision about which one SwissMicros chose to use is hidden behind the DMCP5 API barrier, so BATT? might be giving us a ~10-bit effective measurement.
The R47 code scales the ADC’s return value to millivolt-scale precision, suggesting it is using that secondary ADC.4
For these reasons, the in-circuit data logger idea sketched above still has merit for those willing to put up with its hassles. Even a cheapie will be good for 2000 counts, roughly 11-bit equivalent. It is not difficult to find inexpensive loggers with 14-16 bit ADCs in them, not to mention better timebases.
USB-C Power
Plugging the calculator into USB-C power with that same weak coin cell results in this:
This flat measurement curve shows the ~3 V regulated USB voltage, which does not dip meaningfully under a varying load. (Not within the R47’s ability to yank on the USB VDD pin, at any rate.) This indirectly proves that USB power delivery is working as intended.
Going Beyond
Not all design decisions above have a theoretical basis. While I do bring broad-based experience to this project, I can easily believe that varying these parameters could give more predictive results. I await your results eagerly.
It can be useful to run this program, then wait a minute or more before manually calling 🟦 INFO 🟦 BATT? to get another measurement. There is a high likelihood that the cell voltage has returned to near the value of the first measurement. I mentioned this recovery — a.k.a. “rebound” — phenomenon above as one of several quirky characteristics of chemical voltage cells. The magnitude of the effect varies considerably even among CR2032s, but only an ideal voltage source has zero recovery after a load is removed.
Caveat RPNer
There is a second on-device source of cell voltage: 🟧 PREF DMCP then select menus 7, 8, 5 to get into the Diagnostics screen. This gives a higher value than reported by BATT? for reasons I am not clear on. It might be measured at a different point in the circuit, or it might be a raw, uncalibrated value. Regardless, stick to the same measurement source when making comparisons.
A man with a watch always knows what time it is. A man with two watches is never certain.
— ancient Chinese proverb
(You may now wish to return to my R47 article index.)
License
This work is © 2026 by Warren Young and is licensed under CC BY-NC-SA 4.0
- ^ In the R47’s case, the proper term is “cell,” there being but the one. Strictly, a “battery” is two or more cells arranged in series or parallel to get either more voltage or capacity, respectively. ESR multiplies by the cell count in series but divides in parallel.
- ^ Take as an example Panasonic’s CR2032 datasheet, provider of the cell that shipped in my R47.
- ^ It is an irony for an RPN-focused site like this that the best guide I could find describing the behavior of CR2032s in related applications came from TI, Coin cells and peak current draw. This white paper came out of the IC sensor side of their business, but the behaviors it describes apply to calculators. In all fairness, it must be said that Texas Instruments does know a thing or two about these topics. 🤓
- ^ If not, then I would expect to see a divisor of 4096 here.