五.设计方法
系统实物图如下:

5.1.1 SOPC Builder系统图
本系统充分发挥了SOPC的优势,利用其很好的可重构可重配置性以及高效的Avalon总线交换结构,加入了多种IP核。其中,视频处理模块和VGA控制器模块都是根据系统要求而开发的用户IP核,然后通过SOPC Builder配置到Avalon总线上。SOPC下的设计大大缩短了项目的开发周期,软硬件协同设计,大大提高了系统的开发速度。
SOPC Builder系统如图5所示。

图5 SOPC Builder系统
5.1.2内部模块图
图6 内部模块图
5.1.3 NiosII双核处理器
1. Nios双核处理器的任务分配
利用NiosII多软核处理器可以改善MCU处理速度不高、外设资源有限、接口配置繁琐、硬件设计和软件设计编程复杂等问题。本设计充分利用NiosII软核处理器的特点和性能,通过配置双NiosII软核,将大量控制以及对多种外设访问的工作交给NiosII软核完成,极大地减少了软件的工作量。双核的任务分配如下:
CPU0:(1).人机交互,不设置操作系统;
(2).μC/GUI及应用程序程序的运行;
(3).通过UART1串口接收触摸屏的数据;
CPU1:(1).设置嵌入式实时μC/OS II操作系统;
(2).通过UART2串口与网络模块通信;
(3).通过GPIO口接收外部控制中断信号;
两个NiosII软核通过mailbox进行软核间的通信。
2. Nios双核处理器通信设计
ALTERA提供带Avalon接口的邮箱内核mailbox组件在多核处理器之间发送消息,邮箱适用于双核间单方向的消息通信,功能相当于FIFO缓冲队列,其传送的消息往往是指向共享内存块的结构体的指针,代替实际的数据传输,提高数据交换效率。根据本系统的要求,只是在双核间传送控制信号,单方向的通信完全符合要求。邮箱内核含有两个互斥体,确保了一次只有一个处理器修改邮箱内容, 表1为邮箱内核存储器映射.
表1.邮箱内核存储器映射表
偏移量
|
寄存器
名称
|
读/写
|
位描述符
|
31 … 16
|
15 … 1
|
0
|
0
|
Mutex 0
|
R/W
|
OWNER
|
VALUE
|
1
|
Reset 0
|
R/W
|
N/A
|
N/A
|
RESET
|
2
|
Mutex 1
|
R/W
|
OWNER
|
VALUE
|
3
|
Reset 1
|
R/W
|
N/A
|
N/A
|
RESET
|
5.1.4视频处理模块
本系统采用NTSC制式摄像头。首先利用I2C协议对视频解码器ADV7181进行相关配置,则模拟视频信号经过解码器,输出8位的YCbCr4:2:2的数字视频流,在开发平台中对视频流进行解交织和色度空间变换等处理,输出分辨率为640*480RGB(444)信号,模块做为Avalon总线的从外设,通过CPU控制视频采集的开始和结束,由于视频数据量过大,系统通过Avalon总线规范中的主端口突发传输,将视频数据存入SDRAM的视频缓冲区,缓冲区大小为640*480*2个字节。图7为视频处理模块结构图。
图7 视频处理模块
1. 视频采集解码的实现
由于DE1开发板并没有视频接口,所以我们根据系统的需求做了一块ADV7181的扩展板,通过GPIO与开发板连接。外接一个NTSC制式的摄像头,用I2C总线对视频解码芯片进行合理配置,配置完成后,视频解码器输出符合ITU-R656 YCbCr视频数据以及时钟和控制信号。
视频解码模块包括两个部分:
(1) 利用对视频解码芯片ADV7181进行合理配置;
(2) 系统通过GPIO接收解码器输出的数据和时钟信号。
图8为视频采集解码的硬件配置图。
图8 硬件配置图
2. 视频转换及传输的实现
本模块主要进行视频格式转换,视频解交织处理,视频数据抽取,视频数据的存储。
视频转换子模块完成的功能如下:
(1) 把视频解码器输出的YCbCr 4:2:2的视频流转换为YCbCr 4:4:4格式的数据。
(2) 把视频解码器输出的YCbCr 4:4:4的视频流转换为符合LCD显示的RGB格式的数据,这里主要是进行色度空间的转换;
(3) 根据DE1的VGA接口性能,需要对转换出来的视频数据进行色度抽取,将转换出来的30位的RGB数据,取各自的高4位, 变成12位,从而符合VGA的接口要求,而且减小了视频的数据量。
(4) 除去视频流中应当消隐的数据,只将有效的RGB数据提取出来,放至发送缓冲区。
(5) 视频的解交织处理,由于摄像头是隔行扫描,而LCD显示则需要逐行扫描,所以需要将数据的存储地址进行变换,将隔行变逐行,在这里采用主端口突发写传输的方式将数据写入SDRAM。
5.1.5 VGA控制核
VGA控制器按功能可划分为三个模块:VGA控制模块,FIFO控制器以及VGA时序产生模块。我们在实际处理时将VGA控制模块中的CPU接口部分和数据处理部分分别封装成为AVALON总线的从端口和主端口模式,首先接口部分收到CPU的控制信息然后发起主端口突发读传输,将从SDRAM中读到的视频数据写入FIFO,再以一个符合VGA时序的频率将数据送入VGA时序产生模块,经过处理模块将时序正确的RGB数据从VGA接口输出,写入LCD进行显示。整个VGA IP核的结构连接如图9所示。
图9 VGA控制核内部模块图
1. FIFO控制器
VGA显示需要进行大批量的数据传送。在标准 VGA(640×480 60Hz)模式下,每个像素点的扫描周期只有40ns,如果直接用CPU来刷屏,会严重影响CPU的处理速度,为此,我们在考虑到系统的要求和速度的情况下,使用了Avalon 总线突发读传输读取显存数据,由于DE1开发板上DA转换有12位,这样,RGB数据只需要16位就可以提供一个像素点的数据,那么,在我们的640*480的图象解决方案上,只需要640*480*2个字节的数据,为了避免存储空间和片上资源的浪费,我们在每次读传输周期,向FIFO中存储3行的数据,即突发传输数(burstcount)为16*60 。在FIFO产生读空信号后,再存入3行的数据。系统框图如图10所示。
图10 VGA系统框图
2. VGA控制模块和VGA时序产生模块
VGA控制模块主要控制VGA模块的开始和其运行的状态,需要写一个Avalon 从端口响应CPU的控制信号,继而控制整个模块的运行。时序发生模块需要严格按照VGA时序进行编写,表2为VGA在640*480分辨率下时序要求。
表2 VGA的行时序分辨率要求表
VGA模式
|
行时序
|
Configuration
|
分辨率(HxV)
|
同步脉冲
|
后沿(us)
|
有效(us)
|
前沿(us)
|
时钟(Mhz)
|
VGA(60Hz)
|
640x480
|
3.8us
|
1.9
|
25.4
|
0.6
|
25
|
VGA模式
|
场时序
|
Configuration
|
分辨率(HxV)
|
同步脉冲
|
后沿(lines)
|
有效(lines)
|
前沿(lines)
|
VGA(60Hz)
|
640x480
|
2 lines
|
33
|
480
|
10
|
根据计算,在像素时钟为25MHZ的情况下VGA行时序中,每行包括800像素点,其中640 点为有效显示区,160点为行消隐区(非显示区)。行消隐区包括:行同步信号 HS 的同步脉冲96个脉冲,后沿45个脉冲,前沿13个脉冲。 另外,有效时间包括的6个列过扫描边界列,在后沿和前沿中各加 3个;VGA 场时序中,每场有525行,其中480行为有效显示行,45行为场消隐区。场消隐区包括:场同步信号每场有一个脉冲,该脉冲的低电平宽度为2行,后沿30行,前沿9行;有效时间包括的4行过扫描边界行,后沿和前沿各加2行。图11为VGA模块图。

