Linux下的ADC

ops/2024/11/8 14:14:52/

ADC


ADC简介

ADC是 Analog Digital Converter 的缩写,翻译过来为模数转换器,ADC可以将模拟值转换成数字值。模拟值是什么呢?比如我们日常生活中的温度,速度,湿度等等都是模拟值。所以如果我们想测量这些模拟值的值是多少,就需要使用 adc把模拟值转换成数字值。

ADC的分辨率

分辨率就是 ADC可以分辨量化的做小信号的能力,好比尺子上的最小刻度,有的尺子上的最小刻度是厘米,有的尺子上的最小刻度是毫米。所以分辨率越高,得到的结果精度就越准确。(得到的数字信号再用 DAC转换成模拟信号就越接近原来的模拟值)。ADC的分辨率按位数可分为8位,10位,12位等等,位数越搞,分辨率也越高。
计算公式:分辨率=量程/2的n次方,n位 ADC的位数。

ADC的参考电压

有了最小刻度,那量程又是什么呢?
这里我们需要在了解一个重要的术语叫做参考电压,参考电压是一个已知的电压。通过已知的电压找到未知电压,这个是参考电压的作用。所以参考电压就是上面我们提到的量程。
举个例子:3位分辨率,2V参考电压

1729859799613

ADC框架

1730019094395

ADC的操作

在应用程序中使用sys接口来读取ADC的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]){float adc_value = 0;int sacle = 0;FILE *fp = NULL;fp = fopen("/sys/bus/iio/devices/iio:device0/in_voltage0_raw", "r");fscanf(fp, "%d", &sacle);adc_value = (1.8/1024)*(float)sacle;  //1.8V is the voltage of the ADC// 1024 is the resolution of the ADC// so the real adc_value = (Measurement value) * ((reference voltage)/(ADC resolution))printf("The ADC value is %f\n", adc_value);fclose(fp);return 0; 
}

ADC的驱动

1.在设备树中添加ADC设备

&iio_adc0 {compatible = "myadc";io-channels = <&saradc 4>;  //adc控制器,使用adc通道4status = "okay";
};

2.在驱动中获得ADC的测量值

#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h> //platform_device_register
#include <linux/of.h> //of_match_ptr
#include <linux/of_device.h> //of_device_id
#include <linux/platform_driver.h> //platform_driver_register
#include <linux/mod_devicetable.h>
#include <linux/iio/consumer.h> //iio_channel_get
#include <linux/miscdevice.h> //misc_register
#include <linux/uaccess.h> //copy_to_user
#include <linux/fs.h> //file_operations#define CMD_READ_SACLE _IOR('A',1,int)
struct iio_channel  adc_channel= NULL;int adc_open(struct inode *inode, struct file *file){return 0;
}ssize_t adc_read(struct file *file, char __user *user_buf, size_t size, loff_t *ppos){return 0;
}
long adc_ioctl(struct file *file, unsigned int cmd, unsigned long arg){int scale = 0;if(cmd == CMD_READ_SACLE){iio_read_channel_raw(adc_channel, &scale); // get sacle value(Measurement value) from adc channelif(copy_to_user((int *)arg, &scale, sizeof(scale)) != 0){return -EFAULT;}}return 0;
}
const struct file_operations adc_fops = {.owner = THIS_MODULE,.read = adc_read,.open = adc_open,.unlocked_ioctl = adc_ioctl,
};
struct miscdevice adc_miscdev = {.minor = MISC_DYNAMIC_MINOR,.name = "adc",.fops = &adc_fops,
};
int adc_probe(struct platform_device *pdev){printk(KERN_INFO "ADC driver probe\n");adc_channel = iio_channel_get(&(pdev->dev),NULL); //get adc channelif(!adc_channel){printk(KERN_INFO "ADC channel get failed\n");return -1;}misc_deregister(&adc_miscdev);return 0;
}
int adc_remove(struct platform_device *pdev){printk(KERN_INFO "ADC driver remove\n");return 0;
}
const struct of_device_id adc_of_match[] = {{ .compatible = "myadc" },{ },
};
struct platform_driver adc_driver = {.driver = {.name = "adc_driver",.owner = THIS_MODULE,.of_match_table = of_match_ptr(adc_of_match),}.probe = adc_probe,.remove = adc_remove,
};
static int __init adc_init(void){printk(KERN_INFO "ADC driver init\n");platform_register_drivers(&adc_driver);return 0;
}
static void __exit adc_exit(void){printk(KERN_INFO "ADC driver exit\n");platform_unregister_drivers(&adc_driver);misc_deregister(&adc_miscdev);
}
module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");

http://www.ppmy.cn/ops/131950.html

相关文章

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

安装和卸载Mysql(压缩版)

一、安装Mysql 1.解压后在文件夹里创建一个名为“data”的文件夹&#xff0c;再新建一个名为“my.ini”的文件 2.打开“my.ini”文件&#xff0c;编辑&#xff0c;复制以下内容到文件里面&#xff08;注意&#xff0c;安装目录不能有中文&#xff0c;并且把"\"改为…

[VUE]框架网页开发1 本地开发环境安装

前言 其实你不要看我的文章比较长&#xff0c;但是他就是很长&#xff01;步骤其实很简单&#xff0c;主要是为新手加了很多解释&#xff01; 步骤一&#xff1a;下载并安装 Node.js 访问 Node.js 官网&#xff1a; Node.js — Download Node.js 下载 Windows 64 位版本&…

idea | 搭建 SpringBoot 项目之配置 Maven

目录 1 配置 Maven1.1 打开 settings.xml 文件1.2 配置本地仓库路径1.3 配置中央仓库路径1.4 配置 JDK 版本1.5 重新下载项目依赖 2 配置 idea2.1 在启动页打开设置2.2 配置 Java Compiler2.3 配置 File Encodings2.4 配置 Maven2.5 配置 Auto Import2.6 配置 Cod…

第二章 虚拟仪器及其构成原理

目录 第二章 虚拟仪器及其构成原理 第七章 基于VXI总线的虚拟仪器 7.2 VXI总线系统的体系结构 7.3.1 系统和硬件 7.5 PXI总线与PCI性能比较 第二章 虚拟仪器及其构成原理 2.4 虚拟仪器及其系统集成 2.4.1 虚拟仪器硬件组成 接口硬件&#xff1a;根据不同的标…

达梦数据库安全管理

1、概述 数据库安全管理是指采取各种安全措施对数据库及其相关文件和数据进行保护。数据库 系统的重要指标之一是确保系统安全&#xff0c;以各种防范措施防止非授权使用数据库&#xff0c;主要通过数 据库管理系统进行实现。数据库系统中一般采用用户标识与鉴别、存取控制以及…

Hive 操作基础(进阶篇☝️)

Hive 入门操作 创建表 EXTERNAL&#xff0c;创建外部表 PARTITIONED BY&#xff0c; 分区表 CLUSTERED BY&#xff0c;分桶表 STORED AS&#xff0c;存储格式 LOCATION&#xff0c;存储位置 ......&#xff0c; 数据类型 内部表 创建普通内部表: create table [if not exists…

第73期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…