Reducing power consumption

Hi all,

I've got a bunch of peripheral devices running off my Arduino (RTC, a 16bit ADC, servo motor, pressure sensor and two temperature sensors) which is all part of a portable device that requires a long lifetime between battery changes. The power-saving modes of the Arduino aside (which I'm learning about separately), can someone suggest a simple circuit I can use to cut the power to these devices - as they aren't require to operate all at once and some draw significant current even when they're not in operation (ie servo motors). Some are to be run off the 5V rail of the Arduino, and others driven directly from the battery. My initial thought would be something as simple as a transistor switched on/off via an Arduino output pin... is this too simple?

Thanks in advance!

If the current is low enough, the device(s) can be powered directly from a pin. These are worth investigating... RTC, a 16bit ADC, pressure sensor, and two temperature sensors.

Well a transistor is better - you have forgotten about the need for decoupling. If the device being switched from an Arduino pin is not decoupled downstream then it only sees the +5V decoupling caps through the reletively high series resistance of that Arduino pin driver FET (perhaps 100 ohms). It won't have effective decoupling....

Alternatively you provide decoupling caps at the device being powered and force the Arduino pin to charge that capacitor on switch on which overloads the pin's abs-max rating of 40mA (since an uncharged decoupling cap is a short circuit on short time scales).

Providing a proper switching transistor with an on-resistance of less than an ohm and current-limiting (via selection of base-drive level), you can decouple either way satisfactorily.

The problem with cutting the power to a chip while still having active inputs connected to them is that they tend to 'latch up'. That means they will stop working when you re apply the power and only a total power cycle to the whole system will restore them.

Thanks for your responses.

Bit more of a background - my (portable) device needs to be powered for only maybe 20 seconds every ten or twenty minutes, and I'm aiming for a lifetime (before the batteries need to be changed) of a few months. Subsequently, I need the "off" state to draw no more than 100uA, perhaps even less. If I use the Arduino as is (which is my preference), I'll need to design a circuit that switches the power on and off at required intervals. I've been playing around with the DS3234 RTC, which has an alarm setting built it. I think the RTC draws 120uA which may be bareable, provided any other additional circuitry doesn't draw too much more current. The DS3234 provides an interrupt low signal when the alarm triggers.

The alarm set into the RTC will trigger when the device needs to turn on (ie, every ten minutes), and somehow the Arduino will need to power down after the device. Given the potential problems associated with powering down the Arduino at random, it may be best to initiate a reset each time I turn it on.

So the basic operation would be:

  1. RTC time and alarm set
  2. Arduino starts up, runs main program
  3. When program finished (after ~20 seconds), Arduino powers down
  4. RTC alarm triggers at some future time (ie ~10-20 minutes later) and turns the Arduino back on
  5. Arduino resets itself to ensure peripheral devices don't latch up (as per Grumpy Mike's suggestion)
  6. Back to step 2, process repeats...

The RTC will be powered directly from the battery, but I will also need some kind of switch to switch the power to the Arduino (switching ON when the interupt pin from the RTC goes low; and switching OFF when a signal is sent from the Arduino). Obviously this needs to be low power.

I came across this Pololu switch circuit: Pololu Pushbutton Power Switch LV (old version)
It can cut the power when it receives a high signal, but not the other way around. The physical (push button) switch in the circuit can switch the power on and off when the switch shorts.

Can anyone suggestion a possible low-power (ie uA) solution that can switch the power on (via Arduino) and off (via the RTC)? Or a way of adapting the pololu circuit?

Any suggestions would be much appreciated!

If you use a RBBB Arduino compatible (for instance) and leave out the voltage regulator and power LED, then you can run the ATmega328 powered down to uA levels. Standard Arduino has the USB to serial chip and the regulator so they can't go down to micropower levels. Most regulators consume much more power than a powered down CMOS chip, note. I can get down to 10uA at 5V with a 328 - I've used the Sleepy class from the Jeelabs Ports library which packages up the relevant power-management and watchdog timer stuff.

