电池BMS管理下位机

#include "SH367309.h"
#include "SYSTICK.h" 

#include "i2c1.h"
#include "can.h"
#include "usart.h"
#include "math.h"
#include "string.h"
#include "IO_CTRL.h"
#include "usart2.h"
/*****************************

decription:
   1.采集BQ76930的14位ADC的增益和偏置电压:void get_offset(void)
   2.采集单体电压:void Get_Batteryx(void),其中x取值1-10;
   3.BQ76930初始化 void BQ_config(void)
   4.读取BQ76930寄存器值: void readbqstate(void)
   5.
******************************/
/***********************
fuction:void get_offset(void)
************************/

/****************************************
fuction: void Get_Battery1(void)
description:系统寄存器配置,详见手册第69页
Parameters:开启CADC进行电流采集
******************************************/
 void SYS_CONF(void)
 {
 
     IIC1_write_one_byte_CRC(CONF,0X78);
     IIC1_write_one_byte_CRC(CHS,0X90);
     
 }

/****************************************
fuction: void Get_Battery1(void)
description:获取第1号单体电池电压
Parameters:batterylval[0],battery1val[1];
******************************************/
 u8 READ_BSTATUS1(void)
 {
    unsigned char buf[2];
  buf[0]=IIC1_read_one_byte(BSTATUS1);
    return buf[0];
 }
/****************************************
fuction: void Get_Battery1(void)
description:获取第1号单体电池电压
Parameters:batterylval[0],battery1val[1];
******************************************/
 u8 READ_BSTATUS2(void)
 {
    unsigned char buf[2];
  buf[0]=IIC1_read_one_byte(BSTATUS2);
    return buf[0];
 }
/****************************************
fuction: void Get_Battery1(void)
description:获取第1号单体电池电压
Parameters:batterylval[0],battery1val[1];
******************************************/
 u8 READ_BSTATUS3(void)
 {
    unsigned char buf[2];
  buf[0]=IIC1_read_one_byte(BSTATUS3);
    return buf[0];
 }
 /****************************************
fuction: void Get_Battery1(void)
description:获取第1号单体电池电压
Parameters:batterylval[0],battery1val[1];
******************************************/
 u8 READ_BFLAG1(void)
 {
    unsigned char buf[2];
  buf[0]=IIC1_read_one_byte(BFLAG1);
    return buf[0];
 }
  /****************************************
fuction: void Get_Battery1(void)
description:获取第1号单体电池电压
Parameters:batterylval[0],battery1val[1];
******************************************/
 u8 READ_BFLAG2(void)
 {
    unsigned char buf[2];
  buf[0]=IIC1_read_one_byte(BFLAG2);
    return buf[0];
 }
int Batteryval[50]={0};
unsigned char shang[100]={0xAA,0x01};
unsigned char shang1[100]={0xAA,0x02};
unsigned char shang2[100]={0xAA,0x03};
unsigned char shang3[100]={0xAA,0x04};
unsigned char shang4[100]={0xAA,0x05};


unsigned char can_buf1[8]={0xAA,0x01};
unsigned char can_buf2[8]={0xAA,0x02};
unsigned char can_buf3[8]={0xAA,0x03};
unsigned char can_buf4[8]={0xAA,0x04};
unsigned char can_buf5[8]={0xAA,0x05};
unsigned char can_buf6[8]={0xAA,0x06};
unsigned char can_buf7[8]={0xAA,0x07};
unsigned char can_buf8[8]={0xAA,0x08};
unsigned char can_buf9[8]={0xAA,0x09};
unsigned char can_buf10[8]={0xAA,0x10};

 void Get_Battery1(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL1H);
  readbattbuf[0] = IIC1_read_one_byte(CELL1L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];


    Batteryval[0]= batteryval1*5/32;
//        printf("VOL1=%d\r\n",Batteryval[0]);

    shang[2]=Batteryval[0]>>8;
    shang[3]=Batteryval[0]&0XFF;
    
    can_buf1[2]=shang[2];
    can_buf1[3]=shang[3];

}


