首页 > 其他分享 >提高ADC采样精度:C语言中的滤波与取平均值技巧

提高ADC采样精度:C语言中的滤波与取平均值技巧

时间:2024-10-28 08:49:52浏览次数:11  
标签:采样 平均值 滤波 C语言 最小值 ADC TIME

在嵌入式系统中,ADC(模数转换器)是常用的组件,用于将模拟信号转换为数字信号。然而,由于噪声和其他干扰因素,ADC采样值可能会波动,导致读数不稳定。为了提高ADC读数的准确性,常用的方法是进行滤波和取平均值。本文将详细介绍如何在C语言中实现ADC采样值的滤波和取平均值,并提供详细的代码示例。

代码思路

  1. 初始化ADC

    • 假设已经完成了ADC的硬件配置和初始化工作,可以通过 ADC0_get 函数读取ADC通道1的值。
  2. 滤波与取平均值

    • 使用一个环形缓冲区来存储最近的 ADC_TIME 次采样值。
    • 在每次采样后,更新最小值和最大值。
    • 每当达到 ADC_TIME 次采样时,去掉最大值和最小值,计算剩余值的平均值。
    • 重置相关变量,准备下一轮采样。
  3. 计算实际电压值

    • 将计算得到的平均值转换为实际的电压值,以便于进一步处理和显示。

 

代码实现

初始化ADC

#include <stdint.h>
#include <stdio.h>

#define ADC_CHANNEL_1 1
#define ADC_TIME 12
#define BASE_VOLTAGE 3.3
#define ADVOLTAGE_SCALE 10

uint16_t ADC0_get(uint8_t channel) {
    // 模拟ADC读取值,实际应用中应从ADC读取值
    static uint16_t value = 0;
    return value++;
}

主函数

int main() {
    uint16_t sum = 0;         // 存储ADC_TIME次采样值的总和
    uint16_t min = 4096;      // 初始化为最大值
    uint16_t max = 0;         // 初始化为最小值
    uint8_t i = 0;            // 计数器,记录当前已经读取了多少次ADC值
    float current = 0.0;      // 存储计算后的当前值

    while (1) {
        uint16_t val = ADC0_get(ADC_CHANNEL_1);  // 读取ADC值

        if (i == ADC_TIME) {
            // 滤波:去掉最大值和最小值
            sum -= min;
            sum -= max;
            uint16_t avg = sum / (ADC_TIME - 2);  // 计算平均值

            // 计算当前值:将平均值转换为实际的电压值
            current = BASE_VOLTAGE * avg * 10 / ADVOLTAGE_SCALE / 4096.0;

            // 重置变量,准备下一轮采样
            sum = 0;
            min = 4096;  // 重置最小值
            max = 0;     // 重置最大值
            i = 0;       // 重置计数器
        } else {
            // 累加值
            sum += val;
            i++;

            // 更新最小值和最大值
            if (min > val) min = val;
            if (max < val) max = val;
        }

        // 打印当前值
        printf("Current: %.2f V\n", current);
    }

    return 0;
}

原理与优势

滤波

  • 去掉最大值和最小值:通过去掉最大值和最小值,可以有效滤除噪声,提高ADC读数的稳定性。
  • 计算平均值:计算去掉最大值和最小值后的平均值,进一步提高了读数的准确性。

取平均值

  • 多次采样:通过对 ADC_TIME 次采样值进行平均,可以平滑波动,减少随机误差的影响。
  • 调整采样次数:通过调整 ADC_TIME 的值,可以平衡滤波效果和响应速度。

应用场景

  1. 传感器数据采集:在温度、湿度、压力等传感器数据采集过程中,滤波和取平均值可以提高数据的准确性。
  2. 电源监测:在电源监测系统中,滤波和取平均值可以减少电压波动的影响,提供更稳定的读数。
  3. 信号处理:在信号处理领域,滤波和取平均值可以去除高频噪声,保留有用信号。

结论

