一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4146|回复: 19
收起左侧

[其他综合] 免费16位ADC,温度监测,日期时钟芯片,电路

[复制链接]
发表于 2017-1-16 14:06 | 显示全部楼层 |阅读模式
其实不是免费,其实也是免费。这个要慢慢说起。

前几天在某地摊20大洋收了一块hp av08的笔记本电池。回家拆开测量发现没输出了。电池基本完好。基本每节都有3.8v电压。测到有个自毁没式保险烧了。不知道短接之后怎样。电池应该也是锁上了。
查询了一下芯片资料。于是查到。

借用一下数码之家某网友的拆机图。和这个差不多。电路板有少许差别。我的芯片是 bq20z70,这货貌似8个美刀。可能我看错。
发帖1.JPG

发帖2.JPG

看了一下bq20z70 pdf文档。有以下条目,先列出感兴趣的部分,其实有很多。

Two 16-Bit Delta-Sigma Converter     16位ADC
SBS Commands 章节
0x08 R Temperature unsigned int 2 0 65535 — 0.1°K   温度读取
0x09 R Voltage unsigned int 2 0 20000 — mV    电压读取,最高20v
0x0a R Current signed int 2 -32768 32767 — mA   电流读取,双向的。
0x3c R CellVoltage4 unsigned int 2 0 65535 — mV    电池1读取,16位,可以读4路。
0x23 R ManufacturerData String 14+1 — — — ASCII  日期时间读取

看到这,非常不错。平时网友玩的东西这里基本都有了。ADC,温度,日期时钟。
这时也许会有某度c论坛的热心网友跳出来抬扛说,温漂如何,线性如何。我只能扔个shit过去了。

于是就有了:
bq20z70 + 单片机+lcd  = 电压表,电流表,温度计,时钟, 看了一下坛里玩得最多的东西不过也这么多。

于是便产生了一下问题,怎么读取,锁死了还能读取吗。SBS Commands协议是什么东东,和i2c有什么区别。i2c硬件地址是什么。
再查资料,查到:
https://github.com/PowerCartel/PackProbe
有人做过类似的工作用arduino读取资料。有个硬件地址,我怎么查不到这个。
[tr]        [/tr]
// standard I2C address for Smart Battery packs
byte deviceAddress = 11;
某些网友的发现。
另外發現在電池沒拿下來時, 可以透過這個介面讀資料, 換句話說,
也可以在不斷電的情況下讀取好的板子跟寫到被鎖的板子上, 機會
應該很高...好像BQ2084直接用I2C介面直讀Flash也能成功, 不
受密碼保護限制, 因為文件沒有寫到保護相關的資訊

最简单使用后背接口,只要连接4根线:电源、地线、SCL、SDA(笔记本电池接口处的“电池连接”认证脚2和1脚要连好,SCL、SDA是I2C总线的两根线)。连接了这些线以后,笔记本即可与电池通讯、充电、放电、正常使用。

bq20z90 可驱动 3、4 或 5 段 LED 显示屏,以显示电池剩余电量。针对一些不需要显示器的设计,TI 还推出了不带 LED 显示驱动器的 bq20z70 电量监测计芯片组

该器件利用 I2C 通信接口实现了 bq20z90 对电池安全状况(如电压、单节电池电压以及电池平衡数据)的监控,并能够向主机系统报告信息。

暂告一段落,有空试试,快手的网友可以先测试。希望报告一下成果。



以上用到的芯片估计大部分网友都有。有的也许还有不少。或者扔掉不少。何不废物利用呢。能实现以上功能的芯片费用不低,何况这是全部集成起来的。














发表于 2017-1-16 14:58 | 显示全部楼层
我之前换笔记本电池的时候自己还做了一个BQ208X的编程器,用EV2200试出了密码并对电池重新编程,时间太久了,编程器不知道还在不在。
现在笔记本电池不同的厂家密码好像都不一样,要重新编程不是那么容易。
 楼主| 发表于 2017-1-16 15:15 | 显示全部楼层
