1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| interpolate_pc(chip->batt_data->pc_temp_ocv_lut,batt_temp, ocv_uv / 1000); //calculate the capacity percent if (batt_temp == pc_temp_ocv->temp[j] * DEGC_SCALE) { /* found an exact match for temp in the table */ for (i = 0; i < rows; i++) // i: rows- Capacity Percent j: columns-Temperature ... pc = linear_interpolate(pc_temp_ocv->percent[i],pc_temp_ocv->ocv[i][j],pc_temp_ocv->percent[i - 1],pc_temp_ocv->ocv[i - 1][j],ocv); // calculate 不匹配dts表格的percentcharge 转换为公式见下公式一;
/* batt_temp is within temperature for column j-1 and j */ is_between(pc_temp_ocv->ocv[i][j],pc_temp_ocv->ocv[i+1][j], ocv) // caculate temp1 percentcharge pcj = linear_interpolate(pc_temp_ocv->percent[i],pc_temp_ocv->ocv[i][j],pc_temp_ocv->percent[i + 1],pc_temp_ocv->ocv[i+1][j], ocv); 转换为公式见下公式二; is_between(pc_temp_ocv->ocv[i][j-1],pc_temp_ocv->ocv[i+1][j-1], ocv)) // caculate temp2 percentcharge pcj_minus_one = linear_interpolate(pc_temp_ocv->percent[i],pc_temp_ocv->ocv[i][j-1],pc_temp_ocv->percent[i + 1],pc_temp_ocv->ocv[i+1][j-1],ocv); 转换为公式见下公式三; if (pcj && pcj_minus_one) // temp1 and temp2 都存在,calculate percentcharge pc = linear_interpolate(pcj_minus_one,pc_temp_ocv->temp[j-1] * DEGC_SCALE, pcj,pc_temp_ocv->temp[j] * DEGC_SCALE,batt_temp); 转换为公式见下公式四; 否则:return pcj 、pcj_minus_one、其他临界值
|