LTC具温度电压和电流测量功能的多节电池电量测量芯片_第1页
LTC具温度电压和电流测量功能的多节电池电量测量芯片_第2页
LTC具温度电压和电流测量功能的多节电池电量测量芯片_第3页
LTC具温度电压和电流测量功能的多节电池电量测量芯片_第4页
LTC具温度电压和电流测量功能的多节电池电量测量芯片_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LTC2943 -具温度、电压和电流测量功能的多节电池电量测量芯片特点可测量累积的电池充电和放电电量3.6V至20V工作范围可适合多种电池应用14位ADC负责测量电池电压、电流和温度1%电压、电流和充电准确度50mV检测电压范围高压侧检测适合任何电池化学组成和容量的通用测量I2C / SMBus 接口 可配置警报输出/充电完成输入静态电流小于 120卩A小外形8引脚3mm x 3mm DFN圭寸装典型应用描述LTC ?2943?可测量便携式产品应用中的电池充电状态、电池电压、电池电流及其自身温度。其具有宽输入电压范围,因而可与高达?20V?的多节电池配合使用。一个精准的库仑计量器负责对流经位于

2、电池正端子和负载或充电器之间的一个检测电阻器电流进行积分运算。电池电压、电流和温度利用一个内部?14位无延迟增量累加?(No Latency 男)ADC?来测量。测量结果被存储于可通过内置?I2C / SMBus?接口进行存取的内部寄存器中。LTC2943?具有针对所有?4?种测量物理量的可编程高门限和低门限。如果超过了某个编程门限,则该器件 将采用?SMBus?警报协议或通过在内部状态寄存器中设定一个标记来传送警报信号。LTC2943?仅需采用单个低阻值检测电阻器以设定测量电流范围。应用电动工具电动自行车便携式医疗设备视频摄像机程序:#include #include #include Li

3、nduino.h#include LT_I2C.h#include UserInterface.h#include QuikEval_EEPROM.h#include LTC2943.h#include / Function Declarationvoid print_title();/ Print the title blockvoid print_prompt();/ Print the Promptvoid store_alert_settings();/ Store the alert settings to theEEPROMint8_t restore_alert_settings

4、(); / Read the alert settings from EEPROM#define AUTOMATIC_MODE_DISPLAY_DELAY 1000/! Thedelay between readings in automatic mode#define SCAN_MODE_DISPLAY_DELAY 10000 /! The delay between readings in scan modeconst float resistor = .100;/!resistor value on demo board/ Error stringconst char ack_error

5、 = Error: No Acknowledge. Check I2C Address.; /! Error message/ Global variablesstatic int8_t demo_board_connected;/! Set to 1 if the boardis connectedstatic uint8_t alert_code = 0;/! Value stored or readfrom ALERT register. Shared between loop() and restore_alert_settings()/! Initialize Linduino vo

6、id setup()char demo_name = DC1812; /! Demo Board Name stored in QuikEval EEPROMquikeval_I2C_init(); /! Configure the EEPROM I2C port for 100kHzquikeval_I2C_connect(); /! Connects to main I2C portSerial.begin(115200); /! Initialize the serial port to the PCprint_title();demo_board_connected = discove

7、r_demo_board(demo_name);if (demo_board_connected)print_prompt();elsedemo_board_connected = true;Serial.println(Did not read ID String, attempting to proceed anyway.nPlease ensure I2C lines of Linduino are connected to the LTC device);/! Repeats Linduino loopvoid loop()/! I2C acknowledge/! The user i

