ADC 使用教程

拉灯是我干掉的
原创
发布时间: 2025-06-24 17:42:20 | 阅读数 0收藏数 0评论数 0
封面
RV1103是一款专门用于人工智能相关应用的高度集成 IPC 视觉处理器 SoC。它基于单核 ARM Cortex-A7 32 位内核,集成了 NEON 和 FPU,并内置 NPU 支持 INT4 / INT8 / INT16 混合运算,计算能力高达 0.5TOPs。LuckFox Pico是基于瑞芯微 RV1103 芯片的低成本微型 linux 开发板。本文我们将学习如何使用 iio 在用户空间的设备文件读取开发板上的 ADC 数据。
1

IIO子系统

IIO(Industrial I/O)子系统是 Linux 内核中的一个重要组成部分,专门用于处理各种工业和嵌入式应用中的模拟输入和输出设备。这些设备可以包括传感器、ADC(模数转换器)、DAC(数字模拟转换器)以及其他模拟信号处理设备。IIO 子系统的主要目标是提供一个通用的、统一的框架,以便在 Linux 中支持各种不同类型的模拟设备。

IIO 子系统通过 sysfs 文件系统和用户空间提供了统一的接口,允许用户轻松地访问和配置模拟设备。这意味着应用程序可以使用标准的 Linux 文件I/O操作来与传感器和模拟设备进行通信。

2

查看引脚分布

开发板默认开启了 ADC 接口,测量范围为0V~1.8V。我们通过接口图可以看到,开发板 ADC 接口对应的引脚编号均为144和145。

3

查看基本信息

1.设备目录

在 /sys/bus/iio/devices 目录中,包含了与系统中检测到的 IIO 设备相关的子目录。每个子目录通常对应一个特定的 IIO 设备,其名称可能包括设备类型和编号。如果您想查看系统存在的 IIO 设备,可以使用如下命令:

# ls /sys/bus/iio/devices/
iio:device0

2.设备属性

每个设备子目录中包含了一组属性文件,这些文件用于获取和配置 IIO 设备的各种参数和状态。例如,您可以通过读取这些文件来获取传感器的数据,配置采样频率,或者设置中断阈值。

  1. 查看设备的属性文件
# ls /sys/bus/iio/devices/iio\:device0/
of_node in_voltage_scale in_voltage0_raw power
name trigger buffer subsystem
uevent in_voltage1_raw dev scan_elements
  1. 属性文件

在这个目录中,主要用到的文件是 in_voltage0_raw 、 in_voltage1_raw 和 in_voltage_scale。

  1. in_voltage0_raw 文件包含ADC输入通道0的原始电压值,通常以整数形式表示,可以使用 cat 命令来读取它,例如:
# cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw
1023
  1. in_voltage1_raw 文件包含ADC输入通道1的原始电压值,通常以整数形式表示,可以使用 cat 命令来读取它,例如:
# cat /sys/bus/iio/devices/iio\:device0/in_voltage1_raw
1023
  1. in_voltage_scale 文件包含了一个比例因子,可以将原始电压值转换为实际电压值。您可以使用 cat 命令来读取它,例如:
# cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale
1.757812500


4

编写shell脚本获取电压值

要获得 ADC 通道0和通道1实际的电压值,您可以编写一个shell脚本分别读取原始电压值 in_voltage0_raw 、 in_voltage1_raw 和比例因子 in_voltage_scale 的值,然后分别将两个原始电压值与比例因子相乘即可,如下所示:

  1. 使用vi编辑器打开shell脚本
# vi adc.sh
  1. 编写shell脚本
#!/bin/sh

echo "Press Ctrl+C to quit"
ADC_DIR="/sys/bus/iio/devices/iio:device0"

while true
do
scale_value=$(cat "$ADC_DIR/in_voltage_scale")
IN0_raw_value=$(cat "$ADC_DIR/in_voltage0_raw")
IN1_raw_value=$(cat "$ADC_DIR/in_voltage1_raw")
IN0_voltage=$(awk -v raw="$IN0_raw_value" -v scale="$scale_value" 'BEGIN { printf "%.6f\n", raw * scale / 1000 }')
IN1_voltage=$(awk -v raw="$IN1_raw_value" -v scale="$scale_value" 'BEGIN { printf "%.6f\n", raw * scale / 1000 }')
echo "IN0_Voltage: $IN0_voltage V,IN1_Voltage: $IN1_voltage V"
sleep 1
done
  1. 运行脚本
# chmod 777 adc.sh
# ./adc.sh
Press Ctrl+C to quit
IN0_Voltage: 1.796484 V,IN1_Voltage: 1.798242 V
IN0_Voltage: 1.798242 V,IN1_Voltage: 1.798242 V


5

编写读取ADC的C程序

在前文中,我们演示了如何使用 Shell 脚本获取实际的电压值。此外,我们还可以使用C库函数或系统调用来读取设备文件,从而实现获取电压值的目标。请注意,为了在特定的嵌入式系统上运行程序,通常需要使用交叉编译工具来编译代码,以生成可在目标开发板上执行的可执行文件。接下来,让我们一起探讨具体的实施步骤。

1 完整代码

通过附件程序,可以实现获取 ADC 通道0和通道1的电压值。

2 打开文件

这段代码定义了文件路径相关的变量,通过 sprintf 根据 adc_dir 动态构建了三个文件路径并以只读的方式打开这三个文件,分别用于后续读取ADC设备双通道的原始电压值和比例因子。

3 计算电压值

这段代码实现了一个循环,每秒读取一次ADC设备双通道的原始电压值和比例因子,然后计算并显示出实际电压值,保留小数点后六位。文件操作通过fseek确保每次循环都从文件开头读取数据。

6

交叉编译

  1. 指定交叉编译工具(如果之前做过实验此步可省略)

首先,我们要将交叉编译工具的路径添加到系统的 PATH 环境变量中,以便可以在任何地方使用交叉编译工具,您可以在shell配置文件中添加以下行(通常是 ~/.bashrc 或 ~/.bash_profile 或 ~/.zshrc,具体取决于您使用的shell),注意 PATH= 后的路径为交叉编译工具所在的目录。

  1. gcc路径
<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
  1. 打开shell配置文件
vi ~/.bashrc
  1. 将交叉编译工具的路径添加到系统的PATH环境变量中,将 <SDK Directory> 修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/
export PATH=<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
  1. 重新加载shell配置文件,使更改生效
source ~/.bashrc
  1. 使用交叉编译工具编译程序
arm-rockchip830-linux-uclibcgnueabihf-gcc adc.c -o adc
  1. 交叉编译成功后,将在当前目录下生成可在开发板运行的可执行文件
# ls
adc adc.c


7

运行程序

  1. 文件传输

先将 adc 从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:

adb push 文件所在路径 开发板存储路径
eg:(将当前目录下adc文件传输到开发板的根目录)
adb push adc /
  1. 运行程序

修改 adc 文件的操作权限后运行程序

# chmod 777 adc
# ./adc


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载