1、 物理与电子工程学院 嵌入式系统 设计性实验报告 题目 基于 ARM 的多通道仪表数据采集实验 系 别 物理与电子工程学院 年 级 12 专 业 电子信息工程 班 级 电信 12 学 号 160412107 学生姓名 何剑 指导教师 浦 炜 实验时间 2015 年 12 月 10 日 目 录 课题要求 . 3 1.本课题的目的 . 3 2.运行环境 . 3 正文 . 3 一课题分析 . 3 二系统设计 . 4 2.1 新建工程 . 4 2.2 打开 main.c 文件,编辑 Main_Task 任务中的代码 . 4 2.3 编写 OnKey()函数,响应键盘消息 . 4 2.4 编写绘图显示任
2、务 Display_Task . 5 2.5 编写 4 路 AD 采集任务 ADx_Task . 6 2.6 用 ARM SDT 2.5 或 ADS1.2 编译、下载并调试上述程序,检查运行结果 . 6 2.7 生成发行版本的 .bin 文件,通过 USB 下载到嵌入式开发平台中,运行并检查输出结 . 6 果。 . 6 三 .技术实现问题 . 6 3.1 数码管显示及闪烁显示的代码 . 6 3.2 在 LCD 屏条形图中超出部分闪烁原理 . 8 3.3 条形图顶端显示具体电压值的代码如下: . 9 3.4 实现条形图闪烁显示及文本框显示相应数值 . 9 3.5 按键实现单通道图形显示 . 10
3、 3.6 双击切换电压值显示 . 14 四 . 总结与体会 . 15 设计性实验报告成绩: 指导教师签名: . 31 课题要求 1.本课题的目的 采用多任务编程方法,每个任务监视一路 AD 转换, 每一路 AD 的转换结果在液晶屏上用一个条形图的长短来 表示,直观地显示每路模拟输入电压的大小。可以通过文本框给每路 AD 设置警戒值,某路输入超出警戒线之后条形图中超出的部分会以闪动的方式显示。 在此基础上,利用实验箱中的数码管显示每一路的电压采样值,并能在超出警戒值的情况下闪烁显示。或在 LCD 屏上对应条形图的顶部显示具体的电压值。通过对触摸屏的双击切换电压值的显示。按键 03 仅显示对应的通
4、道柱状图,其余按键全部显示。 2.运行环境 硬件: ARM 嵌入式开发平台、用于 ARM7TDMI 的 JTAG 仿真器、 PC 机 Pentium100 以上。 软件: PC 机操作系 统 Win98、 Win2000 或 WinXP、 ARM SDT2.51 或 ADS1 集成开发环境、仿真器驱动程序、超级终端通讯程序。 正文 一课题分析 数据采集系统置于被监控的设备处,通过传感器对设备的 电压 或者 电流 信 号进行采样、保持,并送入 A/D 转换器变成数字信号,然后将该信号送到 FIFO 中。当 FIFO 中存放的数据到了一定数目时,由 ARM7 从 FIFO 中读出,然后通过 ARM
5、7 的以太网接口送给上位机。多路采集通道经过模拟开关后再进入 A/D 转换器。 CPLD 是整个系统的控制核心,它控制采集通道的切换、 A/D 转换器的启 /停、转换后的数据在 FIFO 中的存放地址发生器、产生中断请求以通知 ARM7 读取存放在 FIFO 中的数据等。 二系统设计 2.1 新建工程 将“ Exp23 多通道仪表数据采集实验”中的文件加入工程。 2.2 打开 main.c 文件,编辑 Main_Task 任务中的代码 用 init_ADdevice()函数初始化处理器的 AD 转换硬件,启动消息循环。 2.3 编写 OnKey()函数,响应键盘消息 流程图如图 5-4 所示。
6、提示: 1) 这里设置了两个文本框,用来输入通道编号和该通道的警戒值,在键盘消息响应函数里针对两个文本框分别作出处理,只处理回车键和取消键,其他键由控件本身处理。程序里用变量 EditNumber 指示当前要编辑的文本框控件;用变量 input 指示该文本框控件是否处于输入编辑状态。以此决定回车键应该执行的功能。 2)当文本框控件不是 编辑状态时,回车将使其进入编辑状态,在程序里用 SetWndCtrlFocus( )函数将焦点转移到该控件并用 SetTextCtrlEdit() 函数设置为编辑状态;当文本框正处于编辑状态时,回车将使其退出编辑状态,并将要编辑的文本框切换到另一个文本框控件,取
7、消键的处理和这种情况类似。 3) 如果当前要编辑的文本框是警戒值输入框,在编辑状态中回车确定后,所输入的通道编号以及警戒值就会保存在数组 WarnningData 中,代码如下: WarnningData Unicode2Int(pChannelTextCtrl-text)=Unicode2Int(pValueTe xtCtrl-text); 图 5-4 流程图 2.4 编写绘图显示任务 Display_Task 绘制文本框和条形图等,并实现文本框编辑过程中和超过警戒值后的动画显示。流程图如图5-5 所示。 提示: 1)程序中用 TextOut()函数显示文本框的提示信息,用数组 edit 记
8、录两个文本框是否处于编辑状态,用变量 IsEdit 指示提示信息是否显示。实际上, IsEdit 这个变量在显示任务循环一次就改变一次状态,当 IsEdit=1 时将提示信息擦掉,否则保持显示不变。这就是闪烁显示的原理,表示 AD 转换结果的条形图超出警戒值的部分的闪烁也是这样实现的,随着任务的循环隔次的改变状态。 2)和变量 IsEdit 的作用类似, warnningx是条形图闪烁的指示变量。当某路 AD 转换的结果 result_ADx 大于对应通道的警戒值 Warnni ngDatax时,根据 warnningx 的值决定条形图的长度是和 result_ADx 对应还是和 W arnn
9、ingDatax对应,这样看起来条形图的长度是变化的,效果就是超过警戒线 的那部分在闪烁。 3)这里条形图实际上是一个实心矩形,用 FillRect()函数填充。 图 5-5 Display_Task 流程图 2.5 编写 4 路 AD 采集任务 ADx_Task 提示: 1)使用 GetADresult()函数即可得到某路 AD 输出的二进制代码。由于处理器的 8 路 10 位 AD 转换单元的最大输入电压是 2.50V,所以实际电压值就是 result_ADx=GetADresult(x)*2.50/1024; 2.6 用 ARM SDT 2.5 或 ADS1.2 编译、下载并调试上述程序
10、,检查运 行结果 。 2.7 生成发行版本的 .bin 文件,通过 USB 下载到嵌入式开发平台中,运行并检查输出结 果。 三 .技术实现问题 3.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(ZLG728
11、9_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_AD0WarnningData0) a=0x3f; Delay(1); WriteSDIO(ZLG7289_CMD_FLASH);/闪烁 WriteSDIO(a
12、); 通道 1、 2、 3 和通道 0 一样只需将通道 0 中的输入值和警戒值改成对应通道的值就可以实现,当然要选择不同数码管来显示,具体哪个数码管可由自己选择。 3.2 在 LCD 屏条形图中超出部分闪烁原理 利用 FillRect()函数画出条形图,如果采样值小于警戒值则正常画图,如果超过警戒值,则先画采样值所对应的条形图,后画出警戒值所对应的条形图,两者无限循环这样现实的现象就是超出部分闪烁。 闪烁显示的代码如下: if(result_AD0=WarnningData0) FillRect(pdc, 110, (int)(210-result_AD0*20/3.3), 130, 210,
13、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; else warnning0=1; FillRect(pdc, 110, (int)(210-WarnningData0*20/3.3), 130,210, GRAPH_MODE_NORMAL,COLOR_BLACK); 这是通道 0 的代码,通道 1、 2、 3 的代码同上,只要改
14、变相应的输入值和警戒值即可。 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); 相应的也只需改变对应通道的输入值和警戒值即可实现其他通道电压值显示。 3.4 实现条形图闪烁显示及文本框显示相应数值 完整代码如下: /0 通道 if(result_AD0=WarnningData0) FillRect(pdc, 110, (int)(210-resu
15、lt_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; else warnning0=1; FillRect(pdc, 110, (int)(210-WarnningData0*20/3.3), 130, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); Int2U
16、nicode(int)(result_AD0),result_AD0_16); TextOut(pdc, 114, (int)(198-result_AD0*20/3.3), result_AD0_16, TRUE, FONTSIZE_SMALL); 其他通道的显示和 0 通道类似,只需修改相应坐标及相应数值即可。 3.5 按键实现单通道图形显示 添加全局变量 static int Key_val; switch(nkey) case 15:Key_val=0;break; case 11:Key_val=1;break; case 12:Key_val=2;break; case 13:Ke
17、y_val=3;break; case 8:Key_val=4;break; 在 void Display_Task(void * Id) 中添加相应功能,代码如下: if(Key_val=0) 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; else warnning0=1; FillRect(pdc, 110, (int)(210-WarnningData0*20/3.3), 130, 210, GRAPH_MODE_NORMAL,COLOR_BLACK); else if(Key_val=1) if(result_AD1=WarnningData1)