图11 VGA模块图
VGA时序仿真图如图12.

图12 VGA时序仿真图
3. 异步FIFO
异步FIFO采用ALTERA器件库中的IP核,宽度为32位,深度为1024位,有异步清零端与读空,写满信号。
5.1.6 LCD触摸屏
LCD采用夏普公司的LQ080V3DG01 TFT真彩屏,接VGA驱动板,驱动板与开发板相连,并使用四线电阻式触摸板,四线触摸屏包含两个阻性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线。为了在X轴方向进行测量,将左侧总线偏置为0V,右侧总线偏置为VREF。将顶部或底部总线连接到ADC,当顶层和底层相接触时即可作一次测量。
为了在Y轴方向进行测量,将顶部总线偏置为VREF,底部总线偏置为0V。将ADC输入端接左侧总线或右侧总线,当顶层与底层相接触时即可对电压进行测量。图13显示了四线触摸屏在两层相接触时的简化模型。对于四线触摸屏,最理想的连接方法是将偏置为VREF的总线接ADC的正参考输入端,并将设置为0V的总线接ADC的负参考输入端。
图13 简化模型
此四线电阻式触摸板采用11位AD转换芯片,采集的AD值送回开发板进行处理,由于传过来的AD值无法供GUI使用,所以需要校正为640*480的像素值,校正算法类似于线性代数中的空间变换,首先在屏上定义5个坐标,如图14所示,这些坐标的实际像素值已知,然后点击这些坐标,将AD值记录,其纵向因子系数,横向因子系数计算公式如式(3-2)。
图14 LCD坐标轴示意图
KY={(YLA-YLC)/(YA-YC)+(YLB-YLD)/(YB-YD)}/2 (3-1)
KX={(XLB-XLA)/(XB-XA)+(XLD-XLD)/(XD-XC)}/2 (3-2)
式中有L的值为AD值,无L的值的值为像素值,然后再定义一个基坐标,根据KX,KY,和其AD值就可推出现在的像素值,见式(3-3),
XF=(XLF-XLC)/KX+XC
YF=(YLF-YLC)/KY+YC (3-3)
式中C点为基坐标,XC,YC为基坐标的像素值,XLC与YLC为基坐标的AD值。
5.1.7 SD卡
1. SD卡基本知识介绍
SD卡是一种基于半导体快闪记忆器的记忆设备,也就是一种高度集成闪存卡,具备串行和随机存储能力,它被广泛地于便携式装置上使用。SD卡拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。正是由于SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域,音乐、电影、新闻等多媒体文件都可以方便地保存到SD卡中。在本监控系统中我们有各种体征参数,报警信息,还有声音文件等大量数据需要存储,DE1板上的存储空间有限,所以我们利用SD接口设计来扩充系统存储空间。
2. SD卡的硬件介绍
图15为SD卡的硬件结构图。
图15 SD卡结构图
从图15可以看出SD卡主要由接口引脚,接口控制,寄存器组和存储区四部分构成。由于我们无法直接访问其中的存储区域,所以只能通过接口引脚对SD卡内的寄存器组进行读写控制操作,而DE1开发平台已经为我们提供了标准的SD卡接口,所以在此重点介绍一下寄存器组部分。
由图15所示的SD卡结构图可以看出SD卡主要的寄存器包括5种,如表3所示。
表3 SD卡的寄存器描述
名称
|
宽度
|
描述
|
CID
|
128
|
卡识别号:单独卡号码的识别
|
RCA
|
16
|
卡相对地址:卡在本地系统中的地址,在主机对卡初始化的过程中由卡动态分配
|
CSD
|
128
|
卡特别数据:有关卡操作条件的信息
|
SCR
|
64
|
SD卡配置寄存器:有关SD卡的特殊功能信息
|
OCR
|
32
|
操作条件寄存器
|
3. SD的工作协议描述
对SD卡的控制操作是通过一种问答式的协议来进行的。首先主端口在CMD信号线上发命令(CMD),接着卡发送响应(RESPONSE),如果需要数据传送,则数据在DAT信号线上传送。图16,图17分别为主端口对SD卡的读和写的操作示意图。
图16 对SD卡的读操作

