S5PV210的ADC部分

S5PV210的ADC部分
1.ADC:模数转换器,模拟量转数字量。
CPU本身是数字的,而外部世界变量(如电压、温度、高度、压力···)都是模拟的,所以需要用CPU来处理这些外部的模拟变量的时候就需要做AD转换。为了用数字技术来处理外部的模拟物理量
2.模拟的就是连续的,现实生活当中的时间、电压、高度等都是模拟的。
数字的就是离散的,离线的就是不连续的。这种离散处理实际上是从数学上对现实中的模拟量的一种有限精度的描述
3.数字化就是离散化,就是把连续分布的模拟量按照一定精度进行取点(采样)变成有限多个不连续分布的数字值,就叫数字量,)数字化的意义就在于可以用(离散)数学来简化描述模拟量
4.计算机处理参量的时候都是数字化的,计算机需要数字化的值来参与运算。如果系统输入参数中有模拟量,就需要外加AD转换器将模拟量转成数字量再给计算机。


有AD自然就有DA:
(1)AD是analog to digital,DA自然就是digital to analog,数字转模拟。
(2)纯粹用cpu是不可能实现数字转模拟,因为cpu本身就是数字的。使用一些(具有一些积分或微分效果的)物理器件就可实现数字转模拟。
(3)数字转模拟的作用。譬如可以用来做波形发生器。


ADC的主要相关概念:
量程(模拟量输入范围):
AD转换器是一个电子器件,所以他只能输入电压信号。其他种类的模拟信号要先经过传感器(Sensor)的转换变成模拟的电压信号然后才能给AD。
AD输入端的模拟电压要求有一个范围,一般是0~3.3V或0~5V或者是0~12V等等。模拟电压的范围是AD芯片本身的一个参数。实际工作时给AD的电压信号不能超过这个电压范围。
精度(分辨率resolution):
AD转换输出的数字值是有一定的位数的(譬如说10位,意思就是输出的数字值是用10个二进制位来表示的,这种就叫10位AD)。这个位数就表示了转换精度…
10位AD就相当于把整个范围分成了1024个格子,每个格子之间的间隔就是电压的表示精度。加入AD芯片的量程是0~3.3V,则每个格子代表的电压值是3.3V/1024=0.0032265V。如果此时AD转换后得到的数字量是447,则这个数字量代表的模拟值是:447×0.0032265V=1.44V。
AD的位数越多,则每个格子表示的电压值越小,将来算出来的模拟电压值就越精确
AD的模拟量程一样的情况下,AD精度位数越多精度越高,测出来的值越准
转换速率(MSPS与conventor clock的不同):
首先要明白:AD芯片进行AD转换是要耗费时间的。这个时间需要多久,不同的芯片是不一样的,同一颗芯片在配置不一样(譬如说精度配置为10位时时间比精度配置为12位时要小,譬如说有些AD可以配转换时钟,时钟频率高则转换时间短)时转换时间也不一样。
详细的需要时间可以参考数据手册。一般数据手册中描述转换速率用的单位是MSPS(第一个M是兆,S是sample,就是采样;PS就是per second,总的意思就是兆样本每秒,每秒种转出来多少M个数字值)
AD工作都需要一个时钟,这个时钟有一个范围,我们实际给他配置时不要超出这个范围就可以了。AD转换是在这个时钟下进行的,时钟的频率控制着AD转换的速率。注意:时钟频率和MSPS不是一回事,只是成正比不是完全相等。譬如S5PV210中的AD转换器,MSPS = 时钟频率/5
通道数:
AD芯片有多少路analog input通道,代表了将来可以同时进行多少路模拟信号的输入


简单总结一下:
量程就是ADC的电压的输入范围,例如0-5V,那么它的电压范围就是0-5V,5V就是它的量程。
精度:也就是ADC对应的量程,我们用多少bit来表示,例如精度是10bit,我们的量程是5V,那么我们就是把这5V划分为2的10次方份,也就是把这5V划分为了1024份,每一份是5V / 1024 = 0.00488V
转换速率:一般是MSPS,意思就是兆样本每秒,每秒种转出来多少M个数字值,就是1S的时间,ADC可以进行M次采样,得到M个值
通道数:可以接入多少个模拟通道


S5PV210的ADC控制器:
在这里插入图片描述
ADC和(电阻式)触摸屏的关系?
电阻式触摸屏本身工作时依赖于AD转换,所以在210的SoC中电阻触摸屏接口本身和ADC接口是合二为一的。或者说电阻触摸屏接口使用了(复用了)ADC的接口。

在这里插入图片描述
ADCCLK是ADC控制器工作的时钟,从时钟框图可以看出,它是PCLK(当然是PCLK_PSYS)经过了一次分频后得到的。所以将来初始化ADC控制器时一定有一个步骤是初始化这里的分频器

我们的S5PV210支持10个ADC通道,分别叫AIN[0]~AIN[9]。理论上可以同时做10路AD转换。
SoC的引脚至少分2种:digit数字引脚和analog模拟引脚。我们以前接触的GPIO都属于数字引脚,ADC channel通道引脚属于模拟引脚。数字引脚和模拟引脚一般是不能混用的


主要寄存器:
TSADCCON0
TSDATX0 TSDATY0 转出来的AD值存在这里,我们读也是读这里
CLRINTADC0 清中断
ADCMUX 选择当前正在操作的AD通道
等待触摸屏转换完毕的方法有2种:一种是检查标志位,第二种是中断。第一种方式下我们先开启一次转换然后循环不停检查标志位直到标志位为1表明已经转换完可以去读了;第二种方式下就是设置好中断,写好中断isr来读取AD转换数据。然后开启中断后CPU就不用管了,等AD转换完成后会生成一个中断信号给CPU,就会进入中断处理流程。第一种方法是同步的,第二种方式是异步的。
AD转换都是需要反复进行的,那么转完一次一般要立即开启下一次转换,所以需要有一种机制能够在一次转完时自动开启下一次。这个机制就叫start by read,这个机制的工作方法是:当我们读取本次AD转换的AD值后,硬件自动开启下一次AD转换。


程序分析:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
adc_init:初始化函数

rTSADCCON0	|= (1<<16);		// resolution set to 12bit 12位分辨率
rTSADCCON0	|= (1<<14);		// enable clock prescaler 
rTSADCCON0 	&= ~(0xFF<<6);  //先清0
// convertor clock = 66/(65+1) = 1MHZ   MSPS = conveter / 5 = 200KHZ
rTSADCCON0	|= (65<<6);		// convertor clock = 66/66M=1MHz, MSPS=200KHz

选择普通模式,没有选择start by 模式
rTSADCCON0 	&= ~(1<<2);		// normal operation mode
rTSADCCON0 	&= ~(1<<1);		// disable start by read mode

rADCMUX		&= ~(0x0F<<0);	// MUX选择ADCIN0,选择通道0

测试程序:
首先初始化adc
while (1)
{
// 第一步:手工开启ADC转换,打开ADC,写1打开
rTSADCCON0 |= (1<<0);
// 第二步:等待ADC转换完毕,bit15是ADC转换完成的标志
//bit15 == 1的话,是转换完成了

	while (!(rTSADCCON0 & (1<<15)));

}
rTSDATX0:普通模式读取的值放在这里
rTSDATY0:可能start by read模式的值放在这里,我这里并没有做start by read的实验

start by read模式介绍
(1)应用方法:开启start by read模式,第一次先读一次丢掉,这次读就能开启下一次AD转换,然后以后就可以不停的读取AD值了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值