Days21 Elfboard 板ADC

模数转换器(ADC)是数字电子设备中不可或缺的组件,它能够将模拟信号转换为数字信号,以便于计算机或微处理器进行处理。ADC的作用是将连续的模拟信号转换为离散的数字信号,这一过程涉及到对信号进行采样、量化以及编码三个步骤。采样是将连续时间信号转换为离散时间信号的过程,量化是将离散幅度值进行近似取整的过程,而编码则是将量化后的结果转换为二进制码。ADC的性能指标包括分辨率、量化误差、动态范围、采样速率等。随着科技的不断发展,ADC的应用越来越广泛,不仅应用于音频、视频等消费电子产品中,还涉及到通信、医疗、工业控制等领域。
ELFboard上板载了一个可调电阻,可用于测试 ADC 功能。

shell命令查看ADC原始值

从图中可以看出,当前ADC采集到的数值为1153,通过调节滑动变阻器,能够改变ADC采集到的数值,但该数值并不是电压值,若要获取电压值则还需要进行一定的转换。

C编程读取ADC原始值并转换为电压值
在/sys/bus/iio/devices/iio:device0/文件夹下,其中in_voltage5_raw 文件中存储的是ADC采集到的原始值, in_voltage_scale 文件中存储的是电源规模值。若要获取实际的电压值(V),只需将两者相乘再除以1000即可。

这里我们分别使用了系统调用函数和C语言标准库函数进行了编程实现,并使用利用 atoi 和 atof 库函数进行数据类型转换,具体代码如下:

系统调用函数
#include
#include
#include

#include
#include

#define voltage5_raw "/sys/bus/iio/devices/iio:device0/in_voltage5_raw"
#define voltage_scale "/sys/bus/iio/devices/iio:device0/in_voltage_scale"

int main(int argc, char *argv[])
{
    int raw_fd, scale_fd;
    int res;
    char buff[20];
    int raw;
    double scale;

    while(1){
        /* 1.打开文件 */
        raw_fd = open(voltage5_raw, O_RDONLY);
        if(raw_fd < 0){
            printf("open raw_fd failed!\n");
            return -1;
        }

        scale_fd = open(voltage_scale, O_RDONLY);
        if(scale_fd < 0){
            printf("open scale_fd failed!\n");
            return -1;
        }

        /* 2.读取文件 */
        // rewind(raw_fd);   // 将光标移回文件开头
        res = read(raw_fd, buff, sizeof(buff));
        raw = atoi(buff);

        memset(buff, 0, sizeof(buff));
        // rewind(scale_fd);   // 将光标移回文件开头
        res = read(scale_fd, buff, sizeof(buff));
        scale = atof(buff);

        printf("ADC原始值:%d,电压值:%.3fV\r\n", raw, raw * scale / 1000.f);

        close(raw_fd);
        close(scale_fd);
        sleep(1);
    }

    return 0;
}


标准库函数
#include
#include
#include

#include

#define voltage5_raw "/sys/bus/iio/devices/iio:device0/in_voltage5_raw"
#define voltage_scale "/sys/bus/iio/devices/iio:device0/in_voltage_scale"

int main(int argc, char *argv[])
{
    FILE *raw_fd, *scale_fd;
    int len1, len2, res;
    char data[20];
    int raw;
    double scale;

    while(1){
        /* 1.打开文件 */
        raw_fd = fopen(voltage5_raw, "r");
        if(raw_fd == NULL){
            printf("open raw_fd failed!\n");
            return -1;
        }

        scale_fd = fopen(voltage_scale, "r");
        if(scale_fd == NULL){
            printf("open scale_fd failed!\n");
            return -2;
        }

        /* 2.读取文件 */
        // rewind(raw_fd);   // 将光标移回文件开头
        res = fscanf(raw_fd, "%s", data);
        raw = atoi(data);

        memset(data, 0, sizeof(data));
        rewind(scale_fd);   // 将光标移回文件开头
        res = fscanf(scale_fd, "%s", data);
        scale = atof(data);


        printf("ADC原始值:%d,电压值:%.3fV\r\n", raw, raw * scale / 1000.f);

        fclose(raw_fd);
        fclose(scale_fd);
        sleep(2);
    }

    return 0;
}

在程序中,我们首先分别读取了in_voltage5_raw和in_voltage_scale中的数据,并分别使用atoi和atof将读取到的ADC原始数据和电源规模值转换成int类型和double类型的数据,之后通过计算得到ADC采集到的电压值。实验效果如下:

你可能感兴趣的:(单片机,嵌入式硬件)