DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 145|回复: 0
打印 上一主题 下一主题

基于s3c2410和嵌入式Linux的D/A转换的实现

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-17 23:39:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 引言在嵌入式应用系统中,特别是智能仪器、仪表、机电设备及装置控制中,需要使用A/D转换将模拟的电量信号转换为数字信号进行处理,而后再将处理的结果通过D/A转换为模拟量实现对被控过程和对象的控制[1]。基于ARM920T内核的s3c2410是一款低功耗,高性价比的处理器[2]。这款处理器内部集成了多种控制接口,自带8路10位的A/D转换器[3],用于支持对于触摸屏输入的控制,而且足以满足外部模拟量采集的需要,但是s3c2410内部没有集成D/A转换器,因此在上述应用中,就需要采用独立的D/A转换芯片与s3c2410配合,满足应用的需要。而MAX504一款通用的10位串行D/A转换器,可以满足一般应用对于分辨率和精度的要求,并且采用串行通信,芯片面积小,占用的处理器管脚数少,因此本文中以s32410外接MAX504,并基于Linux操作系统,实现D/A转换的功能。2 系统硬件电路2.1 10位的D/A转换器MAX504[4]MAX504是MAXIUM公司推出的低功耗,电压输出,10位串行数字/模拟转换芯片,支持+5V单供电和±5V双供电方式,并且该芯片对于包括偏移、增益和线性误差在内的各项误差均以调整,所以应用非常简单,不需要再度校正。MAX504采用的是三线串行接口,与SPI,QSPI和Microwire标准均兼容。MAX504可通过写入两个8位长的数据进行编程,其写入的先后顺序为,4个填充位,10个数据位和最低两位的0。此处,最高4位的填充位只有当MAX504采用菊花链方式连接时必须写入,而最低的两位0则一定需要写入。当且仅当CS片选有效时,数据在SCLK的上升沿逐位打入片内的16位移位寄存器,并在CS上升沿,将有效的10位数据(第2"第11位)传送到D/A转换寄存器中,修改原寄存器内容。MAX504芯片为14管脚的DIP或者SO封装形式,除电源和地管脚外,管脚可以分为两组,一组与处理器相连接,另一组管脚的不同连接可以改变MAX504的工作模式。MAX504具有三种工作模式,分别是单极性输出,双极性输出和四象限乘法器。通过将MAX504的REIN,VOUT ,BIPOFF和RFB几个管脚的不同连接方式,可以根据需要将MAX504定义为需要的工作模式。2.2 MAX504与S3c2410的连接   MAX504与处理器之间可以使用SPI,QSPI和Microwire中的任何一种串行通信方式,而s3c2410带有两个SPI接口,所以MAX504与s32410之间通过SPI进行连接非常方便。电路如图所示图2.1 电路连接原理图  MAX504与处理器连接的主要管脚有四个,分别是:   (1) DIN—数据输入端,该管脚用于接收串行通信数据信号,直接与s3c2410的MOSI管脚连接即可。MOSIn(n可以为0或1,分别对应两个SPI口)管脚,s3c2410作为SPI串行通信的主模块使用,该管脚由s3c2410输出信号,MAX504作为通信的从设备进行数据的接收。   (2) SCLK—串行时钟输入端,该管脚用于接收串行通信的时钟信号,以便串行通信过程中的通信双方的同步,直接与s3c2410的SPI时钟输出管脚SPICLK连接即可。   (3) CS—片选管脚,该管脚为低电平有效,只有当CS有效时,MAX504接收数据,并在CS失效时,开始进行数据转换。本电路中,使用s3c2410的一根外部I/O管脚进行控制。   (4) CLR—清除端,该管脚也是低电平有效,可将MAX504的转换数据寄存器复位清零,本电路,使用s3c2410的另一个外部I/O脚进行控制。    该电路中,采用的是单极性工作模式,输出电压范围为0"2VREF,参考电压VREF由片内电路形成,为2.048V,故该电路的输出电压范围为0"4.096V。3 系统的编程实现3.1 嵌入式Linux简介目前嵌入式系统为了更好的适应高效,稳定,可移植的需要,广泛地应用了嵌入式操作系统进行资源管理。Linux因其开放性特点,成为在嵌入式系统中应用最为广泛的操作系统。嵌入式Linux包括RT-linux,μClinux以及ARM处理器使用的ARM-Linux等多种适应不同应用需要的版本。ARM-Linux将Linux内核移植到各种ARM处理器上,因此,在开发基于ARM处理器的应用系统时,如果对于实时性的要求不是很严格,且处理器又支持MMU时,采用ARM-Linux作为操作系统可以缩短开发周期,降低开发成本。3.2 D/A驱动的实现   考虑到一个嵌入式应用系统中,不仅仅包含A/D,D/A转换,还包括其他,如通信,显示,输入等等功能,所以在实现D/A转换功能时,是基于嵌入式操作系统的,以嵌入式Linux作为操作系统。嵌入式Linux在操作外设时,将外设分为三种类型的设备进行操作,即:字符型、块设备和网络设备[5]。在支持D/A操作时,将D/A设备作为字符型设备,需要编写相应的驱动程序。   驱动程序主要包含的内容就是对文件结构体open, ctrl,realse的重定向函数的编写,即定向为s3c2410_da_open,s3c2410_da_ctrl,s3c2410_da_close。这三个函数的作用分别为:  (1)s3c2410_da_open:所做的工作非常简单,就是增加模块使用的计数值,通过该值可以体现逻辑上当先打开da端口的任务数。 (2)s3c2410_da_close:该函数进行的处理与open刚好相反,将模块使用计数值减一,表明使用结束。图3.1 驱动核心函数s3c2410_da_ctrl流程图 (3)s3c2410_da_ctrl:该函数为核心函数,函数定义为static int s3c2410_exio_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg),函数功能为:由cmd参数指出D/A操作类型,arg为操作使用的参数,根据cmd和arg,可以根据通道号,对多个D/A通道进行清空操作和数据写入操作。     函数流程如图3.1所示,应用程序进行系统调用后,进入内核态,运行该函数实现对DA的操作,DA_ENABLE,使能s3c2410用于控制Max504的外部I/O,使CS低电平有效,选中D/A。之后,根据cmd指定的操作类型,对不同的D/A设备进行数据传送操作和寄存器清空操作。对D/A的数据写入,这里是通过s3c2410的SPI口进行的,s3c2410的两个SPI口,在D/A应用中,需要操作的SPI寄存器主要是SPICON和SPITDAT,设置SPICON,使s3c2410工作于主模式,将发送给MAX504进行转换的数据写入SPITDAT,SPITDAT为8位的寄存器,而MAX504是10位D/A转换器,所以需要发送两次,并且MAX504接收的16位数据,要求最低两位一定为00。数据经SPI传送后,MAX504并不立即进行数据转换,而是在CS片选上升沿才开始数据转换,DA_DISABLE的作用就是使s3c2410连接MAX504-CLR管脚的外部I/O端失效,此时D/A开始进行数据转换,系统调用结束。    将写好的驱动程序库,进行加载,加载到Linux核中,应用程序就可以像操作文件一样操作D/A设备了。3.3应用程序设计示例   有了底层驱动的支持,用户可以根据自己的需要编写D/A转换应用程序,而不需要关心MAX504和s3c2410的硬件特征,这样就使的应用程序的编写非常的简单。这里以一个简单的应用程序为例,说明其程序编写方法,流程图如图所示。该应用程序,可以根据用户输入的D/A转换器的编号和电压,由MAX504的Vout管脚输出该电压。  首先,由于按上述电路,MAX504的满量程输出电压为4.096V,所以用户要求输出的电压应在该范围内,将用户输入的电压值,用下面语句转换为数字量:value=(unsigned int)((v*1024.0f)/Max504_FULL);得到D/A转换的数字量后,调用ioctl,首先将指定D/A的寄存器清空:ioctl(da_fd, DA_IOCTRL_CLR, 0);//清D/A0而后调用ioctl,对待转换的数字量进行D/A转换:ioctl(da_fd, DA0_IOCTRL_WRITE, &value);     转换结束后,将设备释放即可。图3.2 应用程序流程图4结束语                                        本文针对主流嵌入式处理器-基于ARM920T内核的s3c2410,以D/A小型外设实际开发过程为引,在硬件连接电路的基础上,详细地说明了嵌入式Linux操作系统的外设驱动开发方法,给出了基于该处理器和Linux操作系统的外设驱动开发流程,既可直接用于工程应用,同时又为其他嵌入式系统的开发提供参考。
                          
                       
                          
                               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-23 17:19 , 耗时 0.087317 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表