举个栗子~位操作到底有什么用【库仑计芯片MAX17043】

2023-12-29 15:36

本文主要是介绍举个栗子~位操作到底有什么用【库仑计芯片MAX17043】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先吐槽各个平台在卖的五花八门的库仑计芯片EV board,前后试了估计有4家不同的货,终于DFRobot给出最稳定也是最符合MAX17043说明书描述的效果。

本篇继续水,描述一下位操作的一个普遍用法,就是读写各类测量芯片。此处就拿MAX17043举个例子。先流水账黄色箭头,再叨叨两句print。

整体代码:

'''!@file DFRobot_MAX17043.py@copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)@license     The MIT License (MIT)@author [ouki.wang](ouki.wang@dfrobot.com)@version  V1.0@date  2018-4-14@url https://github.com/DFRobot/DFRobot_MAX17043
'''
import time
from machine import I2C, Pin
## Get I2C bus
i2c = I2C(scl = Pin(1), sda = Pin(0), freq=400000, id=0)MAX17043_ADDR = 0x36 # may regard it as api address for read/write on the max17043
MAX17043_VCELL = 0x02
MAX17043_SOC = 0x04
MAX17043_MODE = 0x06
MAX17043_VERSION = 0x08
MAX17043_CONFIG = 0x0c
MAX17043_COMMAND = 0xfeclass DFRobot_MAX17043():  def __init__(self):'''!@brief create MAX17043 object@return MAX17043 object'''passdef begin(self):'''!@brief MAX17043 begin and test moudle@return initialization result:@retval 0     successful@retval -1     faild'''self._write16(MAX17043_COMMAND, 0x5400)time.sleep(0.01)if self._read16(MAX17043_CONFIG) == 0x971c:self._write16(MAX17043_MODE, 0x4000)  # 开始quick start modetime.sleep(0.01)self._write16(MAX17043_CONFIG, 0x9700)return 0else:return -1      def read_voltage(self):'''!@brief read battery voltage in mV@return voltage in mV'''return (1.25 * (self._read16(MAX17043_VCELL) >> 4))def read_percentage(self):'''!@brief read battery remaining capacity in percentage@return battery remaining capacity in percentage'''tmp = self._read16(MAX17043_SOC)return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff)) def _write16(self, reg, dat):buf = bytearray(2)buf[0] = dat >> 8buf[1] = dat & 0x00ffi2c.writeto_mem(MAX17043_ADDR, reg, buf)    def _read16(self, reg):buf = i2c.readfrom_mem(MAX17043_ADDR, reg, 2)return ((buf[0] << 8) | buf[1])  gauge = DFRobot_MAX17043()
rslt = gauge.begin()  
while rslt != 0:print('gauge begin failed')time.sleep(2)rslt = gauge.begin()
print('gauge begin successful')
while True:time.sleep(2)print('voltage: ' + str(gauge.read_voltage()) + 'mV')print('percentage: ' + str(round(gauge.read_percentage(), 2)) + '%')

黄色箭头,执行顺序,首先初始化一个对应对象名为gauge,然后查看芯片状态rslt。

gauge = DFRobot_MAX17043()
rslt = gauge.begin()  
while rslt != 0:
  print('gauge begin failed')
  time.sleep(2)
  rslt = gauge.begin()
print('gauge begin successful')

# 进入begin函数:

  def begin(self):
    '''!
      @brief MAX17043 begin and test moudle
      @return initialization result:
      @retval 0     successful
      @retval -1     faild
    '''
    self._write16(MAX17043_COMMAND, 0x5400)
    time.sleep(0.01)
    if self._read16(MAX17043_CONFIG) == 0x971c:
      self._write16(MAX17043_MODE, 0x4000)  # 开始quick start mode
      time.sleep(0.01)
      self._write16(MAX17043_CONFIG, 0x9700)
      return 0
    else:
      return -1

begin函数干的活,在说明书里的文字描述,

首先把0x5400,写到了0xFE的位置。根据POR的描述:

