LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片_第1頁
LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片_第2頁
LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片_第3頁
LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片_第4頁
LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、LTC2943 - 具溫度、電壓和電流測量功能的多節(jié)電池電量測量芯片特點· 可測量累積的電池充電和放電電量· 3.6V 至 20V 工作范圍可適合多種電池應用· 14 位 ADC 負責測量電池電壓、電流和溫度· 1% 電壓、電流和充電準確度· ±50mV 檢測電壓范圍· 高壓側檢測· 適合任何電池化學組成和容量的通用測量· I2C / SMBus 接口· 可配置警報輸出 / 充電完成輸入· 靜態(tài)電流小于 120A· 小外形 8 引腳 3mm x 3mm DFN 封裝典型應用描

2、述LTC®2943 可測量便攜式產品應用中的電池充電狀態(tài)、電池電壓、電池電流及其自身溫度。其具有寬輸入電壓范圍,因而可與高達 20V 的多節(jié)電池配合使用。一個精準的庫侖計量器負責對流經位于電池正端子和負載或充電器之間的一個檢測電阻器電流進行積分運算。電池電壓、電流和溫度利用一個內部 14位無延遲增量累加 (No Latency TM) ADC 來測量。測量結果被存儲于可通過內置 I2C / SMBus 接口進行存取的內部寄存器中。LTC2943 具有針對所有 4 種測量物理量

3、的可編程高門限和低門限。如果超過了某個編程門限,則該器件將采用 SMBus 警報協議或通過在內部狀態(tài)寄存器中設定一個標記來傳送警報信號。LTC2943 僅需采用單個低阻值檢測電阻器以設定測量電流范圍。應用· 電動工具· 電動自行車· 便攜式醫(yī)療設備· 視頻攝像機程序:#include <Arduino.h>#include <stdint.h>#include "Linduino.h"#include "LT_I2C.h"#include "UserI

4、nterface.h"#include "QuikEval_EEPROM.h"#include "LTC2943.h"#include <Wire.h>/ Function Declarationvoid print_title(); / Print the title blockvoid print_prompt(); / Print the Promptvoid store_alert_settings(); / Store the alert settings to the EEPROMint8_t restore_alert

5、_settings(); / Read the alert settings from EEPROM#define AUTOMATIC_MODE_DISPLAY_DELAY 1000 /!< The delay 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 s

6、tringconst char ack_error = "Error: No Acknowledge. Check I2C Address." /!< Error message/ Global variablesstatic int8_t demo_board_connected; /!< Set to 1 if the board is connectedstatic uint8_t alert_code = 0; /!< Value stored or read from ALERT register. Shared between loop() a

7、nd restore_alert_settings()/! Initialize Linduinovoid setup() char demo_name = "DC1812" /! Demo Board Name stored in QuikEval EEPROM quikeval_I2C_init(); /! Configure the EEPROM I2C port for 100kHz quikeval_I2C_connect(); /! Connects to main I2C port Serial.begin(115200); /! Initialize the

