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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于ARM7多通道仪表数据采集.docx

1、基于ARM7多通道仪表数据采集 嵌入式系统与应用设计性实验报告 题目 基于ARM7的多通道仪表数据采集实验 系 别 物理与电子工程学院 年 级 专 业 班 级 学 号 学生姓名 指导教师 实验时间 引言 1第一章 实验要求 2一、实验内容及目的 2二、实验设备及工具 2第二章 正文 3一、实验分析 3二、系统设计 3三、代码分析 8第三章 实验结果 11第四章 实验总结 12参考文献 13附录 14引言随着工业自动化与信息化的不断发展,数据采集已经成为了计算机与外部物理世界连接的桥梁。数据采集系统广泛地应用于工业生产中设备工作状况的监测、控制领域中的闭环控制系统及仿真领域的半实物仿真系统。传统

2、的数据采集装置通常由单片机及采集卡组成, 其采集通道数较少、单任务的软件结构及实时性差等不足之处已无法满足人们的需求。ARM ( Advanced RISC Machines) 是基于RSIC 架构的数据宽为32 位可嵌入操作系统的微处理器。由于其体积小、价格低、可靠性高、低功耗等特点在工业自动化、国防、运输等领域得到了广泛的应用。本次设计是基于ARM的多通道实时数据采集系统;该系统由下位机系统及上位机软件组成,下位机硬件主要基于ARM工控开发平台、数据采集板及模拟量输出板,采用C/OS实时多任务操作系统,实现多通道数据的采集、数据存储及模拟量的输出,并将采集数据实时传送至上位计算机;上位机软

3、件接收数据进行监控,图形化显示数据变化曲线,并控制下位机的模拟量输出功能;通过实验验证,下位机系统能够实现多通道数据的采集、存储及模拟量的输出,C/OS操作系统完成多任务的实时调度,上位机软件成功进行模拟量数据的采集监控及数据变化的图形显示,整个系统具有良好的实时性。第一章 实验要求一、实验内容及目的采用多任务编程方法,每个任务监视一路AD 转换, 每一路AD 的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路AD 设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。并在数码管上对应的某通道的数值显示当超过警戒线数值时,数字

4、闪烁显示。在此基础上,利用实验箱中的数码管显示每一路的电压采样值,并能在超出警戒值的情况下闪烁显示,在LCD屏上对应条形图的顶部显示具体的电压值。二、实验设备及工具 硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。 软件:PC机操作系统Win98、Win2000或WinXP、ARM SDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。第二章 正文一、实验分析数据采集系统置于被监控的设备处,通过传感器对设备的电压或者电流信号进行采样、保持,并送入A/D转换器变成数字信号,然后将该信号送到FIFO中。当FIFO中存放的数据到

5、了一定数目时,由ARM7从FIFO中读出,然后通过ARM7的以太网接口送给上位机。多路采集通道经过模拟开关后再进入A/D转换器。CPLD是整个系统的控制核心,它控制采集通道的切换、A/D转换器的启/停、转换后的数据在FIFO中的存放地址发生器、产生中断请求以通知ARM7读取存放在FIFO中的数据等。二、系统设计 1编写OnKey()函数,响应键盘消息。流程图如图1所示。1) 这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理。程序里用变量EditNumber 指示当前要编辑的文本框控件;用变量inp

6、ut 指示该文本框控件是否处于输入编辑状态。以此决定回车键应该执行的功能。 2)当文本框控件不是编辑状态时,回车将使其进入编辑状态,在程序里用SetWndCtrlFocus( )函数将焦点转移到该控件并用SetTextCtrlEdit() 函数设置为编辑状态;当文本框正处于编辑状态时,回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取消键的处理和这种情况类似。 3) 如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组WarnningData 中,代码如下: WarnningData Unicode2Int(pChannelT

7、extCtrl-text)=Unicode2Int(pValueTe xtCtrl-text); 图12编写绘图显示任务Display_Task, 绘制文本框和条形图等,并实现文本框编辑过程中和超过警戒值后的动画显示,其流程图为图2所示。图21)程序中用TextOut()函数显示文本框的提示信息,用数组edit 记录两个文本框是否处于编辑状态,用变量IsEdit 指示提示信息是否显示。实际上,IsEdit这个变量在显示任务循环一次就改变一次状态,当IsEdit=1 时将提示信息擦掉,否则保持显示不变。这就是闪烁显示的原理,表示AD 转换结果的条形图超出警戒值的部分的闪烁也是这样实现的,随着任务

