ADBMS1818菊花链通信

        ADBMS1818是一款多通道电池堆监控器,可测量多 达18串电池电压,总测量误差(TME)小于3.0 mV。ADBMS1818具有0V至5V的电池测量范围,适合大多数电池应用。可在290 μs内完成所有18个电池电压测量,并可以选择较低的数据采集速率以实现高降噪抑制。

        当电芯数高于18时,可将多个ADBMS1818器件串联,以便同时监测更长 串的高压电池组。每个ADBMS1818都有一个isoSPITM 接口,用于实高速抗干扰局域通信。多个器件以菊 花链形式连接,通过最顶端或底端的器件连接到主 处理器。该菊花链可双向操作,即使通信路径出错,也能确保通信完整性。

        ADBMS1818引脚图:

 

        ADBMS1818串联菊花链通信电路可采用容性耦合isoSPI,电路图如下:

         同时,ADBMS1818的9个GPIO可以有用来采集电芯温度,S引脚可用来控制被动均衡电路中的MOS管开关。通过软件去配置1818的寄存器进行初始化,再通过发相关指令去读取电芯电压,具体的bsp层驱动可在官网上下载,

下载地址:ADBMS1818 Datasheet and Product Info | Analog Devices.

        首先初始化1818的相关寄存器

        

         在官网上下载完成后,在这两个文件夹中的.C\.H都是1818相关的底层驱动,找到配置CFGAR\CFGBR的函数,进行初始化。

#define TOTAL_IC 3 //1818串联个数
static cell_asic BMS_IC[TOTAL_IC];

void ADBMS1818_Task_Init(void)   
{	
    ADBMS1818_Reg_Param_Init();
	Status_Param_Init();
    ADBMS1818_init_cfg(TOTAL_IC, BMS_IC);
	ADBMS1818_init_cfgb(TOTAL_IC, BMS_IC);
    ADBMS1818_set_cfg_reg();
	ADBMS1818_reset_crc_count(TOTAL_IC, BMS_IC);
    ADBMS1818_init_reg_limits(TOTAL_IC, BMS_IC);
}

         TOTAL_IC就是ADBMS1818串联的个数,用到多少个,修改宏定义即可;BMS_IC是缓存cell数据的结构体,类型为cell_asic,在官网下载的文件中可找到。

       初始完寄存器后,通过数据手册的命令,触发1818ADC转换,以及读取电压值。

    

         

#define ADBMS1818_CHIP_MAX_CELL_CHANNELS  18
void ADBMS1818_Sample_Task(void)
{
#define TASKE_TIME120MS 80
#define TASKE_TIME10MS  20
    static T_Sample_Status tADBMS1818Sampling = BIO_TASK_IDLE;
	static u32 SampleTaskTicker = 0;
    static u8 TaskTime = TASKE_TIME10MS;
	E_Bool eState = False;
    u8 nIc = 0;

    eState = Ticker_Out(&SampleTaskTicker, (u32)TaskTime);	
	if(True == eState)
    {
        Ticker_Out(&SampleTaskTicker, 0);
		switch (tADBMS1818Sampling)
		{
            case BIO_TASK_IDLE: //初始化寄存器
				ADBMS1818_Wakeup_Sleep(TOTAL_IC);
                Confirm_Ref_On();
				Check_Reg_Data(0xFFu);
                tADBMS1818Sampling = BIO_BAT_MEAS_CMD;	
			break;	

            case BIO_BAT_MEAS_CMD: 	//发生ADC转换命令
				ADBMS1818_Wakeup_Sleep(TOTAL_IC);
				ADBMS1818_adcv(ADC_CONVERSION_MODE, ADC_DCP, CELL_CH_TO_CONVERT);
                tADBMS1818Sampling = BIO_BAT_WAIT;
			break;
        
            case BIO_BAT_WAIT: 	
				tADBMS1818Sampling = BIO_BAT_RD;
			break;
            
            case BIO_BAT_RD://读取电压
				ADBMS1818_Wakeup_Sleep(TOTAL_IC);
				ADBMS1818_rdcv(SEL_ALL_REG, TOTAL_IC, BMS_IC);
               tADBMS1818Sampling = BIO_TASK_IDLE;	
	            for (nIc = 0; nIc < TOTAL_IC; nIc++)
	            {
                    memcpy(&tAdbms1818InfoBuf[nIc].BattVolt[0],                               
        
     &BMS_IC[nIc].cells.c_codes[0],sizeof(u16)*ADBMS1818_CHIP_MAX_CELL_CHANNELS);
                }    
			break;	 
                
    }
}

        在发生指令前,必须发生唤醒信号ADBMS1818_Wakeup_Sleep(TOTAL_IC),如果不发,菊花链通信将会失败。

 

        每个步骤延时时间根据你选择的采样频率,低于1Khz,每个步骤必须有80ms的延时,大于等于1KHZ,20ms即可,如果延时不够,ADC转换未完成,读取的电压值将会出错。BMS_IC.cells.c_codes就是电压采样值,一个电压值占2个字节。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆拾叁~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值