基于ARM的多通道仪表数据采集.docx
- 文档编号:8638320
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:13
- 大小:210.59KB
基于ARM的多通道仪表数据采集.docx
《基于ARM的多通道仪表数据采集.docx》由会员分享,可在线阅读,更多相关《基于ARM的多通道仪表数据采集.docx(13页珍藏版)》请在冰豆网上搜索。
基于ARM的多通道仪表数据采集
目录
引言-----------------------------------------------------------------------------------------------------------------------2
第一章课题要求3
1.1课题内容及目的3
1.2运行环境3
第二章正文4
2.1课题分析4
2.2系统设计4
2.3代码分析、技术实现问题8
第三章实验结果13
第四章实验总结15
参考文献16
设计性实验报告成绩:
指导教师签名:
17
引言
随着工业自动化与信息化的不断发展,数据采集已经成为了计算机与外部物理世界连接的桥梁。
数据采集系统广泛地应用于工业生产中设备工作状况的监测、控制领域中的闭环控制系统及仿真领域的半实物仿真系统。
传统的数据采集装置通常由单片机及采集卡组成,其采集通道数较少、单任务的软件结构及实时性差等不足之处已无法满足人们的需求。
ARM(AdvancedRISCMachines)是基于RSIC架构的数据宽为32位可嵌入操作系统的微处理器。
由于其体积小、价格低、可靠性高、低功耗等特点在工业自动化、国防、运输等领域得到了广泛的应用。
本次设计是基于ARM的多通道实时数据采集系统;该系统由下位机系统及上位机软件组成,下位机硬件主要基于ARM工控开发平台、数据采集板及模拟量输出板,采用μC/OSⅡ实时多任务操作系统,实现多通道数据的采集、数据存储及模拟量的输出,并将采集数据实时传送至上位计算机;上位机软件接收数据进行监控,图形化显示数据变化,并控制下位机的模拟量输出功能;通过实验验证,下位机系统能够实现多通道数据的采集、存储及模拟量的输出,μC/OSⅡ操作系统完成多任务的实时调度,上位机软件成功进行模拟量数据的采集监控及数据变化的图形显示,整个系统具有良好的实时性。
采用多任务编程方法,每个任务监视一路AD转换,每一路AD的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。
可以通过文本框给每路AD设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。
第一章课题要求
1.1课题内容及目的
采用多任务编程方法,每个任务监视一路AD转换,每一路AD的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。
可以通过文本框给每路AD设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。
并在数码管上对应的某通道的数值显示当超过警戒线数值时,数字闪烁显示。
在此基础上,利用实验箱中的数码管显示每一路的电压采样值,并能在超出警戒值的情况下闪烁显示,在LCD屏上对应条形图的顶部显示具体的电压值。
1.2运行环境
硬件:
ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。
软件:
PC机操作系统Win98、Win2000或WinXP、ARMSDT2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
第2章正文
2.1课程分析
数据采集系统置于被监控的设备处,通过传感器对设备的电压或者电流信号进行采样、保持,并送入A/D转换器变成数字信号,然后将该信号送到FIFO中。
当FIFO中存放的数据到了一定数目时,由ARM7从FIFO中读出,然后通过ARM7的以太网接口送给上位机。
多路采集通道经过模拟开关后再进入A/D转换器。
CPLD是整个系统的控制核心,它控制采集通道的切换、A/D转换器的启/停、转换后的数据在FIFO中的存放地址发生器、产生中断请求以通知ARM7读取存放在FIFO中的数据等。
2.2系统设计
1.编写OnKey()函数,响应键盘消息。
流程图如图1所示。
1)这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理。
程序里用变量EditNumber指示当前要编辑的文本框控件;用变量input指示该文本框控件是否处于输入编辑状态。
以此决定回车键应该执行的功能。
2)当文本框控件不是编辑状态时,第一次回车将使其进入编辑状态,在程序里用SetWndCtrlFocus()函数将焦点转移到该控件并用SetTextCtrlEdit()函数设置为编辑状态;当文本框正处于编辑状态时,第二次回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取消键的处理和这种情况类似。
当在实现按键实现通道的选择时,我我在voidMain_Task(void*Id)里添加了如下代码:
if(flag){
switch(pMsg->WParam)
{
case15:
Key_val=0;break;
case11:
Key_val=1;break;
case12:
Key_val=2;break;
case13:
Key_val=3;break;
case8:
Key_val=4;break;
}
时通过按键的扫描码来改变变量Key_val的值,最后来控制通道的选择以及后面添加的数码管的显示位置。
在之前添加一个变量flag是为了在文本焦点时,柱状图和通道不会改变。
3)如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组WarnningData中,代码如下:
WarnningData[Unicode2Int(pChannelTextCtrl->text)]=Unicode2Int(pValueTextCtrl->text);
图1
2.编写绘图显示任务Display_Task,绘制文本框和柱状图等,并实现文本框编辑程序和超过警戒值后的显示,其流程图为图2所示。
图2
1)程序中用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这个变量在显示任务循环一次就改变一次状态,当IsEdit==1时将提示信息擦掉,否则保持显示不变。
这就是闪烁显示的原理,表示AD转换结果的条形图超出警戒值的部分的闪烁也是这样实现的,随着任务的循环隔次的改变状态。
2)warnning[x]是条形图闪烁的指示变量。
当某路AD转换的结果result_ADx大于对应通道的警戒值WarnningData[x]时,根据warnning[x]的值决定条形图的长度是和result_ADx对应还是和WarnningData[x]对应,这样看起来条形图的长度是变化的,效果就是超过警戒线的那部分在闪烁。
而我在这里做出了修改与控制,是在键盘按键响应才触发这警告值。
而按键的响应式依靠之前的键盘的扫描码的值来控制的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);//数码管以方式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);
}
a=0xff;
if(result_AD0>WarnningData[0])
a=0x3f;
Delay
(1);
WriteSDIO(ZLG7289_CMD_FLASH);//闪烁
WriteSDIO(a);
}
这是通道0的数码显示及闪烁,只需将通道0中的输入值和警戒值改成对应通道的值就可以实现。
(2)在LCD屏条形图中超出部分闪烁显示的代码
if(result_AD0<=WarnningData[0])
{
FillRect(pdc,110,(int)(210-result_AD0*20/3.3),130,210,GRAPH_MODE_NORMAL,COLOR_BLACK);
}
else
{
if(warnning[0]==1)
{
FillRect(pdc,110,(int)(210-result_AD0*20/3.3),130,210,GRAPH_MODE_NORMAL,COLOR_BLACK);
warnning[0]=0;
}
else
{
warnning[0]=1;
FillRect(pdc,110,(int)(210-WarnningData[0]*20/3.3),130,210,GRAPH_MODE_NORMAL,COLOR_BLACK);
}
}
这是通道0的代码,通道1、2、3的代码与之像似,只要改变相应的输入值和警戒值即可。
(3)触摸屏及按键的控制:
voidMain_Task(void*Id)//Main_Test_Task
{
POSMSGpMsg;
//flag=TRUE;
structpoint{
intx;
inty;};
structpointscrpoint;
flag=TRUE;
init_ADdevice(20,ADCCON_SLEEP);
for(;;)
{
POS_CtrlpCtrl;
pMsg=WaitMessage(0);
if(pMsg->pOSCtrl)
{
if(pMsg->pOSCtrl->CtrlMsgCallBk)
(*pMsg->pOSCtrl->CtrlMsgCallBk)(pMsg);
}
else
{
switch(pMsg->Message)
{
caseOSM_TOUCH_SCREEN:
//触摸屏的控制
switch(pMsg->LParam)
{
caseTCHSCR_ACTION_CLICK:
//响应触摸屏单击控制
disp_en=TRUE;//单击触发文本框电压显示
break;
caseTCHSCR_ACTION_DBCLICK:
//响应触摸屏双击控制
disp_en=FALSE;
break;
}
break;
caseOSM_KEY:
//按键响应
pCtrl=GetCtrlfromID(NULL,GetWndCtrlFocus(NULL));
if(pCtrl->CtrlType==CTRLTYPE_WINDOW)
{
if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_STYLE_MODE)
{
//焦点是有模式窗口,消息直接传递过去
OSOnSysMessage(pMsg);
break;
}
}
if(onKey(pMsg->WParam,pMsg->LParam))
break;
Uart_Printf("key=%d\n",pMsg->WParam);
if(flag){//变量flag在之前的触摸屏单双击控制时响应是否成立
switch(pMsg->WParam)
{
case15:
Key_val=0;break;
case11:
Key_val=1;break;
case12:
Key_val=2;break;
case13:
Key_val=3;break;
case8:
Key_val=4;break;
}
}
default:
OSOnSysMessage(pMsg);
break;
}
}
DeleteMessage(pMsg);
OSTimeDly(200);
}
}
第3章实验结果
将生成的文件编辑下载到开发平台并运行,通过四个旋钮来改变相应通道的电压值,当输入的电压值超过警戒值时,对应的数码管显示的数值也会闪烁显示,同时在LCD屏上的条形图的超过部分也会闪烁,条形图的顶端会显示相应的电压值(数值与数码管显示的值相同)。
也可在通过按键来直接控制是否闪烁显示。
哪怕电压值再高,超过警告值也不闪烁。
在LCD屏上设置了两个文本框,一个是控制的通道的,另一个是改变警戒值的。
当enter键按下时,选中了通道文本框,按键响应后,在文本框内显示所按下的值,再按下enter后,柱状图跳到该值对应的通道。
并且在触摸屏上单击就可以显示柱状图上的电压值,双击后,电压值消失。
实验结果实物图如下:
第4章实验总结
嵌入式实验,从第一次到最后一次,我几乎都是选择的ARM7的实验,所以对ADS实验比较熟悉,可是在实验中还是遇到了形形色色的问题,因为一个人想把一个设计性的实验完全做完,是不太容易的,之前的实验都是按照老师的视频做的,而且也是最多实现一个现象而已,没有什么要细细斟酌考虑要实现的话该怎么做?
而这次是自己想实现什么样的现象,什么样的特色都要自己去发现、去理解,所以面对一大堆代码时,很是伤脑筋。
所以我必须要将前面所掌握的知识融会贯通,并灵活运用,这样才能把这次实验做完。
首先按照的实验要求,我开始在网上找资料,以及结合之前老师讲的实验资料,然后和做这个实验的同学讨论,终于有了一个比较的明确的思路,也想出了自己想要的效果。
可是真正做的时候并不是那么简单的,总是遇到这样那样的问题,遇到问题就要解决,这就要自己的实力,终于经过自己不懈的努力,终于把程序中的错误都改正过来了。
这次实验使我明白了很多,光会有理论知识是不行的,我们要把理论知识和实践结合起来,这样才发挥了理论知识的用途。
虽然这次实验我经历了整整七个小时的艰苦奋斗,这样的坚持不懈终于最后有了自己想要的成效。
所以我知道也深深地体会到做实验的时候不能太急躁,要慢慢来,凡事都不能一气呵成的,都要经历一定的过程,途中总会遇到一些问题,遇到问题我们不能退缩,要勇敢面对,用自己的实力解决他,这样我们才会成长。
参考文献
[1]田泽.嵌入式系统开发与应用教程[M].北京:
北京航空航天大学出版社,2005.3
[2]周立功.ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社,2005.
[3]吴明晖.基于ARM的嵌入式系统开发与应用[M].北京:
人民邮电出版社,2004.
[4]金建设.基于ARM的嵌入式系统开发与应用[M].大连:
大连理工大学出版社,2009.9
设计性实验报告成绩:
___________指导老师签名:
_____________
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM 通道 仪表 数据 采集