当前位置: 首页 > news >正文

[单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)

接上一篇:[单片机框架][device层] fuelgauge 电量计

CW2015 是一款超紧凑、低成本、主机侧/电池组侧、无传感电阻器的电量计量系统 IC,适用于手持和便携式设备中的锂离子 (Li+) 电池。
CW2015 跟踪 Li+ 电池的运行状况,并使用最先进的算法报告非常不同的电池化学系统(LiCoOx、聚合物锂离子、LiMnOx 等)的相对充电状态 (SOC)。
CW2015 包括一个 14 位 Sigma-Delta ADC、一个精密电压基准和内置准确温度传感器。该 IC 允许最终用户消除占用大量电路板面积的昂贵感测电阻器。如果电池 SOC 水平达到预先设定的阈值,IC 也会发出警报信号。
快速启动功能提供了对电池 SOC 进行初始估计的可能性,这也使 IC 能够位于系统侧或电池组侧,为系统制造商提供灵活性关于包装选择。
CW2015 使用 2 线 I2C 兼容串行接口,可在标准 (100 kHz) 或快速 (400 kHz) 模式下运行。

功能特性

• 应用于系统侧或电池包内

• ±3%剩余电量误差

• 14-bit模数转换器进行温度和电压检测

• 无需检流电阻

• 无库伦计累积误差

• 无学习周期

• 低电量警示中断

• 功耗

  • 工作模式 15μA

  • 休眠模式 0.5μA

• I2C接口

在这里插入图片描述

fuelgauge.c

#include "log.h"
#include "errorno.h"

#include "fuelgauge.h"

int32_t fuelgauge_driver_register(const char *name, fuelgauge_driver_t *drv) {
    int32_t ret;
    driver_t *pdrv;
    pdrv = &(drv->drv);
    pdrv->drv_data = (void*)drv;
    pdrv->type = DRIVER_CLASS_FULE_GAUGE;
    /* register to driver manager */
    ret = driver_register(pdrv, name);

    return ret;
}

fuelgauge_driver_t* fuelgauge_driver_find(const char *name) {
    fuelgauge_driver_t *fuelgauge;
    driver_t *pdrv;
    pdrv = driver_find(name);
    if (pdrv == NULL || pdrv->type != DRIVER_CLASS_FULE_GAUGE)
        return NULL;
    fuelgauge = (fuelgauge_driver_t*)pdrv->drv_data;
    return fuelgauge;
}

int32_t fuelgauge_driver_probe(fuelgauge_driver_t *drv) {
    int32_t ret;
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    ret = driver_probe(&drv->drv);
    return ret;
}

int32_t fuelgauge_driver_init(fuelgauge_driver_t *drv) {
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    if (drv->ops.init)
        return drv->ops.init();
    return RETVAL(E_NOT_SUPPORT);
}

int32_t fuelgauge_driver_get_info(fuelgauge_driver_t *drv, fuelgauge_info_t *info) {
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    if (drv->ops.get_info)
        return drv->ops.get_info(drv, info);
    return RETVAL(E_NOT_SUPPORT);
}

int32_t fuelgauge_driver_set_work_mode(fuelgauge_driver_t *drv, fuelgauge_work_mode_t mode) {
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    if (drv->ops.set_work_mode)
        return drv->ops.set_work_mode(drv, mode);
    return RETVAL(E_NOT_SUPPORT);
}

int32_t fuelgauge_driver_set_batt_type(fuelgauge_driver_t *drv, uint32_t type) {
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    if (drv->ops.set_batt_type)
        return drv->ops.set_batt_type(drv, type);
    return RETVAL(E_NOT_SUPPORT);
}

int32_t fuelgauge_driver_set_charge_state(fuelgauge_driver_t *drv, fuelgauge_charge_state_t state, uint32_t current) {
    if (drv == NULL)
        return RETVAL(E_NO_DEV);
    if (drv->ops.set_charge_state)
        return drv->ops.set_charge_state(drv, state, current);
    return RETVAL(E_NOT_SUPPORT);
}

fuelgauge.h

#ifndef __FUEL_GAUGE_H__
#define __FUEL_GAUGE_H__

#include "typedefs.h"
#include "driver.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
    FUELGAUGE_SET_CHARGER_STATE,
    FUELGAUGE_SET_CHARGER_CYCLE,
    FUELGAUGE_SET_BATTERY_TYPE,
    FUELGAUGE_SET_WORK_MODE,
    FUELGAUGE_SET_HEALTH,
    FUELGAUGE_SET_TEMPE,
} fuelgauge_cmd_t;

