《基于ARM的多通道仪表数据采集》由会员分享,可在线阅读,更多相关《基于ARM的多通道仪表数据采集(19页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统课程小论文 物理与电子工程学院 嵌入式系统设计课程小论文课题题目 基于ARM的多通道仪表数据采集 系 别 物理与电子工程学院 年 级 10级 专 业 电子科学与技术 学 号 050210220 学生姓名 王军 指导老师 浦玮 日 期 2013.05.31 目 录引言-2第一章 课题要求3 1.1 课题内容及目的3 1.2 运行环境3第二章 正文4 2.1 课题分析4 2.2 系统设计4 2.3 代码分析、技术实现问题8第三章 实验结果13第四章 实验总结15参考文献 16设计性实验报告成绩: 指导教师签名:17引言随着工业自动化与信息化的不断发展,数据采集已经成为了计算机与外部物理世
2、界连接的桥梁。数据采集系统广泛地应用于工业生产中设备工作状况的监测、控制领域中的闭环控制系统及仿真领域的半实物仿真系统。 传统的数据采集装置通常由单片机及采集卡组成, 其采集通道数较少、单任务的软件结构及实时性差等不足之处已无法满足人们的需求。ARM ( Advanced RISC Machines) 是基于RSIC 架构的数据宽为32 位可嵌入操作系统的微处理器。由于其体积小、价格低、可靠性高、低功耗等特点在工业自动化、国防、运输等领域得到了广泛的应用。 本次设计是基于ARM的多通道实时数据采集系统;该系统由下位机系统及上位机软件组成,下位机硬件主要基于ARM工控开发平台、数据采集板及模拟量
3、输出板,采用C/OS实时多任务操作系统,实现多通道数据的采集、数据存储及模拟量的输出,并将采集数据实时传送至上位计算机;上位机软件接收数据进行监控,图形化显示数据变化,并控制下位机的模拟量输出功能;通过实验验证,下位机系统能够实现多通道数据的采集、存储及模拟量的输出,C/OS操作系统完成多任务的实时调度,上位机软件成功进行模拟量数据的采集监控及数据变化的图形显示,整个系统具有良好的实时性。采用多任务编程方法,每个任务监视一路AD 转换, 每一路AD 的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路AD 设置警戒值,某路输入超出警戒线之后条形图
4、中超出的部分会以闪动的方式显示。 第一章 课题要求1.1 课题内容及目的采用多任务编程方法,每个任务监视一路AD 转换, 每一路AD 的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路AD 设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。并在数码管上对应的某通道的数值显示当超过警戒线数值时,数字闪烁显示。在此基础上,利用实验箱中的数码管显示每一路的电压采样值,并能在超出警戒值的情况下闪烁显示,在LCD屏上对应条形图的顶部显示具体的电压值。1.2 运行环境硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、P
5、C机Pentium100以上。软件:PC机操作系统Win98、Win2000或WinXP、ARM SDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。第二章 正文2.1 课程分析数据采集系统置于被监控的设备处,通过传感器对设备的电压或者电流信号进行采样、保持,并送入A/D转换器变成数字信号,然后将该信号送到FIFO中。当FIFO中存放的数据到了一定数目时,由ARM7从FIFO中读出,然后通过ARM7的以太网接口送给上位机。多路采集通道经过模拟开关后再进入A/D转换器。CPLD是整个系统的控制核心,它控制采集通道的切换、A/D转换器的启/停、转换后的数据在FIFO中的存放
6、地址发生器、产生中断请求以通知ARM7读取存放在FIFO中的数据等。2.2 系统设计1编写OnKey()函数,响应键盘消息。流程图如图1所示。1) 这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理。程序里用变量EditNumber 指示当前要编辑的文本框控件;用变量input 指示该文本框控件是否处于输入编辑状态。以此决定回车键应该执行的功能。 2)当文本框控件不是编辑状态时,第一次回车将使其进入编辑状态,在程序里用SetWndCtrlFocus( )函数将焦点转移到该控件并用SetTextCtr
7、lEdit() 函数设置为编辑状态;当文本框正处于编辑状态时,第二次回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取消键的处理和这种情况类似。 当在实现按键实现通道的选择时,我我在void Main_Task(void *Id) 里添加了如下代码:if(flag)switch(pMsg-WParam)case 15:Key_val=0;break; case 11:Key_val=1;break; case 12:Key_val=2;break; case 13:Key_val=3;break; case 8:Key_val=4;break; 时通过按键的扫描码来改变变量K
8、ey_val的值,最后来控制通道的选择以及后面添加的数码管的显示位置。在之前添加一个变量flag是为了在文本焦点时,柱状图和通道不会改变。3) 如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组WarnningData 中,代码如下: WarnningData Unicode2Int(pChannelTextCtrl-text)=Unicode2Int(pValueTe xtCtrl-text); 图12编写绘图显示任务Display_Task, 绘制文本框和柱状图等,并实现文本框编辑程序和超过警戒值后的显示,其流程图为图2所示。图21) 程
9、序中用TextOut()函数显示文本框的提示信息,用数组edit 记录两个文本框是否处于编辑状态,用变量IsEdit 指示提示信息是否显示。在此次的实验中,我是利用一个disp_en来控制是否在柱状图上的文本框内显示电压值,而这一使能的控制是在触摸屏上的点击实现的,只有在单击触摸屏的时候才会被触发。if(disp_en) Int2Unicode(int)result_AD0,result_AD0_16);TextOut(pdc,110,(int)(210-result_AD0*20/3.3)-10,result_AD0_16,TRUE, FONTSIZE_SMALL);在实际上,IsEdit这
10、个变量在显示任务循环一次就改变一次状态,当IsEdit=1 时将提示信息擦掉,否则保持显示不变。这就是闪烁显示的原理,表示AD 转换结果的条形图超出警戒值的部分的闪烁也是这样实现的,随着任务的循环隔次的改变状态。 2)warnningx是条形图闪烁的指示变量。当某路AD 转换的结果result_ADx 大于对应通道的警戒值Warnni ngDatax时,根据warnningx 的值决定条形图的长度是和result_ADx 对应还是和W arnningDatax对应,这样看起来条形图的长度是变化的,效果就是超过警戒线的那部分在闪烁。 而我在这里做出了修改与控制,是在键盘按键响应才触发这警告值。而
11、按键的响应式依靠之前的键盘的扫描码的值来控制的Key_val变量。于是在此添加了一段语句:if(Key_val=0|Key_val=4)。5、编写数码管显示代码。通过改变模拟电压的值来控制数码管上的显示值。并且是在此基础上在添加一个控制,当有按键时同时也控制的数码管的显示位。2.3代码分析、技术实现问题(1)数码管显示及闪烁显示的代码/ 0通道显示if(Key_val=0|Key_val=4) /是在按键响应的同时对数码管的位显示也进行控制 ZLG7289_ENABLE();/使zlg7289占有同步串口Delay(5);/延时WriteSDIO(ZLG7289_CMD_DATA1|6);/数
12、码管以方式1译码,第一个数码管亮WriteSDIO(int)(result_AD0)%10);/显示个位Delay(1);/延时if(int)(result_AD0)9)/键值大于9显示十位WriteSDIO(ZLG7289_CMD_DATA1|7);/发送十位数据WriteSDIO(int)(result_AD0)/10);Delay(1);WriteSDIO(ZLG7289_CMD_HIDE);/使一、二、三这三位数码管显示WriteSDIO( 0xff);else/键值小于10不显示十位WriteSDIO(ZLG7289_CMD_HIDE);/使个位数码管显示WriteSDIO(0x7f
13、); a=0xff;if(result_AD0WarnningData0)a=0x3f;Delay(1);WriteSDIO(ZLG7289_CMD_FLASH);/闪烁WriteSDIO(a);这是通道0的数码显示及闪烁,只需将通道0中的输入值和警戒值改成对应通道的值就可以实现。(2)在LCD屏条形图中超出部分闪烁显示的代码if(result_AD0=WarnningData0) FillRect(pdc,110,(int)(210-result_AD0*20/3.3),130,210,GRAPH_MODE_NORMAL, COLOR_BLACK);elseif(warnning0=1)FillRect(pdc, 110, (int)(210-result_AD0*20/3.3), 130, 210, GRAPH_MODE_NORMAL,COLOR_BLACK);warnning0=0;elsewarnni