PDA

View Full Version : Battery powered applications



NavMicroSystems
- 6th August 2005, 20:03
I would like this thread to collect Info about the Hardware Design of Battery Powered Applications.

(All the Do's and Dont's)

So far I never really had to care about "power consumption"
as my applications have always connected to Power Supplies with almost "infinite" capacity.

Now I have got the challenge to design a battery powered "standalone" device
that has got to be "as small as possible"
and should run reliably for at least 6 months without the need to recharge/replace the battery.

I have got to run the the Board at exactly and stable 5.00 V as there are some analog sensors.

All Linear LDO's I have found so far do have a quiscent current that would flatten
a "small" Battery within that period of time.

How do you solve this kind of problem?

Again:
I'm not asking how to reduce the Systems power consumption by turning off peripherals,
the question is about the design of the power supply.

Melanie
- 7th August 2005, 14:14
Here's a thought straight off the top of my head...

The chances are your sensors will produce an output proportional to Vdd applied. The ADC's will give you a result proportional to Vdd. You therefore probably don't have to worry about a too stable Vdd as the two (ADC and sensor) will still be in proportion respective to Vdd. Anyway, since when did regulators ever give you 5.000v? So run your product at 3v or 4.5v and lose the hassle, expense and power consumption of the whole Regulator circuitry.

NavMicroSystems
- 7th August 2005, 16:34
Thanks Melanie,

you are right, chances are that the regulators are slightly off 5.00V, this is something I could compensate as long as the output is relatively stable and there is not too much drift.

Some of the sensors are integrated types and require a 5.0V supply, so running the circuit at 3.3V or 4.5V is not an option.
For higher resolution I'm using an external ADC.

The LP2950 Regulator has an initial tolerance of 0.5%
and a line regulation of 0.05%
quiescent current is 75ľA "only"

I'll give it a try.

Or do you know any "better" Regulator?

Worst case I would have to solve the problem by throwing battery capacity at it

NavMicroSystems
- 9th August 2005, 00:17
GOOD NEWS:

I have got the standby current down to less than 200ľA !

georgex5
- 18th October 2005, 16:57
Can you add on a few solar cells?

Ron Marcus
- 18th October 2005, 21:04
Seiko makes LDOs with 10 uA standby current. They are in Mouser.

NavMicroSystems
- 18th October 2005, 22:34
Thanks for the Input.

In my last post I was talking about the overall system standby current and.

A fresh battery I have installed exactly 70 days ago is still working fine on the prototype.

The LP2950 works quite well, precision regulation and not measurable temp drift etc.

BTW
The MCP1701 has a quiscent current of 2ľA only !

jellis00
- 22nd June 2009, 08:12
Purpose of this thread is stated to:

collect Info about the Hardware Design of Battery Powered Applications.
Would appreciate ideas on how to minimize power consumption by making right settings of ports and registers.
Am using a 16F690..its data sheet says that SLEEP power with all peripherals off should be 8 - 16 microamps. Yet, my 16F690 is consuming 400 microamps on power up when it goes into SLEEP mode.:mad: This is excessive! I need to figure out how to bring it down to expected values.
Attached code shows the steps taken in the MAIN program loop before the SLEEP statement to set things for minimum power during SLEEP.
Can anyone advise what I have done wrong or haven't yet done that would bring the SLEEP power down to expected values??
Am also having a problem getting the MCU back into SLEEP with this code after servicing the 1st interrupt, but that is probably an issue for a different forum.


' -----[ Device Declaration ]----------------------------------------------
' For MSASM assembler use following:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF
' For PM assembler only use following instead
'@device pic16F690, intrc_osc_noclkout, bod_off, pwrt_off, wdt_off, mclr_off,
' protect_off
' The above config settings set CONFIG = %0000111111011100 or hex 0FD4 for
' FCMEN on (1), IESO on(1), BOR on (11) CDP off (1), CP off (1), /MCLR is
' digital input (0), /PWRTE off (1), WDTE off (0), INTOSCIO (100).

' -----[ Revision History ]------------------------------------------------
' Version 1.0.4 on 6/16/09: Includes changes to minimize power during Sleep
' Version 1.0.6 on 6/19/09: Replaced 2nd IF-THEN block with REPEAT-UNTIL to
' flash leds correctly during flow and low battery
' Version 1.0.7 on 6/21/09: Eliminated @ NOP in MAIN; Reformated Port
' Assignments list; Changed IntCloc from 4 to 1 MHz;
' WDT_OFF and comparators off to save power.

' -----[ Declare Variables & Aliases ]-----------------------------
'
diff VAR Byte ' Difference between bat_mon and Vthr
dummy VAR Byte ' For read of on-interrupt port & clear mismatch condition
flush VAR PORTA.3 ' Set RA3 as input for sensing flush switch closure Int
i VAR Byte ' Index used in Gallon counter loop
led1 VAR PORTC.0 ' Set RC0 as LED indicator of valve open..water flowing
led2 VAR PORTC.1 ' Set RC1 as LED indicator of low battery
bat_mon VAR PortA.0 ' Set RA0 as battery low power monitor
meter VAR PORTA.2 ' Set RA2 as input for Hall Sensor meter pulse Interrupt
open_valve VAR PORTC.2 ' Set RC2 as valve solenoid open command
close_valve VAR PORTC.3 ' Set RC3 as valve solenoid close command

' -----[ Declare Constants ]----------------------------------------
'
k CON 10 ' Calibration factor for flow meter...# pulses per gal
Vthr CON 3 ' Assumes Low Battery Monitor threshold = 3 volts

