13. iio子系统:adc

IIO (Industrial I/O)是用于模拟数字转换器(adc)、数字模拟转换器(dac)和各种类型传感器的子系统。 也可用于高速、高数据速率的工业设备。

下面将介绍如何使用iio在用户空间的设备文件读取pro开发板上的ADC数据。

13.1. 检查系统adc设备树插件

检查/boot/uEnv.txt文件是否开启adc设备树插件

/boot/uEnv.txt
#检测以下这行是否被注释,确保前面没有‘#’号
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-adc1.dtbo

若以上这行被注释,则删掉‘#’号,重启开发板。

13.2. 使用shell脚本读取板子电位器电压值

使用以下shell脚本需要先安装bc工具,在开发板上执行如下命令

1
 sudo apt install bc

ADC设备在系统上的目录路径为:/sys/bus/iio/devices/iio:device0, 查看该目录下的文件内容

root@npi:/sys/bus/iio/devices/iio:device0# ls  /sys/bus/iio/devices/iio\:device0/
buffer              in_voltage3_raw                sampling_frequency_available
dev                 in_voltage_sampling_frequency  scan_elements
in_conversion_mode  in_voltage_scale               subsystem
in_voltage0_raw     name                           trigger
in_voltage1_raw     of_node                        uevent
in_voltage2_raw     power
root@npi:/sys/bus/iio/devices/iio:device0#

该目录下文件数目很多,但我们主要关注 in_voltage3_raw、in_voltage_scale 这两个 文件即可,其中 in_voltage3_raw 为读取adc数据的原始数值,in_voltage_scale 为adc数据 与电压值换算比例,将从这两个读取到的数据相乘即可得到我们想要的板载电位器上的电压值。

由于读取电压值相对简单,接下来我们将编写简单的shell脚本获取电压值。

ebf_6ull_quick_start_code/Source/adc/adc.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 #!/bin/bash

 echo "Press Ctrl+C for quit"

 while true
 do
         vol_raw=$(cat /sys/bus/iio/devices/iio\:device0/in_voltage3_raw)
         vol_scale=$(cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale)
         vol=$(echo "scale=4; $vol_raw*$vol_scale/1000" | bc )
         echo "vol_raw:$vol_raw,vol_scale:$vol_scale,vol:$vol V"
         sleep 1s
 done

脚本内容很简单,获取adc的原始数据与换算比例数据之后将两个数据相乘得到电压值。 读者也可自行编写相关C语言代码。 执行脚本打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@npi:/home/debian# ./adc.sh
Press Ctrl+C for quit
vol_raw:2365,vol_scale:0.805664062,vol:1.9053 V
vol_raw:2363,vol_scale:0.805664062,vol:1.9037 V
vol_raw:2363,vol_scale:0.805664062,vol:1.9037 V
vol_raw:2366,vol_scale:0.805664062,vol:1.9062 V
vol_raw:2308,vol_scale:0.805664062,vol:1.8594 V
vol_raw:2139,vol_scale:0.805664062,vol:1.7233 V
vol_raw:2138,vol_scale:0.805664062,vol:1.7225 V
vol_raw:2136,vol_scale:0.805664062,vol:1.7208 V

旋转板子上的电位器打印的原始数据与电压值将发生变化。

13.3. 修改adc相关设备树

野火imx6ull提供了很多的设备树插件源码,若想要添加或修改不同的引脚作为adc的引脚, 可参考:

野火设备树插件GitHub仓库

其中adc的设备树插件文件为 imx-fire-adc1-overlay.dts ,源码如下所示

/arch/arm/boot/dts/overlays/ebf/imx-fire-adc1-overlay.dts
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/dts-v1/;
/plugin/;
#include "imx6ul-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"

 / {
     fragment@0 {
        target-path="/";
        __overlay__ {
                    reg_vref_3v3: regulator@2 {
                        compatible = "regulator-fixed";
                        regulator-name = "vref-3v3";
                        regulator-min-microvolt = <3300000>;
                        regulator-max-microvolt = <3300000>;
                    };
        };
     };

    fragment@1 {
        target=<&adc1>;
        __overlay__ {
                    pinctrl-names = "default";
                    pinctrl-0 = <&pinctrl_adc1>;
                    vref-supply = <&reg_vref_3v3>;
                    num-channels = <4>;
                    status = "okay";
        };
    };
        fragment@2 {
                target=<&iomuxc>;
                __overlay__ {
                        pinctrl_adc1: adc1grp{
                        fsl,pins = <
                            MX6UL_PAD_GPIO1_IO03__GPIO1_IO03          0x000010B1
                        >;
                    };

                };
        };
};

若想使用adc1的其他引脚,只需修改代码第34行即可。