
《嵌入式系统与应用》设计性实验报告-基于ARM的多通道仪表数据采集实验.doc
28页物理与电子工程学院 《嵌入式系统与应用》设计性实验报告 题目 基于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_Stack[STACKSIZE-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();//复位MMU LCD_Init(); //初始化LCD模块 LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据 LCD_printf("320 x 240 Text Mode\n"); initOSGUI();//初始化图形界面 LoadFont();//调Unicode字库 LoadConfigSys();//使用config.sys文件配置系统设置 LCD_printf("Create task on uCOS-II...\n"); OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio);// 创建系统任务 OSTaskCreate(Display_Task,(void *)0, (OS_STK *)&Display_Task_Stack[STACKSIZE-1], Display_Task_Prio);// 20 OSTaskCreate(AD0_Task,(void *)0, (OS_STK *)&AD0_Task_Stack[STACKSIZE-1], AD0_Task_Prio); OSTaskCreate(AD1_Task,(void *)0, (OS_STK *)&AD1_Task_Stack[STACKSIZE-1], AD1_Task_Prio); OSTaskCreate(AD2_Task,(void *)0, (OS_STK *)&AD2_Task_Stack[STACKSIZE-1], AD2_Task_Prio); OSTaskCreate(AD3_Task,(void *)0, (OS_STK *)&AD3_Task_Stack[STACKSIZE-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_Task{ for(;;) { result_AD0=GetADresult(0)*33/1024; //Uart_Printf("result_AD0=%d\n",result_AD0); OSTimeDly(100); }}void AD1_Task(void * Id) //Main_Test_Task{ for(;;) { result_AD1=GetADresult(1)*33/1024; //Uart_Printf("result_AD1=%d\n",result_AD1); OSTimeDly(100); }}void AD2_Task(void * Id) //Main_Test_Task{ for(;;) { result_AD2=GetADresult(2)*33/1024; //Uart_Printf("result_AD2=%d\n",result_AD2); OSTimeDly(100); }}void AD3_Task(void * Id) //Main_Test_Task{ for(;;) { result_AD3=GetADresult(3)*33/1024; //Uart_Printf("result_AD3=%d\n",result_AD3); OSTimeDly(100); }}3.3响应键盘消息模块流程图如图5-4 所示。
图5-4 流程图1)这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理程序里用变量EditNumber 指示当前要编辑的文本框控件;用变量input 指示该文本框控件是否处于输入编辑状态以此决定回车键应该执行的功能2)当文本框控件不是编辑状态时,回车将使其进入编辑状态,在程序里用SetWndCtrlFocus( )函数将焦点转移到该控件并用SetTextCtrlEdit() 函数设置为编辑状态;当文本框正处于编辑状态时,回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取消键的处理和这种情况类似3)如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组WarnningData 中,代码如下: WarnningData[Unicode2Int(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 的作用类似,warnning[x]是条形图闪烁的指示变量当某路AD 转换的结果result_ADx 大于对应通。












