举个栗子~位操作到底有什么用【库仑计芯片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) 所谓的精度,得到了电压。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot(ssm交通管理在线服务系统 交通管理平台 Java系统

springboot(ssm交通管理在线服务系统 交通管理平台 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09…

AUTOSAR从入门到精通-可变速率 CAN 总线控制器设计与实现

目录 前言 研究现状 2通信协议及产品特性研究 2.1总线概述 2.2通信协议研究

【资源分享】免费好用的API接口汇总

IP归属地-IPv4城市级&#xff1a;根据IP地址查询归属地信息&#xff0c;支持到城市级&#xff0c;包含国家、省、市、和运营商等信息。IP归属地-IPv6城市级&#xff1a;根据IP地址&#xff08;IPv6版本&#xff09;查询归属地信息&#xff0c;支持到中国大陆地区&#xff08;不…

1317:【例5.2】组合的输出

1317&#xff1a;【例5.2】组合的输出 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 排列与组合是常用的数学方法&#xff0c;其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n)&#xff0c;我们可以简单地将n个元素理解为自然数1&#xff0c;2&#xff0c;…&#…

基于ssm食用菌菌棒溯源系统的开发与设计论文

食用菌菌棒溯源系统 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了食用菌菌棒溯源系统的开发全过程。通过分析企业对于食用菌菌棒溯源系统的需求&#xff0c;创建了一个计算机管理食用菌菌棒溯源系统的方案。文章介绍了食用菌…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

<JavaEE> TCP 的通信机制(五) -- 延时应答、捎带应答、面向字节流

目录 TCP的通信机制的核心特性 七、延时应答 1&#xff09;什么是延时应答&#xff1f; 2&#xff09;延时应答的作用 八、捎带应答 1&#xff09;什么是捎带应答&#xff1f; 2&#xff09;捎带应答的作用 九、面向字节流 1&#xff09;沾包问题 2&#xff09;“沾包…

Go配置镜像源

1. 简介 GOPROXY是一个加速Go语言包下载和更新的工具。它通过镜像源的方式&#xff0c;帮助开发者快速获取Go语言包&#xff0c;提高开发效率。GOPROXY的使用非常简单&#xff0c;只需在终端中设置其地址&#xff0c;然后使用go get、go mod等命令即可享受更快的下载速度。对于…

帕金森病的病因是什么?

帕金森病是一种常见的神经系统变性疾病&#xff0c;其确切的病因尚未完全明了&#xff0c;但可以确定的是&#xff0c;它是多种因素共同作用的结果。下面将从多个方面详细介绍帕金森病的病因。 首先&#xff0c;年龄老化是帕金森病发病最主要的因素之一。随着年龄的增长&#…

node实现对git仓库的管理

一、项目背景 一份代码&#xff0c;发布多个小程序。想让技术支持部通过脚本自己获取代码&#xff0c;并通过脚本自动提交到客户的小程序后台。他们自行发布。 现已注册第三方平台&#xff0c;开发人员通过“开发小程序”上传模板。开发人员把代码上传到模板&#xff0c;支持…

JavaSE基础50题:28.(数组练习)冒泡排序

概述 给定一个整型数组&#xff0c;实现冒泡排序。 如&#xff1a;给一组数组{5&#xff0c;10&#xff0c;8&#xff0c;3&#xff0c;7}进行冒泡排序。 j一直往下走&#xff0c;和下一个数字进行比较&#xff0c;如果当前数字大于下一个数字&#xff0c;则两个数字交换&…

【Java干货教程】JSON,JSONObject,JSONArray类详解

一、定义 JSON&#xff1a;就是一种轻量级的数据交换格式&#xff0c;被广泛应用于WEB应用程序开发。JSON的简洁和清晰的层次结构&#xff0c;易于阅读和编写&#xff1b;同时也易于机器解析和生成&#xff0c;有效的提升网络传输效率&#xff1b;支持多种语言&#xff0c;很多…

ERROR: No matching distribution found for torch==2.0.1解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 ERROR: No matching distribution found for torch2.0.1 问题的解决方案&#xff0c;希望能对你有所帮助。 《Python入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

Mysql相关面试题及答案

1、什么是MySQL&#xff1f; MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它基于SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;进行操作。MySQL是最流行的数据库系统之一&#xff0c;特别是对于Web应…

对于高速链路,需要考虑 TVS 管结电容的要求

TVS管,即瞬态电压抑制器,是一种用于保护电路免受瞬态过电压损害的半导体器件。在高速链路(如USB、HDMI、以太网等)中,TVS管被广泛用于抑制外部电涌、静电放电(ESD)等引起的瞬态电压,以保护敏感的电子组件。 TVS管的结电容:是在TVS管的PN结上形成的固有电容…

前端通过增加XHR钩子来全局增加header

引言 前端通过修改 XHR 原型来全局增加 header 是采用 XMLHttpRequest 加 hook 方式实现一个简单业务场景。这样可以提高代码的可维护性和可扩展性&#xff0c;减少重复代码的编写。 比如&#xff0c;在用户登录后&#xff0c;后端返回了一个 token&#xff0c;前端需要在发送…

PostgreSQL 数据库归档最近被问及的问题问题 与 4 毋 处世学

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共1790人左右 1 2 3 4 5&#xff0…

小型企业成为网络犯罪分子获取数据的目标

在过去十年的大部分时间里&#xff0c;网络犯罪的巨额资金来自针对大型组织的勒索软件攻击。这种威胁仍然存在。但犯罪分子可能会将注意力转向中小企业 (SMB)。这对消费者的影响将是巨大的。 将软件即服务 (SaaS) 技术用于核心业务功能继续将中小企业整合到全球供应链中。由于…

优雅的处理tkMapper批量插入、分批次插入

Springboot框架下tkMapper想实现批量插入&#xff0c;一般是需要自定义BaseMapper来继承InsertListMapper tkmapper提供的有两个insertList方法&#xff0c; 一个支持主键自动生成 tk.mybatis.mapper.additional.insert 一个不支持主键生成 tk.mybatis.mapper.common.specia…

Linux期末考试复习

gcc编译 案例.c源代码-E预处理后.i文件gcc -E test.c -o test.i-S编译后.s文件gcc -S test.i -o test.s-c汇编.o文件 库文件gcc -c test.s -o test.o-I 链接后目标文件 gcc 不使用 –E、–S 和 –c选项&#xff0c;则会依次自动执行预处理、编译和汇编。 头文件#include <…