举个栗子~位操作到底有什么用【库仑计芯片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,一经查实,立即删除!

相关文章

基于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;“沾包…

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入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

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) 技术用于核心业务功能继续将中小企业整合到全球供应链中。由于…

Chatgpt如何共享可以防止封号!

ChatGPT 是一个基于 GPT-3.5/GPT-4 模型的对话系统&#xff0c;它主要用于处理自然语言对话。通过训练模型来模拟人类的语言行为&#xff0c;ChatGPT 可以通过文本交流与用户互动。每个新版本的 GPT 通常都会在模型规模、性能和其他方面有一些改进。在目前免费版GPT-3.5 中&…

【第十二课】KMP算法(acwing-831 / c++代码 / 思路 / 视频+博客讲解推荐)

目录 暴力做法 代码如下 KMP算法 不同的next求法-----视频讲解/博客推荐 视频推荐 博客推荐 课本上的方法- prefix的方法- 求next数组思路---next数组存放前缀表的方式 s和p匹配思路 代码如下 暴力做法 遍历s主串中每一个元素&#xff0c;如果该元素等于模板串p中…

数据智慧:C#中编程实现自定义计算的Excel数据透视表

前言 数据透视表&#xff08;Pivot Table&#xff09;是一种数据分析工具&#xff0c;通常用于对大量数据进行汇总、分析和展示。它可以帮助用户从原始数据中提取关键信息、发现模式和趋势&#xff0c;并以可视化的方式呈现。 在数据透视表中&#xff0c;数据分析师通常希望进…

Vue使用Element table表格格式化GMT时间为Shanghai时间

Vue使用Element表格格式化GMT时间为Shanghai时间 说明 阿里巴巴java开发规范规定&#xff0c;数据库必备gmt_create、gmt_modified字段&#xff0c;使用的是GMT时间&#xff0c;在中国使用必然要转换我中国时间。 在阿里巴巴的Java开发规范中&#xff0c;要求每个表都必备三…

智能写作辅助工具有哪些,这4款强烈推荐

智能写作辅助工具是现代写作过程中的必备利器&#xff0c;它们能够提供语法纠错、词汇替换、文本优化等功能&#xff0c;帮助我们提高写作效率和质量。在众多智能写作辅助工具中&#xff0c;以下是四款强烈推荐的中文软件。 推荐一&#xff1a;爱制作AI 一、什么是爱制作AI 爱…

VD6283TX环境光传感器(2)----移植闪烁频率代码

VD6283TX环境光传感器----2.移植闪烁频率代码 闪烁定义视频教学样品申请源码下载参考代码硬件准备开发板设置生成STM32CUBEMX串口配置IIC配置X-CUBE-ALSADC使用定时器触发采样KEIL配置FFT代码配置app_x-cube-als.c需要添加函数演示结果 闪烁定义 光学闪烁是指人造光源产生的光…

什么是骨传导耳机?骨传导能保护听力吗?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用&#xff0c;主要是因为它们不…

UniApp小程序使用vant引入vant weapp

HBuilder X里新建项目指路 HBuilderX新建项目 安装node.js指路 安装node.js 1.通过npm安装 查看npm环境 //打开终端输入命令查看版本 npm -version 1.1.右键打开外部终端窗口 1.2.输入npm init -y命令 1.3.通过命令安装 npm i vant/weapp1.3.3 -S --production 1.4.打开工具…

Hive讲课笔记:内部表与外部表

文章目录 一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 在park数据库里创建student表1.2.3 在student表插入一条记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建…

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

idea 插件开发之 HelloWorld

前言 本文使用的 idea 2023.3 版本进行插件入门开发&#xff0c;首先要说明的是 idea 2023 版本及以后的 idea&#xff0c;对插件开发进行了一定程度的变动&#xff1a; 1、创建项目时不再支持 maven 选项 2、必须是 jdk17 及以后版本&#xff08;点击查看官网版本对应关系&…

【微服务核心】MyBatis Plus

MyBatis Plus 文章目录 MyBatis Plus1. 简介2. 入门使用3. 核心功能3.1 CRUD 接口3.1.1 Mapper CRUD 接口3.1.2 Service CRUD 接口 3.2 条件构造器3.3 分页插件3.4 Mybatis-Plus 注解 4. 拓展4.1 逻辑删除4.2 MybatisX快速开发插件 5. 插件5.1 [分页插件](#page)5.2 乐观锁插件…