当前位置: 首页 > news >正文

20.ARMLinux上ADC的驱动和使用方法

ADC(Analog-to-Digital Converter)即模数转换器,是一种将模拟信号转换为数字信号的电子元器件,用于实现模拟信号的数字化处理和采集。在嵌入式系统中,ADC广泛应用于传感器信号采集、电源管理、环境检测等领域。

一、Userspace使用ADC

1.硬件以及规格书

以firefly ROC-RK3588S-PC 开发板为例

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

  • TS-ADC(Temperature Sensor):支持七通道。
  • SAR-ADC(Successive Approximation Register):支持八通道单端12位的SAR-ADC,最大转换速率为1MSPS,采用20MHz的A/D转换器时钟。

ROC-RK3588S-PC 的ADC接口通道4如下所示,将其与风扇的引脚使用杜邦线相连

在这里插入图片描述

2.设备节点获取ADC的raw值
获取通道4的ADC转换值
# cd /sys/bus/iio/devices/iio:device0
root@firefly:/sys/bus/iio/devices/iio:device0# ls
buffer  in_voltage0_raw  in_voltage2_raw  in_voltage4_raw  in_voltage6_raw  in_voltage_scale  of_node  scan_elements  trigger dev     in_voltage1_raw  in_voltage3_raw  in_voltage5_raw  in_voltage7_raw  name      power    subsystem      uevent
# cat in_voltage4_raw
7

二、内核获取ADC

firefly有写好的ADC的demo驱动程序,这里只需要配置好对应的设备树节点

1.添加设备树节点
	adc_demo: adc_demo {
		compatible = "firefly,rk3588-adc";
		status = "okay";
		io-channels = <&saradc 4>;
	};
2.确保驱动被编译

驱动源文件路径:

drivers/iio/adc/adc-firefly-demo.c
3.接口说明
  • 获取 AD 通道
struct iio_channel *chan;     #定义 IIO 通道结构体
chan = iio_channel_get(&pdev->dev, NULL);    #获取 IIO 通道结构体
  • 读取 AD 采集到的原始数据
int val,ret;
ret = iio_read_channel_raw(chan, &val);

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

4.驱动过程梳理
  • probe获取设备的ADC通道,初始化队列以及其实现函数
static int firefly_adc_probe(struct platform_device *pdev)
{
    printk("firefly_adc_probe!\n");

    count = 0;
    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;
    
}
  • 队列服务函数里读取ADC转换值,并计算实际电压,并延时队列重复时间
#define VREF 5000
static void firefly_demo_adc_poll(struct work_struct *work)
{
    int ret,raw;
    int result = -1;

    ret = iio_read_channel_raw(chan, &raw); 
    if (ret < 0) {
        printk("read hook adc channel() error: %d\n", ret);
        return;
    }

            result = (VREF*raw)/4095    ;//Vref / (2^n-1) = Vresult / raw
            printk("Fan insert! raw= %d Voltage= %dmV\n",raw,result);
        
    schedule_delayed_work(&adc_poll_work, 1000);
}

12位ADC 2^12=4096

5.用户空间验证

在50%占空比下测电压,一会测5v,一会测0v,ADC的测量比pwm改变电平的速度要快

[ 1238.836547] Fan insert! raw= 4095 Voltage= 5000mV
[ 1242.250015] Fan insert! raw= 4095 Voltage= 5000mV
[ 1245.663091] Fan insert! raw= 4 Voltage= 4mV
[ 1249.076442] Fan insert! raw= 9 Voltage= 10mV

相关文章:

  • 云之家开发者模式下接口值的抓取
  • 前端处理pdf文件流,展示pdf
  • CouchBase稀疏索引和全量索引的对比
  • Leetcode 3504. Longest Palindrome After Substring Concatenation II
  • react+antd封装一个可回车自定义option的select并且与某些内容相互禁用
  • ffmpeg中格式转换需要注意点总结
  • 设计模式基础入门
  • Android 使用CameraX实现预览、拍照、录制视频(Java版)
  • AI产品的基础设施:算法、数据与大语言模型
  • 解决安卓手机WebView无法直接预览PDF的问题(使用PDF.js方案)
  • 基于SpringBoot的仓库管理系统-023
  • 递归详解:从原理到实战
  • 9.常用模板引擎
  • Elasticsearch索引的字段映射
  • 串口中断接收与环形缓冲实例(apollo3 blue plus)
  • Perl 哈希
  • Springboot实战:如何用Docker和Kubernetes部署微服务
  • Unity中MonoBehaviour组件禁用时协程的行为
  • Qt基本框架(1)
  • 正则表达式和通配符
  • 山西太原一居民小区发生爆炸,应急管理部派工作组赴现场
  • 马上评丨准入壁垒越少,市场活力越足
  • 发挥全国劳模示范引领作用,加速汽车产业电智化转型
  • 龚正会见委内瑞拉副总统罗德里格斯
  • 四川落马厅官周海琦受审,1000余人接受警示教育
  • 野猪穿过江苏电视台楼前广场,被抓捕后送往红山森林动物园