static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat) { int capacity = 0; struct rk30_adc_battery_platform_data *pdata = bat->pdata; //充放电状态变化后,Buffer填满之前,不更新 if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) { bat->gBatCapacityDisChargeCnt = 0; bat->gBatCapacityChargeCnt = 0; return; } capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); if (rk30_adc_battery_get_charge_level(bat)){ if (capacity > bat->bat_capacity){ //实际采样到的容量比显示的容量大,逐级上升 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityDisChargeCnt = 0; if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } bat->gBatCapacityChargeCnt = 0; } else{ // 实际的容量比采样比 显示的容量小 bat->gBatCapacityDisChargeCnt = 0; (bat->gBatCapacityChargeCnt)++; if (pdata->charge_ok_pin != INVALID_GPIO){ if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){ //检测到电池充满标志,同时长时间内充电电压无变化,开始启动计时充电,快速上升容量 if (bat->gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityChargeCnt = 0; if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } else{ #if 0 if (capacity > capacitytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 gBatCapacityChargeCnt = 0; } else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } #else // 防止电池老化后出现冲不满的情况, if (capacity > bat->capacitytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 bat->gBatCapacityChargeCnt = 0; } else{ if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){ bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } } #endif } else{ //没有充电满检测脚,长时间内电压无变化,定时器模拟充电 if (capacity > bat->capacitytmp){ //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快 bat->gBatCapacityChargeCnt = 0; } else{ if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } } }
static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat) { int capacity = 0; struct rk30_adc_battery_platform_data *pdata = bat->pdata; //��ŵ�״̬�仯��Buffer����֮ǰ�������� if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) { bat->gBatCapacityDisChargeCnt = 0; bat->gBatCapacityChargeCnt = 0; return; } capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); if (rk30_adc_battery_get_charge_level(bat)){ if (capacity > bat->bat_capacity){ //ʵ�ʲ������������ʾ�������������� if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityDisChargeCnt = 0; if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } bat->gBatCapacityChargeCnt = 0; } else{ // ʵ�ʵ������Ȳ���� ��ʾ������С bat->gBatCapacityDisChargeCnt = 0; (bat->gBatCapacityChargeCnt)++; if (pdata->charge_ok_pin != INVALID_GPIO){ if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){ //����س����־��ͬʱ��ʱ���ڳ���ѹ�ޱ仯����ʼ������ʱ��磬������������ if (bat->gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE){ bat->gBatCapacityChargeCnt = 0; if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } else{ #if 0 if (capacity > capacitytmp){ //���������ѹ����������ʱ����λ����ֹ��ʱ��ģ�����ʵ�ʳ��� gBatCapacityChargeCnt = 0; } else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } #else // ��ֹ����ϻ�����ֳ岻�������� if (capacity > bat->capacitytmp){ //���������ѹ����������ʱ����λ����ֹ��ʱ��ģ�����ʵ�ʳ��� bat->gBatCapacityChargeCnt = 0; } else{ if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){ bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } } #endif } else{ //û�г������ţ���ʱ���ڵ�ѹ�ޱ仯����ʱ��ģ���� if (capacity > bat->capacitytmp){ //���������ѹ����������ʱ����λ����ֹ��ʱ��ģ�����ʵ�ʳ��� bat->gBatCapacityChargeCnt = 0; } else{ if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){ bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE); if (bat->bat_capacity < 99){ bat->bat_capacity++; bat->bat_change = 1; } } } } }