sln.1550 发表于 2017-1-16 14:58
我之前换笔记本电池的时候自己还做了一个BQ208X的编程器,用EV2200试出了密码并对电池重新编程,时间太久了 ...

解锁需要密码。貌似如此。
我只是吧芯片当传感器用。读取电压信息,温度,等,这个需要密码吗?不太明白。

另外问问。你用的数据端口是电池上的接口吗?还是芯片上引线出来。指明一下。

发表于 2017-1-16 15:31 | 显示全部楼层
MOWEIWEI 发表于 2017-1-16 15:15
解锁需要密码。貌似如此。
我只是吧芯片当传感器用。读取电压信息,温度,等,这个需要密码吗?不太明白 ...

编程器是接电池上的,不需要直接接芯片。不清楚读取数据是不是需要密码,我用EV2200软件去操作,不是直接读写
发表于 2017-1-16 17:39 | 显示全部楼层
本帖最后由 狗狗百里游 于 2017-1-16 17:41 编辑

搜索是否有I2C设备,并且输出地址的代码,给有时候不知道i2c设备的类型,跟是否能正常使用,来测试


#include <Wire.h>


void setup() {

  Serial.begin(115200);
  Wire.begin();
  Serial.println("\nI2C Scanner");
}


void loop() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.

    Wire.beginTransmission(address);
    error = Wire.endTransmission();
   
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);

      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found");
  else
    Serial.println("done");

  delay(5000);           // wait 5 seconds for next scan
}
发表于 2017-1-16 18:48 | 显示全部楼层
IIC 可以多个从设备接入,所以就有了地址这个概念.
像 24C0X 有一面的三个脚都接地,这三个脚就是定义地址的.

IIC 一般是7位地址, 也有10位地址的.

这种芯片ADC估计采集时间会比较长, 做电压表有局限性.
 楼主| 发表于 2017-1-16 19:29 | 显示全部楼层
附上测试代码


//  Arduino Dpin6 = Atmega PD7
#define SDA_PORT PORTD
#define SDA_PIN 7

// Arduino DPin8 = Atmega PB4
#define SCL_PORT PORTB
#define SCL_PIN 4

#define I2C_SLOWMODE 1
#include <SoftI2CMaster.h>


// standard I2C address for Smart Battery packs
byte deviceAddress = 11;
//byte deviceAddress = 18;
//byte deviceAddress = 0x12;
//byte deviceAddress = 0x14;


/************************************************************************************
Output Selection
This sketch was made to run on the WiFi-enabled Arduino Yun.
The default programming and output connection of the Yun is over TCP/IP
rather than the serial connection used by most other Arduino boards.
The default output on the Yun is available through the Console library.
If you are using this sketch on board with a serial port, you'll need to
#include <Serial.h> instead and change every instance of "Console." in the
code to "Serial." In addition you need to comment/uncomment the necessary
code in the setup function before compiling and installing on your board.
We are looking for a clean way to simplify this configuration in the future,
or make it automatic. Suggestions welcome.
*************************************************************************************/

// Yun Bridge Console Access
//#include <Console.h>

// Standard and common non-standard Smart Battery commands
#define BATTERY_MODE             0x03
#define TEMPERATURE              0x08
#define VOLTAGE                  0x09
#define CURRENT                  0x0A
#define RELATIVE_SOC             0x0D
#define ABSOLUTE_SOC             0x0E
#define REMAINING_CAPACITY       0x0F
#define FULL_CHARGE_CAPACITY     0x10
#define TIME_TO_FULL             0x13
#define CHARGING_CURRENT         0x14
#define CHARGING_VOLTAGE         0x15
#define BATTERY_STATUS           0x16
#define CYCLE_COUNT              0x17
#define DESIGN_CAPACITY          0x18
#define DESIGN_VOLTAGE           0x19
#define SPEC_INFO                0x1A
#define MFG_DATE                 0x1B
#define SERIAL_NUM               0x1C
#define MFG_NAME                 0x20   // String
#define DEV_NAME                 0x21   // String
#define CELL_CHEM                0x22   // String
#define MFG_DATA                 0x23   // String
#define CELL4_VOLTAGE            0x3C   // Indidual cell voltages don't work on Lenovo and Dell Packs
#define CELL3_VOLTAGE            0x3D
#define CELL2_VOLTAGE            0x3E
#define CELL1_VOLTAGE            0x3F
#define STATE_OF_HEALTH          0x4F