typedef struct
{
    fuelgauge_cmd_t cmd;
    uint8_t state;                  /* charge state */
    uint8_t mode;                   /* work mode */
    uint16_t ocv;                   /* open circuit voltage */
    uint16_t ccv;                   /* closed circuit voltage */
    uint16_t current;               /* current */
    uint8_t soc;                    /* state of charge */
    uint8_t temp;                   /* temperature of battery */
    uint16_t soh;                   /* state of health */
    uint16_t cycle;                 /* cycle of charging */
    uint16_t fcc;                   /* full charge capacity */
} fuelgauge_info_t;

typedef enum
{
    FUELGAUGE_WORK_MODE_NORMAL,
    FUELGAUGE_WORK_MODE_SLEEP,
    FUELGAUGE_WORK_MODE_SHUTDOWN,
} fuelgauge_work_mode_t;

typedef enum
{
    FUELGAUGE_CHARGE_STATE_DISCHARGE,
    FUELGAUGE_CHARGE_STATE_CHARGE,
} fuelgauge_charge_state_t;

typedef enum
{
    FUELGAUGE_IOCTRL_CMD_WORK_MODE,
    FUELGAUGE_IOCTRL_CMD_CHARGE_STS,
} fuelgauge_ioctrl_cmd_t;

typedef struct fuelgauge
{
    fuelgauge_ioctrl_cmd_t cmd;
    uint32_t argv;
} fuelgauge_cmd_argv_t;

typedef struct fuelgauge_driver_s fuelgauge_driver_t;

typedef struct fuelgauge_ops_s
{
    int32_t (*init)(void);
    int32_t (*get_info)(fuelgauge_driver_t *drv, fuelgauge_info_t *data);
    int32_t (*set_batt_type)(fuelgauge_driver_t *drv, uint32_t type);
    int32_t (*set_charge_state)(fuelgauge_driver_t *drv, fuelgauge_charge_state_t state, uint32_t current);
    int32_t (*set_work_mode)(fuelgauge_driver_t *drv, fuelgauge_work_mode_t mode);
    int32_t (*set_power)(fuelgauge_driver_t *drv, fuelgauge_work_mode_t mode);
} fuelgauge_ops_t;

struct fuelgauge_driver_s
{
    driver_t drv;
    fuelgauge_ops_t ops;
};

int32_t fuelgauge_driver_register(const char *name, fuelgauge_driver_t *drv);
fuelgauge_driver_t* fuelgauge_driver_find(const char *name);

int32_t fuelgauge_driver_probe(fuelgauge_driver_t *drv);
int32_t fuelgauge_driver_init(fuelgauge_driver_t *drv);
int32_t fuelgauge_driver_get_info(fuelgauge_driver_t *drv, fuelgauge_info_t *info);
int32_t fuelgauge_driver_set_batt_type(fuelgauge_driver_t *drv, uint32_t type);
int32_t fuelgauge_driver_set_charge_state(fuelgauge_driver_t *drv, fuelgauge_charge_state_t state, uint32_t current);
int32_t fuelgauge_driver_set_work_mode(fuelgauge_driver_t *drv, fuelgauge_work_mode_t mode);

#ifdef __cplusplus
}
#endif

#endif // __FUEL_GAUGE_H__

下一篇:[单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(二)

[单片机框架][drivers层][ADC] fuelgauge 软件电量计(二)

相关文章:

  • 【iVX 开发 - 入门】开发环境、应用对象树介绍(含操作演示)
  • CTFshow 代码审计
  • 19-Django REST framework-DRF工程搭建
  • CSP-S信息学奥赛考试大纲(提高级)
  • 电源硬件设计----降压-升压(Buck-Boost)变换器基础
  • C语言循环的嵌套、比较、break语句,continue语句
  • 【数据挖掘算法与应用】——数据挖掘导论
  • Java语言高级特性——泛型
  • 混合模拟退火和教与学的鸽群优化算法-附代码
  • Java Agent通灵之术
  • c语言进阶 结构体的声明
  • 深度学习Mask R-CNN等实例分割网络
  • [计算机通信网络]网桥与其作用机理举例详解
  • 缓存相关知识点
  • MyBatis映射配置文件结构、标签详解及SQL语句中参数的获取
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • docker容器内的网络抓包
  • ECS应用管理最佳实践
  • iOS小技巧之UIImagePickerController实现头像选择
  • jquery ajax学习笔记
  • leetcode讲解--894. All Possible Full Binary Trees
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redis 懒删除(lazy free)简史
  • socket.io+express实现聊天室的思考(三)
  • Solarized Scheme
  • vue脚手架vue-cli
  • vue总结
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 区块链分支循环
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序--------语音识别(前端自己也能玩)
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #Lua:Lua调用C++生成的DLL库
  • #mysql 8.0 踩坑日记
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP分步表单提交思路(分页表单提交)
  • .net core 依赖注入的基本用发
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net接口调试与案例
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET与 java通用的3DES加密解密方法
  • @JSONField或@JsonProperty注解使用
  • @RestControllerAdvice异常统一处理类失效原因
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • []error LNK2001: unresolved external symbol _m
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会