前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一段取ADC代码的锅

一段取ADC代码的锅

作者头像
呱牛笔记
发布2023-12-09 13:10:59
1340
发布2023-12-09 13:10:59
举报
文章被收录于专栏:呱牛笔记

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

代码语言:javascript
复制
//取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++;
        }
    }
    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个元素的平均值。

代码语言:javascript
复制
#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;  
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/12/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档