淘宝hp dv3000 battery(hp dv3000)

本篇文章给大家谈谈hp dv3000 battery,以及hp dv3000的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

文章详情介绍:

三星SDI公司:NCA正极材料在充放电过程中结构不稳定机理探究

第一作者:Eun Cheol Lee

通讯作者:Junghwan Park

通讯单位:韩国三星SDI股份有限公司

【工作简介】

韩国三星SDI股份有限公司的Junghwan Park等人利用电化学方法、原位XRD测试及密度泛函理论计算研究了Li(Ni0.80Co0.15Al0.05)O2(NCA)正极材料的晶体结构变化,揭示了晶体缺陷对晶体结构的转换和晶格常数的影响,并研究不同温度下材料结构的演化,确认了发生混排的过渡金属离子。相关文章以“Unraveling the Structural Instability of Li(Ni0.80Co0.15Al0.05)O2 as a Cathode Material Due to Operating a Li-ion Battery”为题发表在国际知名期刊“Small”上。

【研究背景】

NCA作为锂离子电池正极材料具有较好的电化学性能,但也面临着容量衰减的问题。晶体缺陷对正极材料性能具有较大影响,能控制原子在晶格中的迁移,但目前对NCA材料的晶体缺陷研究认识较少。因此需要通过对其晶体结构进行追踪来了解其衰减机制,找出材料的改善方向。同时,理解锂离子电池的热力学特征对提升电池的安全性有重要意义,对NCA正极材料在脱锂状态下的热稳定性也进行了研究。

【内容详情】

电化学、原位XRD及理论计算

如图1a所示,NCA正极首圈充放电容量分别为212.4 mAh/g和195.4 mAh/g,这与 Li 含量的变化相对应,Li1-x(Ni0.80Co0.15Al0.05)O2中Li(Δx)的变化量在充电时为0.76,在放电时为0.70。图1b中dQ/dV曲线的三对氧化还原峰则对应着不同的晶体结构相变。原位XRD结果显示,NCA晶胞体积变化表现出缺陷控制的特征,缺陷值的定义为:Li1-x(Ni0.80Co0.15Al0.05)O2 (x为缺陷值),随着x系数的增加,a轴线性减小,c轴则先线性增加,至x值为0.6时,线性降低。且XRD实验结果与理论计算结果误差较小,确定Li缺陷数量对NCA材料结构变化有较大影响。

图 1. NCA正极的a) 首圈充放电曲线及b)dQ/dV曲线;c)原位XRD图谱。

高温XRD图谱、中子衍射图谱及理论计算

为了确定Li缺陷对材料结构稳定性的影响,对x=0.05的材料(Li0.95(Ni0.80Co0.15Al0.05)O2)进行了高温X射线及中子衍射图谱分析,如图2所示,Li缺陷系数为0.05时,NCA材料的晶格常数呈现出温度依赖性,随着温度升高,晶胞大小同时上升。在降温过程中,NCA材料同样表现出温度依赖性,但不同的在于,其全程表现出线性的变化关系。

图 2. 晶格常数和晶胞体积的温度依赖关系。

同时对NCA材料中占据Li层的Ni含量的温度依赖关系进行了测定,如图3所示,随着温度上升,Ni含量也逐渐增加,这说明在热量的驱动下,过渡金属离子向Li层移动。由于Ni侵占了Li的位置,使得晶胞体积及晶胞常数发生了变化。另外,在降温过程中,Ni的含量仍保持最高值(2.5%),几乎没有降低,说明Ni占据Li位点的这一结构是稳定存在的。

随后,利用Li0.944(Ni0.796Co0.148Al0.056)O2这一结构研究了Ni在Li层的含量与晶胞常数及所需能量的关系,如图7所示,随着Ni含量的升高,所需要的能量也逐渐增加,说明Ni的移动需要能量。另外,随着Ni含量的增加,a轴逐渐增加,c轴逐渐降低,晶胞体积则变化不大,这与先前的诸多报道结果相一致。

图 3. a)Ni含量与温度的依赖关系;b)Ni迁移至Li层的示意图。

图 4. 不同Ni含量与能量差及晶体结构变化的关系。

磁特性