图17 对SD卡的写操作
所谓SD卡的控制主要是对卡工作时状态模式转换的控制。 SD卡的工作模式可以分为不工作模式(Inactive Mode),卡识别模式(Card Identification Mode)和数据传输模式(Data Transfer Mode)。其所包含的状态见表4。
表4 SD卡工作模式及其对应状态
卡状态
|
工作模式
|
不工作状态
|
不工作模式
|
初始状态
|
卡识别模式
|
准备状态
|
识别状态
|
待机状态
|
数据传输模式
|
传输状态
|
发送数据状态
|
接受数据状态
|
编程状态
|
断开状态
|
其中不稳定模式只是在SD卡在开始阶段或者工作时出现不稳定状态的一个短暂的过程,主要的是另外两种工作模式,大致步骤为SD卡先通过识别模式识别卡的类型和状态,使卡达到稳定状态,主要起到初始化的作用,然后进入数据传输模式传输数据。

图18 SD卡初始化流程图
图18,图19分别为卡识别模式和数据传输模式的流程。

图19 卡数据传输模式流程图
4. SD卡的接口设计
SD卡上所有单元由内部时钟发生器提供时钟,接口驱动单元同步外部时钟的DAT和CMD信号到内部所有时钟。SD卡有两种通信协议:SD通信协议和SPI通信协议。与SPI通信协议相比,SD通信协议采用单根数据线理论,读写速度快,理论上可达25MB/S,可以满足此系统的需要,因此我们采用单根数据线的SD模式。在quartus开发平台的SOPC Builder中我们添加了三个PIO作为和SD卡交流的接口,分别为SD_CLK、SD_DAT和SD_CMD信号线。对SD卡的工作协议我们在Nios IDE中采用软件编程的方式来实现。
5. SD卡在软件系统中的实现
对SD卡配置实际上就是对其寄存器组的读写控制过程,通过对SD卡规范说明书以及其它有关SD卡资料的阅读,我们在Nios IDE中不仅完成了对SD卡驱动的编写,实现了SD卡初始化,也实现了对SD卡工作时序的控制,并且在FAT16文件系统的基础上实现了数据读写函数。
(1)SD卡的驱动
SD卡的初始化过程我们定义为函数SD_card_init(),它的实现过程主要为:
w通过使用命令CMD0使卡得到稳定的工作电压,这是卡正常工作的前提;
w采用命令CMD55+ACMD41来判断卡的类型,判断插入的卡是SD卡还是MMC卡;同时通过命令ACMD41使主机和卡的操作电压范围相匹配,发这个命令之后,卡会把它的OCR中的内容在Response中回过来。
w通过发送命令CMD2来获得卡的CID。CID为卡内的一个128位的寄存器,就像人的身份证一样。获得CID,就获得了卡的使用权限,使卡进入认证状态;
w分配卡的相对地址RCA(relative card address)为控制器对卡访问的唯一标志,HOST通过发送CMD3即可动态分配;
w设置读写块的大小,根据FAT16文件系统的要求,读写块的大小可设置为512字节。HOST发送命令CMD16来设完成此项任务。
w SD卡的读写以设置的数据块大小为单位来读写,每次读写都是块的整数倍。命令CMD17/CMD18和CMD24/CMD25分别对卡读一个或多个和写一个或多个数据块。在文件系统中我们通过SD_read_lba()函数和SD_write_lba()函数来实现。
(2) SD卡的时序控制
在对SD卡进行操作的过程中,我们发现对SD卡时序的理解是件十分重要的事情。只有严格按照时序信息,才能让SD卡更好的工作。SD卡的读写时序如图20,图21。
图3.20 SD卡读操作时序图
表5是对图3.20,图3.21中参数的说明。
表5 SD 卡参数说明
编码
|
描述
|
S
|
开始字节(=0)
|
T
|
传输字节(Host=1;Card=0)
|
P
|
循环一次拉高
|
E
|
结束字节(=1)
|
Z
|
高阻态(->=1)
|
D
|
数据字节
|
X
|
不关心数据字节(从SD卡)
|
.
|
重复
|
CRC
|
循环冗余编码字节(7位)
|
|
卡激活态
|
|
主机激活态
|
(3) SD卡的文件系统设计
① SD卡文件体系结构

图22 SD卡文件体系结构
如图22所示,为SD卡的文件体系结构。应用程序层,通过SD卡文件系统层提供的函数来操作SD。SD卡文件系统层,实现对SD卡的文件操作。SD卡驱动层,实现对SD卡进行读写操作。
由于我们的系统使用的SD卡存储空间不超过1G,所以在SD卡的文件系统层采用FAT16可以很好的满足系统的要求。FAT(File Allocation Table)是“文件分配表”的意思。顾名思义,就是用来记录文件所在位置的表格,它对于SD卡的使用是非常重要的,假若丢失文件分配表,那么SD卡上的数据就会因无法定位而不能使用了。FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT16。
文件系统由4部分组成:系统记录区(MBR),文件分配表(FAT),文件目录表(DIR)和数据区。
系统记录区通常包含4块内容:BIOS参数记录块BPB(BIOS Parameter Block),磁盘标志记录表,分区引导记录代码区和结束标志0x55AA。BPB表从扇区字节位移0x0b开始,占25字节。
FAT16的文件系统中有两份完全相同的文件分配表FAT1和FAT2,每份FAT表占用空间的大小可从BPB表中查得。文件在磁盘上以簇为单位存储,但是同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,往往会分成若干簇,FAT表就是记录文件存储中簇与簇之间连接信息的,这就是文件的链式存储。FAT16文件系统采用16位字长的分配表,最多可以管理216个基本存储单元
文件目录表DIR固定占32个扇区,每个扇区可以容纳16个登记项,每个登记项长32字节,记录了每个文件的代号、长度、属性、目录、生成和最后修改的时间以及文件的存储链在文件分配表中的入口。
数据区用来存放文件数据,占用大部分磁盘空间,本系统定义其1块为512字节。
② SD卡文件系统的实现