Power-On Reset (POR)

Writing a value of 5400h to the COMMAND register caus- es the MAX17043/MAX17044 to completely reset as if power had been removed. The reset occurs when the last bit has been clocked in. The IC does not respond with an I2C ACK after this command sequence.

接下来检查CONFIG这个地址的状态,是不是拿到0x971C。拿不到这个值,说明芯片状态异常,不适合读数。

CONFIG Register

The CONFIG register compensates the ModelGauge algorithm, controls the alert interrupt feature, and forces the IC into Sleep mode through software. The format of CONFIG is shown in Figure 5.

CONFIG

CONFIG is an 8-bit value that can be adjusted to opti- mize IC performance for different lithium chemistries or different operating temperatures. Contact Maxim for instructions for optimization. The power-up default value for CONFIG is 97h.

所以0x9710应该是睡眠模式,我们要打开它,所以begin函数的最后,改写了0x9710变为0x9700(the power-up default value);

那么这时候芯片开始正式工作了。

接下来再过第一句简单的print,

print('voltage: ' + str(gauge.read_voltage()) + 'mV') #找到read_voltage看看它忙啥。

  def read_voltage(self):
    '''!
      @brief read battery voltage in mV
      @return voltage in mV
    '''
    return (1.25 * (self._read16(MAX17043_VCELL) >> 4)) #继续找_read16

  def _read16(self, reg):
    buf = i2c.readfrom_mem(MAX17043_ADDR, reg, 2) #继续找i2c.readfrom_mem
    return ((buf[0] << 8) | buf[1]) 

#来自class I2C – a two-wire serial protocol — MicroPython latest documentation

i2c.readfrom_mem(42, 8, 3)      
# read 3 bytes from memory of peripheral 42,
#   starting at memory-address 8 in the peripheral

所以这里就是在0x36这个元器件的读写口,第2个寄存器地址(也就是VCELL),读取2个bytes;可视化一下它拿到了啥?

VCELL Register

Battery voltage is measured at the CELL pin input with respect to GND over a 0 to 5.00V range for the MAX17043 and 0 to 10.00V for the MAX17044 with resolutions of 1.25mV and 2.50mV, respectively. The A/D calculates the average cell voltage for a period of 125ms after IC POR and then for a period of 500ms for every cycle afterwards. The VCELL register requires 500ms to update after exiting Sleep mode. The result is placed in the VCELL register at the end of each conver- sion period. Figure 3 shows the VCELL register format.

接下来为何要做这些个数据位操作应该就是这个芯片的算法专利部分,datasheet里面是不提的。

#出处:How does the Android estimate the battery level without a current sensor? - Android Enthusiasts Stack Exchange

Battery level estimation is usually performed by a special “fuel gauge” chip; different phone models use different chips. E.g., Samsung GT-I8150 (Galaxy W), according to the kernel config, uses the Maxim MAX17043 chip, which, according to its datasheet, does not have any inputs to measure the current — it has only a battery voltage sensor. According to the manufacturer's description, this chip uses “a sophisticated Li+ battery-modeling scheme, called ModelGauge™ to track the battery’s relative state-of-charge (SOC) continuously over a widely varying charge/discharge profile”. Some information is available in the datasheet, but details of this “ModelGauge” scheme do not seem to be publicly available.

大概就干了这么个事儿:

注意print出来的都是十进制数字。

实际运算就是:

CE: 11001110

B0: 10110000

CE << 8: 1100111000000000

B0:          0000000010110000

或操作下,

1100111010110000

十进制下,它就是52912

接下来拿着这个2进制数字,继续右移4位,>>4,就是扔掉4位二进制的位置,得到

0000110011101011。

这个数字在10进制里面是3307。

拿着3307去乘以resolution(1.25mv) 所谓的精度,得到了电压。

这篇关于举个栗子~位操作到底有什么用【库仑计芯片MAX17043】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549875

相关文章

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(上篇)

