adc 使用
简介
aio-3399c 开发板上的 ad 接口有两种,分别为:温度传感器 (temperature sensor)、逐次逼近adc (successive approximation register)。其中:
ts-adc(temperature sensor):支持两通道,时钟频率必须低于800khz
sar-adc(successive approximation register):支持六通道单端10位的sar-adc,时钟频率必须小于13mhz。
内核采用工业 i/o 子系统来控制 adc,该子系统主要为 ad 转换或者 da 转换的传感器设计。
aio-3399c 只提供一路外接的adc(adc_in0)给客户使用。
下面以sar-adc使用adc风扇为例子,介绍 adc 的基本配置方法。
dts配置
配置dts节点
aio-3399c sar-adc 的 dts 节点在 kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi 文件中定义,如下所示:
saradc: saradc@ff100000 { compatible = “rockchip,rk3399-saradc”; reg = 《0x0 0xff100000 0x0 0x100》; interrupts = 《gic_spi 62 irq_type_level_high 0》; #io-channel-cells = 《1》; clocks = 《&cru sclk_saradc》, 《&cru pclk_saradc》; clock-names = “saradc”, “apb_pclk”; status = “disabled”; };
用户首先需在dts文件中添加adc的资源描述:
kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-demo.dtsi : adc_demo: adc_demo{ status = “disabled”; compatible = “firefly,rk3399-adc”; io-channels = 《&saradc 3》; };
这里申请的是saradc通道3,在aioc-3399中是不提供给客户外部使用的,而且也没有风扇接口,这里只是提供一个参考, 客户可自行参考这个例子 运用saradc通道0 去做自己的一些开发。
在驱动文件中匹配 dts 节点
用户驱动可参考firefly adc demo :kernel/drivers/adc/adc-firefly-demo.c,这是一个侦测firefly-rk3399风扇状态的驱动。 首先在驱动文件中定义 of_device_id 结构体数组:
static const struct of_device_id firefly_adc_match[] = { { .compatible = “firefly,rk3399-adc” }, {}, };
然后将该结构体数组填充到要使用 adc 的 platform_driver 中:
static struct platform_driver firefly_adc_driver = { .probe = firefly_adc_probe, .remove = firefly_adc_remove, .driver = { .name = “firefly_adc”, .owner = this_module, .of_match_table = firefly_adc_match, }, };
接着在firefly_adc_probe中对dts所添加的资源进行解析:
static int firefly_adc_probe(struct platform_device *pdev) { printk(“firefly_adc_probe!\n”); chan = iio_channel_get(&(pdev-》dev), null); if (is_err(chan)){ chan = null; printk(“%s() have not set adc chan\n”, __function__); return -1; } fan_insert = false; if (chan) { init_delayed_work(&adc_poll_work, firefly_demo_adc_poll); schedule_delayed_work(&adc_poll_work,1000); } return 0; }
驱动说明
获取 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);
读取 ad 采集到的原始数据
int val,ret; ret = iio_read_channel_raw(chan, &val);
调用 iio_read_channel_raw 函数读取 ad 采集的原始数据并存入 val 中。
计算采集到的电压
使用标准电压将 ad 转换的值转换为用户所需要的电压值。其计算公式如下:
vref / (2^n-1) = vresult / raw
注:
vref 为标准电压
n 为 ad 转换的位数
vresult 为用户所需要的采集电压
raw 为 ad 采集的原始数据
例如,标准电压为 1.8v,ad 采集位数为 10 位,ad 采集到的原始数据为 568,则:
vresult = (1800mv * 568) / 1023;
接口说明
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:存放读取结果的指针
调试方法
demo程序使用
在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-demo.dtsi中使能adc_demo,将”disabled” 改为 “okay”:
adc_demo: adc_demo{ status = “okay”; compatible = “firefly,rk3399-adc”; io-channels = 《&saradc 3》; };
编译内核,烧录内核到firefly-rk3399 开发板上,然后插拔风扇时,会打印内核log信息如下:
[ 85.158104] fan insert! raw= 135 voltage= 237mv [ 88.422124] fan out! raw= 709 voltage=1247mv
获取所有adc值
有个便捷的方法可以查询到每个saradc的值:
cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw
faqs
为何按上面的步骤申请saradc,会出现申请报错的情况?
驱动需要获取adc通道来使用时,需要对驱动的加载时间进行控制,必须要在saradc初始化之后。saradc是使用module_platform_driver()进行平台设备驱动注册,最终调用的是module_init()。所以用户的驱动加载函数只需使用比module_init()优先级低的,例如:late_initcall(),就能保证驱动的加载的时间比saradc初始化时间晚,可避免出错。
荣耀V9play评测 打造出一个赋予年轻人青春玩乐的生活态度的产品
电子留言系统常用于哪些场所,有哪些展现形式?
监控电源ic U6202SC成本合理方案成熟
BOE(京东方)携尖端创新技术亮相2023国际显示周 引领半导体显示行业发展风向标
振弦采集模块传感器接口(智能振弦传感器)
fireflyAIO-3399C主板ADC介绍
LoRa模块同频干扰是什么?又如何解决?
Facebook推出支持视频通话的电视配件Portal TV
Steam中国版将在今年年初正式上线
任天堂收购加拿大游戏工作室 Next Level Games,加快其它游戏的开发进度
全新VR一体机奇遇Dream Pro搭载强大骁龙XR2平台
有一种可以防止“病毒”感染的小型自动驾驶电动车问世
国高科技企业华为已被邀请在印度参加5G测试
TLP521和6N136,正负边一般使用多大的电阻
手机投屏软件大全
自主创新难以持续是我国集成电路产业发展多年依旧前功尽弃的最大原因
用于沿车内通信网络高效传输传感器数据的SENT协议
电机调速技术的演变 典型的运动控制系统设计详解
游泳蓝牙耳机哪个好,可以游泳使用的蓝牙耳机推荐
炭黑含量测试仪是什么?