嵌入式系统工程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统工程设计
报告
题目:基于MiniGUI的电压采集显示系统
专业:计算机科学与技术(嵌入式系统方向)
学期: 2010 春季学期
班级: 0791142
学号: 1079114223
姓名:任光伟
成绩:
哈尔滨工业大学华德应用技术学院
2010年07月02日
基于MiniGUI的电压采集显示系统
一、功能分析
示意图:
在MiniGUI窗口中显示界面如上,通过ADC采集实验箱上电位器的电压值,调整电位器,柱状图实时显示电压值;使用实验箱提供的ADC驱动程序;软件实现对电压采样值施加软件滤波。实现通道2坐标图曲线实时显示。
图1.1 ADC转换图1.2 MiniGUI图形显示
二、平台设计
LPC2200是基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-S TM CPU的微控制器对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%而性能的损失却很小
由于LPC2200的144脚封装极低的功耗多个32位定时器8路10位ADCPWM 输出以及多达9个外部中断使它们特别适用于工业控制医疗系统访问控制和POS机
通过配置总线LPC2200最多可提供76个GPIO由于内置了宽范围的串行通信接口它们也非常适合于通信网关协议转换器嵌入式软modern以及其它各种
类型的应用
图2.1 ADC转换模块
本系统使用的软件平台有uClinux和MiniGUI
uClinux就是Micro Controller Linux,是针对于工业控制领域,由Linux 内核派生面向低端控制器(无MMU)的嵌入式操作系统。uClinux在对物理内存的管理上仍然采用分页管理方式,但由于uClinux运行在没有MMU管理的CPU上,所以实际上uClinux采用物理存储管理策略,uClinux系统中所有进程访问的地址都是实际的物理地址。同时,由于采用了一系列的技术,uClinux内核和用户软件对内存大小的占用很小。
MiniGUI为实时嵌入式操作系统建立一个跨操作系统的、快速、稳定和轻量级的图形用户界面支持系统。属于一种“嵌入式图形中间件”软件产品。目前,MiniGUI已成为跨操作系统的图形用户界面支持系统,可在 Linux/uClinux、eCos、VxWorks、pSOS、ThreadX、Nucleus、uC/OS-Ⅱ、OSE 等操作系统,以及Win32 平台上运行。
图例,系统结构图如图2.2所示。
图2.2 ADC电压采集结构图
三、软件设计
图3.1 ADC转换模块程序流程图
static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{ HDC hdc;
static int x0 = 130, y0 = 200; // 当前坐标
static int x1 = 130, y1 = 200; // 保存上一次坐标static int t;int i;
static int count1,sum1;
static int count2,sum2;
static int stack1[5],stack2[5];
static int volt_level0,volt_level0_old;
char disp_buf[20];
static char *top = "峰值";
static char *buttom = "0";
static char *voltage = "V";
static char *time = "s";
switch(message)
{
case MSG_CREATE:
SetTimer(hWnd,TIMER0,50); //设定时间为0.5s
SetTimer(hWnd,TIMER1,50);
break;
case MSG_PAINT:
hdc = BeginPaint(hWnd);
绘制柱状图和坐标系
EndPaint(hWnd, hdc);
break;
case MSG_TIMER:
hdc = GetClientDC(hWnd);
if(wParam == TIMER1)
{
ad_data = 0;
read(fd1, &ad_data, sizeof(ad_data));
volt = (3300*(ad_data>>6));
volt = volt/1024;
stack1[count1] = volt;
for(i = 0; i < 5; i++)
sum1 = sum1 + stack1[i];
volt = sum1 / 5;
sum1 = 0;
count1 ++;
count1 = count1 % 5;
volt_level0 = volt / 200;
sprintf(disp_buf,"通道1电压:%dmV",volt);
SetBkColor(hdc,RGB2Pixel(HDC_SCREEN,0x33,0x66,0xCC));
SetTextColor(hdc,COLOR_lightwhite);
//SelectFont (hdc, logfontgb12);
TextOut(hdc,1,15,disp_buf);
if(volt_level0_old != volt_level0)
{更新柱状图}
volt_level0_old = volt_level0;
printf("VIN1's voltage is: %d mV ", volt);
switch(volt_level0)
{填充柱状图}
}
if(wParam == TIMER0)
{
ad_data = 0;
read(fd2, &ad_data, sizeof(ad_data));
volt = (3300*(ad_data>>6));
volt = volt/1024;
stack2[count2] = volt;
for(i = 0; i < 5; i++)
sum2 = sum2 + stack2[i];
volt = sum2 / 5;
sum2 = 0;
count2 ++;
count2 = count2 % 5;
sprintf(disp_buf,"通道2电压:%dmV",volt);
SetBkColor(hdc,RGB2Pixel(HDC_SCREEN,0x33,0x66,0xCC));
SetTextColor(hdc,COLOR_lightwhite);
//SelectFont (hdc, logfontgb12);
TextOut(hdc,140,15,disp_buf);
printf("VIN2's voltage is: %d mV\n", volt);
if(t == 0)
MoveTo(hdc,130,200);
t++;
t = t%160;
if(t == 0)
InvalidateRect (hWnd, &rect, TRUE);
x0 = 130 + t;
y0 = 200 - volt / 20.6;
SetPenColor(hdc,COLOR_lightwhite);
if(x0 > x1)
{
MoveTo(hdc,x1, y1);
LineTo(hdc,x0, y0);
}