S3C2410 普通AD转换

发布者:meilidaowl最新更新时间:2019-09-06 来源: eefocus关键字: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篇

关键字:S3C2410  AD转换  模—数转换 引用地址:S3C2410 普通AD转换

上一篇:S3C2410 UART 发送变量字符
下一篇:mini2440A 裸机编程:串口控制LED灯的亮灭

推荐阅读最新更新时间:2024-11-13 15:52

s3c2410_gpio_setpin()等系列函数
函数的定义在arch/arm/mach-s3c2410/gpio.c,相关的宏定义在include/asm-arm/arch-s3c2410/regs-gpio.h (1)voids3c2410_gpio_setpin(unsigned int pin, unsigned intto); 设置相应GPIO口的输出值,例如: pin=S3C2410_GPG2,to=0,则设置S3C2410_GPG2的输出值为0; pin=S3C2410_GPG2,to=1,则设置S3C2410_GPG2的输出值为1。 函数定义: viewplain void s3c2410_gpio_setpin(u
[单片机]
S3C2440 AD转换
10 位CMOS ADC(模/数转换器)是一个8 通道模拟输入的再循环类型设备。其转换模拟输入信号为10 位二 进制数字编码,最大转换率为2.5MHz A/D转换器时钟下的 500 KSPS。A/D 转换器支持片上采样-保持功能和掉电 模式的操作。 触摸屏在下一篇文章,ADC转换比较简单,这里贴出一个代码 view plain copy #include 2440addr.h #include 2440lib.h #include def.h //==================================================================
[单片机]
S3C2440 <font color='red'>AD转换</font>器
S3C2410存储器管理单元
MMU,全称Memory Manage Unit, 中文名 存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人
[单片机]
<font color='red'>S3C2410</font>存储器管理单元
PIC单片机基础知识之AD转换
AD转换 我们先看看R1和R2,R2是个可调电阻 如果我们将R2变大 RA0这个管脚上的电压就越大。R2变小 RA0这个管脚上的电压就越小。那单片机是怎么知道电压变化的。这就需要AD转换。就是将模拟量转换成数字量。 PIC单片机如何表示电压 PIC用十位二进制位的数来表示电压,也就是数值0~1023来表示电压。那比如现在这个数值是400那这代表多少的电压?这就要根据参考电压来确定了。 比如我们设置正参考电压为3.3V ,当输入的电压为0时,数值就为0。当输入的电压为3.3V时,数值就是1023. 那如果输入的电压是1.2V代表多少电压。 首先,先算出一个数值代表多少的电压 3.3V除以1023 约等于 0
[单片机]
PIC单片机基础知识之<font color='red'>AD转换</font>
STM32 八路AD转换用DMA传输调试成功,DMA传输不错位
// // #include stm32f10x_conf.h //把DMA.h和ADC.h 的注释去掉 #include stm32f10x.h #include stm32_eval.h #include #define N 50 //每通道采50次 #define M 8 //为8个通道 #define ADC1_DR_Address ((u32)0x4001244C) vu16 After_filter ; //用来存放求平均值之后的结果 vu16 AD_Value ; //用来存放ADC转换结果,也是DMA的目标地址
[单片机]
Linux2.4.18核心移植到s3c2410全过程
一.下载核心以及相应补丁: Linux核心:linux-2.4.18.tar.bz2 补丁: patch-2.4.18-rmk7.gz patch-2.4.18-rmk7-swl8.gz patch-2.4.18-rmk7-swl8-cy2.gz patch-2.4.18-rmk7-swl8-cy2-lc3.gz 二. 解压缩: # tar xzvf linux-2.4.18.tar.gz # gunzip patch-2.4.18-rmk7.gz # gunzip patch-2.4.18-rmk7-swl8.gz # gunzip patch-2.4.18-rmk7-swl8-cy2.gz # gunzip p
[单片机]
关于中颖4位单片机AD转换中的一些经验
关于中颖4位机10位AD篇章中的数据处理,10位数据也即: 1111,1111,XX11 或 X111,1111,111X ; 1,起初以为10位数据取8位,把低两位直接省掉就可以了,准备开始写程序了,偶然看到论坛里的一个人也在这里; 于是重新进入中颖网站,原来 1111,1111,XX11 得合并为 1111,1111,11 然后再求和,取平均值; 处理方法,最低位和0011相于,把中位用ADDM左移两位空出低,并上低位, ,得低位;再把中位右位两位得 ,等 待高位,然后把高位左移两位 与中位相或,得中位,最后把高右移位两位,即数据变为 11,1111,1111 ; 想一下吧,是不是很简单?! 2,我根据上面的思路,自已
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved