RK3568开发笔记-CPU内部ADC调试

目录

前言

一、部分原理图

二、DTS设备树节点配置

三、SARADC驱动说明

1. 获取 AD 通道

2. 读取 AD 采集到的原始数据

3. 计算采集到的电压

4. 接口说明

三、调试使用说明

总结


前言

        本文主要介绍RK3568 CPU内部ADC的使用方法,CPU内部使用逐次逼近ADC (Successive Approximation Register),支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。

 

一、部分原理图

SAR-ADC部分原理图如下所示,根据原理图采用SARADC_VIN4第四个通道作为AD数据采集通道:

二、DTS设备树节点配置

设备树文件采用官方SDK设备树文件为基础进行修改,/rk356x_linux_220118/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi

saradc: saradc@fe720000 {
                compatible = "rockchip,rk3568-saradc", "rockchip,rk3399-saradc";
                reg = <0x0 0xfe720000 0x0 0x100>;
                interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
                #io-channel-cells = <1>;
                clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
                clock-names = "saradc", "apb_pclk";
                resets = <&cru SRST_P_SARADC>;
                reset-names = "saradc-apb";
                status = "disabled";
        };

板级设备树dts配置节点如下所示:

&saradc {
        status = "okay";
        vref-supply = <&vcca_1v8>;
        compatible = "rockchip,rk3568-saradc";
        io-channels = <&saradc 4>; // x为通道编号,申请 SARADC 通道0 则 x 为 0
};

三、SARADC驱动说明

官方SDK SARADC驱动文件路径在/rk356x_linux_220118/kernel/drivers/iio/adc/rockchip_saradc.c文件中,驱动文件所用到的接口主要有如下几个:

1. 获取 AD 通道

struct iio_channel *chan;     #定义 IIO 通道结构体
chan = iio_channel_get(&pdev->dev, NULL);    #获取 IIO 通道结构体

注意: iio_channel_get 通过 probe 函数传进来的参数 pdev 获取 IIO 通道结构体,probe 函数如下:

static int XXX_probe(struct platform_device *pdev);

2. 读取 AD 采集到的原始数据

int val,ret;
ret = iio_read_channel_raw(chan, &val);

调用 iio_read_channel_raw 函数读取 AD 采集的原始数据并存入 val 中。

3. 计算采集到的电压

使用标准电压将 AD 转换的值转换为用户所需要的电压值。其计算公式如下:

Vref / (2^n-1) = Vresult / raw

注意:

  • Vref 为标准电压

  • n 为 AD 转换的位数

  • Vresult 为用户所需要的采集电压

  • raw 为 AD 采集的原始数据

例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 568,则:

Vresult = (1800mv * 568) / 1023;

4. 接口说明

struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
  • 功能:获取 iio 通道描述

  • 参数:

    • dev: 使用该通道的设备描述指针

    • consumer_channel: 该设备所使用的 IIO 通道描述指针

void iio_channel_release(struct iio_channel *chan);
  • 功能:释放 iio_channel_get 函数获取到的通道

  • 参数:

    • chan:要被释放的通道描述指针

int iio_read_channel_raw(struct iio_channel *chan, int *val);
  • 功能:读取 chan 通道 AD 采集的原始数据。

  • 参数:

    • chan:要读取的采集通道指针

    • val:存放读取结果的指针

三、调试使用说明

在文件系统中使用cat /sys/bus/iio/devices/iio:device0/in_voltage4_raw命令可以直接查看该通道所采集到的电压值:

 

 当前电压值为V=(1800mv * 1015) / 1024=1784mv。


总结

以上就是在RK3568平台上使用内部ADC的调试方法。

猜你喜欢

转载自blog.csdn.net/qq_18376583/article/details/127989648
今日推荐