图23 文件创建流程图
文件的创建——通过函数CreatFile()来实现,创建流程如图23。
在SD卡上新建FAT文件,应首先在FAT表中查找尚未被使用的簇号,确定文件的起始簇号,并根据文件的大小,确定文件在FAT表格中的终止簇号,在相应的FAT[i]中写入起始与终止簇号。之后应在DIR区申请一个登记项,实际上就是在DIR区中建立一个32字节的文件目录。
文件的读写操作——通过函数OpenSD()来实现,读写流程如图24所示。
图24 文件读写流程图
SD卡上文件都是以簇为单位存取的。读SD卡上的文件,首先要根据文件名查找到该文件的目录登记项,根据目录登记项中的起始簇号既可找到文件在数据区中第1簇的内容,又可在FAT表中找到第2个簇号,根据第2个簇号又能找到第2簇的内容和FAT 表中的第3个簇号,以此类推,可读取到全部文件数据。向SD卡写文件,要保证FAT1和FAT2中内容的一致性,即对两块都要进行同样的写操作。
5.1.8μC/GUI
1. GUI应用程序简介
μC/GUI不仅提供了丰富的界面元素(窗体,各种控件)和绘图函数,同时也提供了很好的颜色管理和汉字支持,对硬件也提供了良好的底层驱动支持。我们的应用程序正是基于这样的图形用户接口开发的。此系统GUI显示的设计中,我们考虑到文字库代码量大的问题,将其中显示汉字的部分用压缩位图代替,系统界面如图25、图26和图27所示。
图25 系统进入界面

图26 功能选择界面

图27 主界面
应用软件设计流程图如图28所示:

