模数转换电路

news2024/11/19 20:33:55

一、Exynos4412 A/D转换器概述

1. 概述

ADC(Analog-to-Digital Converter),就是模数转换器。从字面上看,A我们称为模拟信号(Analog signal),D我们称为数字信号(digital signal)。

模数转换器,在电子技术中即是将模拟信号转换成数字信号,也称为数字量化。当然还有一种叫DAC,就是数模转换,意思相反,即是将数字信号转换成模拟信号。

在我们的日常生活中,会遇到很多的物理量,遇到很多的物理参数,其中,我们经常遇到的物理参数,如电流、电压、温度、压力、速度等电量或非电量都是模拟量。

模拟量的大小是连续分布的,且经常也是时间上的连续函数。要使计算机或数字仪表能识别、处理这些信号,必须首先将这些模拟信号转换成数字信号;而经计算机分析、处理后输出的数字量也往往需要将其转换为相应模拟信号才能为执行机构所接受。这样,就需要一种能在模拟信号与数字信号之间起桥梁作用的电路—模数和数模转换器。

2. 分类

目前常见的A/D转换器中,有:权电阻网络D/A转换器、倒T型电阻网络D/A转换器、权电流型D/A转换器、权电容网络D/A转换器、开关树形D/A转换器。

3. A/D转换主要技术指标

1)分辨率

A/D转换器的分辨率用输出二进制数的位数表示,位数越多,误差越小,转换精度越高。

2)量化误差

在A/D转换中由于整量化产生的固有误差。量化误差在±1/2LSB(最低有效位)之间。

3)转换时间

转换时间是指A/D转换器完成一次转换所需的时间。转换时间是指从接到转换控制信号开始,到输出端得到稳定的数字输出信号所经过的这段时间。

4)偏移误差

输入信号为零时输出信号不为零的值,可外接电位器调至最小。

5)满刻度误差

满刻度输出时对应的输入信号与理想输入信号值之差。

6)线性度

实际转换器的转移函数与理想直线的最大偏移,不包括以上3种误差。

其他指标还有:绝对精度(Absolute Accuracy)、相对精度(Relative Accuracy)、微分非线性、单调性和无错码、总谐波失真(Total Harmonic Distortion,THD)和积分非线性。

二、Exynos 4412 A/D转换器简介

1.简述

10位或12位CMOS再循环式模拟数字转换器,它具有10通道输入,并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时,最大1Msps的转换速度。A/D转换具备片上采样保持功能,同时也支持待机工作模式。

2.特性

ADC接口包括如下特性。

1)10bit/12bit输出位可选。

2)微分误差 1.0LSB。

3)积分误差 2.0LSB。

4)最大转换速率5Msps.

5) 功耗少,电压输入1.8V。

6)电压输入范围 0~1.8V。

7)支持偏上样本保持功能。

8)通用转换模式。

3. A/D功能模块图

图1 ADC Functional Block Diagram

2. Exynos4412 A/D 控制器寄存器

1)A/D控制寄存器ADCCON

2)A/D数据寄存器

3)A/D通道Mux寄存器

三、A/D转换器实例

1. 电路连接如下:

利用一个电位计输出电压到4412的AIN3管脚。输入的电压范围为0~1.8V。

1. 代码如下:

#include <asm/ioctl.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/fs.h>

#include <linux/cdev.h>

#include <linux/device.h>

#include <linux/uaccess.h>

#include <asm/io.h>

#define ADC_MAGIC 'A'

#define CMD_ONE 1

#define ADC_CMD_GET _IOR(ADC_MAGIC, CMD_ONE, int)

//寄存器定义

#define ADC_CFG (0x10010118)

#define ADCCON (0x126C0000)

#define ADCDAT (0x126C000C)

#define ADCMUX (0x126C001C)

dev_t dev;

int minor_base = 0;

int adc_count = 1;

char adc_name[] = "adc";

struct cdev *pcdev = NULL;

struct class *pcls = NULL;

static unsigned int *adccfg;

static unsigned int *adcmux;

static unsigned int *adccon;

static unsigned int *adcdat;

int AdcInit(void)

{

int ret = 0;

adccfg = ioremap(ADC_CFG, 4);

if (adccfg == NULL) {

printk("ioremap adccfg\n");

ret = -ENOMEM;

return ret;

}

adcmux = ioremap(ADCMUX, 4);

if (adcmux == NULL) {

printk("ioremap adcmux\n");

ret = -ENOMEM;

goto ERR1;

}

adccon = ioremap(ADCCON, 4);

if (adccon == NULL) {

printk("ioremap adccon\n");

ret = -ENOMEM;

goto ERR2;

}

adcdat = ioremap(ADCDAT, 4);

if (adcdat == NULL) {

printk("ioremap adcdat\n");

ret = -ENOMEM;

goto ERR3;

}

//ADC_CFG &= ~(0x1 << 16);

writel(readl(adccfg) & ~(0x1<<16), adccfg); //Bit_16:Select ADC Mux 0:General ADC, 1:MTCADC

//ADCMUX = 0x3;

writel(3, adcmux); //0x3: 0011 = AIN3 //原理图管脚查到XadcAIN3

//12bit A/D conversion; enable A/D converter prescaler; prescaler value:20; A/D conversion start by read

//ADCCON = (0x1<<16) | (0x1<<14) | (19<<6) | 0x1<<1;

//ADCDAT & 0xfff;

writel((0x1<<16) | (0x1<<14) | (19<<6) | 0x1<<1, adccon);

return 0;

ERR3:

iounmap(adccon);

ERR2:

iounmap(adcmux);

ERR1:

iounmap(adccfg);

return ret;

}