#define bufferLen 32
uint8_t i2cBuffer[bufferLen];

void setup()
{
  Serial.begin(9600);
  /**************************************************
  Comment out the next two lines following lines for use with Serial output
  
  **************************************************/
  //Bridge.begin();
  //Console.begin();

  /**************************************************
  Uncomment the following lines for use with Serial output
  
  **************************************************/
  //Serial.begin(115200);  // start serial for output
  //Serial.println(i2c_init());
  //pinMode(22,INPUT_PULLUP);
  //pinMode(23,INPUT_PULLUP);

/*
  while (!Console) {   
    ; // wait for Console port to connect.
  }

  Console.println("Console Initialized");
  
  i2c_init();
  Console.println("I2C Inialized");
  */
  i2c_init();
  Serial.println("I2C Inialized");
  scan();
}

int fetchWord(byte func)
{
  i2c_start(deviceAddress<<1 | I2C_WRITE);
  i2c_write(func);
  i2c_rep_start(deviceAddress<<1 | I2C_READ);
  byte b1 = i2c_read(false);
  byte b2 = i2c_read(true);
  i2c_stop();
  return (int)b1|((( int)b2)<<8);
}

uint8_t i2c_smbus_read_block ( uint8_t command, uint8_t* blockBuffer, uint8_t blockBufferLen )
{
  uint8_t x, num_bytes;
  i2c_start((deviceAddress<<1) + I2C_WRITE);
  i2c_write(command);
  i2c_rep_start((deviceAddress<<1) + I2C_READ);
  num_bytes = i2c_read(false); // num of bytes; 1 byte will be index 0
  num_bytes = constrain(num_bytes,0,blockBufferLen-2); // room for null at the end
  for (x=0; x<num_bytes-1; x++) { // -1 because x=num_bytes-1 if x<y; last byte needs to be "nack"'d, x<y-1
    blockBuffer[x] = i2c_read(false);
  }
  blockBuffer[x++] = i2c_read(true); // this will nack the last byte and store it in x's num_bytes-1 address.
  blockBuffer[x] = 0; // and null it at last_byte+1
  i2c_stop();
  return num_bytes;
}


void scan()
{
  byte i = 0;
  for ( i= 0; i < 127; i++  )
  {
    Serial.print("Address: 0x");
    Serial.print(i,HEX);
    bool ack = i2c_start(i<<1 | I2C_WRITE);
    if ( ack ) {
      Serial.println(": OK");
      Serial.flush();
    }
    else {
      Serial.println(": -");
      Serial.flush();      
    }
    i2c_stop();
  }
}


