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;