S3C2410 普通AD转换

一、AD转换基本原理

AD(Analog to Digital) 意思是:模—数转换,它是外部世界模拟信号和计算机之间联系的接口。它将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。

AD转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在AD转换前,输入到AD转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。AD转换后,输出的数字信号可以有8位、10位、12位、14位、16位等。

S3C2410/S3C2440的CMOS模数转换器可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制数据。在2.5MHZ的A/D转换时钟下,最大的转化速率可达500SPS(SPS:samples per secone 每秒采样的次数)。

S3C2410的AD采集的最小量化单位为3.3V/(2^10)=3.222mV,也即当输入最大电压3.3V时,10位数据位为11 1111 1111 (对应十进制是1024),此时对应的电位器阻值为:1024*3.222mV*10^4/3.3≈10KΩ。

二、AD转换相关的寄存器:

ADC控制寄存器(ADCCON)

ADC触摸屏控制寄存器(ADCTSC)

ADC启动延时寄存器(ADCDLY)

ADC转换数据寄存器(ADCDATn)

说明:

时钟公式:A/D converter freq. = PCLK/(prescaler+1) = f
                    Conversion time = 1/(f / 5cycles) = 1/200KHz = 5 us

 通过设置ADC控制寄存器ADCCON,ADCCON[14]位启用预分频器,ADCCON[13:6]位配置预分频值prescaler valuef,从而根据公式得到所需时钟频率(A/D converter freq.)。

ADCDATn有ADCDAT0和ADCDAT1两个ADC转换数据寄存器。

ADCDATn为只读。

在触摸屏应用中,ADCDAT0和ADCDAT1保存X和Y位置转换数据。

普通的AD转换,只用ADCDAT0来保存转换后的数据。

启动AD转换,寄存器ADCCON[0]位置置1即可,后加while(ADCCON&0x1);等待成功开启。
等待转换结束,使用while(!(ADCCON&0x8000));即可。
通过寄存器ADCDAT0低10位读取转换结果(ADCDAT0&0x3ff)。


三、AD接口编程一般步骤

1、设置AD是否分频、工作时钟、工作方式

2、选择模拟输入通道

3、启动AD转换

4、等待AD转换结束

5、读取AD转换结果

四、编程实例及代码

A/D转换器的通道0获取模拟数据,并将转换后的数字量在CRT上打印出来。 

1 .定义与 A/D 转换相关的寄存器。 
#define rADCCON (*(volatile unsigned *)0x58000000) //ADC控制寄存器
#define rADCTSC (*(volatile unsigned *)0x58000004) //ADC触摸屏控制寄存器
#define rADCDLY (*(volatile unsigned *)0x58000008) //ADC启动或间隔延时寄存
器
#define rADCDAT0 (*(volatile unsigned *)0x5800000c) //ADC转换数据寄存器0
#define rADCDAT1 (*(volatile unsigned *)0x58000010) //ADC转换数据寄存器1
2 .对 A/D 转换器进行初始化。这里的参数 ch 表示选择的通道号。
void AD_Init(unsigned char ch){
rADCDLY = 100; //ADC启动或间隔延时
rADCTSC = 0; //选择ADC模式
rADCCON = (1<<14)|(49<<6)|(ch<<3)|(0<<2)|(0<<1)|(0); //设置ADC控制寄存器
}
3 .获取 A/D 的转换值。参数 ch 为选用的通道号。
int Get_AD(unsigned char ch){
int i;
int val=0;
if(ch>7) return 0; //通道不能大于7
for(i=0;i<16;i++){ //为转换准确, 转换16次
rADCCON |= 0x1; //启动 A/D 转换
rADCCON = rADCCON & 0xffc7 | (ch<<3);
while (rADCCON & 0x1); //避免第一个标志出错
while (!(rADCCON & 0x8000)); //避免第二个标志出错
val += (rADCDAT0 & 0x03ff);
Delay(10);
}
return (val>>4); //为转换准确, 除以16取均值
}
4. UART打印A/D的转换值。
 void display_adc(int val)
{
	int ch=val;
	ch=ch&0x200;ch=ch>>9;sendc(ch);
	ch=val;ch=ch&0x100;ch=ch>>8;sendc(ch);
	ch=val;ch=ch&0x80;ch=ch>>7;sendc(ch);
	ch=val;ch=ch&0x40;ch=ch>>6;sendc(ch);
	ch=val;ch=ch&0x20;ch=ch>>5;sendc(ch);
	ch=val;ch=ch&0x10;ch=ch>>4;sendc(ch);
	ch=val;ch=ch&0x8;ch=ch>>3;sendc(ch);
	ch=val;ch=ch&0x4;ch=ch>>2;sendc(ch);
	ch=val;ch=ch&0x2;ch=ch>>1;sendc(ch);
	ch=val;ch=ch&0x1;sendc(ch);
	uart_txd('\n');uart_txd('\r');
}


 5. 主函数 
 
 
void main(void)
{
	uart_init();
	AD_Init(0);
	while(1)
	{
	 int val;
	 val=Get_AD(0);
	 display_adc(val);
	}
}

UART相关配置见UART篇



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值