S5PC100AD示例
一、 S5PC100 A/D转换器概述
1.简述
10位或12位CMOS再循环式模拟数字转换器,它具有10通道输入,并可将模拟量转换至10位或12位二进制数。5MHz A/D转换时钟时,最大1Msps的转换速度。A/D转换具备片上采样保持功能,同时也支持待机工作模式。
2.特性
● ADC接口包括如下特性。
● 10bit/12bit输出位可选。
● 微分误差±1.0LSB。
● 积分误差±2.0LSB。
● 最大转换速率:1 Msps。
● 功耗少,电压输入3.3v。
● 模拟量输入范围:0~3.3v。
● 支持片上样本保持功能。
● 通用转换模式。
3.模块图
S5PC100 A/D转换器的控制器接口框图如图1所示。
图1 S5PC100 ADC控制器接口框图
二、 S5PC100 A/D控制器寄存器
1.寄存器组
S5PC100中的A/D控制器集成了电阻触摸屏控制功能。此处为了简化学习,只考虑的A/D转换使用到的两个寄存器,即A/D控制寄存器(ADCCON)、A/D转换数据寄存器(ADCDAT)。
A/D控制寄存器ADCCON(address = 0xF3000000)如表1所示。
表2 ADCCON描述
ADCCON | 位 | 描 述 | 初 始 值 |
RES | [16] | 0=10bit 输出 1=12bit输出 | 0 |
ECFLG | [15] | A/D转换结束标志 0:A/D转换正在进行 1:A/D转换结束 | 0 |
PRSCEN | [14] | A/D转换预分频允许 0:不允许预分频 1:允许预分频 | 0 |
PRSCVL | [13:6] | 预分频值PRSCVL | 0xFF |
Reserved | [5:3] | 保留 | 0 |
STDBM | [2] | 待机模式选择位 0:正常模式 1:待机模式 | 1 |
READ_START | [1] | A/D转换读-启动选择位 0:禁止Start-by-read 1:允许Start-by-read | 0 |
ENABLE_START | [0] | A/D转换器启动 0:A/D转换器不工作 1:A/D转换器开始工作 | 0 |
A/D转换数据寄存器ADCDAT0(地址:0xF300000C)如表3所示。
表3 ADCDAT0描述
ADCDAT0 | Bit | 描 述 | 初 始 值 |
UPDOWN | [15] | 等待中断模式,Stylus电平选择 0:低电平 1:高电平 | — |
AUTO_PST | [14] | 自动按照先后顺序转换X,Y坐标 0:正常A/D转换顺序 1:按照先后顺序转换 | — |
XY_PST | [13:12] | 自定义X,Y位置 00:无操作模式 01:测量X位置 10:测量Y位置 11:等待中断模式 | — |
XPDATA | [11:0] | X坐标转换数据值(包括正常的ADC转换数值) | — |
2.A/D转换的转换时间计算
例如,PCLK为66M Hz,PRESCALER = 65;所有10位转换时间为:
66 MHz / (65 + 1) = 1MHz
转换时间为1/(1M/5 cycles) = 5μs。
完成一次A/D转换需要5个时钟周期。A/D转换器的最大工作时钟为5MHz,所以最大的采样率可以达到1Mbit/s。
三、A/D转换器示例
1) 电路连接
电路连接如图2所示,利用一个电位计输出电压到S5PC100 的AIN0管脚。输入的电压范围是0~3.3V。
图2 分压电路
2) 程序的编写
编写软件程序,实现电压值的获取、显示。 程序主要是对S5PC100中的A/D模块进行操作,所以软件程序也主要是对A/D模块中的寄存器进行操作,其中包括对ADC控制寄存器(ADCCON)、ADC数据寄存器(ADCDAT)的读/写操作。同时为了观察转换结果,可以通过串口调试助手里面观察ADC采集的电压值。
1.相关寄存器定义
#define rADCCON (*(volatile unsigned *)0x58000000) //ADC 控制寄存器
ypedef struct {
unsigned int ADCCON;
unsigned int ADCTSC;
unsigned int ADCDLY;
unsigned int ADCDAT0;
unsigned int ADCDAT1;
unsigned int ADCUPDN;
unsigned int ADCCLRINT;
unsigned int ADCMUX;
unsigned int ADCPNDCLR;
}adc;
#define ADC (* (volatile adc * )0xF3000000 )
2.A/D测试程序
#include "s5pc100.h"
#include "uart.h"
unsigned char table[10]={'0','1','2','3','4','5','6','7','8','9'};
int main()
{
unsigned int temp = 0;
unsigned int a;
unsigned char bit4,bit3,bit2,bit1;
unsigned int count;
uart0_init();
ADC.ADCMUX = 0;
ADC.ADCCON = ( 1<<16 | 1<<14 | 0xff<<6 | 0<<2 | 1<<1 ) ;
temp = ADC.ADCDAT0 & 0XFFF; //使用读启动的方式启动ADC
while(1)
{
while(!(ADC.ADCCON & 0X8000));
temp = ADC.ADCDAT0 & 0XFFF;
temp = 3.3 * 1000 * temp/ 0xfff;
bit4 = temp/1000;
putc(table[bit4]);
bit3 = (temp%1000)/100;
putc(table[bit3]);
bit2 = ((temp%1000)%100)/10;
putc(table[bit2]);
bit1 = ((temp%1000)%100)%10;
putc(table[bit1]);
puts("mV");
putc('\n');
for(count = 1000000; count != 0; count--);
}
return 0;
}
3) 调试与运行结果
1.串口接收设置
在PC上运行串口调试助手通信程序(波特率为115200、8、1位停止位、无校验位、无硬件流控制);或者使用其他串口通信程序。
2.测试程序
(1)编译程序后可得到ELF文件,通过仿真器下载代码到开发板。
3.观察实验结果
uart0 device ok
1770mv
1765mv
1771mv
1772mv
转动开发板上的电位器,ADC采集的电压值为在0V到3300mv之间变化。