8、nputint8_t ack = 0; indicatorstatic uint8_t user_command; commandstatic uint8_t mAh_or_Coulombs = 0;static uint8_t celcius_or_kelvin = 0;static uint16_t prescalar_mode = LTC2943_PRESCALAR_M_4096;static uint16_t prescalarValue = 4096;static uint16_t alcc_mode = LTC2943_ALERT_MODE;if (demo_board_conne

9、cted) demo board is not connectedif (Serial.available() serial is not availableuser_command = read_int(); commandif (user_command != m)Serial.println(user_command);Serial.println();ack = 0;switch (user_command) appropriate submenu/! Do nothing if the/! Do nothing if/! Read user input/! Prints thecas

10、e 1:ack |= menu_1_automatic_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Automatic Modebreak;case 2:ack |= menu_2_scan_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Scan Modebreak;case 3:ack |= menu_3_manual_mode(mA

11、h_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Manual Modebreak;case 4:ack |= menu_4_sleep_mode(mAh_or_Coulombs, prescalar_mode, prescalarValue, alcc_mode); /! Sleep Modebreak;case 5:ack |= menu_5_shutdown_mode();/! Shutdown Modebreak;case 6:ack |= menu_6_settings(&

12、mAh_or_Coulombs, &celcius_or_kelvin, &prescalar_mode, &prescalarValue, &alcc_mode); /! Settings Modebreak;if (ack != 0)/! If ack is not recieved print an error.Serial.println(ack_error);Serial.print(F( *);print_prompt();/ Function Definitions /! Print the title blockvoid print_title()Serial.println(

13、F(n *);Serial.print(F(* DC1812A Demonstration Program*n);Serial.print(F(*n);Serial.print(F(* This program communicates with the LTC2943 Multicell Coulomb *n);Serial.print(F(* Counter found on the DC1812A demo board. *n);Serial.print(F(* Set the baud rate to 115200 and select the newline terminator.*

14、n);Serial.print(F(*n);Serial.print(F( * n);/! Print the Promptvoid print_prompt()Serial.print(F(n1-Automatic Moden);Serial.print(F(2-Scan Moden);Serial.print(F(3-Manual Moden);Serial.print(F(4-Sleep Moden);Serial.print(F(5-Shutdown Moden);Serial.print(F(6-Settingsn);Serial.print(F(Enter a command: )

15、;/! Automatic M8_t menu_1_automatic_mode(int8_t mAh_or_Coulombs, int8_t celcius_or_kelvin ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)/! return Returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no 8_t LTC2943_mode;i

16、nt8_t ack = 0;LTC2943_mode = LTC2943_AUTOMATIC_MODE|prescalar_mode|alcc_mode ; /! Set the control register of the LTC2943 to automatic mode as well as set prescalar and AL#/CC# pin values.Serial.println();ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode); /! Writes the set

17、 mode to the LTC2943 control registerdoSerial.print(F(*nn);uint8_t status_code, hightemp_code, lowtemp_code;uint16_t charge_code, current_code, voltage_code, temperature_code;ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_ACCUM_CHARGE_MSB_REG, &charge_code); /! Read MSB and LSB Accumulated

18、 Charge Registers for 16 bit charge codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code);/! Read MSB and LSBVoltage Registers for 16 bit voltage codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_CURRENT_MSB_REG, ¤t_code); /! Read MSB and LSB C

19、urrent Registers for 16 bit current codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temperature Registers for 16 bit temperature codeack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code);/! Read Status Reg

20、ister for 8bit status codefloat charge, current, voltage, temperature;if(mAh_or_Coulombs)charge = LTC2943_code_to_coulombs(charge_code, resistor, prescalarValue); /! Convert charge code to Coulombs if Coulomb units are desired.Serial.print(Coulombs: );Serial.print(charge, 4);Serial.print(F( Cn);else

21、charge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue); /! Convert charge code to mAh if mAh units are desired.Serial.print(mAh: );Serial.print(charge, 4);Serial.print(F( mAhn);current = LTC2943_code_to_current(current_code, resistor);/! Convert current code to Amperesvoltage = LTC2943_

22、code_to_voltage(voltage_code);/! Convert voltage code to VoltsSerial.print(F(Current );Serial.print(current, 4);Serial.print(F( An);Serial.print(F(Voltage );Serial.print(voltage, 4);Serial.print(F( Vn);if(celcius_or_kelvin)temperature =LTC2943_code_to_kelvin_temperature(temperature_code); /! Convert

23、 temperature code to kelvinSerial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( Kn);elsetemperature =LTC2943_code_to_celcius_temperature(temperature_code); /! Convert temperature code to celciusSerial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( Cn);checkAl

24、erts(status_code);/! Check status code for Alerts. If an Alert has been set, print out appropriate message in the Serial Prompt.Serial.print(F(m-Main Menunn);Serial.flush();delay(AUTOMATIC_MODE_DISPLAY_DELAY);/! Delay for 1s before next pollingwhile (Serial.available() = false | (ack);/! if Serial i

25、s not available and an NACK has not been recieved, keep polling the registers.read_int(); / clears the Serial.availablereturn(ack);/! Scan Modeint8_t menu_2_scan_mode(int8_t mAh_or_Coulombs , int8_t celcius_or_kelvin ,uint16_t prescalar_mode,uint16_t prescalarValue, uint16_t alcc_mode)/! return Retu

26、rns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledgeint8_t LTC2943_mode;int8_t ack = 0;LTC2943_mode = LTC2943_SCAN_MODE|prescalar_mode|alcc_mode ;/! Set the control mode of the LTC2943 to scan mode as well as set prescalar and AL#/CC# pin values.Serial.pr

27、intln();ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode);/! Writes the set mode to the LTC2943 controlregisterdoSerial.print(F(*nn);uint8_t status_code;uint16_t charge_code, current_code, voltage_code, temperature_code;ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2

28、943_ACCUM_CHARGE_MSB_REG, &charge_code);/! Read MSB andLSB Accumulated Charge Registers for 16 bit charge codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code);/! Read MSB andLSB Voltage Registers for 16 bit voltage codeack |= LTC2943_read_16_bits(LTC2943_I2C_A

29、DDRESS, LTC2943_CURRENT_MSB_REG, ¤t_code); /! Read MSB and LSB Current Registers for 16 bit current codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temperature Registers for 16 bit temperature codeack |= LTC2943_read(LTC

30、2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code); /! Read Status Registers for8 bit status codefloat charge, current, voltage, temperature;if(mAh_or_Coulombs)charge = LTC2943_code_to_coulombs(charge_code, resistor, prescalarValue);/! Convert charge codeto Coulombs if Coulomb units are desired.Ser

31、ial.print(Coulombs: );Serial.print(charge, 4); Serial.print(F( Cn);charge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue);/! Convert chargecode to mAh if mAh units are desired.Serial.print(mAh: );Serial.print(charge, 4);Serial.print(F( mAhn);current = LTC2943_code_to_current(current_cod

32、e, resistor); /! Convert current code to Amperesvoltage = LTC2943_code_to_voltage(voltage_code);/! Convert voltage code to VoltsSerial.print(F(Current );Serial.print(current, 4);Serial.print(F( An);Serial.print(F(Voltage );Serial.print(voltage, 4);Serial.print(F( Vn);if(celcius_or_kelvin)temperature

33、 = LTC2943_code_to_kelvin_temperature(temperature_code); /! Convert temperature code to Kelvin if Kelvin units are desired.Serial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( Kn);elsetemperature = LTC2943_code_to_celcius_temperature(temperature_code); /! Convert temperature cod

34、e to Celcius if Celcius units are desired.Serial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( Cn);checkAlerts(status_code);/! Check status code for Alerts. If an Alert has been set, print out appropriate message in the Serial PromptSerial.print(F(m-Main Menunn);Serial.flush();d

35、elay(SCAN_MODE_DISPLAY_DELAY);while (Serial.available() = false | (ack);read_int(); / clears the Serial.availablereturn(ack);/! Manual Mode int8_t menu_3_manual_mode(int8_t mAh_or_Coulombs ,int8_t celcius_or_kelvin ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode) /! return Retu

36、rns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledgeint8_t LTC2943_mode;int8_t ack = 0;LTC2943_mode = LTC2943_MANUAL_MODE|prescalar_mode|alcc_mode ;/! Set the control mode of the LTC2943 to manual mode as well as set prescalar and AL#/CC# pin values.Seria

37、l.println();ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode);/! Writes the set mode to theLTC2943 control registerint staleData = 0;/! Stale Data Check variable. When set to 1 it indicates that stale data is being read from the voltage, current and temperature registers.d

38、oSerial.print(F(*nn);uint8_t status_code;uint16_t charge_code, current_code, voltage_code, temperature_code;/! Read MSB andack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_ACCUM_CHARGE_MSB_REG, &charge_code); LSB Accumulated Charge Registers for 16 bit charge codeack |= LTC2943_read_16_bits(

39、LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code);/! Read MSB andLSB Voltage Registers for 16 bit voltage codeack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_CURRENT_MSB_REG, ¤t_code);/! Read MSB andLSB Current Registers for 16 bit current codeack |= LTC2943_read_16_bits(LT

40、C2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temperature Registers for 16 bit temperature codeack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code);/! Read Status Registers for8 bit status codefloat charge, current, voltage, temperature

41、;if(mAh_or_Coulombs)charge = LTC2943_code_to_coulombs(charge_code, resistor, prescalarValue);/! Convert charge codeto Coulombs if Coulomb units are desired.Serial.print(Coulombs: );Serial.print(charge, 4);Serial.print(F( Cn);elsecharge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue); /!

42、 Convert charge code to mAh if mAh units are desired.Serial.print(mAh: );Serial.print(charge, 4);Serial.print(F( mAhn);current = LTC2943_code_to_current(current_code, resistor);/! Convert current code to Amperesvoltage = LTC2943_code_to_voltage(voltage_code);/! Convert voltage code to VoltsSerial.pr

43、int(F(Current );Serial.print(current, 4);Serial.print(F( A);if(staleData) Serial.print(F( * Stale Data *n);/! If Stale data is inside the register after initial snapshot, Print Stale Data message.else Serial.println();Serial.print(F(Voltage );Serial.print(voltage, 4);Serial.print(F( V);if(staleData)

44、 Serial.print(F( * Stale Data *n);/! If Stale data is inside the register after initial snapshot, Print Stale Data message.else Serial.println();if(celcius_or_kelvin)temperature = LTC2943_code_to_kelvin_temperature(temperature_code); /! Convert temperature code to Kelvin if Kelvin units are desired.

45、Serial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( K);elsetemperature = LTC2943_code_to_celcius_temperature(temperature_code); /! Convert temperature code to Celcius if Celcius units are desired.Serial.print(F(Temperature );Serial.print(temperature, 4);Serial.print(F( C);if(st

46、aleData) Serial.print(F( * Stale Data *n);else Serial.println();checkAlerts(status_code);/! Check status code for Alerts. If an Alert has been set, print out appropriate message in the Serial PromptSerial.print(F(m-Main Menunn);staleData = 1;Serial.flush(); delay(AUTOMATIC_MODE_DISPLAY_DELAY);while

47、(Serial.available() = false | (ack); read_int(); / clears the Serial.available return(ack);/! Sleep Modeint8_t menu_4_sleep_mode(int8_t mAh_or_Coulombs ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)/! return Returns the state of the acknowledge bit after the I2C address write

48、. 0=acknowledge, 1=no acknowledgeint8_t LTC2943_mode;int8_t ack = 0;LTC2943_mode = LTC2943_SLEEP_MODE|prescalar_mode|alcc_mode ;/! Set the control mode of the LTC2943 to sleep mode as well as set prescalar and AL#/CC# pin values.Serial.println();ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONT

49、ROL_REG, LTC2943_mode);/! Writes the set mode to the LTC2943control registerdonn);*delay(100);Serial.print(F(uint8_t status_code;uint16_t charge_code;ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_ACCUM_CHARGE_MSB_REG, &charge_code); /! Read MSB and LSB Accumulated Charge Registers for 16

50、bit charge codeack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code);/! Read Status Registers for 8bit status codefloat charge;if(mAh_or_Coulombs)charge = LTC2943_code_to_coulombs(charge_code, resistor, prescalarValue);/! Convert charge code toCoulombs if Coulomb units are desir

51、ed.Serial.print(Coulombs: );Serial.print(charge, 4);Serial.print(F( Cn);elsecharge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue); /! Convert charge code to mAh if mAh units are desired.Serial.print(mAh: );Serial.print(charge, 4);Serial.print(F( mAhn);Serial.print(F(Current );Serial.pr

52、int(F( ADC Sleep.n);Serial.print(F(Voltage );Serial.print(F( ADC Sleep.n);Serial.print(F(Temperature );Serial.print(F( ADC Sleep.n);Serial.print(F(m-Main Menunn); checkAlerts(status_code);Serial.flush(); delay(AUTOMATIC_MODE_DISPLAY_DELAY);while (Serial.available() = false | (ack);read_int(); / clea

53、rs the Serial.available return(ack);/! Shutdown Modeint8_t menu_5_shutdown_mode()/! return Returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledgeint8_t ack = 0;ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_SHUTDOWN_MODE);/! Sets the LTC2943 intoshutdown modeSerial.print(LTC2943 Has Been ShutDownn); return(ack);/! Settings Menuint8_t menu_6_settings(uint8_t *mAh_or_Coulombs, uint8_t*celcius_or_kelvin, uint16_t *prescalar_mode, uint16_t *pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论