《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc_第1页
《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc_第2页
《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc_第3页
《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc_第4页
《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

物理与电子工程学院 嵌入式系统与应用设计性实验报告 题目 基于arm的多通道仪表数据采集实验 系 别 物理与电子工程学院 年 级 专 业 班 级 学 号 学生姓名 指导教师 实验时间 2011.12 目录一摘要3二引言42.1本课题的目的:42.2运行环境:4三课题研究53.1主函数模块53.2 ad数据采集模块63.3响应键盘消息模块73.4绘图显示模块8四总结与体会11参考文献12附 录13设计性实验报告成绩: 指导教师签名:28一摘要在实际应用中,常常需要对现场的设备进行监测,通过采集设备的运行参数随时了解、跟踪设备运行状态,进而对设备进行分析和诊断。传统的数据采集系统一般采用pc 加数据采集卡,主要做法是将一块基于ias 或pci的板卡插入工业计算机或商用机上,将外部信号通过导线引至计算机,然后接入数据采集卡,通过定制的软件进行采集。但是采用数据采集卡的缺点是安装麻烦、易受机箱内环境的干扰,而且由于受计算机插槽数量和位置、中断资源的限制,不可能挂接很多设备。从未来的发展方向上看,数据采集系统的数据采集部分应朝着强实时、多参数、高精度方向发展;数据存储部分朝着大容量、微型化、便携式方向发展;数据传输部分朝着多通讯方式、远距离数据传输方向发展。一般的基于单任务顺序机制的单片机数据采集系统又很难胜任对于稳定性、实时性要求很高的场合。基于此,本设计了一种基于arm7 处理器,采用了串口、usb、以太网3 种与pc 机的通讯方式,以适应不同场合的需要。采用多任务编程方法,每个任务监视一路ad 转换, 每一路ad 的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路ad 设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。二引言2.1本课题的目的:采用多任务编程方法,每个任务监视一路ad 转换, 每一路ad 的转换结果在液晶屏上用一个条形图的长短来表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路ad 设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。 在此基础上,利用实验箱中的数码管显示每一路的电压采样值,并能在超出警戒值的情况下闪烁显示。或在lcd屏上对应条形图的顶部显示具体的电压值。2.2运行环境:嵌入式开发平台(arm7)和pc机三课题研究3.1主函数模块在 main()函数中调用 osstart()函数之前用下列语句创建任务:ostaskcreate(taskname,(void*)0,(os_stk*)&taskname_stackstacksize-1,taskname_prio);ostaskcreate()函数的原型是:int8u ostaskcreate (void (*task)(void *pd), void *p_arg, os_stk *ptos, int8u prio);需要将任务函数 taskname,任务堆栈 taskname_stack,任务优先级 taskname_prio 三个参数传给 ostaskcreate()函数。根据任务函数的内容决定堆栈大小,宏 stacksize 定义为4kb,可以在此基数上乘倍。任务优先级越高,taskname_prio 值越小;ucos-ii 可以管理 64个任务,由 osinit()创建的空闲任务的优先级最低为 63;ucos-ii 保留 4 个最高和 4 个最低 优先级,用户任务可以使用其余 56 个优先级值。int main(void)uart_printf(narm target init ok.); zlg7289_reset();/zlg7289复位armtargetinit(); /开发板初始化osinit(); /操作系统初始化 uhalr_resetmmu();/复位mmulcd_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.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);/ 20ostaskcreate(ad0_task,(void *)0, (os_stk *)&ad0_task_stackstacksize-1, ad0_task_prio);ostaskcreate(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 ucos-ii.n);lcd_printf(entering graph mode.n);lcd_changemode(dspgramode);/变lcd显示模式为文本模式initrtc();/初始化系统时钟nand_rw_sem=ossemcreate(1); /创建nand-flash读写控制权旗语,初值为1满足互斥条件/osstart();/操作系统任务调度开始/不会执行到这里return 0;3.2 ad数据采集模块使用getadresult()函数即可得到某路ad 输出的二进制代码。由于处理器的8路10 位ad 转换单元的最大输入电压是2.50v,所以实际电压值就是result_adx=getadresult(x)*2.50/1024;代码如下:void ad0_task(void * id) /main_test_taskfor(;)result_ad0=getadresult(0)*33/1024;/uart_printf(result_ad0=%dn,result_ad0);ostimedly(100);void ad1_task(void * id) /main_test_taskfor(;)result_ad1=getadresult(1)*33/1024;/uart_printf(result_ad1=%dn,result_ad1);ostimedly(100);void ad2_task(void * id) /main_test_taskfor(;)result_ad2=getadresult(2)*33/1024;/uart_printf(result_ad2=%dn,result_ad2);ostimedly(100);void ad3_task(void * id) /main_test_taskfor(;)result_ad3=getadresult(3)*33/1024;/uart_printf(result_ad3=%dn,result_ad3);ostimedly(100);3.3响应键盘消息模块流程图如图5-4 所示。图5-4 流程图1)这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理。程序里用变量editnumber 指示当前要编辑的文本框控件;用变量input 指示该文本框控件是否处于输入编辑状态。以此决定回车键应该执行的功能。2)当文本框控件不是编辑状态时,回车将使其进入编辑状态,在程序里用setwndctrlfocus( )函数将焦点转移到该控件并用settextctrledit() 函数设置为编辑状态;当文本框正处于编辑状态时,回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取消键的处理和这种情况类似。3)如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组warnningdata 中,代码如下: warnningdataunicode2int(pchanneltextctrl-text)=unicode2int(pvaluetextctrl-text);3.4绘图显示模块流程图如下:图5-5 display_task 流程图1)程序中用textout()函数显示文本框的提示信息,用数组edit 记录两个文本框是否处于编辑状态,用变量isedit 指示提示信息是否显示。实际上,isedit这个变量在显示任务循环一次就改变一次状态,当isedit=1 时将提示信息擦掉,否则保持显示不变。这就是闪烁显示的原理,表示ad 转换结果的条形图超出警戒值的部分的闪烁也是这样实现的,随着任务的循环隔次的改变状态。textout(pdc, 10, 35, channel_caption_16, true, fontsize_small);2)和变量isedit 的作用类似,warnningx是条形图闪烁的指示变量。当某路ad 转换的结果result_adx 大于对应通道的警戒值warnni ngdatax时,根据warnningx 的值决定条形图的长度是和result_adx 对应还是和w arnningdatax对应,这样看起来条形图的长度是变化的,效果就是超过警戒线的那部分在闪烁。if(warnning0=1)fillrect(pdc,110,(int)(210-result_ad0*20/3.3),130,210,graph_mode_normal,color_black);warnning0=0;elsewarnning0=1;fillrect(pdc,110,(int)(210-warnningdata0*20/3.3),130,210,graph_mode_normal,color_black);3)这里条形图实际上是一个实心矩形,用fillrect()函数填充。fillrect(pdc, 160, (int)(210-result_ad1*20/3.3), 180, 210, graph_mode_normal,color_black);4) 使zlg7289占有同步串口,控制对应的数码管做相关反映,使灯点亮或闪烁,运用变量show和flash控制数码管的相应变化/ ad0通道显示zlg7289_enable();/使zlg7289占有同步串口delay(5);/延时writesdio(zlg7289_cmd_data0|0);/数码管以方式1译码,第七个数码管亮writesdio(int)(result_ad0)%10);/显示个位delay(1);/延时if(int)(result_ad0)9)/键值大于9显示十位writesdio(zlg7289_cmd_data0|1);/发送十位数据,并显示在十位writesdio(int)(result_ad0)/10);delay(1);show=show|0x03;writesdio(zlg7289_cmd_hide);writesdio(show);delay(1);else/键值小于10不显示十位show=show & 0xfd;writesdio(zlg7289_cmd_hide);/使个位数码管显示writesdio(show);delay(1);if(result_ad0warnningdata0)flash=flash | 0x03;writesdio(zlg7289_cmd_flash);/闪烁writesdio(flash);delay(1);elseflash=flash & 0xfc;writesdio(zlg7289_cmd_flash);/闪烁writesdio(flash);delay(1);四总结与体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,arm嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。经过一番辛苦,结果达到基本要求,在做课题中,我了解嵌入式开发的基本流程以及开发过程中怎么调试软件等,每一个代码都有固定的意义,再熟悉中你要认真对待。这次实验使我明白了很多,光会有理论知识是不行的,我们要把理论知识和实践结合起来,这样才发挥了理论知识的用途。做实验的时候不能太急躁,要慢慢来,凡事都不能一气呵成的,都要经历一定的过程,途中总会遇到一些问题,遇到问题我们不能退缩,要勇敢面对,用自己的实力解决他,这样我们才会成长。参考文献1 田泽. 嵌入式系统开发与应用教程m . 北京:北京航空航天大学出版社,2005.32 周立功. arm 嵌入式系统基础教程m . 北京:北京航空航天大学出版社,2005.3 吴明晖. 基于arm 的嵌入式系统开发与应用m . 北京:人民邮电出版社,2004.附 录实验代码main.c#include.ucos-iiincludes.h /* uc/os interface */#include .ucos-iiaddosaddition.h#include .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 result_ad0,result_ad1,result_ad2,result_ad3;int warnningdata4=33,33,33,33;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=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_test_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以太网物理层监控任务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 folloeing:/ 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();/zlg7289复位armtargetinit(); /开发板初始化osinit(); /操作系统初始化 uhalr_resetmmu();/复位mmulcd_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.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);/ 20ostaskcreate(ad0_task,(void *)0, (os_stk *)&ad0_task_stackstacksize-1, ad0_task_prio);ostaskcreate(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 ucos-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)static boolean input=false;static int editnumber=1;if(editnumber=1)switch(nkey)case 14:/okif(!input)setwndctrlfocus(null, id_channeltextctrl);pchanneltextctrl-text0=0; /清空文本框settextctrledit(pchanneltextctrl, true);drawtextctrl(pchanneltextctrl);input=true;edit0=1;elsesettextctrledit(pchanneltextctrl, false);drawtextctrl(pchanneltextctrl);input=false;edit0=0;editnumber=2;return true;case 16:/cancelsettextctrledit(pchanneltextctrl, false);input=false;edit0=0;editnumber=2;return true;else if(editnumber=2)switch(nkey)case 14:/okif(!input)setwndctrlfocus(null, id_valuetextctrl);pvaluetextctrl-text0=0; /清空文本框settextctrledit(pvaluetextctrl, true);drawtextctrl(pvaluetextctrl);input=true;edit1=1;elsesettextctrledit(pvaluetextctrl, false);drawtextctrl(pvaluetextctrl);input=false;edit1=0;editnumber=1;warnningdata unicode2int(pchanneltextctrl-text)=unicode2int(pvaluetextctrl-text);return true;case 17:/cancelsettextctrledit(pvaluetextctrl, false);drawtextctrl(pvaluetextctrl);input=false;edit1=0;editnumber=1;return true;return false;void main_task(void *id) /main_test_taskposmsg pmsg;init_addevice(20,adccon_sleep);for(;)pos_ctrl pctrl;pmsg=waitmessage(0);if(pmsg-posctrl)if(pmsg-posctrl-ctrlmsgcallbk)(*pmsg-posctrl-ctrlmsgcallbk)(pmsg);elseswitch(pmsg-message)case osm_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;default:osonsysmessage(pmsg);break;deletemessage(pmsg);ostimedly(200);void display_task(void * id) /main_test_taskpdc pdc;structrect channeltextctrl_rect,valuetextctrl_rect,draw_wnd_rect;char channel_caption_810=channel:;char value_caption_810=value:;char draw_wnd_caption_8=draw window;char vol_8=vol;char chn_8=chn;char chn0_8=0;char chn1_8=1;char chn2_8=2;char chn3_8=3;char vol_10_8=10;char vol_20_8=20;char vol_30_8=30;u8 show=0xff;u8 flash=0x00;u16 channel_caption_1610;u16 value_caption_1610;u16 draw_wnd_caption_1620;u16 vol_165;u16 chn_165;u16 chn0_162;u16 chn1_162;u16 chn2_162;u16 chn3_162;u16 result_ad0_165;u16 result_ad1_165;u16 result_ad2_165;u16 result_ad3_165;u16 vol_10_163;u16 vol_20_163;u16 vol_30_163;wnd draw_wnd;pwnd pdraw_wnd;int warnning4=1,1,1,1;boolean isedit=0;pdc=createdc();pdraw_wnd=&draw_wnd;strchar2unicode(draw_wnd_caption_16, draw_wnd_caption_8);strchar2unicode(channel_caption_16, channel_caption_8);strchar2unicode(value_caption_16, value_caption_8);strchar2unicode(chn_16, chn_8);strchar2unicode(vol_16, vol_8);strchar2unicode(chn0_16, chn0_8);strchar2unicode(chn1_16, chn1_8);strchar2unicode(chn2_16, chn2_8);strchar2unicode(chn3_16, chn3_8);strchar2unicode(vol_10_16,vol_10_8);strchar2unicode(vol_20_16,vol_20_8);strchar2unicode(vol_30_16,vol_30_8);setrect(&channeltextctrl_rect, 10,50,55,75);setrect(&valuetextctrl_rect, 10,125,55,150);setrect(&draw_wnd_rect, 74, 9, 301, 216);pchanneltextctrl=createtextctrl(id_channeltextctrl, &channeltextctrl_rect, fontsize_middle, ctrl_style_frame, null,null);pvaluetextctrl=createtextctrl(id_valuetextctrl, &valuetextctrl_rect, fontsize_middle, ctrl_style_frame, null,null);pdraw_wnd=createwindow(draw_wnd_id, &draw_wnd_rect, fontsize_small,wnd_style_modeless, draw_wnd_caption_16, null);clearscreen();textout(pdc, 55, 10, vol_16, true, fontsize_small);textout(pdc, 290, 215, chn_16, true, fontsize_small);textout(pdc, 116, 215, chn0_16, true, fontsize_small);textout(pdc, 166, 215, chn1_16, true, fontsize_small);textout(pdc, 216, 215, chn2_16, true, fontsize_small);textout(pdc, 266, 215, chn3_16, true, fontsize_small);textout(pdc, 60, (int)(205-1*200/3.3), vol_10_16, true, fontsize_small);textout(pdc, 60, (int)(205-2*200/3.3), vol_20_16, true, fontsize_small);textout(pdc, 60, (int)(205-3*200/3.3), vol_30_16, true, fontsize_small);drawtextctrl(pchanneltextctrl);drawtextctrl(pvaluetextctrl);for(;)textout(pdc, 10, 35, channel_caption_16, true, fontsize_small);textout(pdc, 10, 110, value_caption_16, true, fontsize_small);if(edit0=1)if(isedit=1)fillrect(pdc, 10, 35, 60, 45, graph_mode_normal, color_white);isedit=0;elseisedit=1;if(edit1=1)if(isedit=1)fillrect(pdc, 10, 110, 60, 120, graph_mode_normal, color_white);isedit=0;elseisedit=1;drawwindow(pdraw_wnd);moveto(pdc, 75, 15);lineto(pdc, 80,10);lineto(pdc, 85, 15);moveto(pdc,80 , 10);lineto(pdc, 80, 210);lineto(pdc, 300, 210);moveto(pdc, 295, 205);lineto(pdc, 300, 210);lineto(pdc, 295, 215);moveto(pdc, 80, (int)(210-1*200/3.3);lineto(pdc, 300, (int)(210-1*200/3.3);moveto(pdc, 80, (int)(210-2*200/3.3);lineto(pdc, 300, (int)(210-2*200/3.3);moveto(pdc, 80, (int)(210-3*200/3.3);lineto(pdc, 300, (int)(210-3*200/3.3);if(result_ad0=warnningdata0)fillrect(pdc, 110, (int)(210-result_ad0*20/3.3), 130, 210,graph_mode_normal, color_black);elseif(warnni

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论