×
单片机 > 单片机程序设计 > 详情

S3C2410 普通AD转换

发布时间:2020-09-03 发布时间:
|

一、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篇



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