实验3AD接口实验.docx
- 文档编号:3455166
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:12
- 大小:63.78KB
实验3AD接口实验.docx
《实验3AD接口实验.docx》由会员分享,可在线阅读,更多相关《实验3AD接口实验.docx(12页珍藏版)》请在冰豆网上搜索。
实验3AD接口实验
实验3:
A/D接口实验
一、实验目的
了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。
二、实验内容
学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。
阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。
利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。
三、预备知识
Ø有C语言基础。
Ø掌握在Linux下常用编辑器的使用。
Ø掌握Makefile的编写和使用。
Ø掌握Linux下的程序编译与交叉编译过程。
四、实验设备及工具
硬件:
UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
五、实验原理
1、A/D转换器
A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。
在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。
A/D转换器有以下类型:
逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。
常用的有以下两种:
Ø双积分型的A/D转换器
双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源Vref反向积分,积分电容被放电至零所需的时间T1。
模拟输入电压Vi与参考电压VRef之比,等于上述两个时间之比。
由于VRef、T0固定,而放电时间T1可以测出,因而可计算出模拟输入电压的大小(VRef与Vi符号相反)。
由于T0、VRef为已知的固定常数,因此反向积分时间T1与输入模拟电压Vi在T0时间内的平均值成正比。
输入电压Vi愈高,VA愈大,T1就愈长。
在T1开始时刻,控制逻辑同时打开计数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。
则计数器所计出的数字即正比于输入电压Vi在T0时间内的平均值,于是完成了一次A/D转换。
由于双积分型A/D转换是测量输入电压Vi在T0时间内的平均值,所以对常态干扰(串摸干扰)有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。
双积分型的A/D转换器电路简单,抗干扰能力强,精度高,这是突出的优点。
但转换速度比较慢,常用的A/D转换芯片的转换时间为毫秒级。
例如12位的积分型A/D芯片ADCETl2BC,其转换时间为lms。
因此适用于模拟信号变化缓慢,采样速率要求较低,而对精度要求较高,或现场干扰较严重的场合。
例如在数字电压表中常被采用。
Ø逐次逼近型的A/D转换器
逐次逼近型(也称逐位比较式)的A/D转换器,应用比积分型更为广泛,其原理框图如图2.4.1所示,主要由逐次逼近寄存器SAR、D/A转换器、比较器以及时序和控制逻辑等部分组成。
它的实质是逐次把设定的SAR寄存器中的数字量经D/A转换后得到电压Vc与待转换模拟电压V。
进行比较。
比较时,先从SAR的最高位开始,逐次确定各位的数码应是“1”还+是“0”,其工作过程如下:
转换前,先将SAR寄存器各位清零。
转换开始时,控制逻辑电路先设定SAR寄存器的最高位为“1”,其余位为“0”,此试探值经D/A转换成电压Vc,然后将Vc与模拟输入电压Vx比较。
如果Vx≥Vc,说明SAR最高位的“1”应予保留;如果Vx 然后再对SAR寄存器的次高位置“1”,依上述方法进行D/A转换和比较。 如此重复上述过程,直至确定SAR寄存器的最低位为止。 过程结束后,状态线改变状态,表明已完成一次转换。 最后,逐次逼近寄存器SAR中的内容就是与输入模拟量V相对应的二进制数字量。 显然A/D转换器的位数N决定于SAR的位数和D/A的位数。 图2.4.1(b)表示四位A/D转换器的逐次逼近过程。 转换结果能否准确逼近模拟信号,主要取决于SAR和D/A的位数。 位数越多,越能准确逼近模拟量,但转换所需的时间也越长。 ●逐次逼近式的A/D转换器的主要特点是: 转换速度较快,在1—100/μs以内,分辨率可以达18位,特别适用于工业控制系统。 转换时间固定,不随输入信号的变化而变化。 抗干扰能力相对积分型的差。 例如,对模拟输入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰信号在内,都被采样和转换为数字量,这就会造成较大的误差,所以有必要采取适当的滤波措施。 图2.4.1逐次逼近式A/D转换器 2、A/D转换的重要指标 Ø分辨率(Resolution) 分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。 n位A/D能反应1/2n满量程的模拟输入电平。 由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n位二进制数,最低位所具有的权值,就是它的分辨率。 值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。 即使分辨率很高,也可能由于温度漂移、线性度等原因,而使其精度不够高。 Ø精度(Accuracy) 精度有绝对精度(AbsoluteAccuracy)和相对精度(RelativeAccuracy)两种表示方法。 ●绝对误差: 在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。 我们把它们之间的差的最大值,定义为“绝对误差”。 通常以数字量的最小有效位(LSB)的分数值来表示绝对误差,例如: 1LSB等。 绝对误差包括量化误差和其它所有误差。 ●相对误差 是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。 例如,满量程为10V,10位A/D芯片,若其绝对精度为 1/2LSB,则其最小有效位的量化单位: 9.77mV,其绝对精度为=4.88mV,其相对精度为0.048%。 ●转换时间(ConversionTime) 转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。 转换时间的倒数称为转换速率。 例如AD570的转换时间为25us,其转换速率为40KHz。 ●电源灵敏度(powersupplysensitivity) 电源灵敏度是指A/D转换芯片的供电电源的电压发生变化时,产生的转换误差。 一般用电源电压变化1%时相当的模拟量变化的百分数来表示。 ●量程 量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。 例如,单极性量程为0~+5V,0~+10V,0~+20V; 双极性量程为-5~+5V,-10~+10V。 ●输出逻辑电平 多数A/D转换器的输出逻辑电平与TTL电平兼容。 在考虑数字量输出与微处理的数据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。 ●工作温度范围 由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。 一般A/D转换器的工作温度范围为(0~700C),军用品的工作温度范围为(-55~+1250C) ØARM自带的十位A/D转换器 ARMS3C2410芯片自带一个8路10位A/D转换器,并且支持触摸屏功能。 ARM2410开发板只用作3路A/D转换器,其最大转换率为500K,非线性度为正负1.5位,其转换时间可以通过下式计算: 如果系统时钟为50MHz,比例值为49,则为 A/D转换器频率=50MHz/(49+1)=1MHz 转换时间=1/(1MHz/5cycles)=1/200kHz(相当于5us)=5us 表2.4.1采样控制寄存器的设置 寄存器 地址 读/写 描述 复位值 ADCCON 0x58000000 R/W ADC控制寄存器 0x3FC4 表2.4.2采样控制寄存器的位描述 ADCCON 位 描述 初始设置 ECFLG [15] Endofconversionflag(readonly). 0=A/Dconversioninprocess 1=EndofA/Dconversion 0 PRSCEN [14] A/Dconverterprescalerenable. 0=Disable 1=Enable 0 PRSCVL [13: 6] A/Dconverterprescalervalue. Datavalue: 1~255 Notethatdivisionfactoris(N+1)whentheprescalervalueisN. 0xFF SEL_MUX [5: 3] Analoginputchannelselect.000=AIN0 001=AIN1 010=AIN2 011=AIN3 100=AIN4 101=AIN5 110=AIN6 111=AIN7(XP) 0 STDBM [2] Standbymodeselect. 0=Normaloperationmode 1=Standbymode 1 READ_ START [1] A/Dconversionstartbyread. 0=Disablestartbyreadoperation 1=Enablestartbyreadoperation 0 ENABLE_ START [0] A/Dconversionstartsbysettingthisbit. IfREAD_STARTisenabled,thisvalueisnotvalid. 0=Nooperation1=A/Dconversionstartsandthisbitisclearedafterthestart-up. 0 该寄存器的0位是转换使能位,写1表示转换开始。 1位是读操作使能转换,写1表示转换在读操作时开始。 3、4、5位是通道号。 [13: 6]位为AD转换比例因子。 14位为比例因子有效位,15位为转换标志位(只读)。 表2.4.3A/D转换结果数据寄存器的设置 寄存器 地址 读/写 描述 复位值 ADCDAT0 0x5800000C R ADC转换数据寄存器 - ADCDAT0: 转换结果数据寄存器。 该寄存器的十位表示转换后的结果,全为1时为满量程3.3伏。 ØA/D转换器在扩展板的连接 A/D转换器在扩展板的接法如图2.4.2所示,前三路通过电位器接到3.3v电源上。 图2.4.2A/D转换器在扩展板上的接法 六、程序分析 1、关键代码分析 由于编译开发板内核时直接把ad驱动加入到内核里面,对用户的只是下面的一个文件结构。 在用户程序里只需要用到open、read、write、release等内核函数即可。 staticstructfile_operationss3c2410_fops={ owner: THIS_MODULE, open: s3c2410_adc_open, read: s3c2410_adc_read, write: s3c2410_adc_write, release: s3c2410_adc_release, }; 下面我们对驱动部分重要函数进行说明。 ad驱动在内核里的代码我们放到了本次实验的src文件下,s3c2410.h_chip.h里为arm2410头文件s3c2410.h初始化ADC的部分。 所有代码也可以到内核里面去阅读。 关于驱动知识的基本介绍请见第4章第一小节,本节只作为应用实验的简单例子。 staticints3c2410_adc_open(structinode*inode,structfile*file) { init_MUTEX(&adcdev.lock); init_waitqueue_head(&(adcdev.wait)); adcdev.channel=0; adcdev.prescale=0xff; MOD_INC_USE_COUNT; DPRINTK("adcopened\n"); return0; }//AD通道和比例因子初始化 staticssize_ts3c2410_adc_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos) { intdata; if(count! =sizeof(data)){ //errorinputdatasize DPRINTK("thesizeofinputdatamustbe%d\n",sizeof(data)); return0; } copy_from_user(&data,buffer,count); adcdev.channel=ADC_WRITE_GETCH(data); adcdev.prescale=ADC_WRITE_GETPRE(data); DPRINTK("setadcchannel=%d,prescale=0x%x\n",adcdev.channel,adcdev.prescale); returncount; }//告诉内核驱动读哪一个通道的数据和设置比例因子 #defineSTART_ADC_AIN(ch,prescale)\ do{\ ADCCON=PRESCALE_EN|PRSCVL(prescale)|ADC_INPUT((ch));\ ADCCON|=ADC_START;\ }while(0) //PRESCALE_EN左移14使位比例因子有效;PRSCVL左移6位设置比例因子; //ADC_INPUT左移3位选择通道; //ADCCON|=ADC_START;ADCCON0为置1,准备采集数据 staticssize_ts3c2410_adc_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos) { intret=0; if(down_interruptible(&adcdev.lock)) return-ERESTARTSYS; START_ADC_AIN(adcdev.channel,adcdev.prescale); interruptible_sleep_on(&adcdev.wait); ret=ADCDAT0; ret&=0x3ff;//把数据寄存器内容放入变量ret DPRINTK("AIN[%d]=0x%04x,%d\n",adcdev.channel,ret,ADCCON&0x80? 1: 0); copy_to_user(buffer,(char*)&ret,sizeof(ret)); //把ret变量的内容传给用户缓冲区 up(&adcdev.lock); returnsizeof(ret); }//由内核采集通道数据后把数据放回用户区 main.c的代码如下: /************************************************\ *bythreewater *2004.06.18* \***********************************************/ #include #include #include #include #include #include #include #include"s3c2410-adc.h" #defineADC_DEV"/dev/adc/0raw" staticintadc_fd=-1; staticintinit_ADdevice(void) { if((adc_fd=open(ADC_DEV,O_RDWR))<0){ printf("Erroropening%sadcdevice\n",ADC_DEV); return-1; } } staticintGetADresult(intchannel) { intPRESCALE=0XFF; intdata=ADC_WRITE(channel,PRESCALE); write(adc_fd,&data,sizeof(data)); read(adc_fd,&data,sizeof(data)); returndata; } staticintstop=0; staticvoid*comMonitor(void*data) { getchar(); stop=1; returnNULL; } intmain(void) { inti; floatd; pthread_tth_com; void*retval; //sets3c44b0ADregisterandstartAD if(init_ADdevice()<0) return-1; /*Createthethreads*/ pthread_create(&th_com,NULL,comMonitor,0); printf("\nPressEnterkeyexit! \n"); while(stop==0){ for(i=0;i<=2;i++){//采样0~2路A/D值 d=((float)GetADresult(i)*3.3)/1024.0; printf("a%d=%8.4f\t",i,d); } usleep (1); printf("\r"); } /*Waituntilproducerandconsumerfinish.*/ pthread_join(th_com,&retval); printf("\n"); return0; } 七、实验步骤 1、阅读理解源码 进入/arm2410s/exp/basic/04_ad目录,使用vi编辑器或其他编辑器阅读理解源代码。 2、编译应用程序 运行make产生ad可执行文件 [root@zxt/]#cd/arm2410s/exp/basic/04_ad/ [root@zxt04_ad]#make armv4l-unknown-linux-gcc-c-omain.omain.c armv4l-unknown-linux-gcc-o../bin/admain.o-lpthread armv4l-unknown-linux-gcc-oadmain.o-lpthread [root@zxt04_ad]#ls adhardware.hmain.oMakefile.baks3c2410-adc.h binmain.cMakefilereadme.txtsrc 3、下载调试 换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。 [root@zxtroot]#minicom [/mnt/yaffs]mount-tnfs-onolock192.168.0.56: /arm2410s/host [/mnt/yaffs]insmod/mnt/yaffs/ad/s3c2410-adc.o [/mnt/yaffs]cd/host/exp/basic/04_ad/ [/host/exp/basic/04_ad]./ad PressEnterkeyexit! a0=0.0032a1=3.2968a2=3.2968 我们可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2的变化。 备注: 驱动程序的加载 在实验台的终端提示符【mnt/yaffs】下进入ad目录 【mnt/yaffs】cdad 【mnt/yaffs/ad】insmods3c2410-adc.o s3c2410-adcinitialized 出现上述提示即加载成功。 八、实验要求 设定第1个采用次数为100次,统计一个值 n1 再设定第2个采用次数为100次,统计一个值 n2 …… 再设定第100个采用次数为100次,统计一个值 n100 求统计平均值N=(n1+n2+n3+……+n100)/100。 以列方式显示结果,按回车键开始采样,在按回车键结束。 九、思考题 1.逐次逼近型的A/D转换器原理是什么? 2.A/D转换的重要指标包括哪些? 3.ARM的A/D功能的相关寄存器有哪几个,对应的地址是什么? 4.如何启动ARM开始转换A/D,有几种方式? 转换开始时ARM是如何知道转换哪路通道的? 如何判断转换结束?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 AD 接口
![提示](https://static.bdocx.com/images/bang_tan.gif)