回答

收藏

飞凌嵌入式ElfBoard ELF1板卡-开发板适配之ADC

其他 其他 680 人阅读 | 0 人回复 | 2025-02-25

ADC(Analog-to-Digital Converter),顾名思义就是模数转换器。i.MX6ULL有两组12位ADC,ADC1和ADC2,每一组ADC有10路输入引脚(ADC1和ADC2共同复用这10路,所以实际一共10路ADC)。ELF 1只用了一个ADC1引脚连接到可变电阻上,用来演示ADC功能。
硬件原理


使用的是ADC1_IN5,对应的PAD NAME是GPIO1_IO05。
IOMUX配置
在iomuxc节点下添加子节点:
pinctrl_adc1: adc1grp {
                        fsl,pins = <
                                MX6UL_PAD_GPIO1_IO05__GPIO1_IO05 0x00b0
                        >;
                };

添加设备节点
在arch/arm/boot/dts/imx6ull.dtsi文件中已经存在adc1节点:

在compatible属性中有两个驱动匹配项,"fsl,imx6ul-adc","fsl,vf610-adc",实际上在我们的内核源码中没有"fsl,imx6ul-adc"对应驱动,所以我们使用的是"fsl,vf610-adc"驱动。
reg是ADC1对应的一些寄存器的起始地址和这些寄存器所占用的长度;
interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_ADC1>:开启时钟
num-channels = <2>:开启ADC的通道,这里默认设置的是开启ADC1_IN0和ADC1_IN1。
clock-names = "adc":时钟名称。
status = disable:默认是关闭状态。
我们需要在arch/arm/boot/dts/imx6ull-elf1-emmc.dts中,增加和修改adc1节点配置:
&adc1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_adc1>;
        num-channels = <6>;
        vref-supply = <&reg_adc1_vref>;
        status = "okay";
};

num-channels = <6>:因为我们使用的是ADC1_IN5,所以,需要开启6路ADC通道。
vref-supply = <&reg_adc1_vref>;adc的参考电压,引用了reg_adc1_vref节点,我们还需要在regulators节点下添加reg_adc1_vref子节点:
reg_adc1_vref: regulator@2 {
                compatible = "regulator-fixed";
                regulator-name = "vref-3v3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                };

添加驱动
使用make menuconfig打开图形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig
在Device Drivers菜单下添加:

Device Drivers
-> Industrial I/O support
-> Analog to digital converters
路径下添加vf610驱动:

替换配置文件
通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ul\l_elf1_defconfig

编译测试
编译内核和设备树并拷贝到开发板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage  root\@172.16.0.175:/run/media/mmcblk1p1/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/
进行sync操作后重启开发板:

在/sys/bus/iio/devices/iio:device0下发现in_voltage5_raw:
root@ELF1:~# ls /sys/bus/iio/devices/iio:device0
使用cat in_voltage5_raw查看ADC1_IN5的值:
root@ELF1:~# cat /sys/bus/iio/devices/iio:device0/in_voltage5_raw
950
调节可变电阻,可观察该值的变化,因为ADC为12位精度,所以该值的范围为0~4095。

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条