[note you mustn't remove the decoupling caps from the circuit, just the regulator and the power indicator LED/resistor.]

Thanks MarkT,

  1. In the interests of working out a short term solution (ie butchering an existing board), I'm guessing I could cut the Vi and Vo pins of the regulator and short the connection, as well as cutting the line to the 3.3V regulator (I don't need 3.3V) and severing the line to the LED? I'm working on a Freetronics Eleven, schematic: http://picpaste.com/eleven-schematic.jpg
  2. I'm planning on using a 9V Li ion battery source as some additional circuitry requires 9V. Will a simple voltage divider (with mega-ohm resistors) provide the best (ie most efficient) way of delivering 5V to the Arduino board?
  3. Is there any way to disable the USB-serial chip after I've uploaded my sketch? I'm guessing this pulls at least a few mA, and maybe there isn't any point removing the regulator and power LED if this is still drawing sizeable current.

Cheers in advance!

I would prototype the system on Arduino and then migrate it to a stripboard design. That way, you can leave out the USB/serial chip and anything else you don't need. Also, you can choose to run the mcu at a lower frequency than 16MHz to save power.

I'd use one of the mcu sleep modes rather than turn off power to the mcu.

To derive +5v (or +3.3v to save power) from 9v to power the mcu, get a voltage regulator with low ground current, for example LP2950CZ-5.0 or TS2950CT.

There was a similar query a while back, and I did a mock-up here:

That circuit used 25 uA when asleep.

I hooked up a clock chip (via a breakout board) and powered it from one of the processor pins as suggested earlier. I didn't think about the problem caused by the decoupling cap on the "clock side" but during testing it seemed to work. Whether it would fail prematurely I don't know. Perhaps switching a MOSFET rather than directly connecting would be safer.

I used the watch dog timer, which itself doesn't draw much power, to do "rough" intervals, and then wake up after 20 seconds and check the clock. Depending on the accuracy required you could go into a WDT loop for longer, and then check the clock.

My tests on this page:

... showed that a slower clock didn't seem to save current usage whilst asleep.

However the difference in consumption reported between those two pages was because on the earlier page I put more internal things (like the ADC converter) to sleep, as well as using the sleep mode.

When asleep the clock isn't running at all. You get a rather high 131uA in sleep mode which suggests you haven't powered down all the sections of the 328 (ADC for instance). Checkout Jeelabs.org and blog entries about low power mode - Jeelabs have a utility class called "Sleepy" in their Ports library which packages up all the power-saving and watchdog timer calls nicely - < 10uA should be achievable with just the watchdog timer running.

And back to the switching other loads issue - if they are all run off 5V or 3.3V then a p-channel MOSFET is a good solution. For higher voltage I'd think PNP transistor/darlington and a resistor + zener diode to level-shift the Arduino pin output to the base of the PNP.

Cheers guys. Great site Nick, btw. I was a bit apprehensive to work with a stripped down system (ie MCU plus basics) but I think I might give it a crack now.

As far as the power switching goes, I've been looking into voltage regulators, and seems there are quite a few with an enable pin on them, many of which quote ~1uA current draw when in the shutdown state, which looks promising, like the LT3060 (LT3060 Datasheet and Product Info | Analog Devices). I figure I have a couple of these for the 3.3V and 5V components and use the MCU digital pins to shut them off before moving into a sleep mode.

Can the watchdog timer be programmed for long intervals? (ie every hour?) I noticed the RTC DS3234 has a quiescent current of the order of 120uA, which is pretty large considering I might be able to get the MCU and peripherals down to tens of uA. Does anyone know of any ultra low power RTCs?

Thanks again for all your helpful replies!

I think 8 seconds is the longest (see p56 of the datasheet), which is why I did 20 seconds as 8 + 8 + 4. But waking up after 8 seconds, checking a counter, and going back to sleep wouldn't take long.

As for the RTC, what I did was just power it down. I don't see a problem with doing that, except maybe using a MOSFET rather than directly powering it from the Arduino pin like I did.