ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:46.58KB ,
资源ID:5983852      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5983852.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式A D接口实验.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式A D接口实验.docx

1、嵌入式A D接口实验2.4 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 下的程序编译与交叉编译过程。四

2、、实验设备及工具硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机 Pentium 500 以上, 硬盘 10G 以上。 软件:PC 机操作系统 REDHAT LINUX 9.0MINICOMARM-LINUX 开发环境五、实验原理1、A/D 转换器A/D 转换器是模拟信号源和 CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换 为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采 集及许多其他领域中,A/D 转换是不可缺少的。A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压频率型,主 要应根据使用场合的具体要求

3、,按照转换速度、精度、价格、功能以及接口条件等因素来 决定选择何种类型。常用的有以下两种: 双积分型的 A/D 转换器 双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压 积分的时间 T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源 Vref 反向积分,积分电容被放电至零所需的时间 T1。模拟输入电压 Vi 与参考电压 VRef 之比,等 于上述两个时间之比。由于 VRef 、T0 固定,而放电时间 T1 可以测出,因而可计算出模拟输 入电压的大小(VRef 与 Vi 符号相反)。由于 T0、VRef 为已知的固定常数,因此反向积分时间 T1 与输

4、入模拟电压 Vi 在 T0 时间内的平 均值成正比。输入电压 Vi 愈高,VA 愈大,T1 就愈长。在 T1 开始时刻,控制逻辑同时打开计 数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。则计数器所计出的数字 即正比于输入电压 Vi 在 T0 时间内的平均值,于是完成了一次 A/D 转换。由于双积分型 A/D 转换是测量输入电压 Vi 在 T0 时间内的平均值,所以对常态干扰(串摸干 扰)有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。双积分型的 A/D 转换器电路简单,抗干扰能力强,精度高,这是突出的优点。但转换速度 比较慢,常用的 A/D 转换芯片的转换时间为毫秒级

5、。例如 12 位的积分型 A/D 芯片 ADCETl2BC, 其转换时间为 lms。因此适用于模拟信号变化缓慢,采样速率要求较低,而对精度要求较 高,或现场干扰较严重的场合。例如在数字电压表中常被采用。 逐次逼近型的 A/D 转换器逐次逼近型(也称逐位比较式)的 A/D 转换器,应用比积分型更为广泛,其原理框图如图2.4.1 所示,主要由逐次逼近寄存器 SAR、D/A 转换器、比较器以及时序和控制逻辑等部分 组成。它的实质是逐次把设定的 SAR 寄存器中的数字量经 D/A 转换后得到电压 Vc 与待转换模拟电压 V。进行比较。比较时,先从 SAR 的最高位开始,逐次确定各位的数码应是“1”还是

6、“0”,其工作过程如下:转换前,先将 SAR 寄存器各位清零。转换开始时,控制逻辑电路先设定 SAR 寄存器的最高 位为“1”,其余位为“0”,此试探值经 D/A 转换成电压 Vc,然后将 Vc 与模拟输入电压 Vx 比 较。如果 VxVc,说明 SAR 最高位的“1”应予保留;如果 VxVc,说明 SAR 该位应予清零。 然后再对 SAR 寄存器的次高位置“1”,依上述方法进行 D/A 转换和比较。如此重复上述过程, 直至确定 SAR 寄存器的最低位为止。过程结束后,状态线改变状态,表明已完成一次转换。 最后,逐次逼近寄存器 SAR 中的内容就是与输入模拟量 V 相对应的二进制数字量。显然

7、A/D 转换器的位数 N 决定于 SAR 的位数和 D/A 的位数。图 2.4.1(b)表示四位 A/D 转换器的逐次 逼近过程。转换结果能否准确逼近模拟信号,主要取决于 SAR 和 D/A 的位数。位数越多, 越能准确逼近模拟量,但转换所需的时间也越长。z 逐次逼近式的 A/D 转换器的主要特点是:转换速度较快,在 1100/s 以内,分辨率可以达 18 位,特别适用于工业控制系统。转 换时间固定,不随输入信号的变化而变化。抗干扰能力相对积分型的差。例如,对模拟输 入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干 扰信号在内,都被采样和转换为数字量,这就会造成较

8、大的误差,所以有必要采取适当的 滤波措施。图 2.4.1 逐次逼近式 A/D 转换器2、A/D 转换的重要指标 分辨率(Resolution)分辨率反映 A/D 转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。n 位 A/D 能反应 1/2n 满量程的模拟输入电平。由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即 n 位二进制数, 最低位所具有的权值,就是它的分辨率。 值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。即使分辨率很高, 也可能由于温度漂移、线性度等原因,而使其精度不够高。 精度(Accur

9、acy)精度有绝对精度(Absolute Accuracy)和相对精度(Relative Accuracy)两种表示方法。z 绝对误差: 在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。我们把它们之间的差的最大值,定义为“绝对误差”。通常以数字量的最小有 效位(LSB)的分数值来表示绝对误差,例如: 1LSB 等。绝对误差包括量化误差和其它所 有误差。z 相对误差 是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。例如,满量程为 10V,10 位 A/D 芯片,若其绝对精度为 1/2LSB,则其最小有效

10、位的量化 单位:9.77mV,其绝对精度为4.88mV,其相对精度为 0.048%。z 转换时间(Conversion Time)转换时间是指完成一次 A/D 转换所需的时间,即由发出启动转换命令信号到转换结束信号 开始有效的时间间隔。转换时间的倒数称为转换速率。例如 AD570 的转换时间为 25us,其 转换速率为 40KHz。z 电源灵敏度(power supply sensitivity)电源灵敏度是指 A/D 转换芯片的供电电源的电压发生变化时,产生的转换误差。一般用电 源电压变化 1时相当的模拟量变化的百分数来表示。z 量程量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类

11、型。 例如,单极性 量程为 0+5V,0+10V,0+20V;双极性 量程为-5+5V,-10+10V。z 输出逻辑电平多数 A/D 转换器的输出逻辑电平与 TTL 电平兼容。在考虑数字量输出与微处理的数据总线 接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。z 工作温度范围由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。一般 A/D 转换器的工作温度范围为(0700C),军用品的工作温度范围 为(-55+1250C) ARM 自带的十位 A/D 转换器ARM S3C2410 芯片自带一个路 10 位 A/D 转换器,并且支持触摸屏功能

12、。ARM2410 开发板 只用作 3 路 A/D 转换器,其最大转换率为 500K,非线性度为正负.5 位,其转换时间可以 通过下式计算:如果系统时钟为 50MHz,比例值为 49,则为A/D 转换器频率50 MHz/(49+1) = 1 MHz转换时间1/(1 MHz / 5cycles) = 1/200 kHz(相当于 5us)= 5 us表 2.4.1 采样控制寄存器的设置寄存器地址读/写描述复位值ADCCON0x58000000R/WADC 控制寄存器0x3FC4表 2.4.2 采样控制寄存器的位描述ADCCON位描述初始设置ECFLG15End of conversion flag

13、(read only).0 = A/D conversion in process1 = End of A/D conversion0PRSCEN14A/D converter prescaler enable.0 = Disable1 = Enable0PRSCVL13:6A/D converter prescaler value. Data value: 1 255Note that division factor is (N+1) when the prescaler value isN.0xFFSEL_MUX5:3Analog input channel select. 000 = A

14、IN 0001 = AIN 1010 = AIN 2011 = AIN 3100 = AIN 4101 = AIN 5110 = AIN 6111 = AIN 7 (XP)0STDBM2Standby mode select.0 = Normal operation mode1 = Standby mode1READ_ START1A/D conversion start by read.0 = Disable start by read operation1 = Enable start by read operation0ENABLE_ START0A/D conversion start

15、s by setting this bit.If READ_START is enabled, this value is not valid.0 = No operation 1 = A/D conversion starts and this bit is cleared after the start-up.0该寄存器的 0 位是转换使能位,写 1 表示转换开始。1 位是读操作使能转换,写表示转换在读操作时开始。3、4、5 位是通道号。13:6位为 AD 转换比例因子。14 位为比例因子 有效位,15 位为转换标志位(只读)。表2.4.3A/D转换结果数据寄存器的设置寄存器地址读/写描述

16、复位值ADCDAT00x5800000CRADC转换数据寄存器-ADCDAT0:转换结果数据寄存器。该寄存器的十位表示转换后的结果,全为 1 时为满量程3.3 伏。 A/D 转换器在扩展板的连接A/D 转换器在扩展板的接法如图 2.4.2 所示,前三路通过电位器接到 3.3v 电源上。图 2.4.2 A/D 转换器在扩展板上的接法六、程序分析(关键代码分析)ad 驱动对用户来说只是下面的一个文件结构。在用户程序里只需要用到 open、 read、write、 release 等内核函数即可。本实验采用的是模块方式加载,可以在实验箱的/mnt/yaffs/ad/ 中找到 AD 的驱动程序。sta

17、tic struct file_operations s3c2410_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

