lawrencejiabin
3/19/2020 - 2:05 AM

检测波动过滤例子

#define BATTERY_VALUE_SUM_COUNTER_MAX   (100L)
static u16 battery_value_tab[BATTERY_VALUE_SUM_COUNTER_MAX];
static u16 get_battery_level_average()
{
    static u32 prev_bat = 0;
    u32 max_bat = 0;
    u32 battery_value_sum = 0;
    ///自己做100次累加值,再取平均
    u32 avg_bat = battery_value_sum/BATTERY_VALUE_SUM_COUNTER_MAX;
    u32 tmp_bat = 0;
    /* printf("1-prev_bat:%d..max_bat:%d..avg_bat:%d...\n", */
           /* prev_bat,max_bat,avg_bat); */
    if(MAX(max_bat,avg_bat) - MIN(max_bat,avg_bat) < 8){
        ///波动很小,直接返回avg_bat
    }else if(MAX(max_bat,avg_bat) - MIN(max_bat,avg_bat) < 20){
        avg_bat = MAX(max_bat,avg_bat);
        prev_bat = avg_bat;
    }else{
        tmp_bat = prev_bat;
        prev_bat = (avg_bat * 10 + max_bat * 10)/20;
        avg_bat = tmp_bat;
    }
    /* printf("2-prev_bat:%d..max_bat:%d..avg_bat:%d---\n", */
           /* prev_bat,max_bat,avg_bat); */
    return avg_bat;///(battery_value_sum/BATTERY_VALUE_SUM_COUNTER_MAX);
}