rfg阻值校准方法

Fuel Gauge Unit(FGU)

手机通过计算流进或流出电池的电流,来计算电池电量。通过获取rfg的电压,然后除以rfg的电阻,得到电流值。

由于rfg的电阻(精度1%)受pcb layout和贴片一致性的影响,需要校准rfg的阻值。原理就是给rfg灌固定的电流,然后软件读取fgu两端的电流I,然后得到修正系数。

以展讯平台为例

1.接3.8V电源开机(AC两点),然后插入usb,先禁止充电(对电流有影响echo 1 >stop_charge) stop_charge节点的路径有差异,可以通过find -name stop_charge查找。

 

2.另一路电源设置电压1V,限流1000mA,电源正极接电池座子负极B,电源负极接主板地C(禁止焊线到EF两点),然后读取电流值(current_now)。

比如rfg软件设值100毫欧,I=1050mA,那么rfg的真实阻值就是100*(1050)/1000=105毫欧,然后修改dts里这个值sprd,calib-resistance-real = <10500>;为了保证一致性,拿几台手机

获取rfg的平均值,填写到软件中。

对于mtk平台,更好操作点,不需要插入usb,工程模式可以直接读取流过fpu的电流(Hardware Testing-->Power-->Charge  Battery-->FG_Battery_CurrentConsumption)(要除以100)。第一步是一样的,第二步根据mtk参考文档,电源正极接C,电源负极接D,跟展讯的有差异,个人理解是一样的(只是电流方向不一样)。计算方法CAR_TUNE_VALUE=1000/b*100,假设b为1050mA,那么CAR_TUNE_VALUE=95,然后修改dts里这个值

  /* The resistance of PCB */
 CAR_TUNE_VALUE = <(95)>;


看下FG_Battery_CurrentConsumption的实现,工程模式apk直接cat内核的FG_Battery_CurrentConsumption节点

static DEVICE_ATTR_RW(FG_Battery_CurrentConsumption);
 
static ssize_t FG_Battery_CurrentConsumption_show(
    struct device *dev, struct device_attribute *attr, char *buf)
{
    int ret_value = 8888;
 
    ret_value = gauge_get_int_property(GAUGE_PROP_BATTERY_CURRENT) * 100;
    bm_err("%s[EM] FG_Battery_CurrentConsumption : %d .1mA\n", __func__,
        ret_value);
 
    return sprintf(buf, "%d\n", ret_value);
}
 
static struct mtk_gauge_sysfs_field_info mt6357_sysfs_field_tbl[] = {
    ...
    GAUGE_SYSFS_FIELD_RO(battery_current_get,GAUGE_PROP_BATTERY_CURRENT),
    ...
}
 
static int battery_current_get(struct mtk_gauge *gauge,
    struct mtk_gauge_sysfs_field_info *attr, int *val)
{
    *val = instant_current(gauge);
 
    return 0;
}
 
static int instant_current(struct mtk_gauge *gauge)
{
    ...
    dvalue =((dvalue * car_tune_value) / 1000);
    return dvalue;
}

fg_read_dts_val(np, "CAR_TUNE_VALUE", &(fg_cust_data->car_tune_value),UNIT_TRANS_10);
static int fg_read_dts_val(const struct device_node *np,const char *node_srting,int *param, int unit)
{
    if (!of_property_read_u32(np, node_srting, &val)) {
        *param = (int)val * unit;
    } 
}
实际操作中,遇到2个坑,分享给大家

展讯平台没有stop charge,导致读出来的电流跳变,无法往下进行实验。其实也可以不通过插usb来读取电流,毕竟支持无线adb。

mtk平台也出现了电流跳变,由于偷懒,没有焊接10k电阻,直接接电池fpc来给系统供电,导致系统的地接到了电池座子的负极,导致流过rfg的电流不稳定。

参考

GM2.5_and_3.0_Customized_Setting_Flow_V1.4.pdf

FGU电压及电流检测测试及校准方法20160322.xlsx
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2.理解代码,写出执行结果。 System. out. println("b". matches("[abc]")); System. out. println("b". matches("[^abc]")); System. out. println("A". matches("[a-zA-Z]")); System. out. println("A". matches("[a-z[A-Z]]")); System. out. println("R". matches("[A-Z&&[RFG]]")); System. out. println("\n\t". matches("\\s{2}")); System. out. println("". matches("\\S")); System. out. println("3". matches("\\d")); System. out. println("&". matches("\\D")); System. out. println("a_8". matches("\\w{3}")); System. out. println("\n". matches(".")); System. out. println("\\u0041\\\\". matches("A\")); System. out. println("aaaa". matches("a*")); System. out. println("aaaa". matches("a+")); System. out. println("aaaa". matches("a?")); System. out. println("". matches("a?")); System. out. println("aaaa". matches("a{4}")); System. out. println("abcabcabc". matches("(abc){2,}")); System. out. println("4563456257". matches("\\d{3,10}")); 3.理解代码,写出程序功能。 String s="abc 123 abc1234abcabc"; String s1="abc"; int count=0; int index=0; while((index=s. indexOf(s1, index))!=-1){ index+=s1. length; count++; } System. out. println(count); 4、写出使用StringBuffer判断是否为回文串的代码? 5、利用Pattern和Matcher,查找字符串s (“123abcsfs123a1213c34sf32324f243aa45c c99”)中所有有连续数字(出现2次及以上,例如:123)的起始位置和对应的数字字符串。 思考(选做)找到字符串中出现的两位数。 6、购物小票内容如下: 牛奶:89.9元香肠:12.9元啤酒:69元巧克力:132元 要求使用StringTokenizer类,输出购物小票中的价格数据,并计算出菜单的总价格。
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值