本帖最后由 qiao--- 于 2024-2-19 15:45 编辑
前言:本期测评ADC的功能。在Linux系统中有一个框架是专门管理传感器ADC等模拟量的框架,他就是IIO框架。IIO(Industrial I/O)框架是一个用于Linux系统的通用I/O子系统,用于管理和控制各种工业设备和传感器。IIO 子系统通过 sysfs 文件系统和用户空间提供了统一的接口,允许用户轻松地访问和配置模拟设备。这意味着应用程序可以使用标准的 Linux 文件I/O操作来与传感器和模拟设备进行通信。
Luckfox幸狐 RV1106 Linux 开发板的引脚分布图如下,我圈出的两个引脚具有ADC的功能。
开发板默认开启了 ADC 接口,测量范围为0V~1.8V,我们用串口登录到系统可以查看对应IIO的文件系统接口,他在文件系统的/sys/bus/iio/devices/目录下
这个IIO设备下记录着这个设备的一些相关属性,我们可以进去查看一下
在这个目录中,主要用到的文件是in_voltage0_raw 、 in_voltage1_raw 和 in_voltage_scale这三个文件,其中in_voltage0_raw和in_voltage1_raw文件分别记录着上面我们所查看的两个引脚的电压值,而in_voltage_scale 文件包含了一个比例因子,可以将原始电压值转换为实际电压值。可以使用cat命令查看他是多少
为了方面编写测试程序,这里我选择用脚本的方式来编写示例代码,这样的好处是我们只需要在板子的终端上编写代码,而不需要去交叉编译。
而我们的示例代码也非常的简单,我们只需要读取in_voltage0_raw 、 in_voltage1_raw 这两个文件里面的数值,然后再将他们与比例因子相乘就是实际电压值了。
我们在系统中新建一个adc_tset.sh脚本
编写如下的脚本,脚本的功能就是读取in_voltage0_raw 、 in_voltage1_raw 这两个文件里面的数值,然后再将他们与比例因子相乘打印出来
脚本代码:
#!/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
赋予这个脚本可执行的权限
chmod 777 adc_test.sh
最后运行这个脚本即可看到如下的实验现象:
视频效果如下:
IMG_8520
总结:通过对系统IIO设备接口的读写可以轻松的读取io通道的实际电压。