void loop()
{
  uint8_t length_read = 0;

  Serial.print("Manufacturer Name: ");
  length_read = i2c_smbus_read_block(MFG_NAME, i2cBuffer, bufferLen);
  Serial.write(i2cBuffer, length_read);
  Serial.println("");

  Serial.print("Device Name: ");
  length_read = i2c_smbus_read_block(DEV_NAME, i2cBuffer, bufferLen);
  Serial.write(i2cBuffer, length_read);
  Serial.println("");

  Serial.print("Chemistry ");
  length_read = i2c_smbus_read_block(CELL_CHEM, i2cBuffer, bufferLen);
  Serial.write(i2cBuffer, length_read);
  Serial.println("");

  // Serial.print("Manufacturer Data ");
  // length_read = i2c_smbus_read_block(MFG_DATA, i2cBuffer, bufferLen);
  // Serial.write(i2cBuffer, length_read);
  // Serial.println("");
  
  Serial.print("Design Capacity: " );
  Serial.println(fetchWord(DESIGN_CAPACITY));
  
  Serial.print("Design Voltage: " );
  Serial.println(fetchWord(DESIGN_VOLTAGE));
  
  String formatted_date = "Manufacture Date (Y-M-D): ";
  int mdate = fetchWord(MFG_DATE);
  int mday = B00011111 & mdate;
  int mmonth = mdate>>5 & B00001111;
  int myear = 1980 + (mdate>>9 & B01111111);
  formatted_date += myear;
  formatted_date += "-";
  formatted_date += mmonth;
  formatted_date += "-";
  formatted_date += mday;
  Serial.println(formatted_date);

  Serial.print("Serial Number: ");
  Serial.println(fetchWord(SERIAL_NUM));

  Serial.print("Specification Info: ");
  Serial.println(fetchWord(SPEC_INFO));

  Serial.print("Cycle Count: " );
  Serial.println(fetchWord(CYCLE_COUNT));
  
  Serial.print("Voltage: ");
  Serial.println((float)fetchWord(VOLTAGE)/1000);

  Serial.print("Full Charge Capacity: " );
  Serial.println(fetchWord(FULL_CHARGE_CAPACITY));
  
  Serial.print("Remaining Capacity: " );
  Serial.println(fetchWord(REMAINING_CAPACITY));

  Serial.print("Relative Charge(%): ");
  Serial.println(fetchWord(RELATIVE_SOC));
  
  Serial.print("Absolute Charge(%): ");
  Serial.println(fetchWord(ABSOLUTE_SOC));
  
  Serial.print("Minutes remaining for full charge: ");
  Serial.println(fetchWord(TIME_TO_FULL));

  // These aren't part of the standard, but work with some packs.
  // They don't work with the Lenovo and Dell packs we've tested
  Serial.print("Cell 1 Voltage: ");
  Serial.println(fetchWord(CELL1_VOLTAGE));
  Serial.print("Cell 2 Voltage: ");
  Serial.println(fetchWord(CELL2_VOLTAGE));
  Serial.print("Cell 3 Voltage: ");
  Serial.println(fetchWord(CELL3_VOLTAGE));
  Serial.print("Cell 4 Voltage: ");
  Serial.println(fetchWord(CELL4_VOLTAGE));
  
  Serial.print("State of Health: ");
  Serial.println(fetchWord(STATE_OF_HEALTH));

  Serial.print("Battery Mode (BIN): 0b");
  Serial.println(fetchWord(BATTERY_MODE),BIN);

  Serial.print("Battery Status (BIN): 0b");
  Serial.println(fetchWord(BATTERY_STATUS),BIN);
  
  Serial.print("Charging Current: ");
  Serial.println(fetchWord(CHARGING_CURRENT));
  
  Serial.print("Charging Voltage: ");
  Serial.println(fetchWord(CHARGING_VOLTAGE));

  Serial.print("Temp: ");
  unsigned int tempk = fetchWord(TEMPERATURE);
  Serial.println((float)tempk/10.0-273.15);

  Serial.print("Current (mA): " );
  Serial.println(fetchWord(CURRENT));
  
  Serial.println(".");
//delay(1000);
}

 楼主| 发表于 2017-1-16 19:33 | 显示全部楼层