8、 serial port to the PC print_title(); demo_board_connected = discover_demo_board(demo_name); if (demo_board_connected) print_prompt(); else demo_board_connected = true;Serial.println("Did not read ID String, attempting to proceed anyway.nPlease ensure I2C lines of Linduino are connected to the

9、LTC device"); /! Repeats Linduino loopvoid loop() int8_t ack = 0; /! I2C acknowledge indicator static uint8_t user_command; /! The user input command static uint8_t mAh_or_Coulombs = 0; static uint8_t celcius_or_kelvin = 0; static uint16_t prescalar_mode = LTC2943_PRESCALAR_M_4096; static uint1

10、6_t prescalarValue = 4096; static uint16_t alcc_mode = LTC2943_ALERT_MODE; if (demo_board_connected) /! Do nothing if the demo board is not connected if (Serial.available() /! Do nothing if serial is not available user_command = read_int(); /! Read user input command if (user_command != 'm')

11、 Serial.println(user_command); Serial.println(); ack = 0; switch (user_command) /! Prints the appropriate submenu case 1: ack |= menu_1_automatic_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Automatic Mode break; case 2: ack |= menu_2_scan_mode(mAh_or_Coulo

12、mbs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Scan Mode break; case 3: ack |= menu_3_manual_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode); /! Manual Mode break; case 4: ack |= menu_4_sleep_mode(mAh_or_Coulombs, prescalar_mode, prescalarV

13、alue, alcc_mode); /! Sleep Mode break; case 5: ack |= menu_5_shutdown_mode(); /! Shutdown Mode break; case 6: ack |= menu_6_settings(&mAh_or_Coulombs, &celcius_or_kelvin, &prescalar_mode, &prescalarValue, &alcc_mode); /! Settings Mode break; if (ack != 0) /! If ack is not recieve

14、d print an error. Serial.println(ack_error); Serial.print(F("*"); print_prompt(); / Function Definitions/! Print the title blockvoid print_title() Serial.println(F("n*"); Serial.print(F("* DC1812A Demonstration Program *n"); Serial.print(F("* *n"); Serial.prin

15、t(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.*n"); Serial.print(F("* *n"); Serial.prin

16、t(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(&qu

17、ot;6-Settingsn"); Serial.print(F("Enter a command: ");/! 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

18、 address write. 0=acknowledge, 1=no acknowledge. int8_t LTC2943_mode; int8_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(

19、LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode); /! Writes the set mode to the LTC2943 control register do Serial.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(LTC294

20、3_I2C_ADDRESS, LTC2943_ACCUM_CHARGE_MSB_REG, &charge_code); /! Read MSB and LSB Accumulated Charge Registers for 16 bit charge code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code); /! Read MSB and LSB Voltage Registers for 16 bit voltage code ack |= L

21、TC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_CURRENT_MSB_REG, &current_code); /! Read MSB and LSB Current Registers for 16 bit current code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temperature Registers for 16 b

22、it temperature code ack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code); /! Read Status Register for 8 bit status code float charge, current, voltage, temperature; if(mAh_or_Coulombs) charge = LTC2943_code_to_coulombs(charge_code, resistor, prescalarValue); /! Convert char

23、ge code to Coulombs if Coulomb units are desired. Serial.print("Coulombs: "); Serial.print(charge, 4); Serial.print(F(" Cn"); else charge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue); /! Convert charge code to mAh if mAh units are desired. Serial.print("mAh:

24、"); Serial.print(charge, 4); Serial.print(F(" mAhn"); current = LTC2943_code_to_current(current_code, resistor); /! Convert current code to Amperes voltage = LTC2943_code_to_voltage(voltage_code); /! Convert voltage code to Volts Serial.print(F("Current "); Serial.print(curr

25、ent, 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 temperature code to kelvin Serial.print(F("Temperature

26、"); Serial.print(temperature, 4); Serial.print(F(" Kn"); else temperature = LTC2943_code_to_celcius_temperature(temperature_code); /! Convert temperature code to celcius Serial.print(F("Temperature "); Serial.print(temperature, 4); Serial.print(F(" Cn"); checkAlert

27、s(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 polling while (Serial.available() = false | (ack)

28、; /! if Serial is not available and an NACK has not been recieved, keep polling the registers. read_int(); / clears the Serial.available return(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_m

29、ode)/! return Returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge int8_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

30、# pin values. Serial.println(); ack |= LTC2943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode); /! Writes the set mode to the LTC2943 control register do Serial.print(F("*nn"); uint8_t status_code; uint16_t charge_code, current_code, voltage_code, temperature_code; ack |= LTC

31、2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_ACCUM_CHARGE_MSB_REG, &charge_code); /! Read MSB and LSB Accumulated Charge Registers for 16 bit charge code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code); /! Read MSB and LSB Voltage Registers for 16 b

32、it voltage code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_CURRENT_MSB_REG, &current_code); /! Read MSB and LSB Current Registers for 16 bit current code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temper

33、ature Registers for 16 bit temperature code ack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code); /! Read Status Registers for 8 bit status code float charge, current, voltage, temperature; if(mAh_or_Coulombs) charge = LTC2943_code_to_coulombs(charge_code, resistor, prescal

34、arValue); /! Convert charge code to Coulombs if Coulomb units are desired. Serial.print("Coulombs: "); Serial.print(charge, 4); Serial.print(F(" Cn"); else charge = LTC2943_code_to_mAh(charge_code, resistor, prescalarValue); /! Convert charge code to mAh if mAh units are desired.

35、 Serial.print("mAh: "); Serial.print(charge, 4); Serial.print(F(" mAhn"); current = LTC2943_code_to_current(current_code, resistor); /! Convert current code to Amperes voltage = LTC2943_code_to_voltage(voltage_code); /! Convert voltage code to Volts Serial.print(F("Current &

36、quot;); 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 temperature code to Kelvin if Kelvi

37、n units are desired. Serial.print(F("Temperature "); Serial.print(temperature, 4); Serial.print(F(" Kn"); else temperature = LTC2943_code_to_celcius_temperature(temperature_code); /! Convert temperature code to Celcius if Celcius units are desired. Serial.print(F("Temperatur

38、e "); 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 Prompt Serial.print(F("m-Main Menunn"); Serial.flush(); delay(SCAN_MODE_DISPLAY_DELAY);

39、 while (Serial.available() = false | (ack); read_int(); / clears the Serial.available return(ack);/! Manual Modeint8_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 Returns the state of the acknowle

40、dge bit after the I2C address write. 0=acknowledge, 1=no acknowledge int8_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. Serial.println(); ack |= LTC2

41、943_write(LTC2943_I2C_ADDRESS, LTC2943_CONTROL_REG, LTC2943_mode); /! Writes the set mode to the LTC2943 control register int 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. do Serial.print(F(&

42、quot;*nn"); uint8_t status_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 Charge Registers for 16 bit charge code ack |= LTC2943_read_16_b

43、its(LTC2943_I2C_ADDRESS, LTC2943_VOLTAGE_MSB_REG, &voltage_code); /! Read MSB and LSB Voltage Registers for 16 bit voltage code ack |= LTC2943_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_CURRENT_MSB_REG, &current_code); /! Read MSB and LSB Current Registers for 16 bit current code ack |= LTC29

44、43_read_16_bits(LTC2943_I2C_ADDRESS, LTC2943_TEMPERATURE_MSB_REG, &temperature_code); /! Read MSB and LSB Temperature Registers for 16 bit temperature code ack |= LTC2943_read(LTC2943_I2C_ADDRESS, LTC2943_STATUS_REG, &status_code); /! Read Status Registers for 8 bit status code float charge,

45、 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 charge =

46、 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 Ampe

47、res voltage = LTC2943_code_to_voltage(voltage_code); /! Convert voltage code to Volts Serial.print(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 snap

48、shot, Print Stale Data message. else Serial.println(""); Serial.print(F("Voltage "); Serial.print(voltage, 4); Serial.print(F(" V"); 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(""); if(celcius_or_kelvin) temperature = LTC2943_code_to_kelvin_temperature(temperature_code); /! Convert temperature code to Kelvin if Kelvin units are desired. Serial.print(F("

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論