图28 应用程序开发流程图
2. GUI移植
首先定义GUIConf.h和LCDConf.h这两个文件,前者是μC/GUI功能模块和动态存储空间(用于内存设备和窗口对象)大小,默认字体设置等基本GUI预定义控制的定义。后者LCDConf.h为LCD大小,控制器类别,总线宽度,颜色选取等LCD参数控制文件。GUI/CORE/LCD_ConfDefaults.h文件内可以找到所有囊括LCD配制默认选项,包括LCD屏个数,控制器个数 ,调色板,屏幕反向设置等众多配制选项。如果配备触摸屏可以通过GUITouchConf.h进行配制,根据触摸屏及其控制芯片编制以下几个函数:
void TOUCH_X_ActivateX (void);// 准备X轴数据测量
void TOUCH_X_ActivateY (void);// 准备Y轴数据测量
因为在我们的软件中不需要测量X、Y轴的数据,所以以上两个函数在我们的软件中均为空结构体;
int TOUCH_X_MeasureX(void); // 根据AD转换结果返回X的值
int TOUCH_X_MeasureY(void); // 根据AD转换结果返回Y的值
以上几个函数在GUI_TOUCH_Exec()会被调用,将它们写好就可以了。
触摸屏触点位置的获得是通过调用GUI/core/目录中GUI_TOUCH_DriverAnalog.c文件中的 GUI_TOUCH_Exec( )函数来实现的,对该函数进行修改后的伪代码如下:
void GUI_TOUCH_Exec(void)
{
读取触点在触摸屏上(x, y)点实际坐标值;
进行实际坐标值到逻辑坐标的转换;
调用GUI_TOUCH_StoreState(x, y)保存逻辑坐标值;
}
系统为了实时得到触点坐标,需要不断调用GUI_TOUCH_Exec( )函数,但在GUI系统设置时,我们并没有使用UC/OSII操作系统,所以不能用单独的一个任务对该函数进行调用。我们只在触摸中断服务函数中调用GUI_TOUCH_Exec( )函数,并复位当前的触点状态(包括坐标和是否按下标志),这样就可以比任务的方式更快地响应触摸动作。
图29表示了μC/GUI的软件结构:
图29 μC/GUI的软件结构图
3. LCD驱动程序
通过修改μC/GUI自带的驱动程序,对缓冲区的读写改写成对显存的读写,就可实现LCD的正确显示。
色彩方面,我们使用的VGA接口只接收12位的数据,而在LCDConf.h中我们配置每像素用16位表示,这里就需要色彩的转换,将16位的色彩值转换成12位的,具体的转换如下:
b=(ColorIndex&0xf800)>>12;
g=(ColorIndex&0x07e0)>>7;
r=(ColorIndex&0x001f)>>1;
ColorInde为16位数据。这样通过转换后的颜色会有一定的变化,但不是很明显。
5.1.9μC/OSII
1. uC/OS II简介及组成
uC/OS-Ⅱ实际上是一个实时操作系统内核,只包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。没有提供输入输出管理、文件系统、网络之类的额外服务。但是由于uC/OS-Ⅱ的可移植性和开源性,用户可以自己添加所需的各种服务。目前,已经出现了第三方为uC/OS-Ⅱ开发的文件系统、TCP/IP协议栈、用户显示接口等。
对于一个多任务操作系统来说,任务间的通信与同步是必不可少的。uC/OS-Ⅱ提供了四种同步对象,分别是信号量、邮箱、消息队列和事件。通过邮箱和消息队列还可以进行任务间的通信。所有的同步对象都有相应的创建、等待、发送的函数。但这些对象一旦创建就不能删除,所以要避免创建过多的同步对象以节约系统资源
uC/OS-Ⅱ的大部分代码是用ANSI C写成的,只有与处理器硬件相关的一部分代码用汇编语言编写。所以uC/OS-Ⅱ的移植性很强,可以在绝大多数8位、16位、32位微处理器、数字信号处理器上运行
μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。
(1) 核心部分(OSCore.c)
是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。
(2) 任务处理部分(OSTask.c)
任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。
(3) 时钟部分(OSTime.c)
μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。
(4) 任务同步和通信部分
为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。
(5) 与CPU的接口部分
这里的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。
2.μC/OS II在本系统中的应用
在本系统中μC/OS II是CPU1运行的基础,其中利用MailBox实现双核之间的通信。各个任务之间的调度都是依靠μC/OS II完成的,主要调度发送短信任务、接收短信任务、双核通信任务、监控任务这4个任务,大大提高了系统的实时性。
5.1.10串口通信
带Avalon接口的通用异步接收器/发送器内核为Altera FPGA上的嵌入式系统和外部设备提供了串行字符流的通信方式。内核执行RS—232协议时序,并提供可调整的的波特率。用户可配置奇偶校验位、停止位和数据位,以及可选的RTS/CTS流控制信号.
DE1开发板上只提供的一个标准串口,而触摸屏和网络模块接口都是通过UART来实现串口通信,所以我们外接了一个MAX232芯片,做电平转换,以适合I/O口的TTL电平。
本系统中,所有用到的UART都设置为9600bps,数据格式全部为8个有效位和一个停止位。
因为NiosII提供的UART的驱动程序在使用中会造成CPU的挂起并很难判断数据包的起止与终止,因此我们对每个外设都编写了与其对应的UART中断服务函数,并且对其做了适当优化。中断服务如图30所示。
图30 串口中断服务示意图
5.1.11 A/D转换IP核
前端的采集信号如何能保证信号数据的不失真,数据不丢失问题,是我们对AD模块设计的考虑重点。
(1)AD时序控制模块
系统采用的AD转换芯片为ADS7822。ADS7822 是一种可在 2.7~3.6V 的电源电压下工作的12位单通道A/D转换器,根据情况的不同也可在 2.0~5V 的电源电压下工作,ADS7822 的参考电压可在50mV到V之间任意设置,参考电压的大小直接决定了模拟输入的范围。A/D变换的结果通过串行口输出。具有低电压、微功耗、结构简单和体积小的特点。其采样速率可达75KHz,能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。它的内部结构图如图31所示。
图31 ADS7822转换器的内部结构图
图32为ADS7822芯片工作的时序图
图32 ADS7822时序图
由此可见,在自ADS7822的I/O CLOCK端输入16个外部时钟信号期间需要完成以下工作:CS下降沿来临,准备本A/D转换;对本次转换的输入模拟信号采样并保持;接收上次转换出的12位数据;启动本次A/D转换。
要在FPGA中实现ADS7822模数控制器,可以用Verilog HDL语言的控制状态机设计的仿真如图33。
图33 状态机时序
dout为采集的数据串行输入,时钟ioclock由系统时钟通过分频系数得到。作为采样控制时钟,这样可以根据需要来调整采样速率。
(2)IP核封装
通过将AD转换时序控制器和采样时钟分频器等控制寄存器与总线接口信号相结合,就构成了AD转换IP核的结构。在SOPC Builder中将其封装成为IP核即可挂到Avaln总线上进行使用。它的模块图如图34。
图34 AD转换IP模块图
5.1.12心电
本次设计的主要任务为设计一个简易心电图仪,可测量人体心电信号并在DE1开发板的控制下实现在液晶显示器上显示.示意图如图35所示。
图35 简易心电图仪示意图
导联电极说明:
RA—右臂;LA—左臂;RL—右腿.
导联电极接法:RA接放大器反相输入端(-),LA接放大器同相输入端(+),RL接反馈浮置.
◆ 心电信号属生物医学信号,具有如下特点:
(1)信号具有近场检测的特点,离开人体表微小的距离,就基本上检测不到信号;
(2)心电信号通常比较微弱,至多为mV量级;
(3)属低频信号,且能量主要在几百赫兹以下;
(4)干扰特别强。干扰既来自生物体内,如肌电干扰、呼吸干扰等;也来自生物体外,如工频干扰、信号拾取时因不良接地等引入的其他外来串扰等;
(5)干扰信号与心电信号本身频带重叠(如工频干扰等)。
◆ 针对心电信号的上述特点,对采集电路系统的设计分析如下:
(1)信号放大是必备环节,而且应将信号提升至A/D输人口的幅度要求,即至少为“V”的量级;
(2)应尽量削弱工频干扰的影响;
(3)应考虑因呼吸等引起的基线漂移问题;
(4)信号频率不高,通频带通常是满足要求的,但应考虑输入阻抗、线性、低噪声等因素。
(5)电源部分和放大滤波电路相隔离,削弱电源信号对放大和滤波电路的干扰.
1 采集电路的设计分析过程
总体设计如图36所示。
图36 心电电路处理设计
(1) 低通滤波电路
在此我们采用两阶低通有源滤波电路,因为一阶有源低通滤波电路简单,幅频特性衰减斜率只有-20dB/十倍频程,因此,在fo处附近选择性差,希望衰减斜率越陡越好,只有增加滤波器的阶数来实现。
二阶有源低通滤波电路如图37所示。
图37 有源低通滤波电路
幅频特性图如图38所示。
图38 幅频特性
一阶和二阶有源低通滤波电路的幅频特性曲线如图39。
图39 滤波电路幅频特性
所以,二阶的低通滤波器更适合我们的电路要求。
(2) 前置放大电路
由于人体心电信号的特点,加上背景噪声较强,采集信号时电极与皮肤间的阻抗大且变化范围也较大,这就对前级(第一级)放大电路提出了较高的要求,即要求前级放大电路应满足以下要求:
高输入阻抗;高共模抑制比;低噪声、低漂移、非线性度小;合适的频带和动态范围。
为此,选用Analog公司的仪用放大器AD620作为前级放大(预放)。AD620的核心是三运放电路(相当于集成了三个OP07运放),其内部结构如图1所示。
图40 AD620医用仪表放大器的内部简图
该放大器有较高的共模抑制比(CMRR),温度稳定性好,放大频带宽,噪声系数小且具有调节方便的特点,是生物医学信号放大的理想选择。根据小信号放大器的设计原则,前级的增益不能设置太高,因为前级增益过高将不利于后续电路对噪声的处理。
根据以上分析,前置放大电路的设计如图41所示。
图41 前置放大电路设计
并运用Multisim 2001仿真, 仿真过程采用O.5 MV,1.2 Hz的差分信号源为模拟心电输入来模拟电路的放大过程,结果满足要求。
(3) 高通滤波器(消除基线漂移)
在电路部分加上简单的高通滤波环节,对隔断直流通路和消除基线漂移将会起到事半功倍的效果,本部分电路置于预放大与信号放大电路之间,一个简单的无源高通滤波电路,具体电路如图42所示:
图42 0.03HZ高通滤波电路
其特征频率(转折频率)计算为:
经过高通滤波后,可以大大削弱0.03 Hz以下因呼吸等引起的基线漂移程度,心电信号低频端也就相应地取该频率。
(4) 高通滤波器(消除基线漂移)
引入补偿电路,是为了抵消人体信号源中的干扰(包括工频干扰)。引入补偿电路的方法:在前级放大电路的反馈端与信号源地端建立共模负反馈,为提高电路的反馈深度,将反馈信号放大后(仍采用OP07)接人信号源参考端,这样可以最大限度地抵消工频干扰。引入的这种电路形式,根据其结构和功能,可形象地将其称为“反馈浮置跟踪电路”。
(5)次级放大电路(信号放大)
第二级放大电路主要以提高增益为目的,选用普通的AD OP07即可满足要求。
3 具体电路详细设计
最后的综合电路如图43所示。图中U3单元为AD620前置放大;U1为反馈浮置跟踪部分;U2为第二级放大输出部分。
图43 心电图电路设计
该电路增益估算为:
第一级放大:
第二级放大:
总增益:
实际增益由于高通滤波及其他损耗的存在,要比理论估算值略小,但已满足放大输出的要求。
验证仿真波形如图所示:
当输入信号为2mVrms 5 hz 和 1.2mVrms 200hz 信号时Multisim中的仿真波形如图44所示。
图44 心电仿真波形
电路实物图如图45所示。
图45 心电电路实物图
5.1.13视频识别
本系统的图像识别算法以CamShift运动跟踪算法理论为基础,通过提取其中的核心算法与思想,并对实际模型进行简化处理,可从视频图像中判断出病人的移动情况。
5.2 PC端服务器
5.2.1软件介绍
服务器端软件由两个部分组成,后台程序和图形交互程序。其中后台程序可以独立运行,也可以和图形交互软件作为一个程序运行。
5.2.2软件功能
1)接收网络模块发送的数据,并且链接数据库。
2)判断是否要显示报警信息,根据实际情况发出报警提示。
3)显示历史数据,以波形的形式显示历史数据,并实时更新。
5.2.3实现原理
后台程序利用socket套接字的流式套接字,监听PC机的6000端口,如果有链接则接受网络中传送的数据,并且分析数据是否是应用层规定的有效数据。如果是有效数据,则分析其发送的信息,如果不是有效信息则忽略。由于使用TCP方式链接,因此不会发上数据丢失的情况,保证了整个系统的稳定性。
应用层定义的有效数据可分为测量的数据信息和报警信息。数据格式如下:
如果接受到的数据位测量的数据,则将数据存放到相应的数据库中,并且判断数值是否正常,如果超出正常值的范围,则根据数据对应的检测值发出相应的报警信息。如果是报警信息,则直接发出对应的报警信号。
报警信号以弹出对话框和终端字幕提醒的方式显示,便于观察。示例如下
图形交互程序: 为了便于在远程PC上观察病人的情况并把病人信息能及时反馈给病人家属,通过vb中的开始接收数据和结束接收数据按钮分别控制开始接收网络中传来的病人的相关参数信息并存到Oracle数据库中和停止接收传来的数据,再使用连接字符串的方法将Oracle数据库中的信息导入到Adodc控件中,并使绘制病人各参数曲线的Mschart控件的数据源为Adodc中的数据,这样就可以绘制出参数的曲线图,为了便于医护人员的分析和家属对病人情况的了解,特设了各参数分析的按钮,它可实时打印出当前各参数的报表,更便于归档保存。这些远端pc上的功能使得医护人员能随时根据各参数曲线图了解病人的情况,利于病人的治疗。
Vb中显示参数曲线图如图46(以体温为例):
(注:从16以后的参数是为了测试报警信息,用温水测试的。)
图46 体温参数曲线图
5.2.4数据流程图
图47 数据处理流程图
5.2.5数据库设计
由于医院病人人数多和需要存储信息量大,因此我们使用了适宜存储数据量大、安全性高和稳定性强的Oracle数据库,在数据库中建立了用于存储数据的四张表,各表的表名和相应列名如下:
temp(体温):次(列名1),体温(列名2);
pulse(脉搏):次(列名1),脉搏(列名2);
bp(血压):时间(列名1),血压(列名2);
(Revision: 25 / 2009-09-14 09:59:56)