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

31 篇文章 16 订阅
17 篇文章 0 订阅

借鉴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当成一个对象,不同的寄存器就是它的属性。因此在阅读别人的代码时,你就可以看结构体,这样可以更快的入手此芯片的作用

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电池管理系统(BMS)是一种用于监控和管理电池的系统,其主要功能包括电池状态监测、电池保护、电池数据采集和存储等。BMS开发是指对这个系统进行设计和实现的过程。 BMS开发可以分为多个步骤。首先,需要进行需求分析,明确系统的功能和性能要求。这涉及到对不同种类电池的特征和工作原理的了解,以及用户的具体需求和使用场景。然后,根据需求分析的结果,设计系统的架构和组件,确定数据采集和处理的流程,以及与其他设备或系统的接口。接着,进行软件开发,编写代码来实现系统的各个功能。在开发过程中,需要考虑系统的可靠性、稳定性和安全性,以及对电池进行保护和优化管理的算法。最后,进行系统的测试和调试,验证系统是否按照需求进行了正确的实现。 BMS开发需要涉及多个专业领域的知识,包括电池技术、电路设计、嵌入式系统开发、数据采集和处理、网络通信等。此外,还需要对电池管理相关的标准和法规进行了解,确保系统的设计和开发符合相关要求。 BMS开发对于电池的安全和性能至关重要。它可以实时监测电池的状态,包括温度、电压、电流、容量等,并根据需要采取相应的措施,如调节充放电电流、控制温度等,以避免电池过充、过放等问题,延长电池寿命,并确保电池的安全运行。 总之,BMS开发是一项复杂而重要的工作,它为电池的管理和使用提供了关键的支持,并在电池的性能和安全方面发挥着至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值