STM8L151 库仑计

2019-07-19 20:21发布

本帖最后由 金大米 于 2017-7-27 09:02 编辑

    由于自己能力的原因,一直是网上拿来主义,没有分享过.由于公司的一个新的项目,接触到了DS2780/DS2781库仑计,今天就将他们分享一下吧.这两个芯片的区别就是输入电压的范围不一样.DS2780只能适用于单节锂电池,DS2781可以使用一到两节的锂电池.当我一拿到DS2780的时候也是蛮惊讶的,这个小东西竟然比我的STM8L还贵,TTSOP8的封装还是蛮小的.惊讶过后就是一脸懵逼,网上基本没有DS2780的完整的教程,有的只是为数不多的驱动程序,但基本上程序的参数填写没有说明.在网上蹦跶了好久也没找到好的方法,突然有一天在美信官网闲逛时,看到了一丝丝的希望.首先在官网上下载DS2780的上位机软件,然后在某宝上买一片DS2480B单总线转串口芯片,如下图
注意,没有DS2480B和DS2780的话,上位机软件是打不开的.
     然后在软件里按照表填写锂电池参数,我的锂电池没有参数表,就按照DS2780手册里的表,大致的填写参数了.为什么要填写参数,因为有些数据我是不知道如何计算的,手册里也没有提示,只能由软件填写到DS2780里,然后再读出来,这样就能获得参数了.如果换了锂电池,只要打开软件修改参数就行了.初始化程序
void DS2780_Default(void)
{
  delay_ms(10);
  DS2780_Reset();
  /*设置老化系数*/
  //95%
  Wire_WriteStr(0x14,0x79);
  Wire_EEPROM_CopyStr(0x14);
  /*设置控制寄存器*/
  //BIT 7 Reserved   保留位
  //BIT 6 UVEN    0  欠压使能
  //BIT 5 PMOD    0  电源模式使能位
  //BIT 4 RNAOP   0  读网络地址代码,0x33
  //BIT 3         0  保留位
  //BIT 2 PSPIO   0  保留位
  //BIT 1 PSDQ    0  保留位
  //BIT 0         0  保留位
  Wire_WriteStr(0x60,0x00);
  Wire_EEPROM_CopyStr(0x60);
  Wire_WriteStr(0x61,0x04);
  Wire_EEPROM_CopyStr(0x61);
  /*设置老化容量*/
  //容量为1Ah,检流电阻0.02,1*0.02*1000000/6.25=3200=0x0C80
  Wire_WriteStr(0x62,0x0C);
  Wire_EEPROM_CopyStr(0x62);
  Wire_WriteStr(0x63,0x80);
  Wire_EEPROM_CopyStr(0x63);
  /*设置充电电压*/
  //电压为4.173V/19.5mV=214         
  Wire_WriteStr(0x64,0xD7);
  Wire_EEPROM_CopyStr(0x64);
  /*设置最小充电电流*/
  //最小电流为12.5mA,涓流充电,Rsns为20mR           
  Wire_WriteStr(0x65,0x05);
  Wire_EEPROM_CopyStr(0x65);
  /*设置有效空电压*/
  //电压为3.315V/19.5mV=170         
  Wire_WriteStr(0x66,0xAA);
  Wire_EEPROM_CopyStr(0x66);
   /*设置有效空电流*/
  //电流为50mA           
  Wire_WriteStr(0x67,0x05);
  Wire_EEPROM_CopyStr(0x67);        
   /*设置40度下有效空电量*/         
  Wire_WriteStr(0x68,0x00);
  Wire_EEPROM_CopyStr(0x68);
  /*设置取样电阻*/
  //1/0.02=50=0x32电阻单位mhos
  Wire_WriteStr(0x69,0x32);
  Wire_EEPROM_CopyStr(0x69);
  /*设置40度下有效电量值*/
  Wire_WriteStr(0x6A,0x0C);
  Wire_EEPROM_CopyStr(0x6A);
  Wire_WriteStr(0x6B,0x80);
  Wire_EEPROM_CopyStr(0x6B);
  /*设置满电量曲线*/
  Wire_WriteStr(0x6C,0x52);
  Wire_EEPROM_CopyStr(0x6C);
  Wire_WriteStr(0x6D,0x52);
  Wire_EEPROM_CopyStr(0x6D);
  Wire_WriteStr(0x6E,0xA4);
  Wire_EEPROM_CopyStr(0x6E);
  Wire_WriteStr(0x6F,0xA4);
  Wire_EEPROM_CopyStr(0x6F);
  /*设置有效空电量曲线*/
  Wire_WriteStr(0x70,0x00);
  Wire_EEPROM_CopyStr(0x70);
  Wire_WriteStr(0x71,0x62);
  Wire_EEPROM_CopyStr(0x71);
  Wire_WriteStr(0x72,0x21);
  Wire_EEPROM_CopyStr(0x72);
  Wire_WriteStr(0x73,0x21);
  Wire_EEPROM_CopyStr(0x73);
  /*设置待机电量曲线*/
  Wire_WriteStr(0x74,0x10);
  Wire_EEPROM_CopyStr(0x74);
  Wire_WriteStr(0x75,0x21);
  Wire_EEPROM_CopyStr(0x75);
  Wire_WriteStr(0x76,0x21);
  Wire_EEPROM_CopyStr(0x76);
  Wire_WriteStr(0x77,0x52);
  Wire_EEPROM_CopyStr(0x77);
  /*设置电阻增益*/
  Wire_WriteStr(0x78,0x04);
  Wire_EEPROM_CopyStr(0x78);
  Wire_WriteStr(0x79,0x1B);
  Wire_EEPROM_CopyStr(0x79);
  /*设置检流电阻温度补偿*/
  //检流电阻为100ppm
  Wire_WriteStr(0x7A,0x03);
  Wire_EEPROM_CopyStr(0x7A);  
  /*设置出厂增益*/
  Wire_WriteStr(0x7B,0x04);
  Wire_EEPROM_CopyStr(0x7B);
  Wire_WriteStr(0x7C,0x1B);
  Wire_EEPROM_CopyStr(0x7C);
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。