历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2019年09月06日 | S3C2410 普通AD转换

2019-09-06 来源:eefocus

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

推荐阅读

史海拾趣

Electrocube Inc公司的发展小趣事

Electrocube Inc公司高度重视产品质量管理。公司建立了严格的质量管理体系,从原材料采购到生产流程控制,再到产品检验和售后服务,每一个环节都严格把关。这种对质量的执着追求,使得Electrocube Inc公司的产品具有极高的可靠性和稳定性,赢得了客户的信赖和好评。

Etron公司的发展小趣事

进入21世纪,电子行业的竞争日益激烈,钰创科技意识到必须不断进行技术创新才能保持竞争优势。公司加大了研发投入,成功开发出了一系列先进的内存芯片和系统芯片技术。这些技术突破不仅提升了产品的性能和质量,也帮助公司赢得了更多国际客户的认可和信任。

品赞(G-Switch)公司的发展小趣事
电路结构相对简单,易于实现和维护。
Electronicon Kondensatoren GmbH公司的发展小趣事

1976年,ELECTRONICON推出了采用金属化聚丙烯薄膜的电容器系列,这一创新技术为电容器行业带来了显著的空间和成本优势,进一步巩固了其在市场上的领先地位。随着技术的不断进步,ELECTRONICON的产品逐渐拓展至照明、电机和电力电子等多个领域。

Apacer公司的发展小趣事

在各大电子展会上,Apacer宇瞻科技也频繁亮相,展示其最新技术和产品。在某次台北世界贸易中心的展会上,宇瞻科技展示了一款高端DDR3内存,其频率高达1600MHz,带宽达到了惊人的12800MB/s。这一产品吸引了众多观众的关注,也进一步彰显了宇瞻科技在内存模组领域的领先地位。

这五个故事只是Apacer宇瞻科技发展历程中的一部分,但它们足以展现出公司从创立到崛起的艰辛与辉煌。在未来的发展中,相信宇瞻科技将继续凭借其卓越的技术实力和持续的创新精神,为电子行业的发展贡献更多力量。

Exar [Exar Corporation]公司的发展小趣事

2017年,Exar被MaxLinear公司收购,这是Exar发展历程中的一个重要里程碑。通过合并,Exar和MaxLinear的产品和技术得到了有效整合,两家公司在模拟和混合信号领域的优势得到了进一步加强。合并后的公司继续在通信、视频处理、存储、电源管理和时钟管理等多个领域发挥重要作用。

问答坊 | AI 解惑

PCB转成SCH

您们好!     关于Protel PCB 转成SCH原理图问题,本人通过Omninet for Windows、E-Studio软件转换不能成功?用protel自带的PCB图转成SCH图是可以转换成功,不过,此自带PCB元器件全是插件封装。本人需要转成SCH图的PCB图全是贴片封装元 ...…

查看全部问答>

我要去杭州利尔达公司面试,有利尔达的同事吗,请进来下

请问,利尔达的笔试题目大概是什么方向的,我第一次进利尔达公司做笔试,哥哥,姐姐们,给点精神上与物质上的支持吧…

查看全部问答>

wince的进程切换

wince当没有现成需要工作的时候会进入的kernel内的idle线程。 假设这个时候驱动有个线程要工作了,那是不是要做进程切换到device.exe. 这种切换是不是费时,让cpu的实时性变差。 ISR线程应该属于nk.exe没错吧?所以中断从ISR到IST肯定也是要进程 ...…

查看全部问答>

红外避障

我想用一体化接收头做个红外避障的传感器,可是为什么我发射头明明离得很远甚至遮住了,可是接收头还是输出低电平。 有时候能正常工作,但距离只有1cm左右。谁做过的帮忙看下呀~~ 有没有电路图给发个~~ 谢谢了~…

查看全部问答>

调用flash插件问题

我在wince中使用的是flashplay7 for ppc的插件,把安装后的flash.dll文件拷到PC机上,并在工程里引用了这个flash.dll,但这个dll不是OCX控件,请问怎么显示到界面上?我看到flash.dll里的方法跟PC的OCX控件上一样,就是不知道怎么显示出来。…

查看全部问答>

串口通讯

我这有个串口问题想请教。。设备有一套协议,根据协议,用测试软件发送指令,设备没任何反应,而客户那是经过测试过的,设备和测试软件正常。为什么到我这就不正常了 ?和我机器串口设置有关系吗?当然,串口的波特率 效验什么的测试软件已经设置好 ...…

查看全部问答>

修改位图像素颜色

在EVC上对一幅位图的每个像素设置颜色,采用setpixel函数,同样的代码,在VC上可以运行得到正确结果,但放在EVC上运行就不起作用,编译可以通过也可以运行,就是没效果出来,不知是否setpixel在evc上不支持?         &n ...…

查看全部问答>

vca810过teeple点后产生失真怎么解决?求大侠们

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 我在-40dB到20dBvca810片子工作很好,过teeple点后产生很严重失真!  …

查看全部问答>

怎么解读一个大的VHDL工程?

这段时间都在研究师兄们之前写的VHDL工程。研读人家的工程有好处,也有坏处。 好处是可以学习人家的建模思想和描述风格,坏处是老让别人牵着鼻子走,代码稍微复杂一点,就搞得晕头转向,疲惫不堪。  所以,有必要总结一下分析大工程的经验 ...…

查看全部问答>

【设计工具】Xilinx生成原理图

$(\'swf_mXS\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMTYxMTAwNjY4/v.sw ...…

查看全部问答>