MAX17043/MAX17044为结构紧凑、低成本、主机侧电量计,用于手持及便携产品的锂离子(Li+)电池的电量计量。MAX17043配置为单节锂电池计量,MAX17044配置为两节2S电池组计量。
MAX17043/MAX17044采用成熟的Li+电池建模方案(称为ModelGauge™),在整个充/放电过程中连续跟踪电池的相对充电状态(SOC)。与传统的电量计不同,ModelGauge算法省去了电池的再学习过程以及外部检流电阻。器件提供温度补偿,使得µC与器件之间的交互操作降至最少。

需要注意的是,MAX17043仅支持单节锂电池计量或者锂电池的并联计量,常见的18650单节或者并联多节都是可以的。MAX17043不带电池保护功能,所以在18650锂电池的输出端需要先接锂电池保护板,再将保护板的输出接到MAX17043上。

max17043_iic.h
#ifndef __MAX17043_IIC_H_
#define __MAX17043_IIC_H_#include <STC8.H>#define MAX17043_SCL     P43
#define MAX17043_SDA     P44void MAX17043_IIC_Start();
void MAX17043_IIC_Stop();
void MAX17043_IIC_WriteACK(unsigned char ack);
unsigned char MAX17043_IIC_WaitACK();
void MAX17043_IIC_WriteByte(unsigned char wdata);
unsigned char MAX17043_IIC_ReadByte();#endif
max17043_iic.c
#include "max17043_iic.h"
#include "intrins.h"static void MAX17043_Delay()
{unsigned char i;_nop_();_nop_();i = 20;while(--i);
}void MAX17043_IIC_Start()
{MAX17043_SDA = 1;MAX17043_SCL = 1;MAX17043_Delay();MAX17043_SDA = 0;MAX17043_Delay();MAX17043_SCL = 0;
}void MAX17043_IIC_Stop()
{MAX17043_SDA = 0;MAX17043_SCL = 0;MAX17043_Delay();MAX17043_SCL = 1;MAX17043_Delay();MAX17043_SDA = 1;MAX17043_Delay();
}void MAX17043_IIC_WriteACK(unsigned char ack)
{MAX17043_SDA = ack;MAX17043_Delay();MAX17043_SCL = 1;MAX17043_Delay();MAX17043_SCL = 0;
}unsigned char MAX17043_IIC_WaitACK()
{  unsigned char errtime = 50;MAX17043_Delay(); /*读ACK*/MAX17043_SCL = 1;while(MAX17043_SDA){  errtime--;if(!errtime) {MAX17043_IIC_Stop();return 0;}}MAX17043_SCL = 0;MAX17043_Delay();return 1;
}void MAX17043_IIC_WriteByte(unsigned char wdata)
{unsigned char i;for(i=0; i<8; i++){MAX17043_SDA = wdata&0x80;wdata <<= 1;MAX17043_SCL = 1;MAX17043_Delay();MAX17043_SCL = 0;}
}unsigned char MAX17043_IIC_ReadByte()
{unsigned char i, bytedata;MAX17043_SDA = 1;for(i=0; i<8; i++){MAX17043_SCL = 1; bytedata <<= 1;bytedata |= MAX17043_SDA;MAX17043_SCL = 0;MAX17043_Delay();}return bytedata;
}
max17043.h
#ifndef __MAX17043_H_
#define __MAX17043_H_#define MAX17043_WRITE_ADDR    0x6C
#define MAX17043_READ_ADDR     0x6D#define MAX17043_VCELL_MSB     0x02
#define MAX17043_VCELL_LSB     0x03
#define MAX17043_SOC_MSB       0x04
#define MAX17043_SOC_LSB       0x05
#define MAX17043_MODE_MSB      0x06
#define MAX17043_MODE_LSB      0x07
#define MAX17043_VERSION_MSB   0x08
#define MAX17043_VERSION_LSB   0x09
#define MAX17043_CONFIG_MSB    0x0C
#define MAX17043_CONFIG_LSB    0x0D
#define MAX17043_COMMAND_MSB   0xFE
#define MAX17043_COMMAND_LSB   0xFF#define MAX17043_ALT     P32
#define MAX17043_QST     P40float MAX17043_GetBatteryPercent();
void MAX17043_QuickStart();
void MAX17043_EnterSleepMode();
void MAX17043_Restart();
void MAX17043_ClearAlert();
void MAX17043_SetAlertThreshold(unsigned char threshold);#endif
max17043.c
#include "max17043.h"
#include "max17043_iic.h"
#include "debug.h"
#include "intrins.h"static void MAX17043_Delayms(unsigned int ms)     //@24.000MHz
{unsigned char i, j;while(ms){_nop_();i = 32;j = 40;do{while (--j);} while (--i);ms--;}
}// 写寄存器,MAX17043写入的时候地址会自动增,所以可以连续写
// addr:芯片寄存器起始地址
// buf:写数组值
// count:写的长度
// lastBitAck: 最后写的字节写完之后,主机是否发送应答
//
// 返回:0--写入失败,1--写入成功
static unsigned char MAX17043_WriteReg(unsigned char addr, unsigned char *buf, unsigned char count, unsigned char lastBitAck)
{unsigned char ret;unsigned char i;MAX17043_IIC_Start();MAX17043_IIC_WriteByte(MAX17043_WRITE_ADDR);ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write AddrCMD error, device not ack!\r\n");return 0;}MAX17043_IIC_WriteByte(addr);ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write Addr error, device not ack!\r\n");return 0;}for(i=0; i<count; i++){MAX17043_IIC_WriteByte(buf[i]);   /*写数据*/if(i < count-1 || lastBitAck){ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write data error, device not ack!\r\n");return 0;}}}MAX17043_IIC_Stop();return 1;
}// 读寄存器,MAX17043读取的时候地址会自动增,所以可以连续读
// addr:芯片寄存器起始地址
// buf:读取存放数组
// count:读的长度
//
// 返回:0--读取失败,1--读取成功
static unsigned char MAX17043_ReadReg(unsigned char address, unsigned char * buf, unsigned char count) /*多字节*/
{ unsigned char ret;unsigned char i;MAX17043_IIC_Start();MAX17043_IIC_WriteByte(MAX17043_WRITE_ADDR); //写命令ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write AddrCMD error, device not ack!\r\n");return 0;}MAX17043_IIC_WriteByte(address); //写地址ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write AddrCMD error, device not ack!\r\n");return 0;}MAX17043_IIC_Start();MAX17043_IIC_WriteByte(MAX17043_READ_ADDR); //读命令ret = MAX17043_IIC_WaitACK();if(!ret){Debug_UartSendStr("MAX17043: Write ReadCMD error, device not ack!\r\n");return 0;}for(i=0; i<count; i++){*buf++ = MAX17043_IIC_ReadByte();if(i < count-1){MAX17043_IIC_WriteACK(0);}else{MAX17043_IIC_WriteACK(1);}}  MAX17043_IIC_Stop();return 1;
} // 获取百分比单位的电池剩余电量
float MAX17043_GetBatteryPercent()
{unsigned char buf[2] = {0};float percent = 0.0;MAX17043_ReadReg(MAX17043_SOC_MSB, buf, sizeof(buf));percent = buf[0] + buf[1]/256.0; // buf[0]是1%精度的剩余电量// buf[1]是1/256%精度的剩余电量return percent;
}// 快速启动
// 这里使用了硬件直接在QST引脚给上升沿的方式
// 也可以向MAX17043写寄存器的方式实现,参考数据手册
void MAX17043_QuickStart()
{MAX17043_QST = 0;MAX17043_Delayms(2);MAX17043_QST = 1;MAX17043_Delayms(2);
}// 进入睡眠模式
// 这里将SCL和SDA拉低2.5s进入睡眠模式
// 同样也可以写寄存器使之进入睡眠模式
void MAX17043_EnterSleepMode()
{MAX17043_SCL = 0;MAX17043_SDA = 0;MAX17043_Delayms(2600);
}// 重启,效果和断电重启一样
void MAX17043_Restart()
{unsigned char buf[2] = {0x00, 0x54};// 最后一位写入的时候,MAX17043是不应答的,需要注意MAX17043_WriteReg(MAX17043_COMMAND_MSB, buf, sizeof(buf), 0);
}// 设置电量警报阈值
// threshold:整数百分比单位的阈值,范围是32~1,也就是32%~1%之间
void MAX17043_SetAlertThreshold(unsigned char threshold)
{unsigned char buf[2] = {0x97, 0x1C};if(threshold > 0x1f)  // 如果阈值大于32%,那么限制成32%{threshold = 0x1f;}buf[1] = (0x1F - threshold) | 0x20;  // 设置成寄存器格式,并打开中断// 最后一位写入的时候,MAX17043会应答MAX17043_WriteReg(MAX17043_CONFIG_MSB, buf, sizeof(buf), 1);
}// 清除阈值电量中断标志位
void MAX17043_ClearAlert()
{unsigned char buf[2] = {0x97, 0x1C};MAX17043_ReadReg(MAX17043_CONFIG_MSB, buf, sizeof(buf));buf[1] &= 0xDF;MAX17043_WriteReg(MAX17043_CONFIG_MSB, buf, sizeof(buf), 1);
}

MAX17043锂电池电量测量芯片C51驱动相关推荐

  1. 自己开发的锂电池电量显示芯片

    今天测试成功了单片机控制的双节锂电池电量显示电路.功能有: 1.显示8.4V两节锂电池的电量:按一下按钮,唤醒休眠,显示电量剩余值,7秒后自动熄灭,进入休眠状态.电池电压低于7.4V时能报警显示.检测 ...

  2. 电源管理芯片MAX17048驱动

    电源管理芯片MAX17048驱动 芯片功能 电路 配置 代码 关于电量补偿 最近调试MAX17048,做个简单的记录. 基于STM32H743 芯片功能 MAX17048为小尺寸.微功耗电池电量计,用 ...

  3. 电量检测芯片BQ27510使用心得

    最近接触到一款TI的电量检测芯片BQ27510,网上很少有人提及该芯片如何使用,大部分博文都是搬得BQ27510的datasheet,至于真正使用过的很少,该芯片我个人感觉还是非常强大的,能自动学习你 ...

  4. 单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用

    单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用 2:品牌名称:泛海微 3方案特点: 4.(1)产品特点 特点:   3.6V独立的单节磷酸铁锂电池充电管理    ...

  5. 锂电池升压充电管理芯片CS5080,CS5086,CS5090,CS5095的功能特性与参数比较

    锂电池升压充电管理芯片CS5080,CS5086,CS5090,CS5095的功能特性与参数比较 CS5095E是一款5V输入,最大1.5A充电电流,支持三节锂电池串联应用,锂离子电池的升压充电管理I ...

  6. CYPRESS USB芯片win10驱动

    CYPRESS USB芯片win10驱动 The ZIP file attached with this knowledge base article contains the CyUSB3.inf ...

  7. c++驱动键鼠源码_Android移植FM芯片RDA5807M驱动指导

    文档说明 本文档以SC826为例(MSM8953平台,Android 7),描述如何移植FM芯片RDA5807M驱动. 移植修改 1):rdafm_drv.c rdafm_drv.h 放到kernel ...

  8. 晶联讯JLX12864G-086-PC-3S LCD显示屏 C51驱动代码

    晶联讯JLX12864G-086-PC-3S LCD显示屏 C51驱动代码 //7.1.2 例程:以下为串行方式显示汉字及 ASCII 字符的例程: //液晶屏型号:JLX12864G-086-PC- ...

  9. 芯片噪声测试软件,教你如何测量芯片数字模拟噪声 - 全文

    摘要:在数字设计中,需要持续关注模拟网络上的串扰风险问题,传统流程中通常不会分析此问题.本文将介绍一种利用PrimeTIme-SI来生成由数字信号在模拟网络上引起的串扰上限的技术.如果此技术揭露出潜在 ...