简介 在AI迅猛发展的时代,芯片算力对于模型性能起到了至关重要的作用。一款能够同时兼具高性能和低成本的芯片,能够帮助开发者快速构建性能稳定的生成式AI应用,同时降低开发成本。今天小李哥将介绍亚马逊推出的4代高性能计算处理器Gravition,带大家了解如何利用Graviton芯片为Java生成式AI应用提高性能、优化成本。 本篇文章将介绍如何在云平台上创建Graviton芯片服务器,并在Gra

2024年AI芯片峰会——边缘端侧AI芯片专场

概述 正文 存算一体,解锁大模型的边端侧潜力——信晓旭 当下AI芯片的亟需解决的问题 解决内存墙问题的路径 产品 面向大模型的国产工艺边缘AI芯片创新与展望——李爱军 端侧AI应用“芯”机遇NPU加速终端算力升级——杨磊 边缘端的大模型参数量基本小于100B AI OS:AI接口直接调用AI模型完成任务 具身智能的大脑芯片 大模

2024年AI芯片峰会——AI芯片架构创新专场

概述 2024年9月7日于北京举行。 官方链接: 大会官网 正文 对存内计算的思考——戴瑾 面向边缘端大语言模型的RPP架构芯片与落地实践——李原 LLM推理端的特征 边缘计算的特征 来源《联想集团边缘计算白皮书》出炉 Llama2计算过程举例 RPP架构 RPP软件栈 RPP的PPA AI 芯片架构创新开启打算里第二增长曲

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本,有图有真相: 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动:zram,我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑,完整梳理完这个逻辑将对Linux块设备驱动模型有深入的理解。 zram驱动加载的时候会调用zram_add函数,源码如下: 1887/*1888 * Allocate and initia

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute

可以录音播放的生日贺卡与传统的纸质贺卡相比,它有着创意以及个性的特点,仅需少量的电子元器件,即可实现录音功能,搭配上文字,让声音存储在生日贺卡里,让贺卡也变得有温度,祝福我想亲口对TA说。 生日贺卡录放音芯片方案——NVF04M 采用外挂SPI存储器的方式,达到录音的功能。它的主要特点是声音清晰,录音时间长。目前可以提供的录音时间为32分钟。NV04FM的一个显著特点是存储时间灵活,客

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688,功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算,可支持 16 路高清视频实时分析,灵活应对图像、语音、自然语言等场景,可集成于智算服务器、边缘智算盒、工控机、无人机、AIOT等多种类型产品。 Banana

芯片散热设计

目录 摘要 散热方式分类 1.传导 2.对流 对流换热系数 对流方式 3.辐射 热阻 散热器 作用 材质 底部厚度 鳍片 表面处理 压力设计 界面材料 相关标准 摘要 散热设计是硬件设计中的进阶内容,掌握散热原理和设计要点是很有必要的。 散热方式分类 散热方式有三种,分别是传导,对流和辐射。 1.传导 传导一般是指固体和固体之间的热传递,比如发热芯

MVVM到底是什么

MVVM到底是什么 文章目录 MVVM到底是什么一、MVVM是什么二、为什么这么定义1. 分离关注点2. 提高可维护性3. 数据绑定和事件驱动4. 支持前端框架的发展 三、底层逻辑1. ViewModel层2. 数据绑定3. 事件驱动4. 响应式系统 四、扩展与高级技巧1. 组件化开发2. 双向数据绑定3. 计算属性和侦听器4. 插槽

我们在学习Spark的时候,到底在学习什么?

我必须要说,Spark这个框架出现之前,我对很多大数据领域的框架源码甚至都是嗤之以鼻的。 很多小伙伴在群里或者私信留言问我关于Spark的学习路径问题。 Spark发展至今,应该说已经非常成熟了。是大数据计算领域不得不学习的框架。尤其是Spark在稳定性和社区发展的成熟度方面,基本可以吊打其他的大数据处理框架。 我之前发过一篇关于阅读Spark源码的文章:《Spark源码阅读的正确打开方式》