基于Li(Ni0.80Co0.15Al0.05)O2及Li0.95(Ni0.80Co0.15Al0.05)O2结构的磁特性,验证了缺陷和阳离子无序对材料性能的影响。如图5a,b所示,两种材料的磁矩都随温度的升高而减小,但Li缺陷大的材料变化更大。图5c,d则说明Ni占据Li层后,发生了Ni-O-Ni超交换,产生了铁磁效应及形成了弹晶态。磁性结果证实了晶体结构的缺陷是由电化学反应引起的,由于晶体结构不稳定,原子在热作用下容易移动。

图 5. a) 磁化强度和b) 逆磁化率的温度依赖关系;c,d)不同Li缺陷含量下的磁场与磁化强度的关系。

【结论】

这项工作通过研究晶体结构的变化,证实了NCA正极材料中的原子在电化学、热作用等外部环境中发生了移动。此外,通过各种实验和计算的互补方法,对原子的类型和位置进行了检验和验证。在放电过程中,NCA晶体结构会变得不稳定,但在高温下,会促使结构变得稳定。由于Li缺陷的出现,NCA正极材料的稳定性降低,而Ni阳离子混排可以在一定程度上改善其结构稳定性。正极材料的稳定性是提高锂电池性能的一个重要因素。这一结果提供了一种理解LIBs的结构稳定性思路以及探索改善其性能途径。

【文献信息】

Eun Cheol Lee,Junghwan Park, Unraveling the Structural Instability of Li(Ni0.80Co0.15Al0.05)O2 as a Cathode Material Due to Operating a Li-ion Battery, Small, 2022, 202200581.DOI: 10.1002/smll.202200581

https://doi.org/10.1002/smll.202200581

一种基于电池电压计算电池电量的算法的分析总结

这种算法应用在低成本的无界面的移动产品上,不依于赖库伦计,纯电压计算电量的方法,具有实际应用意义。常见应用产品有宠物定位器,移动WIFI等产品。

首先,设置一些基本的变量:

struct capacity {
int capacity;

int min;
int max;
int offset;
int hysteresis;
};

struct battery_capacity {
struct capacity *tables;
int size;
};

struct battery {
......
struct device *dev;
struct wake_lock wlock;
struct power_supply psy;
struct battery_monitor monitor;
struct battery_property props;
struct battery_parameter params;
......
};

再通过电池厂商提供的电池曲线制作成:

static struct capacity battery_capacity_tables[]= {
/*percentage, min, max, hysteresis*/
{0, 3306, 3426, 0, 10},
{1, 3427, 3638, 0, 10},
{10,3639, 3697, 0, 10},
{20,3698, 3729, 0, 10},
{30,3730, 3748, 0, 10},
{40,3749, 3776, 0, 10},
{50,3777, 3827, 0, 10},
{60,3828, 3895, 0, 10},
{70,3896, 3954, 0, 10},
{80,3955, 4050, 0, 10},
{90,4051, 4119, 0, 10},
{100,4120,4240, 0, 10},
};

此处稍作解释一下:

在选取电压时,厂商提供的电压有OCV/CV两种,我选取的是CV作为上述表中的数据,这样做的目的是可以让电池尽早的充满,同时也保护电池,防止电压过高。但是MTK与高通的制作电池曲线中都是以OCV作为计算基础的。

定义两个全局变量:

......
static struct capacity *battery_capacity_tables = battery_capacity_tables;
static int cap_size = ARRAY_SIZE(battery_capacity_tables);
......
bat->params->cap.tables = battery_capacity_batbles;
bat->params->cap.size = cap_size;
......

有了参考数据,我们就可以开始计算电量了。

通过PMIC已有的采取电压函数进行电压采集。

static int battery_get_voltage(struct battery *bat)
{
......

int vbat;
int ret;
int index;
int vbat_sample[8] = {0};
int count = ARRAY_SIZE(vbat_sample);

......

for(index = 0; index < count; index++) {
/*调用pmic的内部函数进行电压的读取,一般是通过ADC通道获取的*/
ret = pmu_battery_get_vbat(bat, &(vbat_sample[index]));
if (!ret)
break;
mdelay(10);
}

......

vbat = battery_calcuate_average(vbat_sample, count);
return vbat;
}

采集完了电压之后,就需要给采集到的电压进行计算。