unsigned int adc_get(void)

{

unsigned int adc_value;

unsigned int temp_value;

readl(adcdat);

while(!(readl(adccon) & (0x1<<15)));

adc_value = readl(adcdat) & 0xfff;

temp_value = 9999 * adc_value / 4095;

return temp_value;

}

long adc_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)

{

//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);

switch (cmd) {

case ADC_CMD_GET:

*(unsigned int *)arg = adc_get();

break;

default:

return -EINVAL;

}

return 0;

}

struct file_operations fops = {

.owner = THIS_MODULE,

.unlocked_ioctl = adc_ioctl,

};

int adc_init(void)

{

int ret;

int major;

struct device *pdevice = NULL;

//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);

ret = alloc_chrdev_region(&dev, minor_base, adc_count, adc_name);

if (0 > ret) {

printk("Can't get device number\n");

return ret;

}

pcdev = cdev_alloc();

if (NULL == pcdev) {

printk("cdev alloc failed.\n");

ret = -ENOMEM;

goto UNREG_DEV_NUM;

}

cdev_init(pcdev, &fops);

pcdev->owner = THIS_MODULE;

ret = cdev_add(pcdev, dev, adc_count);

if (0 > ret) {

printk("add cdev failed.\n");

goto DEL_CDEV;

}

pcls = class_create(pcdev->owner, adc_name);

if (IS_ERR(pcls)) {

printk("class create failed.\n");

ret = PTR_ERR(pcls);

goto DEL_CDEV;

}

major = MAJOR(dev);

pdevice = device_create(pcls, NULL, MKDEV(major, minor_base), NULL, "%s%d", adc_name, minor_base);

if (IS_ERR(pdevice)) {

printk("device %s%d create failed.\n", adc_name, minor_base);

ret = PTR_ERR(pdevice);

goto DESTROY_CLASS;

}

//printk("Body temperature module init done!\n");

if (0 != AdcInit())

{

goto DESTROY_CLASS;

}

printk("adc init\n");

return 0;

DESTROY_CLASS:

class_destroy(pcls);

DEL_CDEV:

cdev_del(pcdev);

UNREG_DEV_NUM:

unregister_chrdev_region(dev, adc_count);

return ret;

}

void adc_exit(void)

{

device_destroy (pcls, MKDEV(MAJOR(dev), minor_base));

class_destroy(pcls);

cdev_del(pcdev);

unregister_chrdev_region(dev, adc_count);

printk("Good bye, adc module\n");

//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);

}

module_init(adc_init);

