AVR463: Charging Nickel-Metal Hydride Batteries with ATAVRBC100 Features • • • • • • • • • Fully Functional Design for Charging Nickel-Metal Hydride Batteries High Accuracy Measurement with 10-bit A/D Converter Modular “C” Source Code Easily Adjustable Battery and Charge Parameters Serial Interface for Communication with External Master One-wire Interface for Communication with Battery EEPROM Analogue Inputs for Reading Battery ID and Temperature Internal Temperature Sensor for Enhanced Thermal Management On-chip EEPROM for Storage of Battery and Run-Time Parameters 8-bit Microcontrollers Application Note 1 Introduction This application note is based on the ATAVRBC100 Battery Charger reference design (BC100) and focuses on how to use the reference design to charge NickelMetal Hydride (NiMH) batteries. The firmware is written entirely in C language (using IAR Systems Embedded Workbench) and is easy to port to other AVR® microcontrollers. This application is based on the ATtiny861 microcontroller but it is possible to migrate the design to other AVR microcontrollers, such as pin-compatible devices ATtiny261 and ATtiny461. Low pin count devices such as ATtiny25/45/85 can also be used, but with reduced functionality. Rev. 8098A-AVR-09/07 2 Theory of Operation Battery charging is made possible by a reversible chemical reaction that restores energy in a chemical system. Depending on the chemicals used, the battery will have certain characteristics. A detailed knowledge of these characteristics is required in order to avoid inflicting damage to the battery. 2.1 NiMH Battery Technology Nickel-Metal Hydride (NiMH) battery technology is the successor of Nickel-Cadmium (NiCd), and is considered a stepping-stone to lithium-based batteries. Its characteristics are quite similar to NiCd, but offers approximately 50% higher energy density at the cost of reduced cycle life [1] (see References page 25). NiMH does not suffer so much from the memory effect as NiCd, and therefore needs fewer exercise cycles during storage. In addition, NiMH batteries are more environmentally friendly as they contain no cadmium, and therefore pose less of a problem regarding disposal. Currently, it is being used in everything from cameras, PDAs and power tools to hybrid cars. Although Li-Ion batteries offer almost twice the energy density, higher cell voltage and shorter charge times, they are not as stable as nickel-based batteries. Also, since nickel-based batteries have a voltage close to the regular 1.5V Zinc Carbon and Alkaline batteries, they are more suitable for use in existing equipment powered by such batteries. Compared to NiCd, the drawbacks of NiMH batteries include a slightly higher selfdischarge rate (approximately 20% per month at room temperature), lower overcharge tolerance, shorter cycle life (300-500 charge cycles) and longer charge time as it generates more heat. 2.1.1 Safety Nickel-based batteries are quite stable, but might vent gas or explode if severely mishandled (short circuited, charged with the wrong charger, etc.) due to internal pressure and heat build-up. Most batteries come with a safety vent, thermal fuse/switch or pressure switch to help prevent this. 2.2 Charging NiMH Batteries The most common method for recharging nickel-based batteries is with a constant current. In general, the charge current is recommended in the range 0.5 – 1.0 C 1 (fast charge) since slow charging causes crystalline formation, also known as memory effect, and lesser charge efficiency [7]. Greater currents than this, on the other hand, may cause damage. It is also more difficult to detect a full charge of NiMH batteries at low charge currents. NiMH batteries are between 70% and 90% charge efficient, meaning you must charge for longer than one would calculate from a given charge current and battery capacity. 1 2 C represents the battery’s capacity per hour, i.e. mA. AVR463 8098A-AVR-09/07 AVR463 2.2.1 Safety Towards the end of a charge cycle, the positive electrode of the battery will reach full charge first, causing it to produce oxygen. To avoid pressure build-up in the cell, the oxygen is recombined at the negative electrode to produce water. This process does however generate heat, and it relies on the charge current to be limited so that the oxygen generation rate is not greater than the recombination rate. Should a pressure build-up occur, most batteries have a safety vent or even a pressure switch that will cut off the charge current once the pressure gets too high. The venting of gas deteriorates the battery as electrolyte is lost. More advanced batteries have safety electronics that activate once pressure or temperature exceeds a threshold. 2.2.2 Battery Temperature As mentioned, NiMH batteries generate heat during charging and it is therefore important to monitor the battery temperature to prevent damage. Suggested temperature ranges for fast charging are in the area 5 - 45°C, but temperatures between 45°C and 60 °C are acceptable for a short period at the end of a charge. [5] [6]. Naturally, great currents cause a faster increase in temperature. High temperatures decrease cell voltage and charge efficiency, and cause a higher rate of selfdischarge. Cooling the batteries with a fan is sometimes done to maximize efficiency, though lower temperatures slow the oxygen recombination, possibly causing a faster pressure build-up. 2.2.3 Charge Time Determining for how long to charge is not so easy since a battery’s state of charge cannot be reliably determined from its voltage. In addition, it depends on the battery’s capacity and the charge current. Due to charge inefficiency, the ideal charge input lies in the area 120 – 150%, depending on if maximum cycle life (120%) or capacity (150%) is wanted. Assuming a 1.0 C charge current, a full charge of an empty battery should therefore take between 1.2 hours and 1.5 hours. Since NiMH batteries are not as tolerant of overcharge as NiCd ones, measures must be taken to detect a full charge. 2.2.4 Full Charge Detection At about 60% charge input the heat generation in NiMH cells starts to increase, and may be used to detect a full charge. It is recommended to end the charge once the rate of temperature increase reaches 1 °C per minute [5] [6]. Another sign of a full charge is a drop in voltage due to the oxygen recombination, though this is not as pronounced at high temperatures or low charge currents. Suggested limits are in the range 6 - 20 mV per cell. A low limit will reduce the amount of overcharging, but also heightens the risk of prematurely ending the charge due to electrical noise or other normal drops in voltage during charging. 2.2.5 Typical Fast Charge Characteristics Battery specifications should always be verified from manufacturer’s data sheets. Below is a summary of typical nickel-metal hydride battery fast charge characteristics. 3 8098A-AVR-09/07 Table 2-1. Typical Charge Characteristics for Fast Charge Parameter Typical Value Charge time 1.5 - 3 hours Charge current 0.5 – 1 C Charge efficiency 70 – 90 % Charge voltage 1.4 – 1.6 V Temperature range 5 … 60 °C (max) 2.2.6 Typical Battery Characteristics The table below summarises general data for NiMH batteries [5] [6]. Table 2-2. Typical NiMH Battery Characteristics Parameter Nominal voltage Typical Value 1.2 V Open circuit voltage 1.25 – 1.35 V Typical end voltage 1.0 V 2.2.7 Three Step Fast Charge The chosen charge procedure for this application is a fast charge followed by a topping charge, as recommended in literature and by battery & charger manufacturers. This does however require that the batteries’ specifications are defined at compile time since we otherwise don’t know them. The procedure is as follows: • Prequalification – Charge at low current (0.1 C) for at most 2 (TBD) minutes, until battery voltage reaches 1.0 V. Timeout means battery is quite likely damaged. • Fast charge – Charge at high current (C) for at most 1.5 hours, until either the rate of temperature increase reaches 1 °C per minute or the voltage drops with 15 mV per cell. • Low rate charge – Top up the battery with a low current (0.1 C) for 30 minutes, to ensure a full charge. This current is low enough for oxygen recombination to keep up, in case of an overcharge. For safety, a temperature limit of 50 °C has been set for the last two stages, and 35 °C for the first. It is also recommended to leave the batteries on a trickle charge (0.003 C – 0.05 C) for an indefinite duration, to counteract self-discharge. This has not been implemented, but may easily be done so by changing the end charge stage in Charge(). It would be beneficial to switch between the batteries at regular intervals, which would also allow for detection of uncharged batteries. 2.3 Battery Charger This application note targets the ATAVRBC100 Battery Charger reference design by Atmel. The reference design is rather complex and has loads of features but this application focuses on the core feature of the design, the buck converters, only. For 4 AVR463 8098A-AVR-09/07 AVR463 more information on the BC100, please refer to application note AVR451 - BC100 Hardware User's Guide [2]. 2.3.1 Microcontroller The BC100 hosts two microcontrollers: a master (ATmega644) and a slave (an ATtiny85 or ATtiny861, by default). The master microcontroller is outside the scope of this application but it may be noted that the microcontrollers are capable of communicating with each other such that the master may request data from the slave at any time. The slave microcontroller is fully capable of handling all tasks related to battery charging and it does not require a master microcontroller to be present. It constantly scans the connectors for batteries and, if found, charges them when required. The slave microcontroller also constantly monitors the hardware for any anomalies. 2.3.2 Power supply This application note does not focus on the power supply. It may, however, be noted that the firmware constantly monitors the input voltage levels in order to make sure operation is reliable. 2.3.3 Buck switches The firmware on the slave microcontroller controls any of the three buck converters on board the BC100. The default is to use a high-speed PWM output of the microcontroller to adjust the voltage and current flow to the battery. The voltage (and current) of the buck converters is directly proportional to the duty cycle of the PWM signal. 3 Battery Charger Hardware This application note is based on the ATAVRBC100 Battery Charger reference design. A detailed hardware description will not be provided in this document. Please see AVR451 - BC100 Hardware User's Guide for detailed information. 3.1 Configuration The ATAVRBC100 Battery Charger reference design must be configured as detailed below. 3.1.1 Microcontroller The hardware should be populated as follows: • Make sure socket SC300 is empty • Populate socket SC301 with an ATtiny861 It is possible to use other AVR microcontrollers but this application has been optimised for using ATtiny861. Pin compatible replacements such as ATtiny261 and ATtiny461 [3] may be used if the compiled code size is decreased. This can be done by increasing the optimisation of the compiler and by removing unwanted features from the firmware. Other microcontroller options include ATtiny25, ATtiny45 and ATtiny85 [4]. These (as well as other 8-pin AVR microcontrollers) use the SC300 socket on BC100. It should 5 8098A-AVR-09/07 be noted that due to reduced pin count the 8-pin microcontrollers provide less features than the default 20-pin. 3.1.2 Programming Connector The microcontroller can be programmed via 6-pin connector J301, using either SPI or debugWIRE. Please note that in some hardware revisions of BC100 it may be necessary to remove R303 and tri-state pin 15 of U202 (set /OE low from the mega644). This procedure frees the /RESET line for use by external programmer or debugger but removes the possibility for the master microcontroller to reset the slave. Do not alter the board unless required. Alternatively, the microcontroller can always be programmed off-board. 3.1.3 Jumpers The jumpers should be configured as follows: • J405 & J406: Set jumpers to 1/4 (max measurable voltage 10V) • For 300 mAh battery: J401, J404 and J408 should be set to enable Buck converter C (20V / 1A) • For 1300 mAh battery: J400, J401, J403, J408 and J407 should be set to enable Buck converter B (30V / 2.5A) Other configurations are possible, but may require firmware changes. See variable VBAT_RANGE in file ADC.h. 3.1.4 Battery For testing of this application, two generic 3-cell NiMH batteries from Minamoto were used. The only data available were the specific capacity and nominal voltage. Both batteries were rated at 3.6 V, with the respective capacities 300 mAh and 1300 mAh. These batteries did not include Resistor ID, EPROM or NTC. 3.1.5 Battery Resistor ID Some batteries may include a Resistor ID (RID), which is used to identify the battery type. The charger can then know data such as capacity, maximum charge current and charge time, instead of keeping these parameters static. If RID is used, the resistor values and the associated data are available from the battery manufacturer. This application supports but does not require RID, and if used, the RID lookup-table should be updated. The resistor should be connected as follows: Table 3-1. Connecting battery resistor ID to charger Battery Pin Charger Connector RID SCL GND BATTERY- If a Resistor ID is not connected, or its value causes ADC saturation, default battery data may be used. See Configuration on page 22. 6 AVR463 8098A-AVR-09/07 AVR463 3.1.6 NTC Temperature measurement during fast charge of NiMH batteries is vital, and some manufacturers therefore often include a thermistor in their batteries. Usually, these have a negative temperature coefficient (NTC). For this application, an RH16-3H103FB NTC from Mitsubishi was employed, and the NTC lookup-table populated accordingly. The NTC should be connected as follows: Table 3-2. Connecting NTC thermistor to charger Battery Pin Charger Connector NTC NTC/RID GND BATTERY- In this application, if an NTC is not connected, the ADC will be saturated and temperature registered as -1 °C. This will halt the charging, unless a sub zero minimum battery temperature has been set. 3.1.7 Data EPROM Some batteries are equipped with an embedded EEPROM for storing charge and manufacturing data. This application supports the reading of EEPROM via a one-wire interface. The default is a DS2502 EEPROM connected as follows. Table 3-3. Connecting external EPROM DS2502 to charger EPROM Pin Charger Connector DATA 1-WIRE/SDA GND BATTERY- If an EPROM is not connected to the battery charger the application will simply disregard its absence. 3.1.8 Supply Voltage The higher the supply voltage, the higher the minimum current the buck switches can provide. For example, if supply voltage is about 9 V and buck charger C is used to charge a battery at 4.20 V then the minimum attainable current is about 80 mA. At this point the smallest decrease in PWM duty cycle (i.e. reducing the contents of OCR1B by 1) will effectively turn off the current to the battery. It is recommended to use a supply voltage some three volts above battery charge voltage. In this application the battery voltage will typically max out at 4.5 V during charging, so the recommended supply voltage is 7.5 V. Another method to lower the minimum charge current the hardware can provide is to use a buck switch with a large inductor. In BC100 this means Buck Switch A. 4 Battery Charger Software The firmware is written in C language using IAR Systems Embedded WorkbenchTM. Since the firmware has been written entirely in C, it should not be a difficult task to port it to other AVR C-compilers. Some compiler specific details will probably need to be rewritten. 7 8098A-AVR-09/07 The table below lists the files that are relevant to the compiler project. Table 4-1. Project files File Type ADC.c C source code ADC.h Header file battery.c C source code battery.h Header file chargefunc.c C source code chargefunc.h Header file enums.h Header file main.c C source code main.h Header file menu.c C source code menu.h Header file NIMHcharge.c C source code charge.h Header file NIMHspecs.h Header file OWI.c C source code OWI.h Header file PWM.c C source code PWM.h Header file statefunc.c C source code statefunc.h Header file structs.h Header file time.c C source code time.h Header file USI.c C source code USI.h Header file Note Functions related to A/D conversion Functions related to battery control & data acquisition, and definition of default battery data Functions related to charging Enumerations for time.c and USI.c, which are used in both Slave and Master (SPI communication) Main program / Program entry point State machine definitions The charge state function for charging of NiMH batteries Definitions of NiMH cell & battery specifications Functions related to one-wire interface Functions related to generating pulsewidth modulated output The different state functions Structs for ADC.c and battery c, which are used in both Slave and Master (SPI communication) Functions related to timekeeping and measurement of time Functions related to serial interface (SPI communcation) 4.1 Overview The firmware integrates all functions required to charge two NiMH batteries. Batteries are connected to separate ports such that one may be charged while the other is idle. The firmware is fully automated and capable of stand-alone battery monitoring and charging but it may also be used together with a master microcontroller, such as the one implemented in BC100. By default, the firmware fits into an ATtiny861 (build option: debug) or an ATtiny461 (build option: release). Memory requirements of the firmware are summarised in the table below. 8 AVR463 8098A-AVR-09/07 AVR463 Table 4-2. Memory requirements of firmware Build option Memory Debug Release Approximate value CODE (Flash) 5800 bytes DATA (SRAM) 270 bytes XDATA (EEPROM) 130 bytes CODE (Flash) 3900 bytes DATA (SRAM) 270 bytes XDATA (EEPROM) 130 bytes 4.2 State Machine The state machine is rather simple and resides in the main() function. It simply looks up the address of the next function to execute and then jumps to that function. The flow chart of the state machine is illustrated in the figure below. Figure 4-1. Flow chart of main function, including the state machine main() Set Current State = INIT Look up address for Current State Jump to function of Current State State function Next State Look up address for Next State Set Current State = Next State Upon return, the state machine expects the function to indicate the next state as a return argument. The recognised return codes are described in the table below. Table 4-3. State machine codes (see source code, menu.h) Label (1) Related Function (2) Description INIT Initialize() Entry state BATCON BatteryControl() Check hardware and batteries PREQUAL Charge() Raise battery voltage, safety check. SLEEP Sleep() Low power consumption mode FASTCHARGE Charge() Charge with constant current at 1.0 C. TRICKLECHARGE Charge() Charge with constant current at 0.1 C. ENDCHARGE Charge() End of successful charge DISCHARGE Discharge() ERROR Error() Notes: Resolve error, if possible 1. Name of label, excluding leading “ST_” 2. Function name, as declared in source code 9 8098A-AVR-09/07 State functions are described in the following sections. 4.2.1 Initialize() The initialisation function is the first state function that will be executed after device reset. The flow chart of the function is shown in the figure below. Figure 4-2. Flow chart of initialisation function Initialize() Set clock prescaler to 1 Initialize One-Wire Interface Configure I/O pins and disable all batteries Initialize Serial Peripheral Interface Initialize Analoguo-to-Digital Converter Read data from all batteries Initialize timer functions Return(BATCON) The initialisation function always exits with the same return code, pointing to the state function for battery control. 4.2.2 BatteryControl() The battery control function verifies that jumpers are set correctly and then checks to see if there are any enabled batteries present that require charging. The program flow is illustrated in the figure below. 10 AVR463 8098A-AVR-09/07 AVR463 Figure 4-3. Flow chart of battery control function BatteryControl() JumperCheck() JumperCheck() OK? NO Return(ERROR) YES Any batteries enabled? NO Flag Error: no batteries enabled YES Return(ERROR) Any battery: Status OK and not charged NO Disable (disconnect) all batteries Refresh data for selected data Return(SLEEP) Return(PREQUAL) 4.2.3 Charge() The charge function contains the charging algorithm divided into stages. For this application, it has four stages: • Prequalification – If the battery voltage is between 0.8 V and 1.0 V, charge at a low rate like 0.1 C for 2 minutes. If the voltage doesn’t rise to 1.0 V within the time limit, the battery is likely damaged. Limit max. temperature to 35 °C. • Fast charge – Charge at 1.0 C for 1.5 hours at maximum, and terminate when voltage drops 10 – 15 mV per cell or the rate of temperature increase reaches 1 °C per minute. Limit maximum temperature to 50 °C. • Top-up charge – Top the battery up with a 0.1 C charge current for 30 minutes. Limit maximum temperature to 50 °C. • End charge – Decide whether to go into the sleep state or to attempt a charge of the other battery. ChargeParameters and HaltParameters are central variables in this function. After each stage, the function returns the next desired state to main(). The program flow of this state function is illustrated in the figure below. 11 8098A-AVR-09/07 Figure 4-4. Flow chart of the charge state function Charge() What is the current ST_ENDCHARGE state? ST_LOWRATECHARG ST_FASTCHARGE E ST_PREQUAL Set charge current to 0.1 C. (BattData.Capacty / 10) Set charge current to 1.0 C (BattData.Capacity) Set charge current to 0.1 C. (BattData.Capacity / 10) Stop PWM output. Set ST_FASTCHARGE as the next desired state. Set ST_LOWRATECHARGE as the next desired state. Set ST_ENDCHARGE as the next desired state. Flag battery as charged. Flag that charging should halt once voltage reaches limit or time runs out, and that timeout means that battery is exhausted. Flag that charging should halt on maximum voltage, voltage drop, timeout or maximum temperature rise. Reset VBATMax. Is the other battery enabled? NO Start charge timer with 30 minute limit. Set voltage limit to defined limit. (BAT_VOLTAGE_PREQUAL) Set maximum voltage and voltage drop limit to the defined values. (BAT_VOLTAGE_MAX & BAT_VOLTAGE_DROP) Set minimum and maximum temperature. (BAT_TEMPERATURE_MIN & 35) Set maximum temperature. (BAT_TEMPERATURE_MAX) Start PWM output. Reset VBATMax. Start charge timer with defined limit. (BAT_TIME_PREQUAL) Start charge timer with 1.5 hour limit. Call ConstantCurrent() to start charging, get next state in return. Call ConstantCurrent() to continue charging, get next state in return. YES Callt ConstantVoltage() to continue charging, get next state in return. Set ST_BATCON as next state. Set ST_SLEEP as next state. Return next state to main(). 4.2.4 Sleep() The application enters sleep mode when all batteries have been fully charged. It wakes up at regular intervals to check the current status of the batteries. Sleep mode is terminated as soon as any battery requires charging. 12 AVR463 8098A-AVR-09/07 AVR463 Sleep mode is illustrated in the flow chart below. Figure 4-5. Flow chart of sleep function Sleep() Sleep for 8 seconds Set first battery to actual Enable actual battery Actual battery charged? NO YES Return(BATCON) First battery actual? NO YES Set second battery to actual 4.2.5 Error() Program flow is diverted here when an error has occurred. The error handler contains some simple algorithms that try to resolve the most common problems. Program execution will exit the error handler when all sources of error have been cleared. The program flow is illustrated in the figure below. 13 8098A-AVR-09/07 Figure 4-6. Flow chart of error handler Error() Stop PWM output Disable all batteries Sleep for 8 seconds Jumper mismatch error? YES Clear bit in error flag Check jumpers NO NO batteries error? YES Any batteries enabled? NO YES Clear bit in error flag NO PWM control error? YES Clear bit in error flag NO Battery temperature error? YES Clear bit in error flag Battery exhausted error? YES Clear battery exhausted bit Change active battery NO Clear bit in error flag Yes Any error flags set? NO Return(INIT) 14 AVR463 8098A-AVR-09/07 AVR463 4.3 Charging Functions These functions are called by Charge() after all parameters have been set. 4.3.1 Constant Current/Voltage These two functions are similar, apart from what ADC measurements they try to keep within limits. Therefore, only the flow chart for ConstantCurrent() is illustrated in the figure below. They both make use of the variable ChargeParameters. If a Master microcontroller is present, it may temporarily stop the charging by flagging a charge inhibit. This is to prevent battery damage during prolonged serial transfers. Figure 4-7. Flow chart for ConstantCurrent() ConstantCurrent() Wait for ADC conversions to complete. Charging of battery inhibited? NO Were we stopped by Master MCU earlier? YES Remove flag that Master MCU stopped the charging. YES NO Flag that Master MCU stopped the charging. Start timers again. NO Drop PWM output to zero. Current below hysteresis? Stop timers. YES Increment PWM duty cycle. YES Decrement PWM duty cycle. NO Current above hysteresis? NO HaltNow()? YES Return next state. 15 8098A-AVR-09/07 4.3.2 Charge Halt Determination Charge halt is determined by HaltNow(). This function is called by ConstantCurrent() and ConstantVoltage() every time they loop, to decide if a stage of charging is done. With the variable HaltParameters the user can specify at what terms the charging should be halted, and if an error should be flagged if e.g. the time limit expires. An error flag will also result in ST_ERROR being set as the next state, thereby aborting the charge. If no errors are flagged, the next desired state, set earlier in Charge(), will apply. Lastly, the function checks if temperature is within limits, if the battery is OK and if mains voltage is above minimum. Should any of these tests fail, the next state is set to an appropriate error handler (ST_ERROR, ST_INIT or ST_SLEEP) and charging is aborted. Figure 4-8. Flow chart for HaltNow() part 1. HaltNow() Wait for ADC conversions to finish. Halt on voltage drop selected? YES Output voltage higher than stored maximum? Voltage drop above or equal to limit? NO YES YES Store new maximum. Set Halt flag. NO NO Halt on maximum voltage selected? YES Output voltage above or equal to limit? YES Set Halt flag. Output current below or equal to limit? YES Set Halt flag. NO NO Halt on minimum current selected? YES NO NO 1 16 AVR463 8098A-AVR-09/07 AVR463 Figure 4-9. Flow chart for HaltNow() part 2 1 Halt on temperature rise? YES Measured NTC above stored NTC? YES NO Difference between stored and measured NTC above or equal to limit? NO Store NTC value. YES Temperature timer expired? Store NTC value. NO Set Halt flag. Start temperature timer. YES Reset temperature timer. NO 2 17 8098A-AVR-09/07 Figure 4-10. Flow chart for HaltNow() part 3 2 Halt on timeout? YES Charging timer run out? YES Set Halt flag. Flag battery exhaustion? YES Stop PWM output. NO Disable battery and flag it as exhausted. NO NO Flag battery exhaustion error and set ST_ERROR as next state. 3 18 AVR463 8098A-AVR-09/07 AVR463 Figure 4-11. Flow chart for HaltNow() part 4 HaltNow() Wait for ADC conversions to finish. Halt on voltage drop selected? YES Output voltage higher than stored maximum? Voltage drop above or equal to limit? NO YES YES Store new maximum. Set Halt flag. NO NO Halt on maximum voltage selected? YES Output voltage above or equal to limit? YES Set Halt flag. Output current below or equal to limit? YES Set Halt flag. NO NO Halt on minimum current selected? YES NO NO 1 4.4 Other Functions The program flow is mainly state-based, but some processing takes place in the background. This includes A/D conversion, time keeping and serial interface handling. All of these functions are interrupt-driven. 4.4.1 A/D Conversion The A/D converter uses the multiplexer to read in data from several channels. At the end of a conversion the ADC Interrupt Service Routine (ISR) is called, as illustrated in the flow chart below. After the ISR is complete program execution will return to normal. 19 8098A-AVR-09/07 Figure 4-12. Flow chart of ADC interrupt service routine ADC_ISR() Disable ADC 0x01 MUX channel? 0x17 0x02 0x05 0x03 Store NTC reading Store RID reading Set next MUX = 0x02 Set next MUX = 0x03 Format and save supply voltage reading Format and save battery voltage reading Format and save average battery current // Flag signed conversion next Flag unsigned conversion next Set next MUX = 0x17 Set next MUX = 0x01 Supply voltage low? YES NO Flag mains failure. Flag a compelete ADC scan cycle Set next MUX = 0x05 Update MUX Set unsigned conversion NO Signed conversion next? Both halt and complete scan cycle flagged? YES NO Set signed conversion Re-enable ADC YES Return from interrupt 4.4.2 Master-Slave Communication This application is designed to work as stand-alone but it also supports co-operation with other microcontrollers. The Universal Serial Interface (USI) can be used for communication between microcontrollers. The basic protocol for this interface has been developed but some functions need to be finalised. 20 AVR463 8098A-AVR-09/07 AVR463 Figure 4-13. Flow chart of USI overflow interrupt service routine. USI_OVF_ISR() Update flags COMMAND Save incoming data Which state? DATA Read or write? ADDRESS Save incoming data (not implemented) Set Read/Write flag (not implemented) Set address Set SRAM/EEPROM flag Change state to DATA Block counter non-zero? Change state to ADDRESS Decrease counter NO Counter Zero? YES Set COMMAND state Return from interrupt 21 8098A-AVR-09/07 5 Quick Start Guide This section describes how to configure, create and download the software. 5.1.1 Configuration The most important compile-time constants are listed in the table below. Table 5-1. Battery-related compile-time constants (see source files battery.c, battery.h and NIMHspecs.h) 22 Label Description BAT_CELL_NUMBER The number of cells in the battery. Each of the defined cell voltages gets multiplied with this, to define BAT_VOLTAGE_MAX, _LOW, _MIN and _PREQUAL. CELL_VOLTAGE_SAFETY In case unmatched batteries are to be charged, this constant is subtracted from CELL_VOLTAGE_MAX for every extra cell in the battery, ie. BAT_CELL_NUMBER – 1. CELL_VOLTAGE_MAX The maximum voltage to which a cell should be charged. CELL_VOLTAGE_LOW The lowest voltage at which a cell is considered charged. Charging will start when voltage drops below this level. CELL_VOLTAGE_MIN The lowest voltage at which charging may be initiated. Should generally be set to the voltage limit under which further discharge of batteries will cause damage. CELL_VOLTAGE_PREQUAL The voltage to which a cell should be charged to during prequalification. BAT_TEMPERATURE_MAX The highest battery temperature allowed. Charging will stop / not start if above this. BAT_TEMPERATURE_MIN The lowest battery temperature allowed. Charging will stop / not start if below this. BAT_CURRENT_PREQUAL Charge current during prequalification mode. BAT_CURRENT_HYST Charge current hysteresis. Current will not be adjusted when within plus or minus this value from target. BAT_VOLTAGE_HYST Charge voltage hysteresis. Current will not be adjusted when within plus or minus this value from target. BAT_VOLTAGE_PREQUAL Target voltage during prequalification stage. If this voltage is not achieved the battery will be marked as exhausted. BAT_TIME_PREQUAL Maximum amount of time to spend in prequalification stage. DEF_BAT_CAPACITY Default battery capacity. DEF_BAT_CURRENT_MAX Default maximum charge current. DEF_BAT_TIME_MAX Default maximum charge time. DEF_BAT_CURRENT_MIN Default cut-off charge current. ALLOW_NO_RID If defined, batteries without RID (or not matching the lookuptable) will cause the charger to use the battery defaults. Otherwise, charge is halted. RID[].Low and RID[].High Assume RID resistance match if value within these limits. AVR463 8098A-AVR-09/07 AVR463 Label Description RID[].Capacity Battery capacity for given RID. RID[].Icharge Charge current for given RID. RID[].tCutOff Maximum charge time for given RID. RID[].IcutOff Charge termination current for given RID. NTC[] Temperature look-up table. 5.1.2 Compilation Before compiling the code the following configurations should be made. Table 5-2. Compiler configuration. Section Tab Field Target Processor configuration General Options System C/C++ Compiler ATtiny861 Memory model Small Data stack 0x40 Return address stack (1) 24 Enable bit definitions … Selected Language Require prototypes Selected Output Format Extra Options Command Line Linker Notes: Value Other: ubrof8 -y(CODE) -Ointel-extended,(DATA)=$EXE_DIR$\$PROJ_FNAME$_data.hex -Ointel-extended,(XDATA)=$EXE_DIR$\$PROJ_FNAME$_eeprom.hex 1. Other options possible. See section 3.1.1 on page 5 for more information. 5.1.3 Programming The compiled code is conveniently downloaded to the target device using AVR Studio and a debugger or programming tool of choice, such as the JTAGICE mkII. Note that the compiled code contains EEPROM data that must be loaded to the target for the software to work. Answer OK when AVR Studio asks if EEPROM contents should be loaded. This is illustrated in the figure below. Figure 5-1. Loading initialised data to EEPROM 23 8098A-AVR-09/07 The program expects the use of the internal oscillator and that the clock signal is not prescaled. Some fuse bits must be programmed to ensure proper program execution. The fuse bit settings that deviate from the default are listed in the table below. Table 5-3. Non-default fuse bit settings Fuse Bit Setting Description CKDIV8 1 (unprogrammed) Do not divide clock by eight CKSEL3…0 0010 Use internal oscillator 6 Known Limitations Here are listed known limitations of the design. 6.1 Detecting Battery Presence Currently, battery presence is detected by measuring the voltage on each battery connector. In case of fully discharged batteries, the voltage will sink to 0 Volts as soon as the relay connects it to the sensing circuitry, causing the charger not to detect them. One solution is to charge such batteries for a couple of minutes with a power supply at about 0.1 C, to raise the voltage slightly. It is also possible to apply a charging voltage, and flag the battery as absent if no current flows. Note that fully discharging batteries may damage them, especially if they are multicell batteries. 6.2 Current Hysteresis and Voltage Drop When charging just one or two cells, the current hysteresis may cause false full charge detection due to a voltage drop. Narrowing the hysteresis may help, but keep in mind that the Buck converter output is not of infinite resolution. 6.3 Battery Current Measurement Battery current is sensed using a shunt resistor with very low resistance. This means noise is easily picked up in the measured signal and that even noise with very low amplitude may disturb the measurements. As a remedy, the battery current measured is averaged over four samples. Yet, it is not uncommon to find fluctuations in the order of 1 or 2 LSB. By default (see section 3.1.3) this means a measurement error of 7 or 14 mA (see function ScaleI() in file ADC.c). In practice, this may result in premature end of charge cycle. The suggested solution is to optimise the size of the shunt resistor (R410: the larger, the better) and the resistor divider (R400…R410, R427, R428, R446 and R447). 6.4 RID Sensing Battery identification resistor is sensed via pin PA2 (ADC2). The default pull-up resistor on this line (R305 in ATAVRBC100 Battery Charger reference design) is 4.7 kohm. This limits the size of the sense resistor to about 14.7 kohm. 24 AVR463 8098A-AVR-09/07 AVR463 When using Varta PoLiFlex batteries this means the largest battery size that can be reliably sensed is 1000 mAh. For larger sense resistors / battery sizes the pull-up resistor on BC100 must be changed. In addition, the software must be updated to reflect the new pull-up resistor value. 6.5 Buck chargers The choice of buck charger (and supply voltage) sets a limit on how low the minimum charge current may be. The higher the supply voltage and the smaller the buck switch inductor, the higher will the minimum charge current be. This means some configurations may result in premature end of charge cycle. The remedy is to use a low supply voltage and a buck switch with a large inductor. 7 References 1. “What’s the best battery?”. Retrieved August 1, 2007, from Battery University: http://www.batteryuniversity.com/partone-3.htm 2. “AVR451 - BC100 Hardware User's Guide”. Available from Atmel web site: http://www.atmel.com/products/avr/ 3. “ATtiny261/461/861 Data Sheet”. Available from Atmel web site: http://www.atmel.com/products/avr/ 4. “ATtiny25/45/85 Data Sheet”. Available from Atmel web site: http://www.atmel.com/products/avr/ 5. “Duracell Ni-MH Rechargeable Batteries Technical Bulletin”. Retrieved August 1, 2007 from Duracell: http://duracell.com/oem/Pdf/others/TECHBULL.pdf 6. “Handbook of Batteries, Third Edition”, from McGraw-Hill. http://www.mhprofessional.com/product.php?isbn=0071359788 7. “Charging nickel-based batteries” Retrieved August 1 2007, from Battery University: http://www.batteryuniversity.com/partone-11.htm 25 8098A-AVR-09/07 Headquarters International Atmel Corporation 2325 Orchard Parkway San Jose, CA 95131 USA Tel: 1(408) 441-0311 Fax: 1(408) 487-2600 Atmel Asia Room 1219 Chinachem Golden Plaza 77 Mody Road Tsimshatsui East Kowloon Hong Kong Tel: (852) 2721-9778 Fax: (852) 2722-1369 Atmel Europe Le Krebs 8, Rue Jean-Pierre Timbaud BP 309 78054 Saint-Quentin-enYvelines Cedex France Tel: (33) 1-30-60-70-00 Fax: (33) 1-30-60-71-11 Atmel Japan 9F, Tonetsu Shinkawa Bldg. 1-24-8 Shinkawa Chuo-ku, Tokyo 104-0033 Japan Tel: (81) 3-3523-3551 Fax: (81) 3-3523-7581 Technical Support [email protected] Sales Contact www.atmel.com/contacts Product Contact Web Site www.atmel.com Literature Request www.atmel.com/literature Disclaimer: The information in this document is provided in connection with Atmel products. No license, express or implied, by estoppel or otherwise, to any intellectual property right is granted by this document or in connection with the sale of Atmel products. EXCEPT AS SET FORTH IN ATMEL’S TERMS AND CONDITIONS OF SALE LOCATED ON ATMEL’S WEB SITE, ATMEL ASSUMES NO LIABILITY WHATSOEVER AND DISCLAIMS ANY EXPRESS, IMPLIED OR STATUTORY WARRANTY RELATING TO ITS PRODUCTS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE, SPECIAL OR INCIDENTAL DAMAGES (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF THE USE OR INABILITY TO USE THIS DOCUMENT, EVEN IF ATMEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Atmel makes no representations or warranties with respect to the accuracy or completeness of the contents of this document and reserves the right to make changes to specifications and product descriptions at any time without notice. Atmel does not make any commitment to update the information contained herein. Unless specifically provided otherwise, Atmel products are not suitable for, and shall not be used in, automotive applications. Atmel’s products are not intended, authorized, or warranted for use as components in applications intended to support or sustain life. © 2007 Atmel Corporation. All rights reserved. Atmel®, logo and combinations thereof, AVR® and others, are the registered trademarks or trademarks of Atmel Corporation or its subsidiaries. Other terms and product names may be trademarks of others. 8098A-AVR-09/07