通过上述方法,我们可以有效地对ADC采样值进行滤波和取平均值,提高读数的准确性和稳定性。这种方法在嵌入式系统中非常实用,特别是在需要高精度测量的场景中。希望本文对大家有所帮助,如果有任何问题或建议,欢迎留言交流!

标签:采样,平均值,滤波,C语言,最小值,ADC,TIME
From: https://blog.csdn.net/m0_74045985/article/details/143272037

相关文章

  • 中国计量大学《C语言程序设计》课程实验报告
    中国计量大学《C语言程序设计》课程实验报告实验课程:   C语言程序设计        实验名称:实验一 熟悉上机环境、程序设计-顺序结构                                      实验......
  • CuTest C语言单元测试框架
    CuTestC语言单元测试框架Cutest是一个轻量级的C/C++单元测试框架,旨在提供简单、易用的测试功能。它的主要特点包括:简洁性:Cutest以简洁的语法使得编写测试用例变得容易,降低了学习曲线。灵活性:支持多种测试风格,可以根据需要进行定制。单头文件:Cutest仅包含一个头文件,......
  • 中值滤波python代码
    文章目录一、中值滤波二、代码实现一、中值滤波中值滤波使用了局部邻域(窗口)里的中值来代替上述局部平均法中的局部平均值。即将以该点为中心的某个窗口框住的各像素的中间值作为处理后图象中该点像素的值。能有效处理椒盐噪声。二、代码实现下图代码实现了中值滤波对......
  • 刷c语言练习题13(牛客网)
    1、有以下程序12345678#include<iostream>#include<cstdio>usingnamespacestd;intmain(){  intm=0123,n=123;  printf("%o%o\n",m,n);  return0;}程序运行后的输出结果是()A、01230173B、0123173C、123173D、173173答案:C解析:......
  • 在C语言中如何实现文件加密和解密
    在C语言中实现文件加密和解密主要涉及对文件内容进行操作的一系列程序设计。其中包括但不限于读取文件数据、执行加密算法、将加密结果写回文件,以及对加密文件进行读取和解密恢复原始数据。加密和解密的关键在于选择合适的加密算法。常见的算法有对称加密算法(如AES、DES)、非对称......
  • C语言真题卷(1)
     一、选择题(每小题2分,共30分)1.以下(               ) 是错误的整型常量。A. -0xabcdef         B.018         C.0x29         D.011 2.为了判断两个字符串s1和s2是否相等,应当使用(           )。A.  if(s......
  • 带进位加减指令(ADC)和加法指令(ADD)作用上有什么区别
    带进位加减指令(ADC)和加法指令(ADD)作用上的区别:1.CarryFlag的使用;2.适用情景的区别;3.循环进位的处理;4.数据的精度要求;5.标志位的设置;6.性能差异。ADC指令是带有进位标志(CarryFlag)的加法指令,ADD指令执行简单的加法操作,不考虑之前的进位。1.CarryFlag的使用ADC指令:ADC......
  • c语言中整数在内存中的存储
    整数的二进制表示有三种:原码,反码,补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正,用1表示‘负’最高位的以为被当作符号位,剩余的都是数值位。整数的原码,反码,补码都相同负整数的三种表示方法各不相同   原码:直接将数值按照正负数的形......
  • C语言中如何实现图算法
    在C语言中,您可以实现图算法通过以下关键步骤:一、创建图的数据结构,二、实现图的操作,例如添加边、删除边、搜索顶点等,三、编写图的遍历算法,如深度优先搜索和广度优先搜索,四、编写图路径查找算法如迪杰斯特拉算法和弗洛伊德算法,五、通过应用使得图算法更适用于实际问题。对于第一点......
  • 【思维导图】C语言—数据类型和变量
     今天我们来回顾——C语言【数据类型和变量】我们先梳理一下思路:首先学习数据的类型,然后学会用类型去创建变量,接着学习操作符进行变量之间的运算,最后学习scanf输入数据,printf进行数据的打印。回顾的时候最好结合代码的编写,才能更好更直观地理解知识的用法。 我已经把思......