BMS开发之面向对象思想(adbms1818)

news/2024/6/29 11:49:06 标签: C++, 面向对象

借鉴adbms1818的底层驱动代码

前言:adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据,程序员需要通过特定的协议往寄存器里面写入或者读出数据

(1)定义一个结构体

        里面存储了adbms1818的所有寄存器的信息。然后我们看定义,首先就是配置寄存器config,其次是配置寄存器configB,然后就是电压寄存器cells,辅助寄存器aux,状态寄存器stat,COMM寄存器组com......,但是我们不知道最前面的数据类型,他并不是我们熟知的int , char,short等等。

/*! Cell variable structure */
typedef struct
{
  ic_register config;
  ic_register configb;
  cv  cells;
  ax  aux;
  st  stat;
  ic_register com;
  ic_register pwm;
  ic_register pwmb;
  ic_register sctrl;
  ic_register sctrlb;
  uint8_t sid[6];
  BOOL isospi_reverse;
  pec_counter crc_count;
  register_cfg ic_reg;
  long system_open_wire;
}cell_asic;

(2)跳转到ic_register定义

        已知信息是配置寄存器组A占48个位,6个字节,其次协议规定的发送数据格式是 CMD0 CMD1 PEC0 PEC1 6个字节数据 PEC0 PEC1,此处我们只需要考虑红色字体,PEC0,PEC1类似于CRC校验码。

        再次返回来看结构体,首先tx_data[6]里面存储的就是寄存器里面所有位的数据,rx_data[8]收到的数据(包括PEC0 PEC1),rx_pec_match是标志位,判断接收到的PEC和根据6位数据计算出来的PEC是否相同,相同数据接收正确,不同数据接收错误。

typedef struct
{
  uint8_t tx_data[6];  //!< Stores data to be transmitted 
  uint8_t rx_data[8];  //!< Stores received data 
  uint8_t rx_pec_match; //!< If a PEC error was detected during most recent read cmd
} ic_register;

(3)跳转cv定义

        已知信息:电池电压寄存器组总共有A-F,总共6组。每组存放3个电池的电压值,每一个电池的电压值用16位表示。并且电压值我们只会读,不会写,因此只需要定义一块内存用来存储电池电压。

        c_code[0]存储电池1电压,c_code[1]存储电池2电压......,c_code[17]存储电池18电压。pec_match[0]存储电池电压寄存器A是否读取错误......pec_match[5]存储电池电压寄存器F是否读取错误

/*! Cell Voltage data structure. */
typedef struct
{
  uint16_t c_codes[18]; //!< Cell Voltage Codes
  uint8_t pec_match[6]; //!< If a PEC error was detected during most recent read cmd
} cv;

处理数据的办法有两种,我们已知有6组数据,每一组数据有3个

  • 方法一:定义一个二维数组 uint16_t arr[6][3];
for(int i=0;i<6;i++)
{
    for(int j=0;j<3;j++)
    {
        arr[i][j]表示电池电压寄存器组i的第j个电池
    }
}
  • 方法二:定义一个一维数组arr[18];
cur_reg//我要读取的电池电压寄存器cur_reg(范围:012345)
cur_num//我要读取的电池电压寄存器的第几个电池电压(范围:012)
arr[(cur_reg-1)*3+cur_num]//我要读取的电池电压寄存器cur_reg的第cur_num个电池电压

(4)跳转st定义

/*! Status Reg data structure. */
typedef struct
{
  uint16_t stat_codes[4]; //!< Status codes.SC ITMP VA VD
  uint8_t flags[3]; //!< flag[0]:C4OV C4UV C3OV C3UV C2OV C2UV C1OV C1UV 依此内推
  uint8_t mux_fail[1]; //!< Mux self test status flag  MUXFAIL
  uint8_t thsd[1]; //!< Thermal shutdown status	THSD
  uint8_t pec_match[2]; //!< pec_match[0]记录状态寄存器A是否读取错误  pec_match[1]记录状态寄存器B是否读取错误
} st;

(5)总结

        由上述的结构可以看出,把寄存器当成一个对象,寄存器里面存放的不同内容就是他的属性。把adbms1818当成一个对象,不同的寄存器就是它的属性。因此在阅读别人的代码时,你就可以看结构体,这样可以更快的入手此芯片的作用


http://www.niftyadmin.cn/n/5304585.html

相关文章

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…

LeetCode 1475:商品折扣后的最终价格

一、题目描述 给你一个数组 prices &#xff0c;其中 prices[i] 是商店里第 i 件商品的价格。 商店里正在进行促销活动&#xff0c;如果你要买第 i 件商品&#xff0c;那么你可以得到与 prices[j] 相等的折扣&#xff0c;其中 j 是满足 j > i 且 prices[j] < prices[i]…

pytorch集智-1安装与简单使用

1 安装 1.1 简介 pytorch可用gpu加速&#xff0c;也可以不加速。gpu加速是通过cuda来实现&#xff0c;cuda是nvidia推出的一款运算平台&#xff0c;它可以利用gpu提升运算性能。 所以如果要装带加速的pytorch&#xff0c;需要先装cuda&#xff0c;再装pytorch&#xff0c;如…

【云原生】Docker学习笔记

安装docker 系统信息&#xff1a; passnightpassnight-s600:/etc/apt/trusted.gpg.d$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.1 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.1 LTS (Jammy Jellyfish)" VERSION_COD…

day06、SQL语言之概述

SQl 语言之概述 6.1 SQL语言概述6.2 SQL语言之DDL定义数据库6.3 SQL语言之DML操纵数据库 6.1 SQL语言概述 6.2 SQL语言之DDL定义数据库 6.3 SQL语言之DML操纵数据库

prototype 和 __proto__

是什么&#xff1f; prototype&#xff08;显示原型&#xff09;&#xff1a;每个函数都有一个prototype属性__proto__&#xff08;隐式原型&#xff09;&#xff1a;每个实例对象都会有__proto__属性 两者有什么关系&#xff1f; 一般&#xff0c;构造函数的显示原型和其实例…

python opencv怎么安装

1、安装python 注意&#xff1a;windows10 安装时强烈建议不用使用 Windows Store 安装。避免后期python运行时牵扯权限相关问题。 具体步骤&#xff1a; 1、前往python官网下载windows python 安装包 2、双击运行安装&#xff08;强力建议自定义安装&#xff0c;勾选pip&#…

Vue3如何实现组件之间的数据传递

一&#xff0c;props props可以实现父子组件通信,在vue3中我们可以通过defineProps获取父组件传递的数据。且在组件内部不需要引入defineProps方法可以直接使用&#xff01; 父组件给子组件传递数据 <Child info"我爱祖国" :money"money"></Chi…