' -----[ Initialization ]-------------------------------------------
Init:
' Setup Timer0 as an 8-bit counter with the clock input on RA2.
' 1:1 TMR0 prescaler
' TMR0 counts on high-to-low transitions
OPTION_REG = %00111000 ' PORTA pullups disabled, TMR0 clock source is RA2,
' high-to-low transitions, prescaler to TMR0
TMR0 = 256 - k ' preload TMR0 to overflow after k counts

' Initialization of inputs/outputs
open_Valve = 0 ' Initialize RC2 (open_valve) at Low value
close_valve = 0 ' Intialize RC3 (close_valve) at Low value
TRISA.2 = 1 ' Set RA2 as input port for clock to TMR0
TRISA.3 = 1 ' Set RA3 as input port for sensing Flush switch closure
meter = 1 ' Initialize RA2 (meter) at High for METER pulse inputs
' RA2 = TMR0 clock input for simulated meter pulse inputs
flush = 1 ' Initialize RA3 (flush) at High value for flush interrupt

' Interrupts Settings
FLUSH_INT_FLAG VAR INTCON.0 ' Alias RA3(FLUSH) On-change-interrupt flag bit
TMR0_INT_FLAG VAR INTCON.2 ' Alias Timer0 overflow flag bit
INTCON = %10101000 ' Enable interrupts: global, TMR0 overflow, & RABIE
IOCA = %00001000 ' Enable RA3 as on-change-INT

' Set INT Handler
ON INTERRUPT GOTO Int_handler

'-----[ Main Code Starts Here ]------------------------------------------------
MAIN:
' Perform following steps to save power during Sleep mode
OSCCON = %0100011 ' Switch to 1 MHz internal oscillator
VRCON = %00100000 ' Set Voltage Reference for minimum power consumption
' Disable CVref
ANSEL= %11111011 ' Set PortA to Analog I/O to save power during Sleep but
' leave Bit2 as digital for RA2 pulse count interrupt.
ANSELH= %11111111 ' Analog module enabled to save power during Sleep
CM1CON0.7 = 0 ' Turn off comparators during Sleep
CM2CON0.7 = 0
WDTCON = %00010110 ' Turn WDT off to SLEEP indefinitely
TRISB = %11111111 ' Set all PORTB pins to inputs during Sleep
TRISC = %11111111 ' Set all PORTC pins to input during Sleep
PortA = %11111111 ' Write Port A all High to clear mismatch and save
' power during SLEEP
PortB = %11111111 ' Set all Port B and C pins High to save power
PortC = %11111111 ' in Sleep mode
@ sleep
' Microcontroller is in Sleep State waiting for external FLUSH Interrupt
' Valve should be closed at this point and no water flowing
GOTO Main ' Loop to Main to wait for next Flush interrupt on RA3 change

'------{ Begin Interrupt Handler }---------------------------------------------
DISABLE ' Disable interrupts during interrupt handler
Int_handler:
'OSCCON = %01100100 ' Switch to LFINTOC at 4 MHz clock during Int_handler
WDTCON = %0001000 ' Turn WDT on for ops
'Initialize registers for interrupt ops
' A/D & Comparators disabled
ANSEL=0 ' Set PortA to digital I/O for use with RA2 and RA3
ANSELH=0 ' Analog module disabled
CM1CON0=0 ' Disable comparators
CM2CON0=0
' Port Settings
TRISA = %11111111 ' Set all PORTA pins to inputs...RA0, RA2 & RA3 are used
TRISB = %00000000 ' Set all PORTB pins to outputs
TRISC = %11110000 ' Set lower 4 pins of PartB as outputs for LEDs
PORTA = %00000000 ' PortA pins all set to Low
PORTC = %00000000 ' LEDs off, PULSOUT RC3 provides a high-going pulse

High bat_mon ' For testing..simulate battery monitor input is Low or High
DEFINE WRITE_INT 1
'Write 13, bat_mon ' Remove comments on Write statements for test only
'Write 15, Vthr
diff = Vthr - bat_mon
'Write 17, diff
IF FLUSH_INT_FLAG = 1 Then ' Interrupt was from RA3 on change
REPEAT
' Wait until the external Flush interrupt is at high level...limits
' interrupt to switch closure only and not also for switch opening
Until flush = 1
PULSOUT open_valve,2000/10 ' Generate 20 msec pulse to RC3 to open valve
'Write 7, flush ' Write FLUSH value..remove comment for test only
Endif
' Valve is open and water is flowing
REPEAT
' Wait for flow to reach 1.6 gallons
' Flash flow light while water flowinguntil pulse counter overflows
High led1
Pause 125/10
Low led1
Pause 500/10
If diff > 2 Then ' Battery is low..flash the low battery monitor light
HIGH led2 ' while water is flowing
PAUSE 125/10
Low led2
Pause 500/10
ENDIF
'Write 5, bat_mon ' Remove comment for test only
Until TMR0_INT_FLAG = 1 ' Until flow meter pulse counter overflows
PULSOUT close_valve,2000/10 ' Generate 20 msec pulse to RC4 to close valve
'WRITE 11, TMR0_INT_FLAG ' Write TMR0 value..remove comment for test only
dummy = flush ' Clear mismatch condition
FLUSH_INT_FLAG = 0 ' Clear interrupt flag & enable RA3 on interrupt
TMR0_INT_FLAG = 0 ' Clear overflow flag
TMR0 = 256 - k ' Reload TMR0 to overflow after k counts
RESUME Main ' Resume Main Program
ENABLE
'-------{ End of Interrupt Handler }-----------------------------------------

' If the user program ends by getting to the last statement of the program
' at an END instruction, the MCU will SLEEP and await a wakeup.
END