8、的循环隔次的改变状态。 2)和变量IsEdit 的作用类似,warnningx是条形图闪烁的指示变量。当某路AD 转换的结果result_ADx 大于对应通道的警戒值Warnni ngDatax时,根据warnningx 的值决定条形图的长度是和result_ADx 对应还是和W arnningDatax对应,这样看起来条形图的长度是变化的,效果就是超过警戒线的那部分在闪烁。 3)这里条形图实际上是一个实心矩形,用FillRect()函数填充。 5、编写4 路AD 采集任务ADx_Task。1)使用GetADresult()函数即可得到某路AD 输出的二进制代码。由于处理器的8路10 位AD

9、转换单元的最大输入电压是2.50V,所以实际电压值就是result_ADx=GetADresult(x)*2.50/1024;三、代码分析(1)数码管显示及闪烁显示的代码/ 0通道显示 ZLG7289_ENABLE();/使zlg7289占有同步串口 Delay(5);/延时 WriteSDIO(ZLG7289_CMD_DATA1|6);/数码管以方式1译码,第一个数码管亮 WriteSDIO(int)(result_AD0)%10);/显示个位 Delay(1);/延时 if(int)(result_AD0)9) /键值大于9显示十位 WriteSDIO(ZLG7289_CMD_DATA1|

10、7);/发送十位数据 WriteSDIO(int)(result_AD0)/10); Delay(1); WriteSDIO(ZLG7289_CMD_HIDE);/使一、二、三这三位数码管显示 WriteSDIO( 0xff); else /键值小于10不显示十位 WriteSDIO(ZLG7289_CMD_HIDE);/使个位数码管显示 WriteSDIO(0x7f); a=0xff; if(result_AD0WarnningData0) a=0x3f; Delay(1); WriteSDIO(ZLG7289_CMD_FLASH);/闪烁 WriteSDIO(a);通道1、2、3和通道0一

11、样只需将通道0中的输入值和警戒值改成对应通道的值就可以实现。(2)在LCD屏条形图中超出部分闪烁显示的代码if(result_AD0=WarnningData0) FillRect(pdc, 110, (int)(210-result_AD0*20/3.3), 130, 210,GRAPH_MODE_NORMAL, COLOR_BLACK); else if(warnning0=1) FillRect(pdc, 110, (int)(210-result_AD0*20/3.3), 130, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); warnning0=0; el

12、se warnning0=1; FillRect(pdc, 110, (int)(210-WarnningData0*20/3.3), 130, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); 这是通道0的代码,通道1、2、3的代码与之像似,只要改变相应的输入值和警戒值即可。(3)条形图顶端显示具体电压值的代码Int2Unicode(int)(result_AD0),result_AD0_16); TextOut(pdc, 114, (int)(198-result_AD0*20/3.3), result_AD0_16, TRUE, FONTSIZE_SMALL);相

13、应的也只需改变对应通道的输入值和警戒值即可。第三章 实验结果将生成的文件编辑下载到开发平台并运行,通过四个旋钮来改变相应通道的电压值,当输入的电压值超过警戒值时,对应的数码管显示的数值也会闪烁显示,同时在LCD屏上的条形图的超过部分也会闪烁,条形图的顶端会显示相应的电压值(数值与数码管显示的值相同)。在LCD屏上设置了两个文本框,一个是控制的通道的,另一个是改变警戒值的。可以通过改变通道来设置相应的警戒值。当这两个文本的数值改变是数码的闪烁及LCD屏上条形图超出部分的闪烁将根据新的值来执行。第四章 实验总结实验做到这里也差不多要结束了,这次实验总体来说还是有些难度的,实验的代码也是相当的长,验