/****************************************
fuction: void Get_Battery2(void)
description:获取第2号单体电池电压
Parameters:battery2val[0],battery2val[1];
******************************************/
 void Get_Battery2(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL2H);
  readbattbuf[0] = IIC1_read_one_byte(CELL2L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

//    printf("VOL2=%d\r\n",batteryval1*5/32);

        Batteryval[1]= batteryval1*5/32;

    shang[4]=Batteryval[1]>>8;
    shang[5]=Batteryval[1]&0XFF;

    can_buf1[4]=shang[4];
    can_buf1[5]=shang[5];

}
/****************************************
fuction: void Get_Battery3(void)
description:获取第3号单体电池电压
Parameters:battery3val[0],battery3val[1];
******************************************/
 void Get_Battery3(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL3H);
  readbattbuf[0] = IIC1_read_one_byte(CELL3L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

//    printf("VOL3=%d\r\n",batteryval1*5/32);

    Batteryval[2]= batteryval1*5/32;

    shang[6]=Batteryval[2]>>8;
    shang[7]=Batteryval[2]&0XFF;
    

    can_buf1[6]=shang[6];
    can_buf1[7]=shang[7];

}
/****************************************
fuction: void Get_Battery4(void)
description:获取第4号单体电池电压
Parameters:battery4val[0],battery4val[1];
******************************************/
 void Get_Battery4(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL4H);
  readbattbuf[0] = IIC1_read_one_byte(CELL4L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

//    printf("VOL4=%d\r\n",batteryval1*5/32);

        Batteryval[3]= batteryval1*5/32;

    shang[8]=Batteryval[3]>>8;
    shang[9]=Batteryval[3]&0XFF;

    can_buf2[2]=shang[8];
    can_buf2[3]=shang[9];

}/****************************************
fuction: void Get_Battery5(void)
description:获取第5号单体电池电压
Parameters:battery5val[0],battery5val[1];
******************************************/
 void Get_Battery5(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL5H);
  readbattbuf[0] = IIC1_read_one_byte(CELL5L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

//    printf("VOL5=%d\r\n",batteryval1*5/32);

        Batteryval[4]= batteryval1*5/32;

    shang[10]=Batteryval[4]>>8;
    shang[11]=Batteryval[4]&0XFF;

    can_buf2[4]=shang[10];
    can_buf2[5]=shang[11];

}
/****************************************
fuction: void Get_Battery6(void)
description:获取第6号单体电池电压
Parameters:battery6val[0],battery6val[1];
******************************************/
 void Get_Battery6(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL6H);
  readbattbuf[0] = IIC1_read_one_byte(CELL6L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

//    printf("VOL6=%d\r\n",batteryval1*5/32);

        Batteryval[5]= batteryval1*5/32;

    shang[12]=Batteryval[5]>>8;
    shang[13]=Batteryval[5]&0XFF;

    can_buf2[6]=shang[12];
    can_buf2[7]=shang[13];

}/****************************************
fuction: void Get_Battery7(void)
description:获取第7号单体电池电压
Parameters:battery7val[0],battery7val[1];
******************************************/
 void Get_Battery7(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL7H);
  readbattbuf[0] = IIC1_read_one_byte(CELL7L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL7=%d\r\n",batteryval1*5/32);

        Batteryval[6]= batteryval1*5/32;

    shang[14]=Batteryval[6]>>8;
    shang[15]=Batteryval[6]&0XFF;

    can_buf3[2]=shang[14];
    can_buf3[3]=shang[15];

}
/****************************************
fuction: void Get_Battery8(void)
description:获取第8号单体电池电压
Parameters:battery8val[0],battery8val[1];
******************************************/
 void Get_Battery8(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL8H);
  readbattbuf[0] = IIC1_read_one_byte(CELL8L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL8=%d\r\n",batteryval1*5/32);

        Batteryval[7]= batteryval1*5/32;

    shang[16]=Batteryval[7]>>8;
    shang[17]=Batteryval[7]&0XFF;

    can_buf3[4]=shang[16];
    can_buf3[5]=shang[17];

}

