这篇博客里面的很多东西都是基于S5PV210_UM的英文手册,当然也加入了一些自己的理解。
先对S5PV210的ADC的主要特征做个简单介绍:
1.分辨率(输出离散值的个数)可以是10位或者12位(可以通过TSADCCON0/TSADCCON1的第16位RES进行设定,将RES设为0表示10位,设为1表示12位)
2.10通道的模拟输入(AIN[9]---AIN[0])
3.输入电压为0--3.3V
4.最大转换速率:1MSPS
对于转换速率的计算:
S5PV210_UM手册上是这样介绍的:
当PCLK=66MHz时,预分频比P=65时,12位分辨率的转换时间如下:
A/D转换频率=66MHz/(65+1)=1MHz
A/D转换时间=1/(1MHz/5cycles)=1/200kHz=5us
注意:A/D的转换频率最大可达5MHz,所以A/D转换时间最大可达1MSPS
对于官方手册上,所说的A/D转换时间的计算,可能我们第一次看的时候会不太理解,会什么要1MHz/5cycles?
原因是这样的,因为A/D转换时间包括A/D建立时间,1位1位转换时间,保存数据时间等等,加起来一共是5个时钟周期,所以会是1MHz/5cycles
其实对于 A/D转换时间=1/(1MHz/5cycles) 可以换种写法 A/D转换时间=1/1MHz *5=5us 也是一样的
所以当最大转换频率达到5MHz时,A/D转换时间可达1MSPS(SPS为每秒的采样率)
5.具有采样保持功能
接着就是介绍涉及ADC操作的一些寄存器
虽然ADC有10通道的模拟输入,但是只有AIN[0],AIN[1]没有复用,像AIN[2]--AIN[9]是复用为触摸屏的两路控制信号(XM,XP)
所以这里只介绍涉及AIN[0],AIN[1]的相关寄存器
操作AIN[0],在编写ADC的驱动代码的时候,一般情况下只需考虑三个寄存器,分别是
寄存器 | 映射地址 | 读/写 | 描述 | 复位值 |
TSADCCON0 | 0xE170_0000 | R/W | TS0/ADC控制寄存器 | 0x0000_3FC4 |
TSDLY0 | 0xE170_0008 | R/W | TS0/ADC延时寄存器 | 0x0000_00FF |
TSDATX0 | 0xE170_000C | R | TS0/ADC转换数据X寄存器 | --- |
操作AIN[1],在编写ADC的驱动代码的时候,一般情况下只需考虑三个寄存器,分别是
寄存器 | 映射地址 | 读/写 | 描述 | 复位值 |
TSADCCON1 | 0xE170_1000 | R/W | TS1/ADC控制寄存器 | 0x0000_3FC4 |
TSDLY1 | 0xE170_1008 | R/W | TS1/ADC延时寄存器 | 0x0000_00FF |
TSDATY1 | 0xE170_100C | R | TS1/ADC转换数据Y寄存器 | --- |
最后介绍一下ADC的操作流程,其实熟悉S3C2440或者S3C6410的人来看S5PV210的ADC,就会发觉很简单,其实他们的操作流程基本上是一样的
主要分三步:
1.使用clk_get获取adc时钟,接着使用clk_enable使能adc时钟
2.设置ADCCON的工作方式,预分频比之类的
3.当开始读取数据值时,开启ADC转换,判断是否开始转换,判断是否转换完成,最终读取数据,返回给用户空间
对于熟悉S3C2440的人,会发觉一点,S5PV210的控制寄存器,是没有通道选择的,因为在使用之前,直接用ioremap进行地址的映射时,就相当于选择了不同的通道,所以无需通道选择了。以上只是对S5PV210的ADC做了个简单介绍,详细信息请参看S5PV210_UM手册。