14、中要实现的现象也有好几个,先前做过几个也是关于ARM7的实验,然而前面几个实验的是比较基础的要实现的现象也就一两个,单个来说实验还是很好做的,不过当这些现象多了的同时还要一起实现的话实验就有些难度了,有困难干等着也解决不了,所以在第一次实验没成功之后,我和几个做同样实验的同学就讨论了一下。在第一次实验结束回来后,我们几个同学就在网上找了相应的资料,再看了相关资料后终于有了明确的思考方向,再次去实验时就顺利多了,虽然在实验代码中还有些问题,不过在之后调试中都一一解决了。最后实验也顺利完成了。通过这次实验我懂得了许多,一个人的力量再大也有不够的时候,团结同学合力完成实验或是其他的事情往往能起到事半

15、功倍的效果。同时一个人的基础知识也是相当重要的,有了基础才能走得更远、飞得更高!参考文献1 田泽. 嵌入式系统开发与应用教程M . 北京:北京航空航天大学出版社,2005.32 周立功. ARM 嵌入式系统基础教程M . 北京:北京航空航天大学出版社,2005.3 吴明晖. 基于ARM 的嵌入式系统开发与应用M . 北京:人民邮电出版社,2004.4 朱永宏,马梅方,梅杓春.国外电子测量技术. 维普资讯网 第2期,2008 附录#include.ucos-iiincludes.h /* uC/OS interface */#include .ucos-iiaddosaddition.h#inc

16、lude .incdrv.h#include #include.incdrvad.h#includeuhal.h#includezlg7289.h#include44b.h#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting #define ID_ChannelTextCtrl 101#define ID_ValueTextCtrl 102#define Draw_Wnd_ID 104PTextCtrl pChannelTextCtrl,pValueTextCtrl;float re

17、sult_AD0,result_AD1,result_AD2,result_AD3;int WarnningData4=26,26,26,26;int edit2=0,0;extern int Zlg7289SIOBand;extern int Zlg7289SIOCtrl;/*任务定义*/OS_STK Main_StackSTACKSIZE*8=0, ; /Main_Test_Task堆栈void Main_Task(void *Id); /Main_Test_Task#define Main_Task_Prio 12OS_STK Display_Task_StackSTACKSIZE*8=

18、0, ; /Main_Test_Task堆栈void Display_Task(void *Id); /Main_Test_Task#define Display_Task_Prio 20OS_STK AD0_Task_StackSTACKSIZE*8=0, ; /Main_Test_Task堆栈void AD0_Task(void *Id); /Main_Test_Task#define AD0_Task_Prio 21OS_STK AD1_Task_StackSTACKSIZE*8=0, ; /Main_Test_Task堆栈void AD1_Task(void *Id); /Main_T

19、est_Task#define AD1_Task_Prio 22OS_STK AD2_Task_StackSTACKSIZE*8=0, ; /Main_Test_Task堆栈void AD2_Task(void *Id); /Main_Test_Task#define AD2_Task_Prio 23OS_STK AD3_Task_StackSTACKSIZE*8=0, ; /Main_Test_Task堆栈void AD3_Task(void *Id); /Main_Test_Task#define AD3_Task_Prio 24/*已经定义的OS任务*tcp监控任务 11以太网物理层监控

20、任务 8触摸屏任务 9键盘任务 10lcd刷新任务 59系统任务 1*/*事件定义*/OS_EVENT *Nand_Rw_Sem; /Nand_Flash读写控制权旗语/and you can use it as folloeing:/ Nand_Rw_Sem=OSSemCreate(1); /创建Nand-Flash读写控制权旗语,初值为1满足互斥条件/ OSSemPend(Nand_Rw_Sem,0,&err);/ OSSemPost(Nand_Rw_Sem);OS_EVENT *Uart_Rw_Sem; /Uart读写控制权旗语/and you can use it as folloei

