MightyWatt R3: 70W Electronic Load for Arduino

MightyWatt R3 is a programmable electronic load made as an Arduino shield

Similar projects worth following
MightyWatt R3 is the latest revision of my project I started in 2014. I've been selling this on Tindie but the entire project is 100% open hardware, software, everything so you are more than welcome to make your own unit or use this as a starting point for your own electronic load design.

Electronic load is a useful piece of laboratory equipment for testing of power supplies, batteries, solar cells and other sources of electricity. The original motivation for MightyWatt was the testing of PEM fuel cell.

The core of MightyWatt R3 is a special FET designed for linear applications from IXYS, such as IXTH64N10L2 or IXTH75N10L2. The important is the "L2" which indicate linear applications. Normal FETs do not work well in linear mode. Google "Spirito effect" to learn more.

The heat sinking is provided by a 5V 50mm fan with a BGA-style heatsink. Underneath the FET is a small, 0402-footprint thermistor, that is used for monitoring the temperature.

Schematic of MightyWatt R3

How does it work

MightyWatt R3 (MWR3) works internally in constant current or constant voltage mode. Other modes, such as constant power or constant resistance, can be maintained in a software feedback loop in the firmware. MWR3 is an Arduino shield so the logic is contained in the Arduino's processor.

The selected value of current or voltage is recalculated to DAC value and sent over I2C. The DAC is then fed to the gate driver – an op-amp that maintains the selected constant value. Its feedback is taken from either the ammeter or voltmeter, depending on the selected mode.

Voltmeter and ammeter have both two ranges to make measurements more precise. Ammeter second range is 8 times below the main range. Voltmeter ranges can be set to practically anything up to 60 V. It is a safety limit, the electronics can withstand more so in an enclosure, you can go higher.

Voltmeter is differential and it can sense voltages that have offset from the voltages at the power terminals. This is very useful for 4-terminal voltage sensing. MWR3 has 4 terminals – two for power and two for the voltmeter. In this way, it is possible to exclude cable resistance from the measurement. But it can also measure at the power terminals. A relay switches between these two voltmeter modes.

There is a proper protection with 5 TVS diodes (5V line, power line, FET gate and 2× voltmeter). There are only thin-film 0.1% resistors in the differential voltmeter, there is temperature measurement and voltage boost for FET gate driver so the main transistor can be fully open. Both the voltmeter and ammeter have bias for great linearity near zero. There is a LED which can be programmed to indicate stuff like flowing current, higher temperature or anything else. Fan can be automatically switched off for light loads.