/****************************************
fuction: void Get_Battery9(void)
description:获取第9号单体电池电压
Parameters:battery9val[0],battery9val[1];
******************************************/
void Get_Battery9(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL9H);
  readbattbuf[0] = IIC1_read_one_byte(CELL9L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL9=%d\r\n",batteryval1*5/32);

        Batteryval[8]= batteryval1*5/32;

    shang[18]=Batteryval[8]>>8;
    shang[19]=Batteryval[8]&0XFF;
    
  shang1[2]=shang[18];
    shang1[3]=shang[19];

    can_buf3[6]=shang[18];
    can_buf3[7]=shang[19];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第10号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery10(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL10H);
  readbattbuf[0] = IIC1_read_one_byte(CELL10L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL10=%d\r\n",batteryval1*5/32);

    Batteryval[9]= batteryval1*5/32;

    shang[20]=Batteryval[9]>>8;
    shang[21]=Batteryval[9]&0XFF;
  shang1[4]=shang[20];
    shang1[5]=shang[21];

    can_buf4[2]=shang[20];
    can_buf4[3]=shang[21];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第11号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery11(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL11H);
  readbattbuf[0] = IIC1_read_one_byte(CELL11L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL11=%d\r\n",batteryval1*5/32);

    Batteryval[10]= batteryval1*5/32;

    shang[22]=Batteryval[10]>>8;
    shang[23]=Batteryval[10]&0XFF;
  shang1[6]=shang[22];
    shang1[7]=shang[23];
    
    can_buf4[4]=shang[22];
    can_buf4[5]=shang[23];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第12号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery12(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL12H);
  readbattbuf[0] = IIC1_read_one_byte(CELL12L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL12=%d\r\n",batteryval1*5/32);

        Batteryval[11]= batteryval1*5/32;

    shang[24]=Batteryval[11]>>8;
    shang[25]=Batteryval[11]&0XFF;
  shang1[8]=shang[24];
    shang1[9]=shang[25];

    can_buf4[6]=shang[24];
    can_buf4[7]=shang[25];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第13号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery13(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL13H);
  readbattbuf[0] = IIC1_read_one_byte(CELL13L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL13=%d\r\n",batteryval1*5/32);

        Batteryval[12]= batteryval1*5/32;

    shang[26]=Batteryval[12]>>8;
    shang[27]=Batteryval[12]&0XFF;
  shang1[10]=shang[26];
    shang1[11]=shang[27];
    
    can_buf5[2]=shang[26];
    can_buf5[3]=shang[27];

}

/****************************************
fuction: void Get_Battery10(void)
description:获取第14号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery14(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL14H);
  readbattbuf[0] = IIC1_read_one_byte(CELL14L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL14=%d\r\n",batteryval1*5/32);

        Batteryval[13]= batteryval1*5/32;

    shang[28]=Batteryval[13]>>8;
    shang[29]=Batteryval[13]&0XFF;
  shang1[12]=shang[28];
    shang1[13]=shang[29];
    
    can_buf5[4]=shang[28];
    can_buf5[5]=shang[29];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第15号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery15(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL15H);
  readbattbuf[0] = IIC1_read_one_byte(CELL15L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL15=%d\r\n",batteryval1*5/32);

        Batteryval[14]= batteryval1*5/32;

    shang[30]=Batteryval[14]>>8;
    shang[31]=Batteryval[14]&0XFF;
  shang1[14]=shang[30];
    shang1[15]=shang[31];
    
    can_buf5[6]=shang[30];
    can_buf5[7]=shang[31];

}
/****************************************
fuction: void Get_Battery10(void)
description:获取第16号单体电池电压
Parameters:battery10val[0],battery10val[1];
******************************************/
void Get_Battery16(void)
{
  unsigned int readbattbuf[2];
//  unsigned int battery1val[2];
  short batteryval1;
    
  readbattbuf[1] = IIC1_read_one_byte(CELL16H);
  readbattbuf[0] = IIC1_read_one_byte(CELL16L);
 
  batteryval1= (readbattbuf[1] << 8) +readbattbuf[0];

    printf("VOL16=%d\r\n",batteryval1*5/32);

    Batteryval[15]= batteryval1*5/32;

    shang[32]=Batteryval[15]>>8;
    shang[33]=Batteryval[15]&0XFF;
  shang1[16]=shang[32];
    shang1[17]=shang[33];
    
    can_buf6[2]=shang[32];
    can_buf6[3]=shang[33];

}
/****************************************
****************************
获取所有电池的总电压值并用串口1打印出来
 *****************************/
float SOC;
void Get_Update_ALL_Data(void)
{
    int i,Sum_val=0;
  for(i=0;i<15;i++)
    {
       Sum_val+= Batteryval[i];
    }
      Batteryval[16] = Sum_val;
//        printf("VOL_ALL=%d\r\n",Batteryval[16]);

    
    
    shang[34]=Batteryval[16]>>24;
    shang[35]=Batteryval[16]>>16;
    shang[36]=Batteryval[16]>>8;
    shang[37]=Batteryval[16]&0XFF;
    
  shang2[10]=shang[36];
    shang2[11]=shang[37];

    can_buf6[4]=shang[34];
    can_buf6[5]=shang[35];
    can_buf6[6]=shang[36];
    can_buf6[7]=shang[37];

}


void Get_SOC(void)
{


float SOC;

   SOC = (float)Batteryval[1];
    SOC = (SOC-2800)/(4200-2800)*100;
    Batteryval[17] = SOC;
//    printf("soc=%d\r\n",Batteryval[17]);
//    Batteryval[7] = SOC;
  shang[38]=(char)Batteryval[17];
  shang2[12]=0;
    shang2[13]=shang[38];
    can_buf7[2]=shang[38];


}


  
/****************************************
fuction: void BQ_1_config(void)
description:BQ76930初始化
Parameters: None
 //0x04寄存器0x19对应SCD延时70uS,放电短路电压33mV;
 //0x05寄存器设置检测电流为1-shot模式;
 //0x06寄存器0x39对应OCD的延时时间80mS,放电过流电压33mV;短路和过流对应电流都是60A.
******************************************/
//unsigned char BQ769_INITAdd[11]={SYS_STAT,CELLBAL1,CELLBAL2,SYS_CTRL1,SYS_CTRL2,PROTECT1,PROTECT2,PROTECT3,OV_TRIP,UV_TRIP,CC_CFG};
unsigned char BQ769_INITdata[11]={0xFF,     0x00,    0x00,    0x18,    0X43,      0x00,     0x00,    0x00,    0x00,   0x00,  0x19};
void BQ_1_config(void)
{
   char i;
   for(i=0;i<11;i++)
    {
            delay_ms(50);
//            IIC1_write_one_byte_CRC(BQ769_INITAdd[i],BQ769_INITdata[i]);
    }
}

/****************************************/
/****************************************
fuction:void SHIP_1_BQ769(void)
description:BQ76930进入低功耗模式
Parameters: None
******************************************/
void SHIP_1_BQ769(void)
{
//  IIC1_write_one_byte_CRC(SYS_CTRL1,0x19); //01
//  delay_ms(20);
//  IIC1_write_one_byte_CRC(SYS_CTRL1,0x1a); //10
 }


/****************************************
fuction:void SHIP_2_BQ769(void)
description:从BQ76930低功耗模式唤醒
Parameters: None
******************************************/
void WAKE_1_BQ769(void)
{
   MCU_WAKE_BQ_ONOFF(1);
     delay_ms(50);
     MCU_WAKE_BQ_ONOFF(0);
 }
/****************************************/
 
/****************************************
fuction: void Get_BQCurrent(void)
description:BQ76930电流测量,采样电阻按4mΩ/8计算
Parameters: None
******************************************/

 void Get_SH367309_Current(void)
 {     
   unsigned char readCurrentbuf[2];
     unsigned int    Currentbufval;
//     unsigned int  Currentval;
//   unsigned char Currentbuf[1];
     readCurrentbuf[1]=IIC1_read_one_byte(0X4C);
   readCurrentbuf[0]=IIC1_read_one_byte(0X4D);
//     printf("高位=%X ", (readCurrentbuf[1]& (1 << 7)) == 0 ? 0 : 1);
   Currentbufval = ((readCurrentbuf[1]&0X7F) << 8)+readCurrentbuf[0];

//   Currentbufval = ((readCurrentbuf[1]) << 8)+readCurrentbuf[0];
//     printf("CUR=%d\r\n",Currentbufval);
   Currentbufval =200*Currentbufval/(26837*5/3/1000);
//     printf("电流=%d\r\n",Currentbufval);
     Batteryval[18]=Currentbufval;
      Batteryval[7]=((readCurrentbuf[1]&0X7F) << 8)+readCurrentbuf[0];
     shang[39]=readCurrentbuf[1]& 0X80 ;
     shang[40]=Currentbufval>>8;
     shang[41]=Currentbufval&0XFF;
     
    shang2[14]=shang[40];
    shang2[15]=shang[41];

     can_buf7[3]=shang[39];
     can_buf7[4]=shang[40];
     can_buf7[5]=shang[41];
     
 }
 /****************************************
fuction: void Get_BQ_1_Temp(void)
description:BQ76930 103AT温度测量
Parameters: None
******************************************/

 float  Tempval_1,Tempval_2,Tempval_3;


 void Get_SH367309_Temp1(void)
 {
//   float Rt=0;
   float Rp=10000;
   float T2=273.15+25;
   float Bx=3950;
   float Ka=273.15;
   unsigned char readTempbuf[3];
     float  TempRes;
//   unsigned char Tempbuf[1];
//     readTempbuf[2]=IIC1_read_one_byte(0X19);
//     printf("CUR=%d\r\n",readTempbuf[2]);

     readTempbuf[1]=IIC1_read_one_byte(0X46);
   readTempbuf[0]=IIC1_read_one_byte(0X47);

   TempRes = (readTempbuf[1] << 8 ) | readTempbuf[0];
     TempRes =TempRes*(6.8+0.05*68)/(32768-TempRes)*1000;
//     TempRes = (10000*(TempRes*382/1000))/(3300-(TempRes*382/1000)); 
   Tempval_1 = 1/(1/T2+(log(TempRes/Rp))/Bx)- Ka + 0.5;
     
     Batteryval[19] = Tempval_1*100;
//     printf("TEMP1=%f\r\n",Tempval_1);

     shang[42]=Batteryval[19]>>8;
     shang[43]=Batteryval[19]&0XFF;
    shang2[16]=Tempval_1;

     can_buf7[6]=shang[42];
     can_buf7[7]=shang[43];

     
 }
 
 void Get_SH367309_Temp2(void)
 {
//   float Rt=0;
   float Rp=10000;
   float T2=273.15+25;
   float Bx=3950;
   float Ka=273.15;
   unsigned char readTempbuf[3];
     float  TempRes;
//   unsigned char Tempbuf[1];
//     readTempbuf[2]=IIC1_read_one_byte(0X19);

     readTempbuf[1]=IIC1_read_one_byte(0X48);
   readTempbuf[0]=IIC1_read_one_byte(0X49);

   TempRes = (readTempbuf[1] << 8 ) | readTempbuf[0];
     TempRes =TempRes*(6.8+0.05*68)/(32768-TempRes)*1000;
//     TempRes = (10000*(TempRes*382/1000))/(3300-(TempRes*382/1000)); 
   Tempval_2 = 1/(1/T2+(log(TempRes/Rp))/Bx)- Ka + 0.5;
     
     Batteryval[20] = Tempval_2*100;
//     printf("TEMP2=%f\r\n",Tempval_2);

     shang[44]=Batteryval[20]>>8;
     shang[45]=Batteryval[20]&0XFF;

     can_buf8[2]=shang[44];
     can_buf8[3]=shang[45];

     
 } 
 
  void Get_SH367309_Temp3(void)
 {
//   float Rt=0;
   float Rp=10000;
   float T2=273.15+25;
   float Bx=3950;
   float Ka=273.15;
   unsigned char readTempbuf[3];
     float  TempRes;
//   unsigned char Tempbuf[1];
//     readTempbuf[2]=IIC1_read_one_byte(0X19);

     readTempbuf[1]=IIC1_read_one_byte(0X4A);
   readTempbuf[0]=IIC1_read_one_byte(0X4B);

   TempRes = (readTempbuf[1] << 8 ) | readTempbuf[0];
     TempRes =TempRes*(6.8+0.05*68)/(32768-TempRes)*1000;
//     TempRes = (10000*(TempRes*382/1000))/(3300-(TempRes*382/1000)); 
   Tempval_3 = 1/(1/T2+(log(TempRes/Rp))/Bx)- Ka + 0.5;
     
     Batteryval[21] = Tempval_3*100;
//     printf("TEMP3=%f\r\n",Tempval_3);
     shang[46]=Batteryval[21]>>8;
     shang[47]=Batteryval[21]&0XFF;

     can_buf8[4]=shang[46];
     can_buf8[5]=shang[47];

     
 }
 /****************************************
fuction: 均衡的1、2、3、4、5、6、7、8、9、10分别表示电池组上第1到10节的均衡,
         并且需要注意相邻的电池串不能同时开启均衡。由于均衡的条件不同需要用户根据自己的需求开启。
description:
Parameters: None
******************************************/
unsigned char balanceL[10],balanceH[10];
void Battery1_Balance(void)
{
     balanceL[0]|= (0x01 << 0);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}

void Battery2_Balance(void)
{
     balanceL[0]|= (0x01 << 1);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}
void Battery3_Balance(void)
{
     balanceL[0]|= (0x01 << 2);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}
void Battery4_Balance(void)
{
     balanceL[0]|= (0x01 << 3);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}
void Battery5_Balance(void)
{
     balanceL[0]|= (0x01 << 4);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}

void Battery6_Balance(void)
{
     balanceL[0]|= (0x01 << 5);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}

void Battery7_Balance(void)
{
     balanceL[0]|= (0x01 << 6);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}
void Battery8_Balance(void)
{
     balanceL[0]|= (0x01 << 7);
   IIC1_write_one_byte_CRC(0X42,balanceL[0]);
}
void Battery9_Balance(void)
{
     balanceH[0]|= (0x01 << 0);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery10_Balance(void)
{
     balanceH[0]|= (0x01 << 1);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery11_Balance(void)
{
     balanceH[0]|= (0x01 << 2);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery12_Balance(void)
{
     balanceH[0]|= (0x01 << 3);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery13_Balance(void)
{
     balanceH[0]|= (0x01 << 4);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery14_Balance(void)
{
     balanceH[0]|= (0x01 << 5);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery15_Balance(void)
{
     balanceH[0]|= (0x01 << 6);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}
void Battery16_Balance(void)
{
     balanceH[0]|= (0x01 << 7);
   IIC1_write_one_byte_CRC(0X41,balanceH[0]);
}

void Balance_Stop(void)
{
     IIC1_write_one_byte_CRC(0X41,0X00);
   IIC1_write_one_byte_CRC(0X42,0X00);
}

void Balance_Start(char i)
{
    if(i==0)
    {
       Battery1_Balance();
    }
    else if(i==1)
    {
       Battery2_Balance();
    }
    else if(i==2)
    {
       Battery3_Balance();
    }
    else if(i==3)
    {
       Battery4_Balance();
    }
    else if(i==4)
    {
       Battery5_Balance();
    }
    else if(i==5)
    {
       Battery6_Balance();
    }
        else if(i==6)
    {
       Battery7_Balance();
    }

        else if(i==7)
    {
       Battery8_Balance();
    }

        else if(i==8)
    {
       Battery9_Balance();
    }

        else if(i==9)
    {
       Battery10_Balance();
    }
        else if(i==10)
    {
       Battery11_Balance();
    }
        else if(i==11)
    {
       Battery12_Balance();
    }
        else if(i==12)
    {
       Battery13_Balance();
    }
        else if(i==13)
    {
       Battery14_Balance();
    }
        else if(i==14)
    {
       Battery15_Balance();
    }
        else if(i==15)
    {
       Battery16_Balance();
    }

}
 
 int imax,imin,imaxp,iminp;
void Cell_Battery_MAX_MIN(void)
{
    char i;
    imaxp=iminp=0;
    imax=imin=Batteryval[0];
    for(i=0;i<5;i++)
    {
    if(Batteryval[i]>imax)
        {
            imax=Batteryval[i];
            imaxp=i;
        }
        if(Batteryval[i]<imin)
        {
            imin=Batteryval[i];
            iminp=i;
        }
    }
//         printf("imax=%d\r\n",imax);
//           printf("imin=%d\r\n",imin);

}


void Cell_Balance(int Difference)
{
 Cell_Battery_MAX_MIN();
 if((imax - imin)>Difference)
 {
      Balance_Start(imaxp);
 }
 else Balance_Stop();
}
 
 unsigned char BMS_sta,DSG_STA,CHG_STA,DSG_STA_FLAG,CHG_STA_FLAG,CHGING=0,DSGING=0,B_flag1=0,B_flag2=0,B_status1=0,B_status2=0;    
void BMS_STA(void)
    {
        
    B_flag1=READ_BFLAG1();
    B_flag2=READ_BFLAG2();
    B_status1=READ_BSTATUS1();
    B_status2=READ_BSTATUS2();
    BMS_sta =READ_BSTATUS3();
    
    CHGING=((BMS_sta& (1 <<7 )) == 0 ? 0 : 1);
    DSGING= ((BMS_sta& (1 <<6 )) == 0 ? 0 : 1);
     DSG_STA =((BMS_sta& (1 << 0)) == 0 ? 0 : 1);
     CHG_STA = ((BMS_sta& (1 << 1)) == 0 ? 0 : 1);
     shang[48]=DSG_STA;
     shang[49]=CHG_STA;
        
        Batteryval[8]=IIC1_read_one_byte(0X10);
        
//    can_buf8[6]=shang[48];
//    can_buf8[7]=shang[49];
    }
 
// void Only_Open_CHG(void)
//    {
//        BMS_STA();
//        if(DSG_STA!=0)
//        {
//        IIC1_write_one_byte_CRC(SYS_CTRL2,0X43);    
//        }
//        else {IIC1_write_one_byte_CRC(SYS_CTRL2,0X41);}
//    }
// void Only_Close_CHG(void)
//    {
//        BMS_STA();
//        if(DSG_STA!=0)
//        {
//        IIC1_write_one_byte_CRC(SYS_CTRL2,0X42);    
//        }
//        else
//        {IIC1_write_one_byte_CRC(SYS_CTRL2,0X40);    }
//    }
//    
//    void Only_Open_DSG(void)
//    {
//        BMS_STA();
//        if(CHG_STA!=0)
//        {
//        IIC1_write_one_byte_CRC(SYS_CTRL2,0X43);    
//        }
//        else
//        {IIC1_write_one_byte_CRC(SYS_CTRL2,0X42);}    
//    }
//  void Only_Close_DSG(void)
//    {
//        BMS_STA();
//        if(CHG_STA!=0)
//        {
//        IIC1_write_one_byte_CRC(SYS_CTRL2,0X41);    
//        }
//        else
//        {IIC1_write_one_byte_CRC(SYS_CTRL2,0X40);    }
//    }
//    
//     void Open_DSG_CHG(void)
//    {
//     IIC1_write_one_byte_CRC(SYS_CTRL2,0X43);
//           
//    }
// void Close_DSG_CHG(void)
//    {
//     IIC1_write_one_byte_CRC(SYS_CTRL2,0X40);    
//    }
 void Update_val(void)
{
  char NEW[50]={0};
    int n;
      for(n=0;n<60;n++)

        {
            USART_SendData(USART1, shang[n]); //发送一个字节数据
            delay_ms(10);
            
        }
        
      USART2_Printf( shang,20,ASCII_CODE);    
        delay_ms(200);
        USART2_Printf( shang1,20,ASCII_CODE);
        delay_ms(200);
        USART2_Printf( shang2,20,ASCII_CODE);

        
//        Can_Send_Msg(can_buf1,8,0x0001);
//        delay_ms(5);
//        Can_Send_Msg(can_buf2,8,0x0002);
//        delay_ms(5);
//        Can_Send_Msg(can_buf3,8,0x0003);
//        delay_ms(5);
//        Can_Send_Msg(can_buf4,8,0x0004);
//        delay_ms(5);
//        Can_Send_Msg(can_buf5,8,0x0005);
//        delay_ms(5);
//        Can_Send_Msg(can_buf6,8,0x0006);
//        delay_ms(5);
//        Can_Send_Msg(can_buf7,8,0x0007);
//    delay_ms(5);
//        Can_Send_Msg(can_buf8,8,0x0008);
//    delay_ms(5);

        
        
        
        
  UartSend("CLR(61);\r\n");
  delay_ms(200);
    UartSend("CLR(61);\r\n");
  delay_ms(200);
  UartSend("DIR(1);\r\n");
  delay_ms(200);
    sprintf(NEW,"DCV16(0,0,'%s%d%s',3);\r\n","第一节电压:",Batteryval[0],"mV"); 
  UartSend(NEW); 
  
    delay_ms(200); 

    sprintf(NEW,"DCV16(0,20,'%s%d%s',3);\r\n","第二节电压:",Batteryval[1],"mV"); 
  UartSend(NEW); 
        
  delay_ms(200);
  
    
    sprintf(NEW,"DCV16(0,40,'%s%d%s',3);\r\n","第三节电压:",Batteryval[2],"mV"); 
  UartSend(NEW); 
  
    delay_ms(200); 
    sprintf(NEW,"DCV16(0,60,'%s%d%s',3);\r\n","第四节电压:",Batteryval[3],"mV"); 
  UartSend(NEW); 
  
    delay_ms(200); 
    sprintf(NEW,"DCV16(0,80,'%s%d%s',3);\r\n","第五节电压:",Batteryval[4],"mV"); 
  UartSend(NEW); 
  
    delay_ms(200); 
    sprintf(NEW,"DCV16(0,100,'%s%d%s',3);\r\n","第六节电压:",Batteryval[5],"mV"); 
  UartSend(NEW); 
      delay_ms(1000);
    UartSend("CLR(61);\r\n");
  delay_ms(200);

    delay_ms(200); 
    sprintf(NEW,"DCV16(0,00,'%s%d%s',3);\r\n","总电压:",Batteryval[16],"mV");
    
  UartSend(NEW);   
  delay_ms(200); 
    sprintf(NEW,"DCV16(0,20,'%s%d%s',3);\r\n","电池SOC为:",Batteryval[17],"%"); 
  UartSend(NEW); 
  
    delay_ms(200); 
    sprintf(NEW,"DCV16(0,40,'%s%.2f%s',3);\r\n","电池温度为:",Tempval_1,"℃"); 
  UartSend(NEW);

    delay_ms(200); 
    sprintf(NEW,"DCV16(0,60,'%s%d%s',3);\r\n","电流:",Batteryval[18],"mA"); 
  UartSend(NEW); 
  
    delay_ms(200);
    
    sprintf(NEW,"DCV24(0,20,'%s',3);\r\n",""); 
  UartSend(NEW);
    
    delay_ms(100);
    
    
    

}
 void Get_Update_Data(void)
{      
    Get_Battery1();
    Get_Battery2();
    Get_Battery3();
    Get_Battery4();
    Get_Battery5();
    Get_Battery6();     
    Get_Update_ALL_Data();//总电压
    Get_SOC();
    Get_SH367309_Temp1();
    Get_SH367309_Temp2();
    Get_SH367309_Temp3();
    Get_SH367309_Current();
    BMS_STA();
    Update_val();            
}
 int OT_Alarm_flag,UT_Alarm_flag;
 
 
 
 
/****************************************
fuction:void readbqstate(void)
description:读取报警信号值
Parameters: UV_Alarm_flagOV_Alarm_flag
            SCD_Alarm_flag,OCD_Alarm_flag
******************************************/

 int UV_Alarm_flag,OV_Alarm_flag,SCD_Alarm_flag,OCD_Alarm_flag;
void ALERT_1_Recognition(void)
{
//    
//  unsigned char sys_stat_1,sys_stat_2,UV_1,OV_1,UV_2,OV_2,SCD,OCD;
//  sys_stat_1 = IIC1_read_one_byte(SYS_STAT);//获取状态SYS_CTRL2
//    
//    
//  UV_1  =  sys_stat_1&0x08;  //取出UV位
//  OV_1  =  sys_stat_1&0x04;
//  SCD   =  sys_stat_1&0x02;
//  OCD   =  sys_stat_1&0x01;
//  if((UV_1 == 0x08)||(UV_2 == 0x08))
//  {
//             IIC1_write_one_byte_CRC(SYS_STAT,0X88);                

//      UV_Alarm_flag = 1;    //欠压报警
//          printf("pack UV\n");
//  }    
//   else
//     UV_Alarm_flag = 0;     //没有欠压
//     if((OV_1 == 0x04)||(OV_2 == 0x04))
//      {
//       OV_Alarm_flag = 1;    
//     IIC1_write_one_byte_CRC(SYS_STAT,0X84);                
//           printf("pack OV\n");
//      }
//        else
//           OV_Alarm_flag = 0;
//           if(SCD == 0x02)
//                        {
//                            IIC1_write_one_byte_CRC(SYS_STAT,0X82);                
//                            SCD_Alarm_flag = 1;
//                            printf("pack SCD\n");        
//                        }
//                            else
//                                    SCD_Alarm_flag = 0;
// 
//                                    if(OCD == 0x01)
//                                        {
//                                            OCD_Alarm_flag = 1;
//                                                                        IIC1_write_one_byte_CRC(SYS_STAT,0X81);                

//                                            printf("pack OCD\n");        
//                                        }   
//                                            else
//                                                    OCD_Alarm_flag = 0;    
}

unsigned char CRC8(unsigned char *ptr, unsigned char len,unsigned char key)
{
    unsigned char i;
    unsigned char crc=0;
    while(len--!=0)
    {
        for(i=0x80; i!=0; i/=2)
        {
            if((crc & 0x80) != 0)
            {
                crc *= 2;
                crc ^= key;
            }
            else
                crc *= 2;

            if((*ptr & i)!=0)
                crc ^= key;
        }
        ptr++;
    }
    return(crc);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

softshow1026

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

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

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

打赏作者

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

抵扣说明:

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

余额充值