21、ng:/ Uart_Rw_Sem=OSSemCreate(1); /创建Uart读写控制权旗语,初值为1满足互斥条件/ OSSemPend(Uart_Rw_Sem,0,&err);/ OSSemPost(Uart_Rw_Sem);/void initOSGUI() /初始化操作系统的图形界面 initOSMessage(); initOSList(); initOSDC(); initOSCtrl(); initOSFile();/ Main function. /int main(void) Uart_Printf(nArm Target Init OK.); Zlg7289_Reset()

22、;/zlg7289复位 ARMTargetInit(); /开发板初始化 OSInit(); /操作系统初始化 uHALr_ResetMMU();/复位MMU LCD_Init(); /初始化LCD模块 LCD_printf(LCD initialization is OKn);/向液晶屏输出数据 LCD_printf(320 x 240 Text Moden); initOSGUI();/初始化图形界面 LoadFont();/调Unicode字库 LoadConfigSys();/使用config.sys文件配置系统设置 LCD_printf(Create task on uCOS-II.

23、n); OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_StackSTACKSIZE*8-1, Main_Task_Prio);/ 创建系统任务 OSTaskCreate(Display_Task,(void *)0, (OS_STK *)&Display_Task_StackSTACKSIZE-1, Display_Task_Prio);/ 20 OSTaskCreate(AD0_Task,(void *)0, (OS_STK *)&AD0_Task_StackSTACKSIZE-1, AD0_Task_Prio); OSTaskCrea

24、te(AD1_Task,(void *)0, (OS_STK *)&AD1_Task_StackSTACKSIZE-1, AD1_Task_Prio); OSTaskCreate(AD2_Task,(void *)0, (OS_STK *)&AD2_Task_StackSTACKSIZE-1, AD2_Task_Prio); OSTaskCreate(AD3_Task,(void *)0, (OS_STK *)&AD3_Task_StackSTACKSIZE-1, AD3_Task_Prio); OSAddTask_Init();/创建系统附加任务 LCD_printf(Starting uC

25、OS-II.n); LCD_printf(Entering graph mode.n); LCD_ChangeMode(DspGraMode);/变LCD显示模式为文本模式 InitRtc();/初始化系统时钟 Nand_Rw_Sem=OSSemCreate(1); /创建Nand-Flash读写控制权旗语,初值为1满足互斥条件/ OSStart();/操作系统任务调度开始 /不会执行到这里 return 0;/void init_ADdevice()/ /rADCPSR=20; /rADCCON=ADCCON_SLEEP;/U8 onKey(int nkey, int fnkey) stat

26、ic BOOLEAN input=FALSE; static int EditNumber=1; if(EditNumber=1) switch(nkey) case 14:/OK if(!input) SetWndCtrlFocus(NULL, ID_ChannelTextCtrl); pChannelTextCtrl-text0=0; /清空文本框 SetTextCtrlEdit(pChannelTextCtrl, TRUE); DrawTextCtrl(pChannelTextCtrl); input=TRUE; edit0=1; else SetTextCtrlEdit(pChanne

27、lTextCtrl, FALSE); DrawTextCtrl(pChannelTextCtrl); input=FALSE; edit0=0; EditNumber=2; return TRUE; case 16:/Cancel SetTextCtrlEdit(pChannelTextCtrl, FALSE); input=FALSE; edit0=0; EditNumber=2; return TRUE; else if(EditNumber=2) switch(nkey) case 14:/OK if(!input) SetWndCtrlFocus(NULL, ID_ValueTextC

28、trl); pValueTextCtrl-text0=0; /清空文本框 SetTextCtrlEdit(pValueTextCtrl, TRUE); DrawTextCtrl(pValueTextCtrl); input=TRUE; edit1=1; else SetTextCtrlEdit(pValueTextCtrl, FALSE); DrawTextCtrl(pValueTextCtrl); input=FALSE; edit1=0; EditNumber=1; WarnningData Unicode2Int(pChannelTextCtrl-text)=Unicode2Int(pValueTextCtrl-text); return TRUE; case 17:/Cancel SetTextCtrlEdit(pValueText

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

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