最新文章

  1. .Net开发笔记(十九) 创建一个可以可视化设计的对象
  2. r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf
  3. mysql创建管理密码_mysql 创建用户与授权、修改密码
  4. 让我们共同怀揣文学与艺术的梦想
  5. ac自动机 匹配最长前缀_别再暴力匹配字符串了,高效的KMP,才是真的香
  6. Revit Family API 找到实体某一方向上的面。
  7. mysql 5.6 登录 警告_解决mysql登录出现警告问题的简单方法
  8. Oracle批量插入数据
  9. 阿里云移动端播放器高级功能---画面控制
  10. 高等代数第3版下 [丘维声 著] 2015年版_一文搞懂代数几何发展史(一)
  11. 新年2021HTML,2021新年倒计时html代码
  12. 用互联网大脑模型分析滴滴的战略意图和战术失误
  13. PS设置图片背景透明色
  14. ubuntu终端英文乱码问题
  15. 微型6轴惯性导航姿态传感器(IMU)LPMS-BE2 OEM
  16. Vue路由懒加载报错问题解决
  17. scratch做简单跑酷游戏_Scratch(七)篇外.用小动画和触碰能做大型游戏?
  18. 畅言普通话软件测试准确率高吗,畅言普通话测试准确吗?畅言普通话准确度介绍...
  19. html语言期末考试,HTML期末考试复习题及参考答案
  20. Webpack基础打包

热门文章

  1. Socket套接字通信 TCP UDP详解(网络通信)
  2. IT公司、软件公司资质(转)
  3. 黑色诺言_蝴蝶——壁纸 Win7
  4. vue el-table的合并单元格与拆分单元格
  5. 如何用git将项目代码上传到github
  6. Remix本地环境搭建
  7. 权值初始化 - Xavier和MSRA方法
  8. Python旅途休憩——闭包
  9. 天猫登录html代码,天猫静态页面
  10. 计算机英语阅读短文,计算机经 典英语短文阅读.pdf