注意

这是最新开发分支配套的文档,可能包含已发布版本中尚未提供的功能。如果您要查看特定版本的文档,请使用左侧的下拉菜单并选择所需要的版本。

ADC 使用说明#

K230 芯片内部集成了一个高性能 ADC 模块,具有以下特性:

  • 通道数:6 个独立通道(channel 0-5)

  • 分辨率:12 位(输出值范围为 0~4095)

  • 采样速率:最高 1 MHz

使用方法#

设备树配置#

ADC 设备树配置已存在于 k230.dtsi 文件中(第 536-540 行):

adc: adc@9140d000 {
    compatible = "canaan,k230-adc";
    reg = <0x0 0x9140d000 0x0 0x1000>;
    clocks = <&adc_clk>;
};

用户空间使用 (通过 sysfs)#

驱动注册为 IIO 设备后,可通过 /sys/bus/iio/devices/ 路径访问:

# 查看设备
ls /sys/bus/iio/devices/

# 读取 channel0 的原始 ADC 值
cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw

# 读取 channel1 的原始 ADC 值
cat /sys/bus/iio/devices/iio:device0/in_voltage1_raw

C 语言编程#

通过 sysfs 接口访问 ADC,无需额外依赖库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int read_adc_channel(int channel) {
    char path[64];
    FILE *fp;
    int value;

    snprintf(path, sizeof(path),
             "/sys/bus/iio/devices/iio:device0/in_voltage%d_raw", channel);

    fp = fopen(path, "r");
    if (!fp) {
        perror("Failed to open ADC sysfs");
        return -1;
    }

    if (fscanf(fp, "%d", &value) != 1) {
        perror("Failed to read ADC value");
        fclose(fp);
        return -1;
    }

    fclose(fp);
    return value;
}

int main() {
    int value;

    // 读取所有通道
    for (int i = 0; i < 6; i++) {
        value = read_adc_channel(i);
        printf("ADC channel %d value: %d\n", i, value);
    }

    return 0;
}

Python 编程#

直接读取 sysfs

# 读取 channel0 的 ADC 值
with open('/sys/bus/iio/devices/iio:device0/in_voltage0_raw', 'r') as f:
    value = int(f.read().strip())
    print(f"ADC value: {value}")

# 多通道读取示例
def read_adc(channel):
    path = f'/sys/bus/iio/devices/iio:device0/in_voltage{channel}_raw'
    with open(path, 'r') as f:
        return int(f.read().strip())

for i in range(6):
    print(f"Channel {i}: {read_adc(i)}")

注意事项#

k230芯片adc管脚电压是1.8v,但是部分开发板有前置分压电路(比如01studio标准板): 比如01studio有如下电路

评论列表
条评论
登录