module_exit(adc_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Ruth Wei");

MODULE_DESCRIPTION("adc for demo");

MODULE_VERSION("1.0.1");

2. 编译测试

经过交叉编译后,加载驱动,写一个应用程序可以读取ADC转换后的值。

四、总结

本文从模数转换器的技术指标和电路连接等方面进行分析,最终写出驱动程序,可以在4412板子上进行测试。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计家乡旅游文化推广系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

教你STM32做USB鼠标、键盘

使用CubeMX软件傻瓜式的配置&#xff0c;一键生成USB的HID驱动。 一、USB鼠标 1、CubeMX配置 ①、选择相对应的芯片 ②、配置时钟和Debug和debug ③、配置USB ④、生成代码 最好把这个也勾上&#xff0c;勾上以后每个外设配置不再都给你塞到main.c里&#xff0c;而是建一个.c…

简单的爬虫架构和网页下载器requests

目录 简单的爬虫架构&#xff1a; 网页下载器&#xff1a; URL管理器: 网页解析器: 网页下载器requests: 发送requests请求&#xff1a; 接收requests请求: requests操作实例&#xff1a; 简单的爬虫架构&#xff1a; 网页下载器&#xff1a; 负责通过URL将网页进行下载…

聊聊Vuex原理

背景 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。Vuex 是专门为 Vue.js 设计的状态管理库&#xff0c;以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。如果你已经灵活运用&#xff0c;但是依然好奇它底层实现逻辑&#xff0c;不妨一探究竟。 Vue 组件开发…

docker系统笔记-03镜像的创建管理和发布

镜像的获取 pull from registry (online) 从registry拉取 public&#xff08;公有&#xff09;private&#xff08;私有&#xff09; build from Dockerfile (online) 从Dockerfile构建load from file (offline) 文件导入 &#xff08;离线&#xff09; 镜像的基本操作 dock…

概率 | 【提神醒脑】自用笔记串联二 —— 数字特征、大数定律、统计量

本文总结参考于 kira 2023概率提神醒脑技巧班。 笔记均为自用整理。加油&#xff01;ヾ(◍∇◍)&#xff89;&#xff9e; 第一部分笔记详见 概率 | 【提神醒脑】自用笔记串联一 —— 事件、随机变量及其分布_西皮呦的博客-CSDN博客 一研为定&#xff01; 四、随机变量的数字特…

cocos2dx 3D物理相关知识点汇总

&#xff08;一&#xff09;3D相关基础知识 网格&#xff08;Mesh&#xff09; 通常说的网格其实就是3D建模出来的形状。因为模型是由很多三角形组成&#xff0c;所以&#xff0c;就像网格一样。 纹理 纹理的作用就是给网格上色。 怎么上色的&#xff1f; 举个简单的例子。…

m基于GA遗传优化的生产工艺设备布置优化matlab仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 在设备布置的问题上&#xff0c;本文将作业车间设备布置这个多目标优化问题看成是包含布局面积&#xff0c;物流成本和生产工艺的连续优化的多行设备布置问题&#xff0c;使之更具有实际意义…

如何在 Rocky Linux 上安装 Apache Kafka?

Apache Kafka 是一种分布式数据存储&#xff0c;用于实时处理流数据&#xff0c;它由 Apache Software Foundation 开发&#xff0c;使用 Java 和 Scala 编写&#xff0c;Apache Kafka 用于构建实时流式数据管道和适应数据流的应用程序&#xff0c;特别适用于企业级应用程序和关…

robots.txt漏洞

robots.txt漏洞描述: 搜索引擎可以通过robots文件可以获知哪些页面可以爬取,哪些页面不可以爬取。Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯,如果robots.txt文件编辑的太过详细,反而会泄露网站的敏感…

[附源码]java毕业设计基于学生信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Delphi中关于PChar、Char数组、string[](ShortString)及结构体长度及占用空间的一些特性说明和测试

关于特性 1&#xff0c;string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户 是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预2&#xff0c;关于ShortString&#xff0c;内存中用第一个字节来表示字符串的长度。FF255,所以这个特性…

【MySQL】MySQL复制与高可用水平扩展架构实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

天王刘德华走红毯,到哪他都是最耀眼的明星

第三十五届金鸡奖&#xff0c;已经在福建厦门落下帷幕&#xff0c;如果要说本届金鸡奖谁收获最大&#xff0c;无疑是天王刘德华。在金鸡奖颁奖典礼现场&#xff0c;功夫巨星吴京登上热搜&#xff0c;然而热搜的主角却不是他&#xff0c;而是天王刘德华。 在本届金鸡奖颁奖典礼现…

cubeIDE开发, stm32调试信息串口通信输出显示

关于cubeIDE开发基本技巧及流程&#xff0c;本文不详细叙述&#xff0c;请参考&#xff1a;cubeIDE快速开发流程_py_free的博客-CSDN博客_cubeide汉化 一、stm32串口配置 本文采用的开发板是stm32L496VGT3,其有两个 USB 接口&#xff0c;一个为 USB ST-link 复用接口&#xff…

代码随想录——最长递增子序列的个数

题目 给定一个未排序的整数数组&#xff0c;找到最长递增子序列的个数。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释: 最长递增子序列的长度是1&#xff0c;并且…

Oracle 表创建和表管理

1.表的命名 必须以字母开头字符长度在1-30之间只能包含A-Z&#xff0c;a-z,0-9,_,$和#被同一个用户拥有的对象不能有重复的名字 2.表的创建 SQL> create table t01(id number(4),name varchar2(15));Table created.SQL> desc t01Name …

现场直击!维视智造携多款明星产品亮相VisionChina 2022深圳机器视觉展

11月15日&#xff0c;2022年中国&#xff08;深圳&#xff09;机器视觉展在深圳国际会展中心&#xff08;宝安新馆&#xff09;盛大开幕&#xff0c;维视智造携MV-CR读码相机、3D线激光相机、VisionBank AI多相机智能视觉系统等多款行业领先产品及解决方案亮相。 1 ►现场速击 …

C基础--内存对齐问题(结构体对齐)

问题现象 在调试一个软件功能时&#xff0c;发现一个结构体对齐的问题&#xff0c;以前没有太关注&#xff0c;现在把它总结出来。先看示例&#xff1a; 结构体1&#xff1a; typedef struct {char magic[4];uint32_t crc32;uint32_t lenght;uint16_t ver;uint16_t IFrameCnt…

多线程DPDK应用的内存优化

作者 Conor Walsh is a software engineering intern with the Architecture Team of Intel’s Network Platform Group (NPG), based in Intel Shannon (Ireland). 引言 高速包处理是一种资源密集型应用。一种解决方案是将包处理流水线(pipeline)分离到多线程以提高程序性能…