ADC驱动开发

概述

TB-96AI开发板上的 AD 接口有两种,分别为:温度传感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。

其中:

TS-ADC(Temperature Sensor):支持两通道,时钟频率必须低于800KHZ

SAR-ADC(Successive Approximation Register):支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。

下面以SAR-ADC为例子,介绍 ADC 的基本配置方法。

设备树

1
2
3
4
5
6
7
8
rk_headset: rk-headset {
         compatible = "rockchip_headset";
         headset_gpio = <&gpio4 28 GPIO_ACTIVE_HIGH>;
         spk_con_gpio = <&gpio0 11 GPIO_ACTIVE_HIGH>;
         pinctrl-names = "default";
         pinctrl-0 = <&hp_det>;
         io-channels = <&saradc 2>;
};

compatible:用于匹配驱动的of_device_id;

io-channels:使用的adc通道;驱动:

驱动文件:”drivers/headset_observe/rockchip_headset_core.c”

定义of_device_id结构体数组:

1
2
3
4
static const struct of_device_id rockchip_headset_of_match[] = {
        { .compatible = "rockchip_headset", },
        {},
};

定义platform_driver结构体:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
static struct platform_driver rockchip_headset_driver = {
        .probe  = rockchip_headset_probe,
        .remove = rockchip_headset_remove,
        .resume = rockchip_headset_resume,
        .suspend = rockchip_headset_suspend,
        .driver = {
                .name   = "rockchip_headset",
                .owner  = THIS_MODULE,
                .of_match_table = of_match_ptr(rockchip_headset_of_match),
        },
};

定义probe函数:

主要是获取硬件资源,注册设备,初始化设备,这里最重要的是获取ADC设备,

pdata->chan = iio_channel_get(&pdev->dev, NULL);

获取数据:

通过iio_read_channel_raw接口获取数据,使用标准电压将 AD 转换的值转换为用户所需要的电压值。

其计算公式如下:

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

注:

Vref :标准电压

n : AD 转换的位数

Vresult :用户所需要的采集电压

raw :AD 采集的原始数据

例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 568,则:Vresult = (1800mv * 568) / 1023;