static int battery_calculate_average(int *battery_array, unsigned int num)
{
int min = battery_array[0];
int max = battery_array[0];
int sum = 0;
int index;

for(index = 0; index < num; index++) {
if (battery_array[index] > max)
max = battery_array[index];
else if (battery_array[index] < min)
min = battery_array[index];
else
;
sum += battery_array[index];
}

return ( num > 3 ? ((sum - max - min) / (num - 2)) : (sum / num));
}

这是对采集的电压进行初步计算,这还不够的,还要进行电压的平滑处理。计算电压的平均值。

#define MAX_CALCULATE_COUNT 48
#define BATTERY_VOLTAGE_ERROR_UP (25 * 1000) /*uV*/
#define BATTERY_VOLTAGE_ERROR_DOWN (-50 * 1000) /*uV*/
static int battery_calculate_average_voltage(struct battery *bat, int cur_voltage)
{
static int vol_pre = 0;
static int vol_error = 0;
static int vol_recover = BATTERY_VOLTAGE_ERROR_UP;
static unsigned char cur_index = 0;
static int vol_array[MAX_CALCULATE_COUNT];
int average = 0;
static int pre_average = 0;
int dv = 0;
int index;

if (!bat->props.persent) {
vol_pre = 0;
vol_error = 0;
vol_recover = BATTERY_VOLTAGE_ERROR_UP;
cur_index = 0
max_index = 0;
return cur_voltage;
}

/*对电池放电时电压进行检查并自动纠正*/

do {
if (vol_pre > 0) {
dv = cur_voltage - vol_pre;
if (dv <= BATTERY_VOLTAGE_ERROR_DOWN) { /*估算电池输出大电流*/
vol_error = (dv * 9) / 10;
vol_recover = - dv / 2;
} else if (dv > vol_recover) { /*估算电池从大电流输出中恢复*/
vol_error = 0;
vol_recover = BATTERY_VOLTAGE_ERROR_UP;
} else {
vol_error = 0;
vol_recover = BATTERY_VOLTAGE_ERROR_UP;
}
}
vol_pre = cur_voltage;
cur_voltage -= vol_error;
} while (0);

vol_array[cur_index] = cur_voltage;
cur_index++;
if (cur_index >= ARRAY_SIZE(vol_array))
cur_index = 0;

if (max_index < ARRAY_SIZE(vol_array))
max_index++;

for (index = 0 ; index < max_index; index++) {
average += vol_array[index];
}
average = average / max_index;

if (bat->props.state == POWER_SUPPLY_STATUS_DISCHARGING \
&& pre_average > 0 && pre_average < average)
return pre_average;

pre_average = average;

return average;
}

电压计算好了,现在就要跟据电压结合电池曲线表进行电量的计算了。

static int battery_calculate_capacity(struct battery *bat, int battery_voltage)
{
int vbat = battery_voltage;
struct capacity *tables = bat->params->cap.tables;
int high = bat->params->cap.size - 1;
int low = 0;
int offset = 0;
int cap = 0;
int v0 = 0;
int c0 = 0;
int v1 = 0;
int c1 = 0;
int deviation = 0;
int compensated = bat->props.state == POWER_SUPPLY_STATUS_DISCHARGING ? false : true;

if (!tables) {
pr_err("capacity convert tables is not present!\n");
return -EINVAL;
}

while (high >= low) {
mid = (high + low) / 2;
offset = (compensated ? tables[mid].offset : 0);
if ((vbat + offset) < tables[mid].min)
high = mid - 1;
else if ((vbat + offset) > tables[mid].max)
low = mid + 1;
else
break;
}

cap = tables[mid].capacity;
if ( 0 < mid) && (mid < bat->params->cap.size - 1 ) {
v0 = tables[mid].min;
c0 = tables[mid].capacity;
v1 = tables[mid + 1].min;
c1 = tables[mid + 1].capacity;

deviation = ((c1 - c0) * (vbat - v0) * 10) / (v1 - v0);
cap = c0 + (deviation / 10 + ((deviation % 10 ) >= 5 ? 1 : 0));
if (cap < c0)
cap = c0;
else if (cap > c1)
cap = c1;
}

return cap;
}

到此,分析完毕。

这是针对最近做的一个项目中发现这个依据电压计算电池电量算法整理的,感觉还不错,就分享出来。

 

关注我的微信公众号