S5PV210之ADC

这篇博客里面的很多东西都是基于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的驱动代码的时候,一般情况下只需考虑三个寄存器,分别是

   

AIN[0]寄存器
寄存器 映射地址 读/写 描述 复位值
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[0]时需要用到的三个寄存器,对于上面的映射地址,在编写驱动代码的时候可使用ioremap的形式进行映射,然后强制转为(volatile unsigned long *)指针形式,接下来就可以直接操作寄存器了(具体使用方式见前面博客adc的驱动代码里面有具体操作)。

     

操作AIN[1],在编写ADC的驱动代码的时候,一般情况下只需考虑三个寄存器,分别是

   

AIN[1]寄存器
寄存器 映射地址 读/写 描述 复位值
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寄存器 ---

对于AIN[1]的使用方式与AIN[0]的使用完全一样,需要修改的只是映射地址而已。


最后介绍一下ADC的操作流程,其实熟悉S3C2440或者S3C6410的人来看S5PV210的ADC,就会发觉很简单,其实他们的操作流程基本上是一样的

主要分三步:

 1.使用clk_get获取adc时钟,接着使用clk_enable使能adc时钟

2.设置ADCCON的工作方式,预分频比之类的

3.当开始读取数据值时,开启ADC转换,判断是否开始转换,判断是否转换完成,最终读取数据,返回给用户空间

对于熟悉S3C2440的人,会发觉一点,S5PV210的控制寄存器,是没有通道选择的,因为在使用之前,直接用ioremap进行地址的映射时,就相当于选择了不同的通道,所以无需通道选择了。

以上只是对S5PV210的ADC做了个简单介绍,详细信息请参看S5PV210_UM手册。


原文地址:https://www.cnblogs.com/liangxinzhi/p/4275620.html