LTC2943具温度电压和电流测量功能的多节电池电量测量芯片Word格式文档下载.docx
《LTC2943具温度电压和电流测量功能的多节电池电量测量芯片Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LTC2943具温度电压和电流测量功能的多节电池电量测量芯片Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
三LI-ION
1ALOAD
TotalChargeErrorvs
DifferentialSenseVoltage
OJ110100
▼sense(mV)
294aTAOIt
描述
LTC?
2943可测量便携式产品应用中的电池充电状态、电池电压、电池电流及其自身温度。
其
具有宽输入电压范围,因而可与高达20V的多节电池配合使用。
一个精准的库仑计量器负责对流
经位于电池正端子与负载或充电器之间的一个检测电阻器电流进行积分运算。
电池电压、电流
与温度利用一个内部14位无延迟增量累加(NoLatency△男)ADC来测量。
测量结果被存储于可通过内置I2C/SMBus接口进行存取的内部寄存器中。
LTC2943具有针对所有4种测量物理量的可编程高门限与低门限。
如果超过了某个编程门限,则
该器件将采用SMBus警报协议或通过在内部状态寄存器中设定一个标记来传送警报信号。
LTC2943仅需采用单个低阻值检测电阻器以设定测量电流范围。
应用
电动工具
电动自行车
便携式医疗设备
视频摄像机
程序:
#ineludevArduino、h>
#ineludevstdint、h>
#inelude"
Linduino、h"
LT_I2C、h"
#include"
UserInterface、h"
QuikEval_EEPROM、h"
LTC2943、h"
#include<
Wire、h>
//FunctionDeclaration
voidprint_title();
//Printthetitleblock
voidprint_prompt();
//PrintthePrompt
voidstore_alert_settings();
//StorethealertsettingstotheEEPROM
int8_trestore_alert_settings();
//ReadthealertsettingsfromEEPROM
//!
<
Thedelay
Thedelaybetween
#defineAUTOMATIC_MODE_DISPLAY_DELAY1000betweenreadingsinautomaticmode
constfloatresistor=、100;
resistorvalueondemoboard
#defineSCAN_MODE_DISPLAY_DELAY10000readingsinscanmode
CheckI2CAddress、"
;
//!
Error
//Errorstring
constcharack_error[]="
Error:
NoAcknowledgemessage
//Globalvariables
staticint8_tdemo_board_connected;
Setto1iftheboardisconnected
staticuint8_talert_code=0;
ValuestoredorreadfromALERT
register、Sharedbetweenloop()andrestore_alert_settings()
InitializeLinduino
voidsetup()
{
chardemo_name[]="
DC1812"
DemoBoardNamestoredinQuikEvalEEPROM
quikeval_I2C_init();
ConfiguretheEEPROMI2Cportfor100kHz
quikeval_I2C_connect();
ConnectstomainI2Cport
Serial、begin(115200);
InitializetheserialporttothePC
print_title();
demo_board_connected=discover_demo_board(demo_name);
if(demo_board_connected)
print_prompt();
}
else
demo_board_connected=true;
Serial、println("
DidnotreadIDString,attemptingtoproceedanyway\nPleaseensureI2ClinesofLinduinoareconnectedtotheLTCdevice"
);
RepeatsLinduinoloop
voidloop()
int8_tack=0;
I2Cacknowledgeindicator
staticuint8_tuser_command;
Theuserinputcommandstaticuint8_tmAh_or_Coulombs=0;
staticuint8_tcelcius_or_kelvin=0;
staticuint16_tprescalar_mode=LTC2943_PRESCALAR_M_4096;
staticuint16_tprescalarValue=4096;
staticuint16_talcc_mode=LTC2943_ALERT_MODE;
Donothingifthedemoboardisnot
Donothingifserialisnotavailable
Readuserinputcommand
if(demo_board_connected)connected
if(Serial、available())
user_command=read_int();
if(user_command!
='
m'
)
Serial、println(user_command);
Serial、println();
ack=0;
switch(user_command)//!
Printstheappropriatesubmenu
case1:
ack|=menu_1_automatic_mode(mAh_or_Coulombs,celcius_or_kelvin,prescalar_mode,prescalarValue,alcc_mode);
AutomaticMode
break;
case2:
ack|=menu_2_scan_mode(mAh_or_Coulombs,celcius_or_kelvin,prescalar_mode,prescalarValue,alcc_mode);
ScanMode
case3:
ack|=menu_3_manual_mode(mAh_or_Coulombs,celcius_or_kelvin,prescalar_mode,prescalarValue,alcc_mode);
ManualMode
case4:
ack|=menu_4_sleep_mode(mAh_or_Coulombs,prescalar_mode,prescalarValue,alcc_mode);
SleepMode
case5:
ack|=menu_5_shutdown_mode();
ShutdownMode
case6:
ack|=menu_6_settings(&
mAh_or_Coulombs,&
celcius_or_kelvin,&
prescalar_mode,&
prescalarValue,&
alcc_mode);
SettingsMode
Ifackisnotrecievedprint
if(ack!
=0)anerror、
Serial、println(ack_error);
//FunctionDefinitions//!
Printthetitleblockvoidprint_title()
Serial、
***********************************************************
println(F("
\n
******"
));
*\n"
Serial、print(F("
*DC1812ADemonstrationProgram
Serial、print(F("
*
*ThisprogramcommunicateswiththeLTC2943MulticellCoulomb*\n"
*CounterfoundontheDC1812Ademoboard、
*Setthebaudrateto115200andselectthenewlineterminator*\n"
print(F("
*************************************************************
**\n"
PrintthePromptvoidprint_prompt()
\n1-AutomaticMode\n"
2-ScanMode\n"
3-ManualMode\n"
4-SleepMode\n"
5-ShutdownMode\n"
6-Settings\n"
Enteracommand:
"
}
AutomaticModeint8_tmenu_1_automatic_mode(int8_tmAh_or_Coulombs,int8_tcelcius_or_kelvin,uint16_tprescalar_mode,uint16_tprescalarValue,uint16_talcc_mode)//!
@returnReturnsthestateoftheacknowledgebitaftertheI2Caddresswrite0=acknowledge,1=noacknowledge、
int8_tLTC2943_mode;
LTC2943_mode=LTC2943_AUTOMATIC_MODE|prescalar_mode|alcc_mode;
SetthecontrolregisteroftheLTC2943toautomaticmodeaswellassetprescalarandAL#/CC#pinvalues、
ack|=LTC2943_write(LTC2943_I2C_ADDRESS,LTC2943_CONTROL_REG,LTC2943_mode);
WritesthesetmodetotheLTC2943controlregister
print(F(
H***********************
**\n\n"
do{
uint8_tstatus_code,hightemp_code,lowtemp_code;
uint16_tcharge_code,current_code,voltage_code,temperature_code;
ack|=LTC2943_read_16_bits(LTC2943_I2C_ADDRESS,
LTC2943_ACCUM_CHARGE_MSB_REG,&
charge_code);
ReadMSBandLSBAccumulatedChargeRegistersfor16bitchargecode
LTC2943_VOLTAGE_MSB_REG,&
voltage_code);
ReadMSBandLSBVoltageRegistersfor16bitvoltagecode
LTC2943_CURRENT_MSB_REG,&
current_code);
ReadMSBandLSBCurrentRegistersfor16bitcurrentcode
LTC2943_TEMPERATURE_MSB_REG,&
temperature_code);
ReadMSBandLSBTemperatureRegistersfor16bittemperaturecode
ack|=LTC2943_read(LTC2943_I2C_ADDRESS,LTC2943_STATUS_REG,&
status_code);
ReadStatusRegisterfor8bitstatuscode
floatcharge,current,voltage,temperature;
if(mAh_or_Coulombs)
charge=LTC2943_code_to_coulombs(charge_code,resistor,prescalarValue);
ConvertchargecodetoCoulombsifCoulombunitsaredesired、
Serial、print("
Coulombs:
C\n"
charge=LTC2943_code_to_mAh(charge_code,resistor,prescalarValue);
ConvertchargecodetomAhifmAhunitsaredesired、
mAh:
Serial、print(charge,4);
mAh\n"
current=LTC2943_code_to_current(current_code,resistor);
ConvertcurrentcodetoAmperes
voltage=LTC2943_code_to_voltage(voltage_code);
ConvertvoltagecodetoVolts
Current"
Serial、print(current,4);
A\n"
Voltage"
Serial、print(voltage,4);
V\n"
if(celcius_or_kelvin){temperature=LTC2943_code_to_kelvin_temperature(temperature_code);
Converttemperaturecodetokelvin
Temperature"
Serial、print(temperature,4);
K\n"
temperature=LTC2943_code_to_celcius_temperature(temperature_code);
Converttemperaturecodetocelcius
checkAlerts(status_code);
CheckstatuscodeforAlerts、IfanAlerthasbeenset,printoutappropriatemessageintheSerialPrompt、
m-MainMenu\n\n"
Serial、flush();
delay(AUTOMATIC_MODE_DISPLAY_DELAY);
Delayfor1sbeforenextpolling
while(Serial、available()==false||(ack));
ifSerialis
notavailableandanNACKhasnotbeenrecieved,keeppollingtheregisters、
read_int();
//clearstheSerial、available
return(ack);
ScanModeint8_tmenu_2_scan_mode(int8_tmAh_or_Coulombs,int8_tcelcius_or_kelvin,uint16_tprescalar_mode,uint16_tprescalarValue,uint16_talcc_mode)//!
@returnReturnsthestateoftheacknowledgebitaftertheI2Caddresswrite0=acknowledge,1=noacknowledge
LTC2943_mode=LTC2943_SCAN_MODE|prescalar_mode|alcc_mode;
SetthecontrolmodeoftheLTC2943toscanmodeaswellassetprescalarandAL#/CC#pinvalues、
do
uint8_tstatus_code;
uint16_tcharge_code,current_code,voltage_code,temperature_code;
ReadMSBandLSB
ack|=LTC2943_read_16_bits(LTC2943_I2C_ADDRESS,LTC2943_ACCUM_CHARGE_MSB_REG,&
AccumulatedChargeRegistersfor16bitchargecode
ack|=LTC2943_read_16_bits(LTC2943_I2C_ADDRESS,LTC2943_VOLTAGE_MSB_REG,&
VoltageRegistersfor16bitvoltagecode
ack|=LTC2943_read_16_bits(LTC2943_I2C_ADDRESS,LTC2943_CURRENT_MSB_REG,&
CurrentRegistersfor16bitcurrentcode
ack|=LTC2943_read_16_bits(LTC2943_I2C_ADDRESS,LTC2943_TEMPERATURE_MSB_REG,&
ReadStatusRegistersfor8bitstatuscode
floatcharge