一段取ADC代码的锅

实现一个通过ADC采样电压值,每次采样5次,去掉一个最大值,一个最小值后,取剩下三次的平均值。


//取5次adc,去掉最大值,去掉最小值,取平均值

#define BATT_LVL_COUNT  5
static int batt_lvl_history[BATT_LVL_COUNT] = {0};
static int batt_lvl_idx = 0;
static void put_batt_avg_lvl(int lvl)
{ 
    batt_lvl_history[batt_lvl_idx] = lvl;
    batt_lvl_idx++;
    if (batt_lvl_idx >= BATT_LVL_COUNT)
    {
        batt_lvl_idx = 0;
    } 
    return;
}

//产生bug的函数
static int get_batt_avg_lvl(int min, int max)
{  
    int i = 0;
    int total = 0;
    int count = 0;
    for (i = 0; i < BATT_LVL_COUNT; i++)
    {
        if (batt_lvl_history[i] != 0 
            && min < batt_lvl_history[i]
            && max > batt_lvl_history[i])
        {
            total += batt_lvl_history[i];
            count++;
        }
    }
        if (total == 0 || count == 0){
            total = dal_batt_lvl_history[0];
            count = 1;
        }
    int avg = total / count;
    return avg;
} 

void test_get_adc(){
    int times = BATT_LVL_COUNT;
    int max  = 0;
    int min  = 0;
    do{
    //通过adc采样读取电压值,读的过程中,将值放到缓冲区中,并拿到最大值和最小值
        voltage = start_adc_read(dev, BSP_BATTERY_DETECT_ADC_CHANNEL);
        put_batt_avg_lvl(voltage); 
        if (min == 0){
            min = voltage;
            max = voltage;
        }else{
            if (voltage < min){
                min = voltage;
            }
            if (voltage > max){
                max = voltage;
            }
        }
    }while(times-- > 0);
    
    //求取平均值
    avg_value = get_batt_avg_lvl(min, max); 
    printf("rt_adc_read:  %d,avg_value:%d\n", voltage, avg_value);
    
}


测试发现,求平均的方法偶尔会返回0 糗大了。其实,就是出现在如果min和max都是同一个值,如果每次采样都是同一个值,是不是bug就出来了。糗大了。


参考下文言一下生成的代码:

实现一个C方法,从一个5个整形数组中,去掉最大值,去掉一个最小值,然后求取平均值的方法


你可以使用下面的C语言代码来实现这个功能。这个代码定义了一个函数calculateAverage(),它接受一个包含5个整数的数组作为参数,然后去掉数组中的最大值和最小值,计算并返回剩余3个元素的平均值。

#include <stdio.h>  
  
double calculateAverage(int arr[], int size) {  
    // 假设第一个元素是最大值和最小值  
    int max = arr[0];  
    int min = arr[0];  
    int sum = 0;  
  
    // 找到最大值和最小值,并计算总和  
    for (int i = 0; i < size; i++) {  
        if (arr[i] > max) {  
            max = arr[i];  
        } else if (arr[i] < min) {  
            min = arr[i];  
        }  
        sum += arr[i];  
    }  
  
    // 从总和中减去最大值和最小值  
    sum = sum - max - min;  
  
    // 计算平均值  
    double average = (double)sum / (size - 2);  
  
    return average;  
}  
  
int main() {  
    int arr[5] = {1, 2, 3, 4, 5}; // 可以替换为任何包含5个整数的数组  
    double average = calculateAverage(arr, 5);  
    printf("Average: %.2f\n", average);  
    return 0;  
}

呱牛笔记

-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com


本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com

请先登录后发表评论
  • 最新评论
  • 总共0条评论