18、 章第一小节,本节只作 为应用实验的简单例子。static int s3c2410_adc_open(struct inode *inode, struct file *file)init_MUTEX(&adcdev.lock); init_waitqueue_head(&(adcdev.wait); adcdev.channel=0; adcdev.prescale=0xff; MOD_INC_USE_COUNT; DPRINTK( adc openedn);return 0; /AD 通道和比例因子初始化static ssize_t s3c2410_adc_write(struct fil

19、e *file, const char *buffer, size_t count, loff_t * ppos)int data;if(count!=sizeof(data)/error input data sizeDPRINTK(the size of input data must be %dn, sizeof(data);return 0;copy_from_user(&data, buffer, count); adcdev.channel=ADC_WRITE_GETCH(data); adcdev.prescale=ADC_WRITE_GETPRE(data);DPRINTK(s

20、et adc channel=%d, prescale=0x%xn, adcdev.channel, adcdev.prescale);return count; /告诉内核驱动读哪一个通道的数据和设置比例因子#define START_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 位选择通道

21、;/ADCCON |= ADC_START; ADCCON 0 为置 1,准备采集数据static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)int ret = 0;if (down_interruptible(&adcdev.lock)return -ERESTARTSYS; START_ADC_AIN(adcdev.channel, adcdev.prescale); interruptible_sleep_on(&adcdev.wait);ret = ADCDA

22、T0;ret &= 0x3ff; /把数据寄存器内容放入变量 retDPRINTK(AIN%d = 0x%04x, %dn, adcdev.channel, ret, ADCCON & 0x80 ? 1:0);copy_to_user(buffer, (char *)&ret, sizeof(ret);up(&adcdev.lock);return sizeof(ret);/把 ret 变量的内容传给用户缓冲区 /由内核采集通道数据后把数据放回用户区main.c 的代码如下:/*by threewater*2004.06.18*/#include #include #include #incl

23、ude #include #include #include #include s3c2410-adc.h#define ADC_DEV /dev/adc/0raw static int adc_fd = -1;static int init_ADdevice(void)if(adc_fd=open(ADC_DEV, O_RDWR)0)printf(Error opening %s adc devicen, ADC_DEV);return -1;static int GetADresult(int channel)int PRESCALE=0XFF;int data=ADC_WRITE(cha

24、nnel, PRESCALE);write(adc_fd, &data, sizeof(data); read(adc_fd, &data, sizeof(data); return data;static int stop=0;static void* comMonitor(void* data)getchar();stop=1;return NULL;int main(void)int i;float d;pthread_t th_com;void * retval;/set s3c44b0 AD register and start ADif(init_ADdevice()0)retur

25、n -1;/* Create the threads */pthread_create(&th_com, NULL, comMonitor, 0);printf(nPress Enter key exit!n);while( stop=0 )for(i=0; i=2; i+)/采样 02 路 A/D 值d=(float)GetADresult(i)*3.3)/1024.0;printf(a%d=%8.4ft,i,d); usleep(1); printf(r);/* Wait until producer and consumer finish. */pthread_join(th_com,

26、&retval);printf(n);return 0;七、实验步骤1、阅读理解源码进入/arm2410cl/exp/basic/04_ad 目录,使用 vi 编辑器或其他编辑器阅读理解源代码。2、编译应用程序运行 make 产生 ad 可执行文件rootzxt /# cd /arm2410cl/exp/basic/04_ad/ rootzxt 04_ad# makearmv4l-unknown-linux-gcc -c -o main.o main.carmv4l-unknown-linux-gcc -o ./bin/ad main.o -lpthread armv4l-unknown-li

27、nux-gcc -o ad main.o -lpthread rootzxt 04_ad# lsad hardware.h main.o Makefile.bak s3c2410-adc.hbin main.c Makefile readme.txt src3、下载调试换到 minicom 终端窗口,使用 NFS mount 开发主机的/arm2410cl 到/host 目录。rootzxt root# minicom/mnt/yaffs mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host/mnt/yaffsinsmod ad/s3c241

28、0-adc.o /mnt/yaffscd /host/exp/basic/04_ad/ /host/exp/basic/04_ad./adPress Enter key exit!a0= 0.0032 a1= 3.2968 a2= 3.2968我们可以通过调节开发板上的三个黄色的电位器,来查看 a0、a1、a2 的变化。八、思考题1. 逐次逼近型的 A/D 转换器原理是什么?2 A/D 转换的重要指标包括哪些?3 ARM 的 A/D 功能的相关寄存器有哪几个,对应的地址是什么?4 如何启动 ARM 开始转换 A/D,有几种方式?转换开始时 ARM 是如何知道转换哪路通道 的?如何判断转换结束?

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1