I have made a Windows program (in C#) for controlling MightyWatt R3.

It has full manual control, you can also create scripts for running custom test protocols, you can log data, display statistics and integrated values (charge, energy) and if you install gnuplot, it can show real-time charts.

Do you want to build one? Do you like this project? Be sure to let me know!

  • 1 × OPA197IDBVR Operational amplifier for driving the gate of the main FET.
  • 1 × OPA365AIDBVR Amplifier and Linear ICs / Operational Amplifiers, used for the differential voltmeter.
  • 1 × INA225AIDGKR Programmable gain current shunt monitor used for the ammeter.
  • 1 × ADS1115IDGSR Data Converters / Analog to Digital Converter ICs (ADCs). This digitizes voltage, current and temperature of the main FET.
  • 1 × AD5693RBRMZ DAC. Used for setting constant voltage and constant current.

View all 14 components

  • Autoranging and constant power/resistance using CV

    kaktus circuits04/07/2017 at 22:09 0 comments

    Two new features to MightyWatt R3 and some observations:

    • First, it is possible to disable autoranging. This may be useful to get rid of glitches when switching ranges. When a range is switched, a few millisecond long dip can form before the load stabilizes. Disabling autoranging can prevent this. The logic is this: When in CC mode, the current range autoranging can be disabled while the voltmeter autoranges as usual. And vice versa.
    • Another feature concerns constant power (CP) and constant resistance (CR). Typically, these software modes are internally constant current but in some cases, it might be better to use constant voltage internally. This is now possible. But I recommend using internal CC mode for normal operation.

    The observations:

    • 3 A CC mode, the current noise/ripple is 0.75 mA RMS in 20 Hz to 300 kHz band.
    • Temperature coefficient for current measured at 10 A, 70 W was about 18 ppm/K.
    • Slew rate measured as the time taking to get from 10 % to 90 % is about 19000 A/s when going from 0 to 20 A.

  • Comparison of Arduino Uno and Arduino Zero

    kaktus circuits03/31/2017 at 22:36 0 comments

    I was getting asked how does the Uno perform against Zero with MightyWatt R3.

    Measurement rate

    After fixing a watchdog reset flaw, I am now able to compare the performance of those two boards. This comparison was made using firmware version 3.0.2.

    The venerable Arduino Uno uses 8-bit AVR from Atmel (well, Microchip…) – ATmega328P running at 16 MHz.

    Arduino Zero (M0/M0Pro) has a 32-bit ARM Cortex M0+, SAMD21, from the same company, running at 48 MHz, i.e. three times faster.

    How does it influence MightyWatt R3?

    First of all, let me tell you that the ADC is precise but not terribly fast. In its 16-bit version (ADS1115), it does approximately 860 samples per second, meaning that it is not possible to get more than 430 complete measurements (current + voltage) per second. Plus, there is a communication overhead on the I2C bus and all the calculations the program must do in every pass of the main program loop. So, in the end, Arduino Uno makes about 220 measurements per second and 4350 main program loops. Arduino Zero finishes 237 measurements per second and 12500 main program loops. The measurement is thus about 8 % faster with Zero and there are 2.9 loops per every loop on Uno. This number is very close to the ratio of core clocks of the two Arduinos, which is 3. What was a little bit surprising for me is that a 32-bit ARM Cortex M0+ does not seem to have any additional advantage against an 8-bit AVR core besides the core clock speed. At least not in this application.


    But what about the analog accuracy? In theory, it shouldn't be dependent on Arduino because the ADC and DAC are all part of the MightyWatt R3. However, Uno runs at 5 V and Zero at 3.3 V and while both the ADC and DAC as well as the rest of the analog circuitry has an excellent power supply rejection, it might have an impact. Let's see the numbers:

    A calibration performed on Zero was uploaded to both Uno and Zero. A constant-voltage mode was used and a power supply limited to 1 A. Then, 20 V was set on the same MightyWatt R3, once using Uno and once using Zero as the control board.

    With Zero, MightyWatt R3 reported 19.998 V while the multimeter (Keysight 34461A) measured 20.0036 V.

    With Uno, MightyWatt R3 reported 20.000 V while the multimeter (Keysight 34461A) measured 20.0042 V.

    The relative error of the set voltage was 0.018 % (Zero) and 0.021 % (Uno).

    The relative error of the measured voltage was 0.028 % (Zero) and 0.021 % (Uno).

    The relative difference of Uno vs. Zero was 0.003 % for the setting of voltage and 0.007 % for the measurement of voltage.

    Because the difference of Uno vs. Zero is very small, the calibration can be used interchangeably between those two control boards.

  • Found and fixed a bug in sketch for Arduino Zero

    kaktus circuits03/31/2017 at 21:55 0 comments

    I have just found and fixed a nasty bug that was slowing down main program loop when using Arduino Zero.

    The problem was in the watchdog system. If you don't have experience with processor watchdog, I'll make a short intro: A watchdog is a countdown timer that once it reaches zero causes a processor reset. That means you have to periodically reset the counter so it never reaches zero. And periodically resetting means calling it in some kind of a loop. If this loop freezes, the watchdog timer will eventually reach zero and reset the processor, which is what it is supposed to do – an automatic reset when your program freezes or enters an infinite loop.

    A watchdog can use a dedicated oscillator. In the case of Arduino Zero and my sketch, it is the ultra-low power internal oscillator running at 32.768 kHz. And because it is very slow, any write to a system that uses it – such as the reset of the watchdog timer – needs a synchronization with the main CPU clock, which runs at 48 MHz on Arduino Zero.

    I was wrongly assuming this synchronization was fast, whereas it was not, governed by the speed of the slower clock. My code made a blocking wait for this synchronization:

    WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; /* reset watchdog timer */

    while(WDT->STATUS.bit.SYNCBUSY){} /* wait for sync */

    A stupid mistake that was, fortunately, easy to find and fix to a non-blocking call:

    if(WDT->STATUS.bit.SYNCBUSY == false) /* synchronization is not busy, meaning it is synchronized */


    WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; /* reset watchdog timer */


    This call will only reset timer if the previous reset was already synchronized. There. Fixed.

    The performance gain? Tremendous. Previously, I was getting around 100 measurements per second and 400 turnarounds of the main loop, now I am at 237 measurements per second with 12500 (!) main loops per second.

    So today's lesson is clear: Don't make blocking calls if you don't have to.

  • Update to 220 reports per second and external power resistor watchdog

    kaktus circuits03/30/2017 at 22:17 0 comments

    • Just updated the ADC measurement logic so that temperature is measured only about twice per second. That means voltage and current can be measured more frequently. The increase of measurement (V+I) rate is from 140 measurements per second to 220! This is equal to the report rate to computer and hence the maximum log rate in the control program.
    • When you have an external series resistance, such as a power resistor, to add some extra watts to the power handling, the windows control program now lets you type in the power resistor rating. The program can then automatically stop the load when the external power resistor rating is exceeded (thank you Jyrki for suggesting this!).

View all 4 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates