ADC——S5PV210的ADC的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

参考博客

s5pv210 AD转换 - biaohc - 博客园

一、ADC的相关概念

1、量程(模拟量的输入范围)

ADC只能输入电压信号,其他种类的模拟信号要经过传感器的转换,变成模拟的电压信号。

ADC输入的模拟电压有一个范围,这个范围是ADC芯片本身的一个参数,一般是0~3.3V或0~5V或者是0~12V等等,实际工作时给AD的电压信号不能超过这个电压范围。

2、转换精度(分辨率resolution)

ADC输出的数字值是有一定的位数的。比如说10位,意思就是输出的数字值是用10个二进制位来表示的,这种就叫10位ADC。这个位数就表示转换精度。10位ADC,相当于把整个范围分成1024个格子,每个格子之间的间隔就是电压的表示精度。假如ADC芯片的量程是0~3.3V,则每个格子代表的电压值是3.3V/1024=0.0032265V。如果此时ADC转换后得到的数字量是447,则这个数字量代表的模拟值是:447×0.0032265V=1.44V。

ADC的位数越多,则每个格子表示的电压值越小,将来算出来的模拟电压值就越精确。

ADC的模拟量程一样的情况下,ADC精度位数越多则精度越高,测出来的值则越准。但是如果ADC的量程不一样,比如2个ADC,A的量程是0~50V,B的量程是0~0.5V,A是12位的,B是10位的,可能B的精度比A的还要高。

比如A的精度:50/1024=0.04883,B的精度:0.5/4096=0.000122

3、转换速率

ADC芯片进行AD转换需要耗费时间。不同的芯片所需的时间是不一样的;同一颗芯片当配置不一样时,所需的转换时间也不一样,比如说精度配置为10位,其转换耗费的时间就比精度配置为12位时要小。

AD工作需要一个时钟(这个时钟有一个范围,配置时不要超出这个范围),这个时钟频率控制着AD的转换速率。注意,时钟频率和AD的转换速率不是一回事,它们只是成正比而不是完全相等。比如S5PV210中的ADC转换器,AD的转换速率 = 时钟频率 / 5。

一般数据手册中描述转换速率所用的单位是MSPS。第一个M是兆,S是采样,PS就是每秒,MSPS的意思就是兆样本每秒,即每秒种转出来多少兆数字值。

4、通道数

ADC芯片有多少路模拟信号输入通道,代表着将来可以同时进行多少路模拟信号的输入。

二、S5PV210的ADC控制器

1、ADC控制器的框图

ADC的内容在数据手册的Section10.7。

因为电阻式触摸屏工作时依赖于AD转换,所以在S5PV210中,电阻触摸屏的接口和ADC接口合二为一,或者说电阻触摸屏接口复用了ADC的接口。

2、ADC的工作时钟框图

ADCCLK是ADC控制器工作的时钟,由PCLK_PSYS经过一次分频后得到的。

PCLK_PSYS时钟总线频率为66MHz,一般设置分频器为65,所以ADC的时钟是1MHz,根据公式,此时的转换速率为1/200KHz。

ADC时钟频率最大可设置为5MHz,对应的最大转换速率为1MSPS。

3、S5PV210的10个ADC通道

SoC的引脚至少分2种,数字引脚和模拟引脚。以前接触的GPIO属于数字引脚,而ADC通道引脚属于模拟引脚。数字引脚和模拟引脚一般不能混用。

S5PV210一共支持10个ADC通道,分别叫AIN[0]~AIN[9],分别对应XadcAIN[0]~XadcAIN[9]引脚。理论上可以同时做10路AD转换。

4、S5PV210的ADC特性

可选的转换精度为10bit,或者12bit。

最大的转换速率1MSPS;

输入的模拟电压范围0-3.3V;

可设置普通AD模式,即TOUCH SCREEN触摸屏模式切换为普通AD模式。

5、ADC控制器的主要寄存器

(1)获取ADC数据的两种方法

轮询检查标志位

启动转换后循环检查标志位,直到标志位为1,表明转换完毕可以去读取数据。这种方式是同步的。

中断

设置好中断,写好中断isr来读取AD转换数据。AD转换完毕后,生成中断信号给CPU,CPU进入中断处理流程。这种方式是异步的。

(2)自动开启下一次AD转换(start by read机制)

转换完毕后要立即开启下一次转换,因此需要设计一种机制,能够自动开启下一次转换。这个机制叫start by read,当我们读取本次AD转换的AD值后,硬件自动开启下一次AD转换。

(3)主要寄存器(这里探讨n=0,即通道0的寄存器)

TSADCCONn寄存器:ADC控制寄存器

  • bit16设置AD转换精度,10bit、12bit可选;
  • bit15只读,状态寄存器,查看是否转换结束;
  • bit14预分频器开关,设置为1;
  • bit13:6分频倍率,如要设置3.3MHz,可设置为19,66/(19+1)=3.3,最大设置频率为5MHz,所以此位最小值为13;
  • bit2设置为普通模式即可;
  • bit1是否开启read star模式,read star模式意思是只要读取AD转换后的寄存器数据,就重新开始AD转换,使用这种模式第一次读数据要丢掉;
  • bit0开启AD转换,开始后自动设置为0。另外如果设置了read star模式,此位无效。

TSCONn寄存器:touch screen控制寄存器

TSDATXn寄存器,TSDATYn寄存器:数据寄存器

  • bit14查看输出数据位ADC 还是TOUCH SCREEN;
  • bit11:0为转换后的数据;

CLRINTADCn寄存器清中断,写入任意的数值就可以

ADCMUX寄存器:选择当前正在操作的AD通道


 

三、代码实战

1、编写代码步骤

(1)AD控制器初始化,即 adc_init函数。

(2)循环进行AD采样,即wihle(1)。注意这次实验是关闭start by read模式的。

2、关键的代码如下,完整案例代码见链接。

#include "main.h"#define TSADCCON0		0xE1700000
#define TSDATX0			0xE170000C
#define TSDATY0			0xE1700010
//#define CLRINTADC0		0xE1700000
#define ADCMUX			0xE170001C#define rTSADCCON0		(*(volatile unsigned int *)TSADCCON0)
#define rTSDATX0		(*(volatile unsigned int *)TSDATX0)
#define rTSDATY0		(*(volatile unsigned int *)TSDATY0)
//#define rCLRINTADC0		(*(volatile unsigned int *)CLRINTADC0)
#define rADCMUX			(*(volatile unsigned int *)ADCMUX)// 初始化ADC控制器的函数
static void adc_init(void)
{rTSADCCON0	|= (1<<16);		// resolution set to 12bitrTSADCCON0	|= (1<<14);		// enable clock prescalerrTSADCCON0 	&= ~(0xFF<<6);rTSADCCON0	|= (65<<6);		// convertor clock = 66/66M=1MHz, MSPS=200KHzrTSADCCON0 	&= ~(1<<2);		// normal operation moderTSADCCON0 	&= ~(1<<1);		// disable start by read moderADCMUX		&= ~(0x0F<<0);	// MUX选择ADCIN0
}// 注意:第一,延时要确实能延时;第二,延时时间必须合适。
static void delay(void)
{volatile unsigned int i, j;for (i=0; i<4000; i++)for (j=0; j<1000; j++);
}// 测试ADC,完成的功能就是循环检测ADC并得到ADC转换数字值打印出来
void adc_test(void)
{unsigned int val = 0;adc_init();while (1){// 第一步:手工开启ADC转换rTSADCCON0	|= (1<<0);// 第二步:等待ADC转换完毕while (!(rTSADCCON0 & (1<<15)));// 第三步:读取ADC的数字值// 第四步:处理/显示数字值val = rTSDATX0;printf("x: bit14 = %d.\n", (val & (1<<14)));printf("x: adc value = %d.\n", (val & (0xFFF<<0)));val = rTSDATY0;printf("y: bit14 = %d.\n", (val & (1<<14)));printf("y: adc value = %d.\n", (val & (0xFFF<<0)));// 第五步:延时一段delay();}}

 3、测试结果

-------------adc test--------------
x: bit14 = 0.//第一组
x: adc value = 1598.
y: bit14 = 0.
y: adc value = 0.x: bit14 = 0.//第二组
x: adc value = 1583.
y: bit14 = 0.
y: adc value = 0.x: bit14 = 0.//第三组
x: adc value = 1599.
y: bit14 = 0.
y: adc value = 0.
……

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

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

相关文章

创建新的swap文件

1&#xff09;决定swap文件的大小&#xff0c;这个一般参照要安装软件的说明2&#xff09;以root用户登录&#xff0c;执行以下命令创建一个swap文件dd if/dev/zero of/swapfile bs1M count1024if后面跟的是设备&#xff0c;不确定可以通过”df –h”命令来查看有哪些硬盘设备。…

【洛谷 2661】信息传递

题目描述 有 nn 个同学&#xff08;编号为 11 到 nn &#xff09;正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象&#xff0c;其中&#xff0c;编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学。 游戏开始时&#xff0c;每人都只知道自己的生日。之…

kernel移植——从三星官方内核开始移植

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、内核移植初体验 1、获取三星官方的内核源码包 三星SMDKV210开发板附带的光盘里有内核源码包&#xff1a;下载地址。 2、构建移植环境 &#xff08;1&#xff09;Windows下建立SI工程&…

Android中实时视频传输(摄像头实时视频传输)解决方案二

为什么80%的码农都做不了架构师&#xff1f;>>> 1、使用FFMpeg进行视频采集&#xff0c;使用Live555进行RTP传输&#xff0c;使用VideoView进行播放。 csdn提到&#xff1a;重载FrameSource&#xff0c;写一个服务类&#xff0c;可以从FrameSource的派生类读取帧数…

很好的 .NET 换肤软件 IrisSkin

当前.NET下提供换肤的控件有IrisSkin和DotNetSkin。但是DotNetSkin提供的Demo版本&#xff0c;功能有限制&#xff0c;一时找不到可以破解的完全版。IrisSkin 的功能不比DotNetSkin差&#xff0c;而且使用简单。不需要原始文件&#xff0c;只需要dll文件和皮肤文件。详细信息可…

定时器——S5PV210定时器的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、定时器简介 1、定时器的含义 定时器作为SoC的外设&#xff0c;主要用来实现定时执行代码的功能&#xff0c;它相对SoC而言&#xff0c;就像闹钟相对于人的意义一样。定时器内部的计数器每隔一个…

gson的简单使用方法

gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段&#xff0c;同时gson又可以通过使用annotation来灵活配置需要序列化的字段。 下面是一个简单的例子&#xff1a; publicclassPerson {privateString name;privatein…

String.Format格式说明

C#格式化数值结果表字符说明示例输出C货币string.Format("{0:C3}", 2)&#xff04;2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E0011.20E001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{0:N}", …

linux bjobs

bjobs 查看正在进行的job bkill job id 杀死job 转载于:https://www.cnblogs.com/zk-szd1314/p/11322460.html

uboot的移植——DM9000移植的理论基础

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 一、网卡相关的基本知识 1、DM9000网卡芯片和SoC的连接 如上图所示&#xff0c;DM9000网卡芯片是通过SROM总线接口&#xff0c;或者说SROM控制器接入SoC的。下面分别介绍SROM控制器、DM9000网卡芯片的相关…

mysql“Access denied for user 'root'@'localhost'”问题的解决

我的系统是Ubuntu12.04&#xff0c;最近新装好的mysql在进入mysql工具时&#xff0c;总是有错误提示:# mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO)使用网上介绍的方法修改root用户的密码&#xff1a;# mys…

ServiceStack.Redis之IRedisClient第三篇

事实上&#xff0c;IRedisClient里面的很多方法&#xff0c;其实就是Redis的命令名。只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法&#xff0c;趁着现在对Redis不是特别了解&#xff0c;我也对着命令来了解一下这些方法。 一、属性 IRedisClient的属性如下&am…

javascript深入浅出

第一章 数据类型 1&#xff0c;六种数据类型&#xff1a;原始类型&#xff08;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff09; object对象&#xff08;Function Array Date&#xff09; 2&#xff0c;隐式转换&#xff1a;Na…

mv命令:移动、重命名文件或文件夹

linux使用mv命令来移动、重命名文件或文件夹。 例如&#xff0c;将一个名为abc.txt的文件重命名为1234.txt&#xff1a;mv abc.txt 1234.txt 例如&#xff0c;将目录A重命名为B&#xff1a;mv A B 例如&#xff0c;将a.txt移动到/b下&#xff0c;并重命名为c.txt&#xff1a…

MTK优美代码赏析6:电话本里的快速排序和插入排序算法

MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实用的例子说明为什么要教我们这个,所以考完试就把这些没用的东东给忘了..…

Visual C++中最常用的类与API函数

这篇文章能让初学者快速了解visual C MFC中常见的核心的类与函数&#xff0c;虽然全部看下来有点枯燥&#xff0c;但对初学者快速了解MFC的框架结构很有好处。 常用类 CArchive类&#xff1a;用于二进制保存档案 CBitmap类&#xff1a;封装Windows的图形设备接口(GDI)位图 CBru…

vim编译器的使用方法(行号、删除、复制、查找等)

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 vim是在Linux环境下的编辑器&#xff0c;它的常见使用操作如下。 1、显示行号 编辑器默认不显示行号&#xff0c;有二种办法可以显示行号。 &#xff08;1&#xff09;第一种是&#xff0c;暂时显示。在vim…

Imagination

Imagination Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8 Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There are four matrixs blow ,…

Day19 练习题

1.列举布尔值为False的值 0,[],{},(),False,’’,None 列如&#xff1a; if 0: 2.写函数&#xff1a; 根据范围获取其中被3和7整除的所有数的和&#xff0c;符合条件的数字个数以及符合条件的数字的总和 3.函数传递参数时&#xff0c;是否用的同一内存地址 name “hairui” de…

error U1087: cannot have : and :: dependents for same target

DDK下build -c错误:error U1087: cannot have : and :: dependents for same target 被build的source code所在path不能含有空格. 转载于:https://www.cnblogs.com/vcerror/p/4289079.html