I2C devices found
ScaI2C Inialized
Address: 0x0: -
Address: 0x1: -
Address: 0x2: -
Address: 0x3: -
Address: 0x4: -
Address: 0x5: -
Address: 0x6: -
Address: 0x7: -
Address: 0x8: -
Address: 0x9: -
Address: 0xA: -
Address: 0xB: -
Address: 0xC: -
Address: 0xD: -
Address: 0xE: -
Address: 0xF: -
Address: 0x10: -
Address: 0x11: -
Address: 0x12: -
Address: 0x13: -
Address: 0x14: -
Address: 0x15: -
Address: 0x16: -
Address: 0x17: -
Address: 0x18: -
Address: 0x19: -
Address: 0x1A: -
Address: 0x1B: -
Address: 0x1C: -
Address: 0x1D: -
Address: 0x1E: -
Address: 0x1F: -
Address: 0x20: -
Address: 0x21: -
Address: 0x22: -
Address: 0x23: -
Address: 0x24: -
Address: 0x25: -
Address: 0x26: -
Address: 0x27: -
Address: 0x28: -
Address: 0x29: -
Address: 0x2A: -
Address: 0x2B: -
Address: 0x2C: -
Address: 0x2D: -
Address: 0x2E: -
Address: 0x2F: -
Address: 0x30: -
Address: 0x31: -
Address: 0x32: -
Address: 0x33: -
Address: 0x34: -
Address: 0x35: -
Address: 0x36: -
Address: 0x37: -
Address: 0x38: -
Address: 0x39: -
Address: 0x3A: -
Address: 0x3B: -
Address: 0x3C: -
Address: 0x3D: -
Address: 0x3E: -
Address: 0x3F: -
Address: 0x40: -
Address: 0x41: -
Address: 0x42: -
Address: 0x43: -
Address: 0x44: -
Address: 0x45: -
Address: 0x46: -
Address: 0x47: -
Address: 0x48: -
Address: 0x49: -
Address: 0x4A: -
Address: 0x4B: -
Address: 0x4C: -
Address: 0x4D: -
Address: 0x4E: -
Address: 0x4F: -
Address: 0x50: -
Address: 0x51: -
Address: 0x52: -
Address: 0x53: -
Address: 0x54: -
Address: 0x55: -
Address: 0x56: -
Address: 0x57: -
Address: 0x58: -
Address: 0x59: -
Address: 0x5A: -
Address: 0x5B: -
Address: 0x5C: -
Address: 0x5D: -
Address: 0x5E: -
Address: 0x5F: -
Address: 0x60: -
Address: 0x61: -
Address: 0x62: -
Address: 0x63: -
Address: 0x64: -
Address: 0x65: -
Address: 0x66: -
Address: 0x67: -
Address: 0x68: -
Address: 0x69: -
Address: 0x6A: -
Address: 0x6B: -
Address: 0x6C: -
Address: 0x6D: -
Address: 0x6E: -
Address: 0x6F: -
Address: 0x70: -
Address: 0x71: -
Address: 0x72: -
Address: 0x73: -
Address: 0x74: -
Address: 0x75: -
Address: 0x76: -
Address: 0x77: -
Address: 0x78: -
Address: 0x79: -
Address: 0x7A: -
Address: 0x7B: -
Address: 0x7C: -
Address: 0x7D: -
Address: 0x7E: -
Manufacturer Name: &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
Device Name: &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
Chemistry &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
Design Capacity: -1
Design Voltage: -1
Manufacture Date (Y-M-D): 2107-15-31
Serial Number: -1
Specification Info: -1
Cycle Count: -1
Voltage: -0.00
Full Charge Capacity: -1
Remaining Capacity: -1
Relative Charge(%): -1
Absolute Charge(%): -1
Minutes remaining for full charge: -1
Cell 1 Voltage: -1
Cell 2 Voltage: -1
Cell 3 Voltage: -1
Cell 4 Voltage: -1
State of Health: -1
Battery Mode (BIN): 0b11111111111111111111111111111111
Battery Status (BIN): 0b11111111111111111111111111111111
Charging Current: -1
Charging Voltage: -1
Temp: 6280.35
Current (mA): -1


测试结果。很仆街。只有日期和温度出来。最重要的电压信息一个都没有。
 楼主| 发表于 2017-1-16 19:37 | 显示全部楼层
狗狗百里游 发表于 2017-1-16 17:39
搜索是否有I2C设备,并且输出地址的代码,给有时候不知道i2c设备的类型,跟是否能正常使用,来测试

试了一下这个代码不错。
 楼主| 发表于 2017-1-16 19:48 | 显示全部楼层
最后看了一下程序,其实什么都没读出,日期和温度是程序产生的默认值。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-20 18:20 , Processed in 0.073806 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表