版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1-综合课程设计基于ARM和QT的信号自动测试系统学院:自动化工程学院专业:测控技术与仪器学生姓名:李耀楠学号:2010071060010指导教师:谢婷2013年6月摘要2-摘要自动测试系统是一种组装电路板自动测试系统,而在线多路信号测试是一种不断开电路,不拆下元器件管脚的测试技术,“在线”反映了ICT重在通过对在线路上的元器件或开短路状态的测试来检测电路板的组装问题。随着嵌入式越来越受到重视,嵌入式系统近年来的发展有目共睹,嵌入式系统的应用越来越广泛。无论是传统的工业监测、机械控制,还是新兴的移动通讯、数字娱乐,嵌入式系统正逐渐走进人们的生活生产的方方面面。在工业检测方面,传统的监控系统主要以单片机为硬件载体进行设计,功能相对单一,可视化及拓展性有限。随着Linux系统的不断升级换代,现在出现了以ARM芯片为载体,以Linux系统为软件平台设计出的新一代监控系统。除了能实现原有单片机的功能外,其可视化更强,具备网络通信功能,是一台具备功能拓展更丰富的微型计算机。本文先从硬件平台设计入手,根据要求对硬件设备进行了解,设计了功能模块,在软件部分移植了Linux操作系统平台,构建了开发环境,就数模转换、触摸屏驱动程序进行编程,最后详述在了Qt下,如何使用C++语言设计监控系统图形界面。最后展现了系统运行效果,并提出了改进意见。运行效果表明,设计的监控系统是有效和实时的。关键词:嵌入式系统Linux驱动Qt自动测试AbstractAbstractWiththeincreasingimportanceofembeddedtechnology,thedevelopmentofembeddedsystemsforalltoseeinrecentyears,embeddedsystemapplicationsincreasinglybroad.Whetherintraditionalindustrialmonitoring,mechanicalcontrol,ortheemergingmobilecommunications,digitalentertainment,embeddedsystemsaregraduallymovedintoallaspectsofproductionandlivesofthepeople.Intheindustrialtesting,thetraditionalembeddedcontrolsystemsprimarilyforthesingle-chipmicrocomputerhardwarevectordesignfunctionrelativelysingle,visualization,andlimitedscalability.WiththeLinuxsystemconstantlyupgradingandupdating,andnowappearedtoARMchipcarrierandLinuxsystemssoftwareplatformdesignedforanewgenerationofmonitoringsystem.Inadditiontoachievingtheoriginalmicrocontrollerfunctions,visualizationsstronger,equippedwiththenetworkcommunicationfunctionisafunctionofdevelopingamoreabundantmicro-computer.Thispaper,basedonUP-NetARM2410-SexperimentinstrumentprovidedbytheBeijing
Universal
Pioneering
Technology
Co.,LTD.,designsamonitoringsystemtoconductresearchandapplication.SystemplatformisLinux2.4.18kernel,GUIforthefirsttimeinthebottomQtgraphicsmodule,usingC++andQtgraphicaluserinterfacelibrarymonitorthedevelopmentofgraphicaldataintegrationplatform.Thisarticlefirststartwiththehardwareplatformdesign,requiredtounderstandthehardwaredevicesdesignedmodules,portedinthesoftwarepartoftheLinuxoperatingsystemplatform,buildthedevelopmentenvironment,howtobuildadevelopmentenvironment,andwereontheA/Dconversion,touchscreendriverprogramming,thefinaldetailsinQt,howtouseC++languagedesignedmonitoringsystemgraphicalinterface.Asanapplicationofresearchpapers,thepapermainlyonthesoftwaredesign,whilethediagnosisandmonitoringtechnologyprovidesasimilarsoftwaredesignanddevelopmentofthereferencemodel.Thestudyprovedtobeeffectiveandreal-time.Keywords:Embeddedsystem,Linux,Driver,Qt目录目录摘要 IAbstract II目录 III第一章前言 11.1课题研究背景和意义 11.2自动测试系统的发展 11.3嵌入式技术发展现状与未来 21.4课题研究内容 2第二章基于ARM和QT的自动测试系统硬件设计 32.1系统组成 32.2S3C2410介绍 32.3设计方案 52.4ADC硬件设计 6第三章嵌入式linux移植及驱动开发 83.1linux主要特征 83.2驱动程序开发 93.2.1嵌入式linux驱动程序开发方法 93.2.2ADC在ARM中的驱动开发 93.2.3触摸屏在ARM中的驱动开发 17第四章信号自动测试应用软件设计 214.1Qt主要特性 224.2Qt类库及其机制简介 234.2.1Qt类库 234.2.2Qt对象间通讯机制 234.3信号监测UI设计 254.4信号监测UI和驱动连接 25第五章总结与展望 285.1全文总结 285.2展望 28参考文献 29致谢 29附录 30第一章前言3-第一章前言1.1课题研究背景和意义在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人,需要的已经不再仅仅是那种放在桌上处理文档,进行工作管理和生产控制的计算机"机器";各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用计算机。而在工业和服务领域中,使用嵌入式技术的数字机床,智能工具,工业机器人,服务机器人也将逐渐改变传统的工业和服务方式。
目前嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才投入其中。嵌入式系统可以称为后PC时代和后网络时代的新秀。由于嵌入式系统采用的是微处理器,实现相对单一的功能,采用独立的操作系统,所以往往不需要大量的外围器件。因而在体积上,功耗上有其自身的优势。嵌入式在应用中拥有广阔的前景!1.2自动测试系统的发展自动测试系统是一种组装电路板自动测试系统,例如:ICT(In-CircuitTestSystem),中文惯用名为在线测试仪(这里指组装电路板在线测试仪),主要用于组装电路板(PCBA)的测试。这里的“在线”是“In-Circuit”的直译,主要指电子元器件在线路上(或者说在电路上)。在线测试是一种不断开电路,不拆下元器件管脚的测试技术,“在线”反映了ICT重在通过对在线路上的元器件或开短路状态的测试来检测电路板的组装问题。自动测试设备(ATE)的研制工作始于20世纪50年代。现代测试内容日益复杂,测试工作量激增,而且要求完成测试的时间越来越短,人工测试很难满足这些要求,自动测试技术因而得到迅速发展。较完善的自动测试设备是60年代采用电子计算机以后才问世的。自动测试设备的发展经历了三个阶段。①采用专用测试设备:这种系统比较复杂,研制工作量大,造价高,适应性差,在改变测试内容时要重新设计接口(包括仪器与仪器之间的接口和仪器与计算机之间的接口)。专用测试设备仅用来进行大量重复性试验、快速测试或复杂测试,或用于对测试可靠性要求极高、有碍测试人员健康以及测试人员难以接近的测试场所。②采用标准化通用接口母线(GPIB)连接有关设备,系统中各组成部分均配标准化接口功能,用统一的无源母线电缆连接起来。不需要自行设计接口,可灵活地更改、增删测试内容。在这两个阶段中,计算机主要承担系统的控制、计算和数据处理任务,基本上是模拟人工测试的过程,尚不能充分发挥计算机的功能。③将计算机与测试设备融为一体,用计算机软件代替传统设备中某些硬件的功能,能用计算机产生激励,完成测试功能,生成测试程序。1.3嵌入式技术发展现状与未来嵌入式系统是将计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物,是一门综合技术学科。由于空间和各种资源相对不足,嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。作为软硬件高度结合的产物。为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。片上系统,板上系统的实现,使得以pda等为代表的这类产品拥有更加熟悉的操作界面和操作方式,比着传统的商务通等功能更加完善,实用。嵌入式系统是这个后PC时代的擎天之柱。我们有理由相信,未来的电子技术就是嵌入式系统技术的天下。1.4课题研究内容嵌入式系统逐渐成为IT业界技术研究和产品开发的热点。其重要性随着手持设备的普及而越来越突出。本文通过对嵌入式linux和qt的分析与研究,在Qt和ADC自定义驱动的基础上,开发了基于S3C2410和ADC实现对多路模拟量信号的实时监测系统,利用QT和液晶实现图形化显示数据。一体化的图形界面非常方便用户观测,充分地体现了嵌入式系统的优势。此外Qt作为一个GUI解决方案,可用于对GUI大小要求苛刻的系统中。第二章基于ARM和QT的多路自动测试系统硬件设计第二章基于ARM和QT的自动测试系统硬件设计2.1系统组成信号监测系统设计包括信号采集模块、数据处理功能电路模块、以及液晶显示模块,如图2-1所示。这些模块使得该设备拥有强大的功能,集信号采集、数据处理、参数显示为一体,用户可方便的对多路信号进行实时监测。图2-1系统概要框图2.2S3C2410介绍S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器内核,采用0.18um制造工艺的32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer,I/O口,RTC,8路10位ADC,TouchScreen接口,IIC-BUS接口,IIS-BUS接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。[1,7,11]图2-2S3C2410资源结构图CPU:S3C2410X芯片是基于ARM920T内核,主频200M,提供如下功能:=1\*GB3①1.8V内核电压/电源管理有Normal、Slow、Idle、Stop和Power-off模式=2\*GB3②3.3V内存电压、3.3V的处理器IO电压,处理器拥有16KBI-Cache,16KBD-Cache,和MMU=3\*GB3③外部SDRAM控制器=4\*GB3④集成LCD控制器可以支持4KcolorSTNand64KcolorTFT,1个通道的专用DMA用于显存刷新=5\*GB3⑤有外部请求引脚的4通道DMA,3通道的UART,支持IrDA1.016-byteFIFO,1个通道的SPI=6\*GB3⑥1个多主IIC总线控制器,一个IIS总线控制器=7\*GB3⑦SDHost支持1.1的多媒体协议=8\*GB3⑧两个USB1.1控制器,可以配置成为host或device=9\*GB3⑨4通道PWM和一通道的内部定时器/8通道10bitADC和触摸屏控制器=10\*GB3⑩看门狗定时器/117个外部通用IO、24个外部中断源其中本文主要显示应用ADC和LCD资源!UP-NetARM2410-S实验仪器硬件配置如下表:2.3设计方案图2-5系统结构图如图2-5所示,电流电压信号经过电阻分压简单滤波后送入S3C2410ADC模块,S3C2410接受电阻触摸屏输入和鼠标输入,并送显示。2.4ADC硬件设计A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。A/D转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。[1]常用的有以下两种:=1\*GB3①双积分型的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。因此适用于模拟信号变化缓慢,采样速率要求较低,而对精度要求较高,或现场干扰较严重的场合。例如在数字电压表中常被采用。=2\*GB3②逐次逼近型的A/D转换器逐次逼近型(也称逐位比较式)的A/D转换器,主要由逐次逼近寄存器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<Vc,说明SAR该位应予清零。然后再对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位,特别适用于工业控制系统。转换时间固定,不随输入信号的变化而变化。抗干扰能力相对积分型的差。例如,对模拟输入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰信号在内,都被采样和转换为数字量,这就会造成较大的误差,所以有必要采取适当的滤波措施。本文所用为逐次逼近型的A/D转换器。第三章嵌入式linux移植及驱动开发第三章嵌入式linux移植及驱动开发3.1linux主要特征=1\*GB3①符合POSIX1003.1标准POSIX1003.1标准定义了一个最小的Unix操作系统接口,任何操作系统只有符合这一标准,才有可能运行Unix程序。考虑到Unix具有丰富的应用程序,当今绝大多数操作系统都把满足POSIX1003.1标准作为实现目标,Linux也不例外,它完全支持POSIX1003.1标准。另外,为了使UnixSystemV和BSD上的程序能直接在Linux上运行,Linux还增加了部分SystemV和BSD的系统接口,使Linux成为一个完善的Unix程序开发系统。=2\*GB3②支持多用户访问和多任务编程Linux是一个多用户操作系统,它允许多个用户同时访问系统而不会造成用户之间的相互干扰。另外,Linux还支持真正的多用户编程,一个用户可以创建多个进程,并使各个进程协同工作来完成用户的需求.=3\*GB3③采用页式存储管理页式存储管理使Linux能更有效地利用物理存储空间,页面的换入换出为用户提供了更大的存储空间。=4\*GB3④支持动态链接用户程序的执行往往离不开标准库的支持,一般的系统往往采用静态链接方式--即在装配阶段就已将用户程序和标准库链接好,这样,当多个进程运行时,可能会出现库代码在内存中有多个副本而浪费存储空间的情况。Linux支持动态链接方式,当运行时才进行库链接,如果所需要的库已被其它进程装入内存,则不必再装入,否则才从硬盘中将库调入。这样能保证内存中的库程序代码是唯一的。=5\*GB3⑤支持多种文件系统Linux能支持多种文件系统。目前支持的文件系统有:EXT2、EXT、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、PROC、NFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、AFFS。Linux最常用的文件系统是EXT2,它的文件名长度可达255字符,并且还有许多特有的功能,使它比常规的Unix文件系统更加安全。=6\*GB3⑥支持TCP/IP、SLIP和PPP在Linux中,用户可以使用所有的网络服务,如网络文件系统、远程登录等。SLIP和PPP能支持串行线上的TCP/IP协议的使用,这意味着用户可用一个高速Modem通过电话线连入Internet网中。[10]3.2驱动程序开发3.2.1嵌入式linux驱动程序开发方法Linux中的驱动设计是嵌入式Linux开发中十分重要的部分,它要求开发者不仅要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。这对驱动开发者提出了比较高的要求,这个实验主要是给大家进入驱动设计提供一个简单入门的一个实例,并不需要提供太多与硬件相关的内容,这部分应该是通过仔细阅读芯片厂家提供的资料来解决。驱动程序的作用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是因为在驱动层的效率比应用层高,同时为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他一些功能;到底需要展现硬件的哪些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发的问题,就需要调用一些内核的函数使用互斥量和锁等机制。驱动程序主要需要考虑下面三个方面:提供尽量多的选项给用户,提高驱动程序的速度和效率,尽量使驱动程序简单,使之易于维护。[2]3.2.2ADC在ARM中的驱动开发一、开发环境主
机:redhat/linux2.4.2开发板:北京博创兴业科技有限公司开发的UP-NetARM2410-S实验仪器编译器:arm-linux-gcc-4.3.2二、硬件原理分析图3-1所示S3C2410内部ADC结构图3-1S3C2410内部ADC结构我们从上面的结构图和数据手册可以知道,该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP。那么ADC是怎么实现模拟信号到数字信号的转换呢?首先模拟信号从任一通道输入,然后设定寄存器中预分频器的值来确定AD转换器频率,最后ADC将模拟信号转换为数字信号保存到ADC数据寄存器0中(ADCDAT0),然后ADCDAT0中的数据可以通过中断或查询的方式来访问。对于ADC的各寄存器的操作和注意事项请参阅数据手册。S3C2410的ADC及触摸屏控制寄存器以下有5种:(1)ADC控制寄存器:ADCCON。该寄存器各参数描述见表3-1。表3-1ADC控制寄存器参数描述
ENABLE_START置1:启动ADC转换置0:无操作RESR_START置1:允许读操作启动ADC转换置0:禁止读操作启动ADC转换STDBM置1:将ADC置为闲置状态(模式)置0:将ADC置为正常操作状态SEL_MUX选择需要进行转换的ADC信道PRSCVLADC转换时钟预分频参数PRSCENADC转换时钟使能ECFLGADC转换完成标志位(只读),为1:ADC转换结束为0:ADC转换进行中(2)ADC触摸屏控制寄存器:ADCTSC。该寄存器主要是通过触摸屏的各个控制引脚来决定触摸屏转换状态,使其进行坐标轴转换,或者进入中断状态,等待触摸屏终端。各参数描述见表3-2。表3-3ADC触摸屏控制寄存器参数描述XY_PST对X/Y轴手动测量模式进行选择AUTO_PSTX/Y轴的自动转换模式使能位PULL_UPXP端的上拉电阻使能位XP_SEN设置nXPON输出状态XM_SEN设置XMON输出状态YP_SEN设置nYPON输出状态YM_SEN设置YMON输出状态保留这一位必须被设置为0(3)ADC延时寄存器:ADCDLY。该寄存器是只读的,其中控制位都是标志位和结果位。各参数描述见表3-3。表3-3ADC延时寄存器参数描述DEDLY在普通转换模式,独立X/Y坐标转换模式,自动坐标转换模式下,X/Y坐标转换的延时时间。在等待中断模式下,当触摸屏发生触摸中断时,该寄存器在数ms间隔内产生INT_TC中断。(4)ADC数据寄存器0:ADCDATA0。该寄存器是只读的,其中控制位都是标志位和结果位。该寄存器各参数描述见表3-4。表3-4ADC数据寄存器0参数描述XPDATAX轴转换资料寄存器XY_PST选择X/Y轴自动转换模式AUTO_PSTX/Y轴自动转换使能位UPDOWN选择中断等待模式的类型为0:按下产生中断为1:释放产生中断保留保留位(5)ADC数据寄存器1:ADCDATA1。该寄存器是只读的,其中控制位都是标志位和结果位。该寄存器各参数描述见表3-5。表3-5ADC数据寄存器1参数描述XPDATAX轴转换资料寄存器XY_PST选择X/Y轴自动转换模式AUTO_PSTX/Y轴自动转换使能位UPDOWN选择中断等待模式的类型为0:按下产生中断为1:释放产生中断保留保留位图3-2ADC接口电路图上图是UP-NetARM2410-S上的ADC应用实例,开发板通过一个10K的电位器(可变电阻)来产生电压模拟信号,然后通过第一个通道(即:AIN0)将模拟信号输入ADC。[1,8]三、实现方法ADC设备在Linux中可以看做是简单的字符设备,也可以当做是一混杂设备(misc设备),这里我们作为misc设备来实现ADC的驱动。注意:这里我们获取AD转换后的数据将采用中断的方式,即当AD转换完成后产生AD中断,在中断服务程序中来读取ADCDAT0的第0-9位的值(即AD转换后的值)。1、建立驱动程序文件s3c2410-adc.c,实现驱动的打开、读、写和退出staticints3c2410_adc_open(structinode*inode,structfile*filp)//adc打开句柄{ init_MUTEX(&adcdev.lock); init_waitqueue_head(&(adcdev.wait)); adcdev.channel=0; adcdev.prescale=0xff; MOD_INC_USE_COUNT; DPRINTK("adcopened\n"); return0;}staticssize_ts3c2410_adc_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){intdata;
//用来保存应用程序传来的数据if(count!=sizeof(data)){printk("thesizeofinputdatamustbe%d\n",sizeof(data));
//应用程序传来的数据和data长度不同,报错return0;}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);
//开始转换#ifdefUSE_IRQ_WAITQUEUEinterruptible_sleep_on(&adcdev.wait);
//休眠进程,让CPU做其他的事情#endifprintk("inreadchannel=%d\n",adcdev.channel);printk("ADCDAT0=%x\n",ADCDAT0);while(!(ADCCON&0x8000))
//查看AD是否转换完成udelay(100);ret=ADCDAT0;ret&=0x3ff;
//10位AD转换,所以取低十位copy_to_user(buffer,(char*)&ret,sizeof(ret));
//把得到的值传回应用程序up(&adcdev.lock);
//释放信号量returnsizeof(ret);}staticints3c2410_adc_release(structinode*inode,structfile*filp)//关闭adc{ MOD_DEC_USE_COUNT; DPRINTK("adcclosed\n"); return0;}由于编译开发板内核时直接把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,};2、编写用户应用程序测试my2410_adc驱动。建立应用程序adc_test.c#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)//获取AD值{intPRESCALE=0XFF;intdata=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data));read(adc_fd,&data,sizeof(data));returndata;}intmain(void){inti;floatd;pthread_tth_com;void*retval;//sets3c44b0ADregisterandstartADif(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");}}GetADresult函数的具体过程如下:假如我们的比列因子是0XFF,通道是1路,即0XO1,那么经过intdata=ADC_WRITE(channel,PRESCALE);后我们可以得到数据为0X0100FF,而通过下一条语句write(adc_fd,&data,sizeof(data))后,实际调用的是驱动程序中的s3c2410_adc_write函数,在这个函数中ch=ADC_WRITE_GETCH(data),又将通道0X01获取出来。这是因为我们经常在采样的时候需要知道是哪个通道的数据,比列因子是AD频率转换的一个因素,所以我们在读取数据时,要保持这两个部分的值是不变的,而真正换取10位二进制的数据则是在read函数中,通过读取寄存器的值,再取出需要的那10位。3、将驱动程序下载挂载到内核,下载应用程序到开发板上后,运行应用程序,扭动s3c2410开发板上的定位器,可以观察到ADC转换值的变化,证明驱动程序工作正常。3.2.3触摸屏在ARM中的驱动开发SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X是三星推出的自带触摸屏接口的ARM920T内核芯片,ADS7848为Burr-Brown生产的一款性能优异的触摸屏控制器。本文采用SPI接口的触摸屏控制器ADS7848外接四线电阻式触摸屏,这种方式最显著的特点是响应速度更快、灵敏度更高,微处理器与触摸屏控制器间的通讯时间大大减少,提高了微处理器的效率。ADS7848与S3C2410的硬件连接如图3-4所示,鉴于ADS7848差分工作模式的优点,在硬件电路中将其配置为差分模式。[4]图3-4连接图
Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。设备驱动模块的功能就是扩展内核的功能,主要完成两部分任务:一个是系统调用,另一个是处理中断。图3-5是一个设备驱动模块动态挂接、卸载和系统调用的全过程。系统调用部分则是对设备的操作过程,比如open,read,write,ioctl等操作,设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file数据结构。内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数,结构中的每一个成员都对应着一个系统调用。在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、open、ioctl及release就可以完成应用系统需要的功能。写驱动程序的任务之一就是完成file_operations中的函数指针。[9]图3-5设备驱动在内核中的挂接、卸载和系统调用过程在驱动程序中有三个重要的数据结构:用于表示笔触点数据信息的结构TS_RET,表示ADS7843中有关触摸屏控制器信息的结构TS_DEV,以及驱动程序与应用程序的接口file_operations结构的s3c2410_fops:typedefstruct{unsignedshortpressure;unsignedshortx;unsignedshorty;unsignedshortpad;}TS_RET;typedefstruct{unsignedintPenStatus;TS_RETbuf[MAX_TS_BUF];unsignedinthead,tail;wait_queue_head_twq;spinlock_tlock;}TS_DEV;staticstructfile_operationss3c2410_fops={owner:THIS_MODULE,open:s3c2410_ts_open,read:s3c2410_ts_read,
release:s3c2410_ts_release,poll:s3c2410_ts_poll,
};init_module函数是模块的入口函数。在函数内部通过s3c2410_ts_init()实现模块的初始化工作。在本设计中设备与系统之间以中断方式进行数据交换。在s3c2410_ts_init()中的另一个重要任务是执行接口函数s3c2410_ts_open(),在这个函数中初始化缓冲区的头尾指针、触摸屏状态变量及触摸屏事件等待队列。module_exit()该函数调用s3c2410_ts_exit(),主要任务是撤销驱动程序向内核的登记以及释放申请的中断资源。接口函数s3c2410_ts_read()这个函数实现的任务是将事件队列从设备缓存中读到用户空间的数据缓存中。实现的过程主要是通过一个循环,只有在事件队列的头、尾指针不重合时,才能成功的从tsdev.tail指向的队列尾部读取到一组触摸信息数据,并退出循环。否则调用读取函数的进程就要进入睡眠。坐标读取函数s3c2410_get_XY()在定时器中断处理程序中,当查询到与相连的EINT5/GPF5为低电平时,即表示有有效事件,应该调用s3c2410_get_XY()函数采集笔触信息。ADS7843有多种转换时序,时序规定了芯片与设备及CPU间是如何配合工作的。设计中采用16个时钟周期启动一次转换的坐标转换方式。坐标的读取是通过多次采集取平均值的方法,以X坐标的读取为例。循环过程中的每一步都在8个时钟周期内完成,数据的处理严格按照时序进行,Y坐标的采集与X坐标类似。第五章总结与展望第四章信号自动测试应用软件设计4.1Qt主要特性随着嵌入式Linux应用的不断发展,嵌入式处理器运算能力的不断增强,越来越多的嵌入式设备开始采用较为复杂的GUI系统,手持设备中的GUI系统发展得非常迅速。传统的GUI系统,如Microwindows等,由于项目规模较小、功能较为薄弱,缺乏第三方软件开发的支持等诸多原因,在比较高级的手持或移动终端设备(如PDA、Smart-Phone、车载导航系统)中应用较少。Qt/Embedded是著名的Qt库开发商Trolltech公司开发的面向嵌入式系统的Qt版本,开发人员多为KDE项目的核心开发人员。许多基于Qt的XWindow程序可以非常方便地移植到Qt/Embedded上,与X11版本的Qt在最大程度上接口兼容,延续了在X上的强大功能,在底层彻底摒弃了Xlib,仅采用framebuffer作为底层图形接口。Qt/Embedded类库完全采用C++封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,使用X下的开发工具QtDesigner可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。越来越多的第三方软件公司也开始采用Qt/Embedded开发嵌入式Linux下的应用软件。其中非常著名的QtPalmtopEnvironment(Qtopia)早期是一个第三方的开源项目,并已经成功应用于多款高档PDA。Trolltech公司针对Smart-Phone中的应用需求,于2004年5月底发布了Qtopia的Phone版本。1Qt/Embedded的实现技术基础分析横向来看,由于发布的版权问题,Qt/Embedded采用两种方式进行发布:在GPL协议下发布的free版与专门针对商业应用的commercial版本。二者除了发布方式外,在源码上没有任何区别。纵向看来,当前主流的版本为Qtopia的2.x系列与最新的3.x系列。其中2.x版本系列较多地应用于采用Qtopia作为高档PDA主界面的应用中;3.x版本系列则应用于功能相对单一,但需要高级GUI图形支持的场合,如Volvo公司的远程公交信息系统。图4-1为Qt/Embedded的实现结构。[3]图4-1Qt/Embedded的实现结构4.2Qt类库及其机制简介Qt类库是一个跨平台的面向对象的C++类库,目前主要用于Linux下的开发。普通的UI编程是极其底层和繁琐的,而Qt高度面向对象和模块化的特征将我们从这种繁琐中解脱了出来。Qt还提供了免费的版本,这对于非商业的科学项目如我们目前正在设计的《基于ARM和Qt的多路信号监测系统》特别适合,同时Qt还是跨平台的,这对于要求移植性很强的项目也是很好的选择。4.2.1Qt类库Qt类库大致可以分为三个部分:控件,框架和工具。=1\*GB3①控件控件部分包括环境控件,主窗口控件,标准对话框,基本的GUI控件,扩展GUI控件,GUI组织控件,以及帮助系统控件。主窗口类为应用程序提供界面框架,可以在上面添加菜单、工具条等,为应用程序提供集装箱的功能,标准对话框类是打开/关闭文件,选择颜色等预先设计的标准对话框,基本控件包括所有的GUI控件,如按钮组合框等,扩展的控件包括树状视图、进度条等,如QlistViewGUI组织类负责对各种控件进行组织以构成复杂的对话框,如QGroupBox帮助系统是为应用程序提供在线帮助的类,如QStstusBar,QToolTip。=2\*GB3②框架框架部分包括的是一些抽象的类,通常不可见,如对象模型、抽象控件、绘图、拖放、控件、外观。对象模型是框架的基础,如QObject可见的控件一般从抽象控件派生,如QButton绘图类控制绘图,如QBrush拖放类控制拖放操作,如QDragObject控件外观类控制控件的外观如颜色、字体等。例如QColor。Qt的应用程序框架(framework),Qt的应用程序框架是自顶向下的,首先是在main函数中产生一个Qapplication类的实例a和一个主窗口类w,主窗口可以是任何QWidget类的派生类,这里用的是QMainWidget类,调用该类的方法来设置主窗口的位置和大小,调用a的方法来把窗口w设置成主窗口并显示,剩下的工作就是按照项目对面板的要求来编辑主窗口类w了。下面是一个最简单的程序框架:intmain(intargc,char**argv){QApplicationa(argc,argv);//Qapplication实例化
myMainWindoww;
a.setMainWidget(&w);
w.show();//窗口开显示
a.exec();//告诉程序退出,伴随返回代码}=3\*GB3③工具工具部分包括时间日期和链表树等数据结构,它们和GUI无关。普通工具包括链表、堆栈、队列、树等常见数据结构,如QArray。图形处理工具控制图像的编码/解码算法。如Qimage等,IO控制工具具体处理IO的一些类,如QFile。时间和日期工具类处理时间和日期,如Qdate,QTime。另外还有其他杂类如Qsignal,QIconSet等。4.2.2Qt对象间通讯机制对象间通讯是面向对象程序设计的一个极其重要的内容,类似于MicrosoftMFC的消息映射(MessageMaping)和事件循环,Qt的对象间通讯采用的是signal/slot机制,信号就好像是事件,而slot则是响应事件的方法,如果需要实现对象间的通讯,只需要把一个对象的slot和另外一个对象的信号“连接起来”就可以实现“事件驱动”。在Qt中信号是一个全新的东西,它既不属于成员函数也不是变量,用户可以自定信号,下面是自定义信号的例子:signals:voidcreated();自定义的signal可以在需要的时候发送,要发送上面的signal,可以用下面的语句:emitcreated();Linux下开发Qt应用程序比较好的IDE是KDevelop。KDevelop是X系统中的一个快速开发工具。它集成了很多其他实用工具,如make和GNUC++Compilers,它还可以为工程的每个类自动生成HTML格式的API文档,同时有着很好的项目管理、编辑环境和调试环境。[12]另外它还有一个所见即所得的对话框编辑器。4.3信号监测UI设计图4-2Qt/Embedded的实现UI结构设计在QT下进行界面设计,可以使用水平、垂直和Grid布局管理器来进行。水平布局管理器可以把它所管理的部件以水平的顺序依次排开,Grid布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列。比如上图中,所有的部件一起看,其实就是一种矩阵的形式来排列的。
在QT下做界面设计的时候,其实无非就是利用上面三种布局管理器来将部件进行分类和排列。第一部分为二个PushButton。第二部分是三个水平排列的LCDNumber,progressbar可以使用水平布局管理器将其放到一起;4.4信号监测UI和驱动连接由于编译内核时直接把ADC驱动加入到内核里面,对我们来说需要了解的只是下面的一个文件结构。在用户程序里只需要用到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,};在头文件包含#include"s3c2410-adc.h",添加对驱动的引用!定义驱动安装路径以确定程序能连接到驱动#defineADC_DEV"/dev/adc/0raw"在myMainWindow窗体类中添加adc读写成员函数声明,属性设置为私有!classmyMainWindow:publicQWidget{
private:
int
init_ADdevice(void);intGetADresult(intchannel);}并定义ADC初始化和获取ADC值的方法intmyMainWindow::init_ADdevice(void){if((adc_fd=open(ADC_DEV,O_RDWR))<0){printf("Erroropening%sadcdevice\n",ADC_DEV);return-1;}}intmyMainWindow::GetADresult(intchannel){intPRESCALE=0XFF;intdata=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data));read(adc_fd,&data,sizeof(data));returndata;}整个程序的流程图如下:开始开始点击start判断flag是true还是falsestart变成stop,并激活定时器truestop变成startfalse调节ADC旋钮判断AD设备是否初始化获取ADC电位值,并送显是异常退出否点击exit结束第五章总结与展望5.1全文总结本文主要论述的是基于S3C2410设计了多路信号测试系统,讲述了ARM的结构以及其驱动外设,和介绍了LINUX驱动开发及其Qt上UI程序设计。本文还展示了此系统的三大电路模块:信号采集模块、控制模块、显示模块,以及它们各自的原理图和源程序。毕业设计过程中,调试出现了很多问题,本毕业设计是在WindowsXP下的虚拟机下设计而成,由于笔记本没有9孔串口线插口,只能用USB转串口线来对试验箱进行连接,安装好USB转串口线驱动后,需要将虚拟机设置中的串口设置为COM4。另外PC机、虚拟机、试验箱之间实现共享需要将3者IP地址设置为同一网段,能够互相ping通即可。运行程序前,环境变量的设置,鼠标设备为/dev/input下的mouse0,需要连接上鼠标后才会显示。5.2展望本次设计使我对ARM单片机有了进一步的认识,使我对ARM产生了浓厚的兴趣,它强大的功能深深地吸引这我,它能够完成一般单片机所不能完成的,我会进一步去了解它,能够为今后的发展打下基础,去完成更复杂的系统;本次设计基本完成了显示,控制部分的设计,在信号采集部分还有点欠缺,功能不够完善,检测的范围比较小,希望在今后的努力中弥补这些欠缺。参考文献参考文献[1]北京博创兴业科技公司,2410-S实验指导书,北京博创,2006.07.06[2]孙琼著,嵌入式Linux应用程序开发详解,人民邮电出版社,2006年7月[3]宋劲杉著,LinuxC编程一站式学习.北京亚嵌,2009年2月[4]刘淼著,嵌入式系统接口设计与Linux驱动程序开发,北京航空航天大学,2006年6月[5]北京博创兴业科技公司,博创培训资料,北京博创,2006年7月[6]网站资源:北京华清远见,北京亚嵌,/[7]王田苗、魏洪兴著,嵌入式系统设计与实例开发,清华大学出版社,2008年1月[8]徐成,谭曼琼,徐署华,刘豪,朱雪庆等著,嵌入式Linux系统.人民邮电出版社.2010年4月[9]ScottMaxwell著,冯锐等译,Linux内核源代码分析,机械工业出版社,2000年6月[10]谢蓉、巢爱棠著,Linux基础及应用,中国铁道出版社,2005年2月[11]ARMLimited,ARM920TTechnicalReferenceManual,2007.06[12]JasminBlanchetteMarkSummerfield著,C++GUIQt4编程(第二版),电子工业出版社,2008年8月致谢经过近几个月的忙碌,本次毕业设计已经接近尾声,作为一个本科生的课程设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及同学们的支持,想要完成这个设计是难以想象的。这次做毕业设计的经历也会使我受益良多,我感受到做毕业设计是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的经历能让我在以后学习中激励我继续进步。不积跬步何以至千里。附录附录QT界面程序代码如下:Main.cpp文件源代码:#include<QApplication>#include"myqt.h"intmain(intargc,char**argv){QApplicationapp(argc,argv);MyDlg*mydlg=newMyDlg;returnmydlg->exec();}定义槽函数的头文件myqt.h源代码如下:#ifndef__DSLKLG_H__#define__DSLKLG_H__#include<QDialog>#include<QtCore/QTimer>//一定要包含Qtimer头文件#include<ui_testx11.h>//包含ui头文件#include"s3c2410-adc.h"//包含adc驱动头文件#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/ioctl.h>#include<pthread.h>#include<fcntl.h>#defineADC_DEV"/dev/adc/0raw"//路径定义//staticintadc_fd;classMyDlg:publicQDialog//新建类继承Qdialog类{Q_OBJECTpublic:MyDlg();//构造函数,对MyDlg初始化publicslots:voidShowInfo();//建立自定义slots函数voidgetAd();//建立自定义slots函数private: intadc_fd;//设备句柄boolflag;//adc采集使能标志位QTimer*readAdc;//Qtime控件实例化Ui::Formui;//对前面建立的FORM实例化intinit_ADdevice();//adc初始化私有函数intGetADresult(intchannel);//adc读写私有函数};#endifMyqt.cpp源代码如下:#include"myqt.h"MyDlg::MyDlg(){adc_fd=-1;ui.setupUi(this);//初始化ui界面ui构造函数QObject::connect(ui.pushButton1,SIGNAL(clicked()),this,SLOT(ShowInfo()));QObject::connect(ui.pushButton2,SIGNAL(clicked()),this,SLOT(close()));readAdc=newQTimer(this);//使用q版定时器Time控件分配内存connect(readAdc,SIGNAL(timeout()),this,SLOT(getAd()));//连接timeout->getadreadAdc->stop();//先不开启,等按钮被按下才开始}voidMyDlg::ShowInfo(){flag=(flag?false:true);//改变标志,非常棒的三目运算,将flag翻转if(flag)//这里表示开始adc{ui.pushButton1->setText(QString("stop"));//如果标志位为true,pushbutton显示stopreadAdc->start(100);//激活定时器}else{//这里关闭adc,已经在getad中关了,无需多此一举ui.pushButton1->setText(QString("start"));//如果标志位为false,pushbutton显示start}}voidMyDlg::getAd()//Click响应函数{intvaladc0=0;//adc缓冲局部变量初始化intvaladc1=0;//adc缓冲局部变量初始化intvaladc2=0;//adc缓冲局部变量初始化if(flag){readAdc->stop();//关qtime//adc_fd=init_ADdevice();//获取设备句柄if(init_ADdevice()<0){perror("opendeviceadc");//这句话支不支持低版本exit(1);//异常退出返回非0}valadc0=GetADresult(0);//获取adcvaladc1=GetADresult(1);//获取adcv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026烟花爆竹安全生产管理人员考试题库及答案
- 2026届北京市朝阳区高三第二学期质量检测一(一模)地理试题(含答案)
- 2026年广东省恩平市高二化学下册期末考试模拟考试卷附完整答案【必刷】
- 2026英国电气面试题及答案
- 2026游戏原画面试题及答案
- 2026语音测试面试题及答案
- 2026年湖北省丹江口市高二化学下册期末考试模拟卷附答案【培优】
- 四川省字节精准教育联盟2025-2026学年高二下学期6月阶段检测物理试卷(川北)(含答案)
- 2026年黑龙江省北安市高二化学下册期末考试模拟试卷(研优卷)附答案
- 2026年陕西省华阴市高二化学下册期末考试模拟试卷附答案【研优卷】
- 2026春小学信息技术四年级下册期末练习卷(清华版贵州)含参考答案
- 2026年高考全国1卷语文高考真题含答案
- T-CEPPEA 5072-2025 变电站零碳建筑设计规范
- 中国面神经炎临床诊疗指南(2025版)
- 2026海底光缆系统全球布局与中国企业竞争力分析报告
- 2026云南锐达民爆有限责任公司职工招聘7人笔试备考试题及答案详解
- 2026年人教版四年级语文下册期末考试题及答案
- 2025年东南大学强基计划招生数学试卷试题真题(含答案详解)
- 内蒙古矿产资源开发利用方案审查、储量评审备案、非法采矿、破坏性采矿造成矿产资源破坏价值鉴定调查报告评审工作服务指南
- YS/T 280-2011丁钠黑药
- GB/T 30727-2014固体生物质燃料发热量测定方法
评论
0/150
提交评论