温度采集系统课程设计

2024-08-04

温度采集系统课程设计(7篇)

1.温度采集系统课程设计 篇一

基于LabVIEW的FBG温度传感器数据采集系统设计

针对光纤Bragg光栅(FBG)温度传感器实时监测过程中,对数据采集和处理的快速、准确的要求,提出了一种基于虚拟仪器技术的实时数据采集处理系统设计方案.该方案在首先考虑FBG温度传感器原理的基础上设计了数据采集处理系统,应用虚拟仪器软件LabVIEW语言编写程序,实现了对数据采集系统的控制与处理.对FBG温度传感器的实验测试表明:所设计的.系统能够满足FBG传感器实时数据采集和处理的要求.

作 者:赵晓亮 肖立志 张元中 付建伟 陈海峰 ZHAO Xiao-liang XIAO Li-zhi ZHANG Yuan-zhong FU Jian-wei CHEN Hai-feng  作者单位:中国石油大学,北京,102249 刊 名:传感器与微系统  PKU英文刊名:TRANSDUCER AND MICROSYSTEM TECHNOLOGIES 年,卷(期):2006 25(12) 分类号:V249.32 关键词:光纤Bragg光栅   温度传感器   数据采集  

2.温度采集系统课程设计 篇二

在科技革命突飞猛进、发展日新月异、竞争日趋激烈的时代背景下, 人民的生活水平也日益提高。各种电热电器产品也因为其本身产品结构小, 更新换代快, 款式样式新等特点, 已经成为了家庭日常生活必需品中的一个重要组成部分。近些年来我省电热产品发展势头迅猛, 同样作为电热产品中最主要的元件——温度敏感元件, 也成为了各个生产企业重点关注的产品之一。其质量的好坏决定性的影响了整机产品质量的好坏。

在现行标准中, 对于产品动作温度的检测和要求明显增强, 在例如制造偏差和漂移、耐久性等项目中增加了对动作温度的监控要求。同时, 在实地对于产品生产过程的了解以及大量检测业务过程中发现, 现有的检测及判断手段多数仅为定性的判断, 即高于一定值动作即可。并没有对其过程的实时监控, 为产品以后在整机中的工作情况带来不小的安全隐患, 也不利于企业对其产品进行更为有效的改进与质控。开展温度特性自动采集系统的研究, 可以完善现有检测技术平台, 有利于质检部门更加全面地掌握质量状况, 更加贴近企业, 更好地为企业提供多方位的技术服务, 有利于提升机构的检验能力和行业知名度。

一、温度特性自动采集系统设计

1.1温度自动采集系统工作要求

温度检测系统的测试是通过测试软件控制的, 系统软件的开发必须做到:

(1) 检测并记录多个温控开关的断开点温度及恢复点温度;

(2) 按区划分测量出八点均匀分布点的温度图, 并对相关点作适当的补偿;

(3) 根据每批产品的温度特性, 设定温度测定范围以便对烘箱的加热速度进行合理控制; (4) 保存测试参数, 并随时打印出参数表。

1.2设计总体设计思路

本系统采用一体式电控柜为主体。西门子工控机安置于电控柜的上部, 通过485接口与PLC控制模块进行数据交换。PLC控制模块及20位扩展热电偶模块均安装于电控柜内。20组继电器分别与20个测试工位相连, 用于提供温控器启动/停止的电信号。控制柜底部中空, 用于高温线, 使得被测试样品可以置于高温及低温的环境区域内。通过西门子S7-224CN可编程控制器, 完成对于精密烘箱温度场循环的控制、不同产品温度要求的可编程控制, 对高速温度采集模块数据的采集支持等功能。

为实现精确测量、快速响应及曲线复现的设想, 满足标准对温度敏感控制器检测的要求, 设计检测系统原理图如图1所示。

1.2.1系统软件的模块设计

该检测系统的程序开发在基于windows xp操作系统下, 由VISUAL BASIC 语言编写, 软件的设计包括五个独立的功能模块。分别为:

(1) 文件调入模块, 可以调入以前任一时刻的测试数据。

(2) 文件保存模块, 将正在测试的数据存盘备份。

(3) 数据打印模块, 将测试的数据打印出来, 作为产品参数标准。

(4) 温度设置模块, 主要用来设置被测温度范围, 由此温度范围为依据, 来控制烘箱的加热速度。

(5) 温度测试模块, 该模块是整个检测系统的核心组成部分, 其主要完成功能为:

(1) 初始化, 包括将用于控温开关状态接口的8255编程设置为输入方式, 温控开关全部接通等。

(2) 读人I/O状态, 判断各温控开关的通断状态。

(3) 分区读入各温度测试点的温度值, 将此时的温度值赋给有通断变化的温控开关样品, 并在监视器上相应的位置显示该温度值。

为了保证温度测量的精度, 除了在硬件上采取必要的措施如采用12位A/D转换外, 软件上也要采取相应的措施, 本系统中采用了多点平均算法。由于A/D采样用的是AD574芯片, 其转化速率典型值为25μs, 而温度不可能有突变, 所以我们对每一温度点采样100个点, 然后排序, 去掉最大的和最小的各10点, 用剩余的80点进行平均, 这样可大幅度地降低测量误差, 提高检测精度。

1.2.2系统内部电路设计

设备电控柜外形尺寸为1000*600*600 (含滚轮高度) , 电控柜主体为框架结构, 下层中空。安装架通过螺钉卡扣安装于电控柜两侧安装槽上, 位置可根据扩展槽所需容量进行调整。设备采用一体式电控柜为主体。西门子工控机安置于电控柜的上部, 通过485接口与PLC控制模块进行数据交换。PLC控制模块及20位扩展热电偶模块均安装于电控柜内。本系统的控制采用上下位机分层控制的方式。上位机采用西门子工控机用于对于下位机PLC发出启动、停止等具体指令。同时接受下位机反馈的数据, 并分析最终形成报告。下位机采用西门子S7-224CN可编程控制器中PLC224型产品, 配合EM221/EM232/EM231等3组扩展模块完成对被测产品的测试, 启停等功能, 同时反馈采集的数据给上位机进行分析统计。上位机下位机之间采用485接口连接。控制电路接线如图2所示。

1.2.3系统界面设计。操作界面的设计遵循简单明了, 操作简便地设计原则。除外观设置上的电源开关, 急停开关, 报警灯等装置, 其余控制设置均集成在液晶触摸屏上。整个版面指示清晰, 操作简便。

操作系统界面主要分为三个层次:1.系统功能选择界面 (开机界面) , 用于对设备进行初始化以及试验功能的选择。2.测试界面:从系统管理中进行相应功能的选择, 可进入不同的测试单元模块。如图3所示的温度开关恢复测试。在测试系统界面中, 我们可以对样品进行测试参数的设置, 启停动作的设置, 以及设定产品不合格的报警范围等。3.产品最终的结果界面。当下位机反馈数据后, 可以直接上上位机中形成分析报告和最终提交的检测报告。报告文档可以形成不同的记录格式, 以适应于以后的智能化一体检测流程。如图4所示。

二、系统计量校准效果

(1) 多路、多种控制器的同时检测与控制。最多可以完成20个产品的测试监控, 同时测试平台还预留有扩展槽, 可以方便有效地进行工位的扩展。采用西门子S7-200CN模块以及工控机。实现记录存储速度达到25μs, 显示速度达到1s/次。

(2) 无人化管理, 设置好烘箱温度区间后, 系统可以自动记录产品反复动作的温度动作值, 并且设计一套可以与现阶段自动化检测流程相配套的, 基于EXCEL模板的自动报告填写及输出模式。

(3) 系统是windows平台开发的, 可以方便的移植。软件界面清晰, 直观, 具有良好的人机互动功能。除了检测环节中通过人工装夹、结构检查等工作, 其余工作均可由软件代为完成。形成一次录入, 自动匹配的功效。极大地降低了人员的劳动强度。

三、结论与展望

3.基于VB温度采集仪的设计 篇三

【关键词】串口通信;PT100;单片机;C语言;温度采集;VB6.0

在动力工程中,利用热电阻作为传感器最为广泛,研究此类课题,对当下工、农业领域有着重要意义。热电阻的主体实际由两种不同性质的导体或半导体一端焊接在一起而成,构造简单。由于其在测温时它与被测物体直接接触不受中间介质的影响,所以在工业温度测量有较高的准确性。

1.温度采集系统硬件设计

设计采用LM2576作为5V电源稳压模块,PT100铂热电偶作为温度传感器,硬件PT100两端的电压经过LM358放大,送入单片机进行A/D转换,然后通过单片机串口发送到上位机显示温度数值。系统框图如图1.1所示:

1.1恒流源、5V电源电路设计

测温原理基本原理为通过运放U1A将基准电压转换为恒流源,电流流过Pt100时在其上产生压降,再通过运算放大U1B将该微弱压降信号放大,即输出期望的电压信号。

5V电源电路其主控芯片为LM2576-5.0,LM2576系列的稳压器是单片集成电路,能提供降压开关稳压器(buck)的各种功能,能驱动3A的负载,有优异的线性和负载调整能力。220V电源经降压变压器降压,然后通过2W08模块进行整流,再输入到LM2576稳压模块,通过其与外部电感、电容、快速通断二极管IN5822构成反馈回路,从而达到降压稳压的效果。主要电路原理图如图1.1所示:

图1.2 5V电源产生电路原理图

1.2信号放大处理电路设计

首先5V直流电源经过TL431进行调压,调节电压到3V,输入到LM358,从而根据电路产生1mA的稳定的直流电流,让其流过PT100,当周围的温度发生变化,Pt100的电阻值就会发生变化,当周围温度为0℃的时候,按附录一可知其电阻值为100,那么PT100两端的电压就为,此电压再经过LM358构成的放大电路放大10倍,输入到单片机A/D输入口,最后单片机对其进行模数转换。依次原理,周围温度变化,PT100的电阻值发生变化,两端电压差也随之变化,从而使输入的模拟电压发生变化,经过单片机程序的处理分析,就能得到相对应的温度值。信号采集放大电路如图1.3所示:

图 1.3 信号采集放大电路原理图

2.软件设计

STC12C5A16S2单片机,其自带A/D转换口P1(P1.7-P1.0),具有八路十位高速A/D转换器,速度可达250KHz(25万次/秒)。八路电压输入型A/D,可做温度检测、按键扫描、电池电压检测等。上电复位后P1口为弱上拉型I/O口,其中我们可以很容易的通过软件设置八路中的任何一路为A/D转换口,不做A/D口使用的也可做普通的I/O口使用。

当PT100周围温度为0℃时,其阻值为100;当周围温度为600℃,其阻值为313.71。周围温度每增加0.1℃时,PT100基本增加0.32-0.39,平均值为0.356。输入单片机的电压变化范围为1V-3.13V,单片机A/D转换位数为10位。

上位机软件设计。

2.1上位机通信驱动方式选择

VB编程语言中MSComm控件提供了两种处理通信的方式:一种称为事件驱动方式,此方式相当于我们在一般程序设计中的中断方式(如51单片机中的几种中断方式)。当串口发生事件或错误时,MSComm控件就会产生OnComm事件,用户程序可以捕获该事件,从而进行相应处理。另一种称为查询方式,在用户在程序中设计定时或不定时查询 MSComm控件的某些特定属性是否发生变化,从而确定相应处理。在程序空闲时间较多时可以采用该方式。本次设置使用事件驱动方式来处理和解决各类通信软件的开发设计问题,实时性很强。

2.2软件运行效果图

图 2.1 上位机软件运行效果图

3.总结

本次设计通过模拟电路产生4.96V恒定直流电压源,LM358与其他元件产生基本恒定直流源,上位机与下位机能很好联机通信,采集温度范围广,但也存在一定的误差,也存在其他一些问题需要进一步研究解决。

对于温度测量精度要求较高的,本系统存在一定的误差,在缩小误差方面,以后可考虑:

(1)采用独立高精度的A/D转换芯片(如ICL7135)。

(2)采用与PT100相反特性的非线性元件作为补偿元件。

(3)使用高次方程做拟合等方法。

通过运算放大电路产生的恒流源电路,存在一定的干扰信号,恒流源不太稳定。在今后的研究学习中,可以考虑采用(下转第50页)(上接第13页)OP07设计电路或增加放大电路的级数,从而减少误差。同时当温度波动比较大时,也可将运放的供电改为 15V双电源供电。

对于软件设计,加入一定软件温度补偿程序或采用分段转化的思想使测量的温度更加接近实际值。 [科]

【参考文献】

[1]季华,陈旭忠,李占芳等.基于VB与单片机串行通信的数据采集系统的设计[J].煤炭工程,2007(12):134~136.

[2]雷建龙,李秉玉.基于89C2051单片机的远距离高精度温度测控电路[J].中国仪器仪表,2003(2):45~47.

[3]刘志群.基于RS485实现的PC机与单片机多机通信[J].闽江学院学报,2007,28(2):44~46.

[4]Philips semiconductors.sJA1000 stand—alone CAN controer[R].Holand:Philips,2000.

4.温度采集系统课程设计 篇四

一、引言

相对于密码、证件等传统身份认证技术和诸如语音、虹膜、脸形、签名等其他生物特征识别认证技术而言,指纹识别认证是一种更为理想的身份认证技术。其优点体现在:

1.广泛性——每个人的每一跟手指都具有指纹;

2.唯一性——每个人的指纹都不相同,极难进行复制;

3.稳定性——指纹不会随着年龄的增长而改变;

4.易采集性——指纹图像可运用专业的指纹传感器获取,易于开发识别认证系统。

随着电子商务的发展和消费类电子的普及,越来越多的领域需要指纹识别系统。目前,基于、的独立式指纹识别系统已经成功应用于考勤、门禁、安检等领域。同时,随着微电子技术的进步,设计开发能应用在小型微型系统(如手机、PDA等)的ASIC资金资助:上海市科学技术委员会PDC计划项目(No.047062023)和AM 0403项目(专用集成电路)指纹识别认证系统,将具有很强的现实意义和广阔的市场空间。

由于FPGA(现场可编程门阵列)具有高集成度,低功耗,短开发周期等优点,本文选用FPGA作为指纹识别认证系统的核心器件,以控制其依次实现指 纹采集、指纹特征点提取、存储、比 对等等过程。可见,指纹识别认证系统的首要任务是如何采集到高质量指纹图像以保证后续任务的完成,而指纹图像质量不仅与指纹传感器自身的性能有关,也与数 据传输通信接口的性能密切相关。因此,如何设计性能优良的通信接口是实际系统设计的一个难点问题。于是本文针对这一问题进行了研究,介绍了一种基于 FPGA与滑动式指纹传感器的指纹采集接口的设计与实现方法。

二、简介指纹采集接口器件

本指纹采集接口的核心控制器件为Xilinx公司SpartanIII系列的XC3S400型FPGA芯片,它的封装形式为PQ208。这款芯片采用先进的90ns工艺,最大容量40万门,工作频率高达200M,足以完成系统需要。

另外,本文选用的指纹采集传感器为富士通公司的MBF300滑动式电容指纹采集传感器。这款指纹传感器采用标准CMOS技术,含有8位A/D变换 器,能在2.8V~5V的宽电压范围内工作,能自动检测到是否有指纹到达传感器,并实现在线采集。而它与以往采用的面积式指纹传感器相比最大的优点在于,在保证指纹图像高分辨率(500dpi)的同时大大减小了传感器的尺寸(13.3×3.6)。

MBF300支持3种通信接口:8位微处理器总线接口(microprocessor bus interface)、集成的USB全速接口(Integrated USB Full-Speed Interface)和集成SPI接口(Integrated Serial Peripheral Interface)。其中本文选用SPI接口,并将详细讲述基于MBF300和FPGA的SPI设计与实现方法。

MBF300的SPI接口需要时钟信号线SCK、主进从出信号线MISO、主出从进信号线MOSI和使能信号线,共4根信号线。其中,传感器的时钟 源可以从外部输人,也可以外接一个晶体振荡器后,利用MBF300内部的振荡电路来获得时钟源。在选择了SPI模式后,MBF300的其他两种模式将自动 禁止。在本系统中,MBF300在SPI工作模式下相当于一个从设备,XC3S400作为主设备。XC3S400通过读写MBF300内部的寄存器实现对 它的控制,以完成指纹采集的任务。

另外,MBF300在SPI的从设备状态下,它的通信协议的具体内容包括:

MOSI线上的数据在SCK的上升沿被采样;

MISO线上的数据在SCK的下降沿发生改变;

SCK在空闲状态时,可以为高电平,也可以为低电平;

串行传输过程中,高位在前(最先被移出)。具体时序见图1。

三、指纹采集接口的设计与实现

本文中指纹传感器MBF300的主要任务是采集指纹图像,并自动A/D转换,并把转换后的图像数据通过SPI接口传送到FPGA芯片XC3S400 中,以进行指纹登记或者指纹识别比对。由此可见,指纹采集是整个指纹识别系统的第一步,采集质量的好坏将直接影响系统的性能与准确度的高低,因此,接下来 将重点介绍指纹采集接口——SPI接口的设计,在此过程中,XC3S400为SPI主设备,MBF300为SPI从设备。

1、指纹采集电路

由于FPGA内部采用的SRAM存储器结构,所以需要外置一个PROM在上电时对FPGA进行程序配置。同时,还扩展了一个SRAM和Flash分 别用作存储指纹程序运行时的临时数据和指纹数据信息。另外,为了实现与PC机通信,指纹采集部分还设计一个RS232接口,整个的硬件电路如图2所示。由 图中可以看出,整个指纹采集的核心部件就是FPGA芯片XC3S400,它相当于常见的嵌入系统中的DSP或者ARM,控制着整个指纹采集,以及指纹登 记,指纹比对,结果输出等过程。

2、指纹采集接口硬件设计与实现

本文的SPI接口主设备为FPGA芯片XC3S400,从设备为指纹传感器MBF200。由于FPGA没有特定管脚的要求,本文任意选用XC3S400的4个I/O口137—140,分别与指纹传感器MBF300的相应管脚连接,见图3所示。

3、指纹采集接口软件设计与实现

接口时钟采用传感器内部的12M时钟,整个采集指纹图像流程如图4所示,主要有初始化,调整参数,指纹采集,指纹存储几部分组成。

3.1 初始化XC3S400和MBF300

XC3S400为FPGA器件,因此在系统上电后先要对其进行初始化,即从PROM中读取配置数据,以完成后面的指纹采集、特征点提取、存储、比对等工作;初始化XC3S400之后,接着初始化指纹传感器MBF300,其中部分VHDL源程序如下:

……

ENTITY ini_mbf300 IS

PORT(......pgc : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

dtr : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

dcr : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

thr : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

ctrlb : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

isr : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

icr : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);

......);--定义需要初始化的MBF300寄存器;

END ini_mbf300;

ARCHITECTURE ini_mbf300 OF ini_mbf300 IS

BEGIN

pgc <= “00000110 ”;--初始设置图像增益为1.5;

dtr <= “00111111”;

dcr <= “00000001”;

thr <= “00101100”;

ctrlb <= “00000001”;--使能阵列,AD及时钟;

isr <= “00000011”;--清空中断;

icr <= “01011001”;--使能自动检测;…...END ini_mbf300;......3.2 调整MBF300参数

调整MBF300参数,也就是调整PGC、DTR、DCR三个寄存器的值来调整放电时间、放电电流速率和图像的放大增益,直到获得最佳质量的图像。

3.3 采集指纹图像

XC3S400按照MBF300的SPI时序要求,在MOSI信号线上发送一系列读写MBF300寄存器的指令,并由MBF300在MISO信号线上发送A/D转换后的指纹数据,直到一幅完整的256*32的指纹图像传输完毕。

3.4 存储指纹图像

采集到的原始指纹图像保存到片外SRAM中,地址空间为0000 0000 0000 0000~FFFF FFFF FFFF FFFF。实验调试与结论

指纹采集接口的整个程序的VHDL源代码已经通过调试,在ModelSim SE 6.1b中成功仿真,FPGA的SPI时序与MBF300一致,完全能达到指纹采集的目的。于是将MBF300设置为DTR=0x15,DCR= 0x20,PGC=0x01,通过SPI接口采集到的原始指纹数据通过图2中的RS232接口传送给PC机,然后利用Matlab工具数据转化得到指纹图 像,它足以满足后续的指纹特征点提取、比对等要求。

四、小结

这种基于FPGA芯片XC3S400与固体指纹传感器MBF300的SPI接口具有设计实现简单,传输速率高的特点,完 全能胜任指纹采集的任务。而MBF300的高精度更能保证采集到的指纹图像的质量,这有利于简化后续的指纹图像增强、二值化等算法。总之,基于FPGA与 指纹传感器的指纹采集系统的SPI接口的成功实现,为指纹识别技术的SOC片上集成打开一个良好的开端。

本文作者创新点:

虽然基于DSP或者ARM的指纹识别认证系统已经在考勤,门禁等领域实现商品化,但这样的嵌入式系统很难实现小型化集成化,更无法SOC,所以本文 采用FPGA来实现指纹识别认证系统,利用FPGA高集成度,低功耗,短开发周期等优点,并以实现系统的ASIC为研究背景,具有很强的现实意义和广阔的 市场空间。

只有保证高质量的指纹采集才会保证高质量的指纹识别认证,因此本文主要介绍了基于FPGA的指纹识别系统的指纹采集接口部分的设计与实现方案,经实验研究证实该接口完全能满足实际需要,这为指纹识别系统的片上集成打开了一个良好的开端。

参考文献:

[1]谢健阳,李铁才,唐降龙等.指纹识别系统的设计与实现.微计算机信息.2006;22(3-2):156-157;

[2]周宁婕,付宇卓,周煜.基于DSP的指纹识别系统硬件平台设计.计算机仿真.2005;22(1):241-243;

[3]黄林波,杜坤梅,谢建阳等.基于ARM的指纹识别算法的研究与开发.哈尔滨商业大学学报(自然科学版).2005;21(2):179-181;[4]沈小丰, 李小贝.便携式指纹识别系统的设计.自动化技术与应用.2005;24(4):55-58

5.温度采集系统课程设计 篇五

毕业设计(论文)任务书

专业班级 学生姓名

一、题目

二、主要任务与要求

三、起止日期 年 月 日至 年 月 日

指导教师 签字(盖章)系 主 任 签字(盖章)

年 月 日

—1—

河 南 理 工 大 学 万 方 科 技 学 院

毕业设计(论文)评阅人评语

专业班级 学生姓名 题目

评阅人 签字(盖章)职 称

工作单位

年 月 日

—2—

河 南 理 工 大 学 万 方 科 技 学 院

毕业设计(论文)评定书

专业班级 学生姓名 题目

指导教师 签字(盖章)

职称 年 月 日

—3—

河 南 理 工 大 学 万 方 科 技 学 院

毕业设计(论文)答辩许可证

经审查,专业 班 同学所提交的毕业设计(论文),符合学校本科生毕业设计(论文)的相关规定,达到毕业设计(论文)任务书的要求,根据学校教学管理的有关规定,同意参加毕业设计(论文)答辩。

指导教师 签字(盖章)

年 月 日

根据审查,准予参加答辩。

答辩委员会主席(组长)签字(盖章)

年 月 日

—4—

河 南 理 工 大 学 万 方 科 技 学 院 毕业设计(论文)答辩委员会(小组)决议

院(系)专业 班 同学的毕业设计(论文)于 年 月 日进行了答辩。题目 答辩委员会成员 主 席(组长)委 员(成员)委 员(成员)委 员(成员)委 员(成员)委 员(成员)委 员(成员)

答辩前向毕业设计答辩委员会(小组)提交了如下资料:

1、设计(论文)说明 共 页

2、图纸 共 张

3、评阅人意见 共 页

4、指导教师意见 共 页

—5—

根据学生所提供的毕业设计(论文)材料、评阅人和指导教师意见以及在答辩过程中学生回答问题的情况,毕业设计(论文)答辩委员会(小组)做出如下决议。

一、毕业设计(论文)的总评语

二、毕业设计(论文)的总评成绩

毕业设计答辩委员会主席(组长)签名

委员(组员)签名

年 月

—6— 河南理工大学万方科技学院本科毕业论文

摘要

电网继电保护及故障信息处理系统由主站系统、通信网络和子站系统3 部分组成。该系统的应用价值和作用主要体现在主站系统的功能设计上。在综合分析国内各种继电保护及故障信息处理系统的基础上, 着重论述了主站系统的硬件、软件平台构架及功能模块的设计。硬件平台构架的设计充分考虑了系统的独立性、安全性和可靠性;软件平台的设计对两种可行的方案进行了比较, 分析其合理性;功能模块的设计基于故障信息的合理分类从故障分析的各个角度对功能模块进行合理划分。最后简要地展望了主站系统未来的发展趋势。

关键词:继电保护;故障录波;故障信息处理;管理信息系统;系统设计。

河南理工大学万方科技学院本科毕业论文

目 录

1.绪论.........................................................10 1.1 继电保护研究现状...........................................11 1.2 系统保护..................................................11 1.3 继电保护发展趋势..........................................12 1.4 常用保护..................................................15 1.5 基本任务及要求............................................15 1.6基本原理....................................................18 1.7继电保护组成................................................19 1.8 系统概述..................................................19 2.硬件平台设计................................................21 2.1 主站系统的独立性...........................................21 2.2 主站系统的可靠性..........................................21 2.3 主站系统的安全性..........................................21 2.4 主站系统的硬件平台........................................22 3.软件平台设计................................................22 4.应用功能设计................................................25 4.1 主站系统的信息划分.........................................25 4.2 主站系统的应用功能划分.....................................25 5.结语.........................................................30

河南理工大学万方科技学院本科毕业论文

1.1 继电保护研究现状

随着电网规模的扩大和全国联网的发展,电力系统中投入电网的各种保护、自动装置、故障录波器等设备越来越多。在出现故障时,这些设备记录了大量的数据和信息,如何综合利用这些信息来判断故障的元件和性质、故障重演、保护动作分析和录波分析,已成为分析电力系统事故和辅助调度员进行故障处理的重要课题。目前,网络通信技术得到了快速的发展,变电站已经具备了以数据方式向电网调度中心传输各种信息的能力,如何有效地综合运用这些信息从而提高整体调度智能信息化水平成为推动电网故障信息系统研制开发的主要动力。

1.2 系统保护

实现继电保护功能的设备称为继电保护装置。虽然继电保护有多种类型,其装置也各不相同,但都包含着下列主要的环节:①信号的采集,即测量环节;②信号的分析和处理环节;③判断环节;④作用信号的输出环节。以上所述仅限于组成电力系统的各元件(发电机、变压器、母线、输电线等)的继电保护问题,而各国电力系统的运行实践已经证明,仅仅配置电力系统各元件的继电保护装置,还远不能防止发生全电力系统长期大面积停电的严重事故。为此必须从电力系统的全局和整体出发,研究故障元件被相应继电保护装置动作而切除后,系统将呈现何种工况,系统失去稳定时将出现何种特征,如何尽快恢复系统的正常运行。这些正是系统保护所需研究的内容。系统保护的任务就是当大电力系统正常运行被破坏时,尽可能将其影响范围限制到最小,负荷停电时间减小到最短。

大电力系统的安全稳定运行,首先必须建立在电力系统的合理结构

1河南理工大学万方科技学院本科毕业论文

1计算机化

随着计算机硬件的迅猛发展,微机保护硬件也在不断发展。电力系统对微机保护的要求不断提高,除了保护的基本功能外,还应具有大容量故障信息和数据的长期存放空间,快速的数据处理功能,强大的通信能力,与其它保护、控制装置和调度联网以共享全系统数据、信息和网络资源的能力,高级语言编程等。这就要求微机保护装置具有相当于一台pc机的功能。继电保护装置的微机化、计算机化是不可逆转的发展趋势。但对如何更好地满足电力系统要求,如何进一步提高继电保护的可靠性,如何取得更大的经济效益和社会效益,尚需进行具体深入的研究。

2网络化

计算机网络作为信息和数据通信工具已成为信息时代的技术支柱,它深刻影响着各个工业领域,也为各个工业领域提供了强有力的通信手段。到目前为止,除了差动保护和纵联保护外,所有继电保护装置都只能反应保护安装处的电气量。继电保护的作用主要是切除故障元件,缩小事故影响范围。因继电保护的作用不只限于切除故障元件和限制事故影响范围,还要保证全系统的安全稳定运行。这就要求每个保护单元都能共享全系统的运行和故障信息的数据,各个保护单元与重合闸装置在分析这些信息和数据的基础上协调动作,确保系统的安全稳定运行。显然,实现这种系统保护的基本条件是将全系统各主要设备的保护装置用计算机网络联接起来,亦即实现微机保护装置的网络化。

3河南理工大学万方科技学院本科毕业论文

1.4 常用保护

传统保护

1、电流保护。多用于配电网中,分为:电流速断保护、限时电流速断保护和定时限过电流保护。

2、距离保护。

3、差动保护。新兴保护

基于暂态的保护,如行波保护等。

1.5 基本任务及要求

电力系统继电保护的基本任务是:

(1)自动、迅速、有选择性地将故障元件从电力系统中切除,使故障元件免于继续遭到破坏,保证其他无故障部分迅速恢复正常运行。

(2)反应电气元件的不正常运行状态,并根据运行维护的条件(如有无经常值班人员)而动作于信号,以便值班员及时处理,或由装置自动进行调整,或将那些继续运行就会引起损坏或发展成为事故的电气设备予以切除。此时一般不要求保护迅速动作,而是根据对电力系统及其元件的危害程度规定一定的延时,以免暂短地运行波动造成不必要的动作和干扰而引起的误动。

(3)继电保护装置还可以与电力系统中的其他自动化装置配合,在条件允许时,采取预定措施,缩短事故停电时间,尽快恢复供电,从而提高电力系统运行的可靠性。

电力系统继电保护的基本要求是:

继电保护装置为了完成它的任务,必须在技术上满足选择性、速动性、灵敏性和可靠性四个基本要求。对于作用于继电器跳闸的继电保护,5河南理工大学万方科技学院本科毕业论文

能满足灵敏性要求的继电保护,在规定的范围内故障时,不论短路点的位置和短路的类型如何,以及短路点是否有过渡电阻,都能正确反应动作,即要求不但在系统最大运行方式下三相短路时能可靠动作,而且在系统最小运行方式下经过较大的过渡电阻两相或单相短路故障时也能可靠动作。

系统最大运行方式:被保护线路末端短路时,系统等效阻抗最小,通过保护装置的短路电流为最大运行方式;

系统最小运行方式:在同样短路故障情况下,系统等效阻抗为最大,通过保护装置的短路电流为最小的运行方式。

保护装置的灵敏性是用灵敏系数来衡量。4)可靠性

可靠性包括安全性和信赖性,是对继电保护最根本的要求。安全性:要求继电保护在不需要它动作时可靠不动作,即不发生误动。

信赖性:要求继电保护在规定的保护范围内发生了应该动作的故障时可靠动作,即不拒动。

继电保护的误动作和拒动作都会给电力系统带来严重危害。即使对于相同的电力元件,随着电网的发展,保护不误动和不拒动对系统的影响也会发生变化。

以上四个基本要求是设计、配置和维护继电保护的依据,又是分析评价继电保护的基础。这四个基本要求之间是相互联系的,但往往又存在着矛盾。因此,在实际工作中,要根据电网的结构和用户的性质,辩证地进行统一。

7河南理工大学万方科技学院本科毕业论文

1.7 继电保护组成

一般情况而言,整套继电保护装置由测量元件、逻辑环节和执行输出三部分组成。

测量比较部分

测量比较部分是测量通过被保护的电气元件的物理参量,并与给定的值进行比较,根据比较的结果,给出“是”“非”性质的一组逻辑信号,从而判断保护装置是否应该启动。

逻辑部分

逻辑部分使保护装置按一定的逻辑关系判定故障的类型和范围,最后确定是应该使断路器跳闸、发出信号或是否动作及是否延时等,并将对应的指令传给执行输出部分。

执行输出部分

执行输出部分根据逻辑传过来的指令,最后完成保护装置所承担的任务。如在故障时动作于跳闸,不正常运行时发出信号,而在正常运行时不动作等。

1.8 系统概述

电网继电保护及故障信息处理系统是由子站系统、主站系统和连接二者的通信网络构成。系统的总体结构如图1 所示。子站系统的主要任务是负责采集变电站内的微机保护装置、故障录波器及各种电子智能设备的信息, 并负责把这些信息规范化后上传至主站系统。子站系统安装于厂站现场, 采用分布式结构, 一般包含多个子站, 每个子站一般由一台保护管理机或集控中心来完成站内装置信息的采集和通信。

9河南理工大学万方科技学院本科毕业论文

2.硬件平台设计

2.1 主站系统的独立性

主站系统侧重于在电网发生故障后实时地进行故障处理和故障分析,E M S 等侧重于电网正常运行时的实时监视和控制。因此, 主站系统与E MS 等现有系统应该是相互独立的, 所以宜采用相对独立的硬件平台, 以避免不同系统之间的干扰。

2.2 主站系统的可靠性

电网故障的突发性决定了主站系统必须具有很高的可靠性, 以保证故障时故障信息的可靠上传。为此, 采用冗余设计, 设置两台服务器作为主/ 备用通信服务器, 且每台通信服务器均可通过拨号网络或电力专线数据网络与子站系统通信。同时, 通信服务器最好采用U N IX 操作系统和基于U N IX 的底层通信服务, 因为U N IX 具有W in do w s 无可比拟的安全可靠性和灵活开放性。

2.3 主站系统的安全性

根据我国电力二次系统安全防护的总体要求,电网继电保护及故障信息处理主站系统的大多应用属于二级安全区的非控制生产区, 而W e b 信息发布的应用应属于三级安全区的生产管理区。根据安全等级和防护水平的要求, 主站系统的二级安全区与三级安全区之间应该设置安全隔离的硬件防火墙,并采取签名认证和数据过滤等措施。此外, 为了防止主站系统的数据遭到网络黑客或病毒的侵扰, 主站系统与外部系

1河南理工大学万方科技学院本科毕业论文

有如下两种设计方案:方案1 : 采用通信服务层和应用服务层2 层软件体系结构, 直接操作数据库。如图3 所示, 该方案结构简单, 易于实现。

方案2 : 采用3 层软件体系结构, 即在方案1 的基础上, 把通信服务层和应用服务层中的数据访问逻辑独立出来构成数据访问服务层。如图4 所示。

3河南理工大学万方科技学院本科毕业论文

数据的一致性。

4.应用功能设计

4.1 主站系统的信息划分

主站系统所处理的信息都来源于各个子站, 从时间上可以划分为电网正常时的信息和电网故障时的信息。此外, 还可以按照不同的角度对这些信息进行划分。

a.按照信息的来源不同, 分为: 来自录波器的录波文件列表和录波文件, 来自微机保护装置的开关变位信息、保护动作信息、故障简报等, 来自其他采集装置的状态信息等。

b.按照信息的类型不同, 分为开关量信息(开关信息、保护动作信息等)和模拟量信息(电压、电流等)。

c.按照信息的意义不同, 分为动作类、状态类、自检类等。d.按照故障时信息到达主站时间的优先不同,依次分为: 故障简报, 保护动作信息、开关变位信息、保护的录波数据等, 故障录波器的录波信息等。

e.按照获得信息的方式不同, 分为主站召唤的信息和子站上传的信息。另外, 主站系统还可以允许用户对到达主站的信息自定义分类, 例如分为重点信息、一般信息和次要信息等, 以方便用户识别重要信息。主站系统的应用都是基于以上信息进行信息管理和故障分析的, 不同的信息分类方式直接关系到应用功能模块的设计。

4.2 主站系统的应用功能划分

主站系统的作用主要定位于电网发生故障后实时/ 准实时的故障

5河南理工大学万方科技学院本科毕业论文

息过滤配置、信息规范化、对信息加以分类从而识别和剔除误传信息等, 以方便后续的故障诊断和故障分析基于有效信息进行。

c.故障发生后, 主站系统必须提供各种完整分析模块, 最大化地利用所有的信息帮助用户全面分析故障。波形分析模块能分析录波文件, 显示各个通道数据的波形, 并可进行谐波、相量图、序分量、功率以及高频信号、开关信号等的分析。故障诊断专家系统模块帮助用户定位故障元件, 并分析哪些保护误动、拒动或是正确动作。故障测距模块提供多种单端和双端测距算法, 精确定位线路故障地点, 针对线路两端录波数据不完全同步的情况, 系统提供了基于电压模值稳定和基于不同步角计算的非同步双端测距算法进行测距, 还可以辅助以过零点、突变量、人工调节等多种原理性和可视化的同步手段, 使同步误差限制在一个采样点以内, 进而利用同步测距算法, 提高双端测距的准确性。动作行为分析模块通过分析保护的动作原理并用实际测量值验算动作方程来分析保护动作的行为, 可以帮助用户找到保护误动/ 拒动是否是整定值不适合所引起, 或者是保护本身原理的缺陷所引起。

d.故障开始后, 子站系统按照信息的优先权来分批传送各类故障信息。主站系统对故障的处理过程是按照信息到达主站的时间先后进行逐级分析,并最终形成完整的故障分析报告。整个过程是分时间、分层次的, 这样处理将方便调度分析人员逐步认清故障的性质和原因, 分析故障过程兼顾了快速判断和全面分析的效果。其关系如图5 所示。

7河南理工大学万方科技学院本科毕业论文

9河南理工大学万方科技学院本科毕业论文

c.主站系统应进一步提高故障智能诊断水平,增加故障辅助决策等功能, 例如可以提供网络等值计算、继电保护整定计算、故障状况评估和故障恢复辅助系统等模块, 使该系统真正发展成为一个全方位的故障处理系统。

1河南理工大学万方科技学院本科毕业论文

6.温度采集系统课程设计 篇六

摘要

本文根据家庭视频采集系统的要求,提出一种基于ARM的网络视频采集方案。方案要求视频的实时传输、实时监控。本系统以Intel Xscale 芯片和嵌入式Linux系统为平台,在平台中搭建网络视频服务器,并以它为中介,负责将USB摄像头采集到得视频数据传输到网络服务器中,最后发送到申请监控的远程PC机中,远程PC只需在网页中便能实时的看到监控端的视频图像。

论文首先阐述了嵌入式网络视频采集技术的发展、现状和前景,然后介绍了嵌入式硬件系统结构和嵌入式Linux操作系统的特点,阐述了嵌入式硬件整体结构,使大家大体的完整的对系统硬件有详细的了解,实际记录了嵌入式操作系统内核的编译和移植,介绍了Bootloader的基本原理和启动过程,实现了视频采集程序的编译和移植,研究了嵌入式一般驱动程序的使用。随后,本文详细描述了视频采集程序的整体结构框图和具体功能代码块、网络通信编程技术、图像编解码、嵌入式视频服。

关键词:ARM;嵌入式;Linux;视频采集

I

目录

摘 要.............................................................................................................................I 第1章 引言.................................................................................................................1

1.1 课题的背景和来源..........................................................................................1 1.2本文的内容及主要工作..................................................................................1 第2章 嵌入式ARM系统硬件结构简介..................................................................3

2.1 视频监控系统结构简介..................................................................................3 2.2 ARM处理器简介.............................................................................................3 2.3 XSCALE体系结构............................................................................................4 2.4 主要硬件电路说明..........................................................................................7 第3章 嵌入式ARM系统软件结构..........................................................................9

3.1 LINUX操作系统简介.......................................................................................9 3.2 交叉编译环境的建立....................................................................................10 3.3 嵌入式LINUX操作系统移植........................................................................11 3.3.1 BootLorder移植...................................................................................11 3.3.2 Linux 内核移植...................................................................................12 3.3.3 嵌入式文件系统.................................................................................13 3.4 LINUX下的程序调试.....................................................................................14 第4章 USB设备驱动程序设计...............................................................................15 4.1 设备驱动程序简介........................................................................................15 4.2 LINUX下驱动程序的实现.............................................................................18 4.3 USB摄像头驱动程序设计............................................................................20 第5章 视频采集功能的设计...................................................................................23 5.1 基于V4L的编程...........................................................................................24 5.1.1 摄像头相关数据结构.........................................................................24 5.1.2 摄像头基本功能实现.........................................................................25 5.1.3 视频数据采集.....................................................................................29 5.2 图像编解码....................................................................................................32 5.2.1 编解码介绍.........................................................................................32 5.2.2 系统压缩技术.....................................................................................33

第1章引言

1.1课题的背景和来源

二十一世纪的网络化、数字化让人们的生活每天都发生着翻天覆地的变化,获取信息的方便和快捷可以使人们在信息化的今天领先一步创造出巨大的利益,而获取信息的重要途径就是眼睛。据统计,人类采集信息的80%来自视觉。图像和视频是对客观事物生动、形象的描述,是一种最直观的表现方式。而视频监控技术因为它方便快捷、生动形象、信息丰富等特点日益受到人们的青睐,并在各行各业得到广泛的应用。与此同时,现代网络和数字技术的快速发展也为视频监控技术的发展奠定了坚实的基础。

二十一世纪,嵌入式技术、多媒体处理技术进一步发展,为视频监控系统的发展提供了新的出路——嵌入式视频监控系统。嵌入式系统是以应用为中心,软硬件可以剪裁,具有高稳定、低成本、功耗低、速度快、实时好的专用计算机系统,它由嵌入式微处理器,配以周边硬件设备,接口电路组成。嵌入式系统内部使用嵌入式操作系统,安装专用的功能软件。嵌入式技术把硬件和软件集于一体,独立工作。嵌入式视频监控系统比其他视频采集系统在布局区域范围上要广泛;由于使用IP技术,嵌入式视频监控技术比其他视频采集系统更具紧密的结合度,能够充分利用现代网络技术的成果,并能构成复杂的视频监控网络;性能上,嵌入式视频采集系统继承了嵌入式技术的优点,非常适合自动化的环境。

因此,嵌入式视频采集技术正在我国快速的发展,积极的研究会加强我们在这方面技术的学习,也会为视频监控技术的发展贡献力量。

1.2本文的内容及主要工作

根据毕业设计的初衷,我们需要设计基于ARM的网络视频采集系统。在监控系统中,视频采集、传输、播放的功能不是由专门视频处理芯片完成,而是由软件实现。

论文首先介绍了嵌入式ARM系统的硬件结构和软件结构,方便大家熟悉ARM和Linux系统,包括嵌入式设备的硬件结构,逻辑框图和Linux的基本操作、安装方法;第二,研究了嵌入式的一些驱动程序,主要是摄像头驱动程序

V4L,系统中选用的摄像头芯片——中星微301;第三,研究了视频监控的具体流程和实现方式,让大家在总体上对整个系统有一个大概的认知。

本次设计的目的只有一个,就是实现视频的实时监控。围绕它,不管是硬件结构还是软件流程,都需要学习和研究,不断调试,决不放弃。

总之,论文的内容都是围绕如何建立一个视频采集系统。无论是从哪个方面,我们都是为这个目标而努力。2

第2章嵌入式ARM系统硬件结构简介

2.1视频监控系统结构简介

网络视频监控系统是基于嵌入式技术设计的。嵌入式并没有统一的定义,但目前有一个广泛而又被认可的规范:将软件产品固化到硬件平台上,完成应有的功能既是嵌入式。

基于嵌入式ARM技术的视频监控系统服务器端采用摄像头不断的采集图像,压缩成视频流,然后通过网络发送到申请监控的客户端。监控系统的使用者可以在远程实现网页上的实时监控和一些简单的功能操作。系统整体结构如图2.1所示[1]。

LCDJTAG摄像头ZC301CPU单元Intel Xscale以太网控制器远程PC客户端SDRAMFLASH

图2.1 系统整体结构图

该系统中CPU采用基于ARM的PXA270微处理器,通过在其上运行Linux操作系统,执行Boa视频服务器,接受并处理来自摄像头的图像信号,通过以太网控制器发送至远端,实现视频数据的远程传输和接受,达到视频监控的目的[2]。

2.2ARM处理器简介

ARM,既是一个公司的名字,也是对一类微处理器的通称。ARM嵌入式微处理器是全球领先的16/32位RISK处理器芯片知识产权设计供应商ARM(AdvancedRISKMachines)公司的产品。ARM公司本身不直接从事芯片生产,而是依靠转让设计许可,由合作公司生产各具特色的芯片。

ARM处理器以其完整的体系结构,极小的体积、极低的功耗、极低的成本、极高的性能,及时根据嵌入对象的不同进行功能上的扩展的优势,在众多种类的嵌入式微处理器中脱颖而出。基于ARM技术的微处理器应用占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。

采用RISC架构的ARM微处理器一般具有如下特点:

(1)采用固定长度的指令格式,指令规整、简单、基本寻址方式有2~3种;(2)使用单周期指令,便于流水线操作执行;

(3)大量使用寄存器,数据处理指令只对寄存器进行操作,以提高指令的执行效率;

(4)所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率;

(5)可用加载/存储指令批量传输数据,以提高数据的传输效率;(6)可在一条数据处理指令中同时完成逻辑处理和移位处理;(7)在循环处理中使用地址的自动增减来提高运行效率。

目前,ARM处理器有ARM7、ARM9、ARM9E、ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每个系列除了具有ARM体系结构的共同特点以外,都有各自的特点和应用领域。

2.3XScale体系结构

Xscale核是采用ARM V5TE架构的处理器,是Intel公司的StrongARM的升级换代产品,它具有高性能、低功耗等特点,并在流水线设计、DSP处理和指令设计中有很大改进[3]。ARM的体系结构是基于RISK的,XScale是ARM处理器的一种,所以XScale具有RISK的基本特性。而且针对嵌入式系统,XScale构架还引入了Pentium处理器工艺和系统结构技术,实现了Pentium微处理器体系结构的一系列高性能技术,达到了高性能、低功耗和小体积等嵌入式系统要求的特性。它的特点有:超流水线、高主频、存储体系、分支预测和指令集体系结构。本设计采用的就是基于英特尔Xscale构架的一种32位嵌入式处理器,它除了应用于掌上电脑之中外,还可以应用于智能手机、网络存储设备、骨干网路由器等电子设备。

PXA27x系列处理器是英特尔当前最新推出的嵌入式处理器。它的时钟频率从312到624MHz不等,并内建64MB的堆栈型Intel StrataFlash内存。内置了英特尔的无线MMX技术,能够显著提升多媒体性能。

OURS-PXA270-EP是一款基于INTEL XSCALE PXA270处理器,针对高效

嵌入式系统教学和实验科研的平台。这款设备主要包括核心板与底版两个部分,核心板主要集成了高速的PXA270 CPU,配套的存储器,网卡等设备;底版主要是各种类型的接口与扩展口。

核心板(8层PCB电路)系统包括:

CPU: INTEL PXA270(520M),支持GDB调试; SDRAM: 64M 工作在104M外频上; FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller(LAN91C111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144(117USER IO);总线驱动器: 若干;核心板正面如图2.2所示,核心板背面如图2.3所示。

SDRAMCPUdrvdrvCPLDdrvFLASHdrvdrvFLASHLDOdrv 图2.2 核心板正面图

SDRAMdrvEthernetdrvdrvdrv100PIN CONNECTORSuperIOLDO 图2.3 核心板背面图

底版(4层PCB电路)如图2.4所示。包括: Ethernet: 10/100接口1个

UART: 6个(包括RS232,RS485,IRDA,全功能串口)USB1.1:2个(1个host 一个device)PS2:2个(KEYBOARD&MOUSE)标准并口:1个 PCMCIA: 1个 IDE:1个 SD/MMC: 1个 SMC:1个 CAMERA:1个 96PIN功能扩展口:2个 4X5 小键盘

CPU_JTAG CPLD_JTAG LED SHARP LQ080V3DG01 8寸真彩LCD

640X480 VGA 640X480 LED 8X8点阵

一组7段LED数码管

4个

串口irda串口串口串口LCD接口LCD接口并口VGALED点阵音频1音频2音频3PCMCIA 卡LED数码管SMC 卡核心板SDPSPSUSBUSB485NET键盘 图2.4 底版图

2.4主要硬件电路说明

嵌入式设备除了以ARM芯片为主要控制单元,也有很多周边电路和外围设备,它们有的帮助ARM处理信号、有的负责存储数据、有的进行网络连接、有的用来数据通信,这些周边设备缺一不可,不能替代。

首先介绍CPU核心总线[4],总线是CPU和其他设备的桥梁。CPU是通过总线信号来控制SDRAM ,FLASH,网卡,SUPERIO等外部设备的,无论是低速还是高速,只要是与总线相关的芯片,都要和CPU总线信号有关。其次,研究嵌入式系统内存——SDRAM。SDRAM是嵌入式系统的内存,具有单位空间存储容量大和价格便宜的优点,已广泛应用在各种嵌入式系统中。当系统启动时,CPU首先从复位地址0x0处读取启动代码,在完成系统的初始化后,程序代码一般应调入SDRAM中运行,以提高系统的运行速度。同时,系统及用户堆栈、运行数据也都放在SDRAM中。SDRAM的存储单元可以理解为一个电容,总是倾向于放电,为避免数据丢失,必须定时刷新(充电)。因此,要在系统中使用SDRAM,就要求微处理器具有刷新控制逻辑,或在系统中另外加入刷新控制逻辑电路。PXA270芯片在片内具有独立的SDRAM刷新控制逻辑,可方便地与SDRAM接口。除了SDRAM,FLASH也是一种存储媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH单元密度高,写入和擦除速度非常快,而且一般NAND型FLASH的存储容量很大。NOR型FLASH的优点是芯片内执行命令,这样应用程序可以直接在FLASH内运行,不用进入内存,使得它的传输效率很高。嵌入式设备最大的优点就是网络功能强大,它能像PC一样方便地连接到互联网上,这些功能都是网络控制器的作用。也就是Ethernet Controller,本系统采用SMSC公司的单芯片的网络控制器,LAN91C111。它可以工作在两种速度下,10M以太网或者100M以太网。LAN91C111的工作流程是,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,LAN91C111会自动把数据包转换成物理帧格式在物理信道上传输;反之芯片收到物理信号后自动将其还原成数据,并按指定格式存放在芯片RAM中以便主机程序取用。就是LAN91C111完成数据包和电信号之间的相互转换。最后,说明一下串口电路,在嵌入式视频监控系统中,串口起到了很重要地作用,嵌入式系统启动的信息都可以通过串口传到PC上,极大地方便了系统的移植和软件的调试。大多数情况下,嵌入式CPU的串口0会作为CPU的一个终端,为用户与CPU交互提供基本的输出输入信息。当CPU运行BOOT代码时,通常只有这个终端 ;运行LINUX内核时,如果有LCD显示,串口0与LCD终端会同时有效。串口0终端的交互

方式是命令行的模式,在BOOT阶段,支持简单的BOOT命令。8

第3章嵌入式ARM系统软件结构

3.1Linux操作系统简介

Linux是一个类似Unix的操作系统,它起源于芬兰一个名为LinusTorvaldS的业余爱好者,现已成为最流行的一款开放源代码的操作系统。Linux从问世至今,短短时间内已发展成为一个功能强大、设计完善的操作系统。Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒。由于Linux的源码开放,内核精简且性能强悍,不依赖于具体厂商,能广泛适用于各种硬件设备,系统二次开发成本极低,因此在IT业界已经达成共识,即采用嵌入式Linux作为嵌入式操作系统是大势所趋[5]。

嵌入式Linux是目前嵌入式系统领域中发展势头非常迅猛的系统。嵌入式Linux是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几M字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用操作系统。目前正在开发的嵌入式系统中,49%的项目选择嵌入式Linux作为操作系统。嵌入式Linux现已成为嵌入式操作系统的理想选择[6]。目前基于嵌入式Linux的应用已经遍布很多领域,比如移动多媒体设备、手持设备、车载导航系统、机械控制等。嵌入式Linux分为两种类型:在没有使用MMU的平台上(无内存虚实地址转换和映射)的一般为uCLinux;而在有MMU平台上,则使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的内核就能实现网络功能和任务调度的Linux系统就可以适用于从高端服务器到嵌入式应用的各级平台。ARM技术和Linux成功地结合,应用于数以千计的商业产品中。从便携式消费品、网络和无线设备,到自动化设备、医疗设备和存储产品,这一应用列表与日俱增。ARM和Linux的结合充分满足了各类应用对嵌入式平台高性能、低功耗和低价格的要求,通过开发环境、开源社区和ARM的商业伙伴的优势为嵌入式开发提供了更灵活的选择。

本次设计的开发环境为redhat9.0系统,在Windows XP 下安装虚拟机,在虚拟机中安装Linux系统,这样可以屏蔽底层差别,避免硬件驱动带来的麻烦,而且还能方便的使用串口、并口、USB接口,快速的进入实验环境。图3.1为虚拟机下Linux系统启动后的情况。

图3.1 虚拟机下Linux操作系统

3.2交叉编译环境的建立

通常嵌入式系统的软件编译和执行是在两个不同平台上进行的。编译是在宿主机,一般为装有Linux的pc;执行是在目标机,即嵌入式系统的硬件平台。一般是在宿主机上通过跨平台交叉编译器把源文件编译成目标平台上可执行的文件,再通过串口、并口或者网络下载至目标平台上的FLASH或者其它存储介质,然后由目标机来运行这些软件。这里所说的跨平台编译器和一般的编译器功能类似,都是把源代码通过编译器编译成目标文件,然后通过链接器、可重定位器程序和定位器把目标文件重新定位成可执行文件。和通用的编译器之间最大的差别就在于跨平台编译器编译出来的可执行程序通常只能在特定CPU所属平台上运行。所以一般来说每种CPU都对应有不同的跨平台编译器。

本系统采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉编译器。要成功构建完整的交叉编译环境需要在宿主机上创建一系列的工具包括C/C++编译器、汇编器、链接器、嵌入式系统的标准C库和GDB代码级调试器。成功建立好开发环境后便可以运用这些工具进行嵌入式系统开发[7]。

3.3嵌入式Linux操作系统移植 3.3.1BootLorder移植

BootLoader是系统加电后运行的第一段代码。一般只是在启动时运行很短的时间,然而对一个嵌入式系统来说,这一部分却是整个系统的一个无比重要的组成部分,不可缺少。在一般嵌入式系统中,系统复位或者加电后通常从地址0x00000000处开始执行,而这个地址一般正是存放的BootLoader启动代码。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终加载操作系统内核准备好正确的环境。

BootLoader一般情况下需要包含以下几个必备的功能 :(l)初始化处理器。这个动作都是用汇编语言完成的,称为重置码(resetcode)或者称为bootcode,而且对于每个CPU都不一样的,当电源接通后就会执行这个动作,通常只有两三个汇编指令,目的是将CPU的控制权转给硬件初始化的程序。

(2)初始化一些必要的硬件。这个动作也大都由汇编语言来完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c语言等比较高级的程序语言来完成后续动作。

(3)设置处理器的寄存器以及内存,关掉所有的输入管脚(包括中断管脚),以防止突然有信号进入妨碍接下来的硬件初始化动作。然后初始化串口,以便后续运行的程序能够同HOST端进行通信,便于调试。

(4)从特定的位置把操作系统和文件系统调入内存,并设置一些操作系统所必需的参数,然后把CPU控制权交给操作系统。有的BootLoader会先从串口或者网络等其他途径得到内核的映像文件,然后把这些文件写入目标系统的FLASH或者其它存储介质,最后再把内核载入RAM执行,交出控制权。

一般BootLoader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。

(l)启动加载(Bootloading)模式:这种模式也称为“自主”(Autonomous)模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。

(2)下载(Downloading)模式:在这种模式下,目标机上的BootLoader将通过串

口连接或者网络连接等通信手段从主机(HOST)下载文件,比如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootL0ader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用,此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。

BootLoader的实现依赖于CPU的体系结构,一般来说启动过程分为两个阶段。

第一阶段依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在第一阶段中,而且通常都用汇编语言来实现,运行效率比较高。这个阶段完成的任务一般如下:(l)硬件设备初始化(屏蔽所有的中断、关闭处理器内部的指令/数据cache);(2)为第二阶段准备RA.M空间;(3)复制BootLoader的第二阶段代码到RAM空间中;(4)设置好堆栈并跳转到第二阶段的C程序入口点。

第二阶段则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。这个阶段主要任务有:(l)初始化本阶段要使用的硬件设备;(2)检测系统内存映射;(3)将内核映像和根文件系统从FLASH读到RAM中;(4)为内核设置启动参数;(5)调用内核文件运行。

本设计中的Bootloader采用Blob,Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw两人为一块名为LART(Linux Advanced Radio Terminal)的开发板写的,该板使用的处理器是StrongARM SA-1100,现在Blob已经被成功移植到许多基于ARM的CPU上了。本设计中的Intel Xcale就是采用Blob作为Bootloader[8]。

3.3.2Linux 内核移植

选用嵌入式Linux作为目标机操作系统,一方面由于Linux是一款免费的操作系统,能很好的降低成本,同时Linux的开发应用现在已经成为热门,有大量的资源可用于学习与重复应用,并且Linux系统具有良好的可移植性和可裁剪性,能自动支持多任务管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。

Linux的开发工具也都可以很方便的免费获得。

系统采用的嵌入式Linux内核为随实验平台光盘中的Linux内核,它是针对这套实验平台所配置的Linux内核,内核版本为Linux2.4.20[9]。在实验过程中,只需要在这个内核的基础上进行添加和删减所需要和不需要的功能,编译后就可以使用了。

在编译内核之前,需要对内核进行必要的配置,通过虚拟机进入/pxa270_linux/linux/目录后在终端执行make menuconfig[10]命令,就可以可视化的配置内核需要的功能和要求,本次试验,主要是针对视频方面,选择了对V4L的静态加载、对spca5xx摄像头驱动的动态加载,这样就结束了对内核的配置。编译内核需要创建内核依赖关系、创建内核镜像文件和创建内核模块。首先执行makedep命令,读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而哪些不需要;接着需要makeclean删除前面步骤留下的文件,以避免出现一些错误;然后便可以生成所需要的内核文件了,用make zlmage来实现得到可移植的内核。内核文件通过并口下载线烧写入开发板中,便可以通过BootLoader加载运行。

3.3.3嵌入式文件系统

嵌入式Linux操作系统一般采用FLASH作为存储介质。FLASH具有独特的物理特性,所以必须使用专门的嵌入式文件系统。嵌入式系统对文件的操作是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过对文件IO函数操作文件。嵌入式文件系统是嵌入式操作系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作(复制、删除、修改等)接口,方便用户操作文件和目录。在文件系统内部,根据存储设备的特点,使用不同的文件组织模式来实现文件的逻辑结构。此外,文件系统要对管理文件的安全性负责。文件系统不能直接控制物理设备,它是通过FLASH驱动实现控制的[11]。

目前FLASH支持的文件系统技术主要有JFFS2,YAFFS2,TrueFFS,FTL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系统采用的是JFFS2文件系统。

JFFS2文件系统是专门为NAND闪存设计的嵌入式文件系统,根据NAND闪存以页面为单位存取的特点,将文件组织成固定大小的数据段。利用NAND闪存提供的每个页面16B的备用空间来存放ECC(ErrorCorrectionCode)和文件系统的组织信息、,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加

载速度。JFFS2采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。JFFS2文件系统是按层次结构设计的,分为文件系统管理层接口、JFFS2内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与YAFFS相比,它增加了一些功能,因此功能更强。

3.4Linux下的程序调试

调试是程序开发过程中必不可少的一个重要环节,通用PC机的程序调试与嵌入式操作系统的调试环境上有着明显的区别,前者调试器和被调试的程序往往是运行在同一台机器上,是相同操作系统下的两个不同的进程,调试器通过操作系统专用调用接口控制被调试进程,后者通常为远程调试,调试器一般运行于桌面操作系统上,而被调试的程序则运行在嵌入式系统之上,因此需要协调这两个程序之间的通信。Linux下的调试工具非常的少,gdb是Linux下最著名的调试工具,它是GNUC自带的调试工具,它可以使开发人员了解程序运行的详细细节,从而消除程序的错误,达到调试的目的,gdb还具有远程调试功能,可以满足嵌入式系统调试的要求,在调试过程中PC机也称为宿主机和嵌入式系统通过串口协议或者TCP/IP协议连接起来,远程主机上运行被gdb规范断点改造过的内核,当条件成立时,断点被激活,然后等待本地宿主机的连接命令,一旦连接成功,宿主机就可以向远程嵌入式系统发送调试命令了。在调试过程中gdb通过调试stub来完成通信功能,调试stub是嵌入式操作系统中的一小段代码,它提供了运行gdb的宿主机和嵌入式系统进程之间交互的一个媒介。

除了使用调试器外还可以直接在程序中使用printf()或printk打印函数,这种方法功能比较弱,效率低下,但在内核模块调试时这是唯一的方法。14

第4章USB设备驱动程序设计

4.1设备驱动程序简介

Linux系统中,设备驱动程序扮演着特殊的角色。它就像一个独立的黑盒子一样,使某个特定的硬件可以相应一个定义良好的内部编程接口并且完成隐藏设备的作用。用户只需调用一组标准化的函数完成操作,而且这些操作与特定的驱动程序无关。驱动程序的任务就是将这些函数映射到作用硬件的具体操作上。这样的模块化的驱动程序结构使得Linux系统中的驱动程序可以独立于内核的其他部分,可以在需要使用的时候将驱动“插入”内核。

从系统运行顺序来看,硬件平台启动运行Linux后,启用了MMU单元即内存管理单元,在这种模式下系统不能直接对物理地址进行访问。若要对某一硬件外设进行读写,需要通过内核调用该硬件的驱动来实现。

上面已经说过,驱动程序的作用在于向应用程序提供访问硬件设备的接口,驱动程序屏蔽了硬件实现上的细节操作,于是应用程序可以像操作普通文件一样对硬件设备进行操作。Linux以模块的形式加载设备类型,通常是一个模块对应实现一个设备驱动。模块是内核的一部分,它们没有被编译到内核中,而是分别被编译并链接成一组目标文件。可以根据用户的需要在不需要对内核进行重新编译的情况下动态载入正在运行的内核,或从正在运行的内核中卸载。利用这种机制,内核尺寸可以保持在最小,并具有最大的灵活性,也便于检验新的内核代码,而不需要重新编译内核并重新引导。设备驱动程序一般需要完成以下功能:(l)对设备初始化和释放;(2)把数据从内核传送到硬件和从硬件读取数据;(3)读取应用程序传送给设备文件的数据和回送应用程序的请求数据;(4)检测和处理设备出现的错误。

在Linux操作系统下有两类主要设备文件类型:块设备、字符设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性,表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。

Linux驱动程序可以分为三个主要部分: 15

(l)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件位口中断、DMA通道)进行申一请并初始化。这部分驱动程序仅在初始化时被调用一次。

(2)服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。

(3)中断服务子程序,又称为驱动程序的下半部分。在Linux操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。

在系统内部,I/O设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点:(1)open入口点:打开设备准备I/O操作,对字符特别设备进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备的状态。

(2)close入口点:关闭一个设备,当最后一次使用设备结束后,调用dose子程序。独占设备必须标记设备可再次使用。

(3)read入口点:读取设备,对于有缓冲区的I/0操作,一般从缓冲区里读取设备数据。

(4)write入口点:向设备写数据,对于有缓冲区的I/O操作,一般向缓冲区里写入数据。

(5)ioctl入口点:执行读写之外的操作。

USB(Universal Serial Bus)即“通用串行外部总线”,用途广泛,可以外接硬盘、键盘、鼠标、打印机等多种设备,USB能够使用尽可能少的接口支持尽可能多的外设,尤为适合在嵌入式设备中使用,是嵌入式接口标准的一个很好的选择。

USB总线规范有1.1版和2.0版。USB1.1支持两种传输速率:低速1.5Mbit/s、全速12Mbit/s,这样的速率完全满足鼠标、键盘、CD-ROM等设备,但是在嵌入式视频监控系统中,这样的速度还是很慢。所以,USB2.0提供了一种更好的传输速率:高速,它可以达到480Mbit/s。USB2.0向下兼容USB1.1,可以将遵循USB1.1规范的设备连接到USB2.0控制器上,也可以把USB2.0的设备链接到USB1.1控制器上。

USB总线的硬件拓扑结构[12]如图4.1所示。

USB主机控制器USB设备根集线器USB设备USB设备集线器USB设备集线器USB设备集线器USB设备USB设备USB设备USB设备 图4.1 USB总线硬件拓扑图

USB主机控制器通过根集线器与其他USB设备相连。集线器也属于USB设备,通过它可以在一个USB接口上扩展出多个接口。除根集线器外,最多可以层叠5个集线器,每条USB电缆的最大长度是5m,所以USB总线的最大距离为30m。一条USB总线上可以外接127个设备,包括根集线器和其他集线器。整个结构图是一个星状结构,一条USB总线上所有设备共享一条通往主机的数据通道,同一时刻只能有一个设备与主机通信。

通过USB主机控制器来管理外接的USB设备,USB主机控制器共分3种:UHCI、OHCI和EHCI。在配置Linux内核的时候,看到的“HCD”字样表示“Host Controller Drivers”,即主机控制器驱动程序。

USB驱动程序分为两类:USB主机控制器驱动程序(Host Controller Drivers)、USB设备驱动程序(USB device drivers)。它们在内核中的层次如图4.2所示。

UserUSB Device DriversUSB Host Controller DriversHardware 图4.2 USB驱动程序层次结构

在试验中,教学平台上的Linux嵌入式内核已经配置了USB主机控制器驱动程序,只需要添加需要的USB设备驱动程序,就能实现USB设备的正常使用。

4.2Linux下驱动程序的实现

Linux操作系统下对硬件设备进行驱动开发的一般步骤如下:(l)注册设备

在系统启动时或者在模块加载的时候需要将设备和重要的数据结构登记到内核的设备数组中,并确定该设备的主次设备号。在Linux系统中,对于字符设备一般通过调用register_chrdev向系统注册设备驱动程序,register_chrdev在fs/deviees.c文件中的定义如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定义中的major是设备驱动程序向系统申请的主设备号,如果major为O,则系统为该驱动程序动态的分配一个主设备号,不过此设备号是临时的;name是设备名:fops是各个调用入口点的说明。函数返回O表示注册成功,返回-INVAL表示申请的主设备号非法,返回-EBUSY表示申请的主设备号正在被其它设备驱动程序使用。

以后对设备驱动程序的file_operations的操作都可以通过该主设备号的索引来完成。register_chrdev函数操作成功后,设备名便出现在/proc/devices文件目录中,使用命令cat/proc/devices可以查看设备的工作状态。

(2)定义操作集

驱动程序中要通过一系列函数完成对设备的不同操作,这些操作在面向对象编程术语中也称为方法,该操作集通过数据结构file_operations实现。内核内部通过file结构识别设备,通过file_operations数据结构提供的文件系统的入口点函数访问设备。

file_operations定义在中的函数指针表: struct file_operations { struct module*owner;loff_t(*llseek)(struct file*, loff_t, int);ssize_t(*read)(struct file*, size_t, loff_t*);ssize_t(*write)(struct file*, const char*, size_t, loff_t*);int(*readdir)(struct file*, void*, filldir_t*);unsigned int(*poll)(struct file*, struct poll_table_struct*);int(*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);int(*mmap)(struct file*, struct vm_area_struct*);int(*open)(struct inode*, struct file*);int(*flush)(struct file*);

int(*release)(struct inode*, struct file*);int(*fsync)(struct file*, struct dentry*, int datasync);int(*fsyne)(int, struct file*, int);int(*lock)(struct file*,int, struct file_lock*);ssize_t(*readv)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*writev)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*sendpage)(struct file*, struct page*, int, size_t, loff_t*, int);unsigned long(*get_unmapped_area)(struct file*, unsigned long, unsigned long,unsigned long, unsigned long);}

这个结构的每一个成员的名字对应一个系统调用,在用户程序利用系统调用对设备文件进行诸如读/写操作时,系统调用会通过设备文件的主设备号找到相应的驱动程序,然后读取这个数据结构的相应函数指针,把控制权交给该函数。对于具体的设备驱动并不需要实现结构中所有的例程,只要完成设备功能就可以了。例如对于一个常见的字符设备驱动来说,可能只有操作open(),write(),read(),ioctl()和close(),当用户程序通过系统调用访问设备时,最终要通过这些操作集来完成。

(3)卸载模块

当不再需要使用一个模块或设备时,需要将其从内核中卸载下来,这时会动态调用模块中的module_exit()函数,并需要在该函数中调用modul_unregister_chrdev()或module_unregister_blkdev()释放挂入内核的数据结构同时释放该设备号。

4.3USB摄像头驱动程序设计

摄像头属于视频设备,在Linux内核中,VideoforLinux(简称V4L)是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。本系统所使用的USB摄像头正是基于该标准来编写驱动和应用程序的。

Linux内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/dev/video0,主设备号是81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头,所以可以通过mknod/dev/video0 c 81 0来创建节点。USB摄像头驱动程序实现原理如图4.3所示。

USB摄像头的驱动和通用设备的驱动准则一样,但需要与内核提供的视频驱动挂钩。即首先在驱动中声明一个 video_device结构,并为其指定文件操作函数指针数组fops,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。

例如: Static struct video_devie vdev_template={……};

声明 video_deviee,指出挂接驱动

用户进程系统调用摄像头驱动文件操作接口接收缓冲区发送缓冲区中断服务程序摄像头 图4.3 摄像头驱动实现框图

Static Struct file_operation spcasxx_fops= {……};

声明本驱动的文件操作函数指针 Struct video_device*vdev=video_devdata(file);从文件指针中提取出 video_deviee结构

在video_deviee结构中,有一个私有指针priv,可以将它指向一块保留内存。在这块内存中,保存着本驱动、本设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在USB驱动的枚举函数probe中完成。这样,在枚举函数将控制权返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。在驱动卸载函数中需要将申请的各块内存全部释放。

Linux系统中任何USB传输都通过URB实现。为提高速度,可以考虑扩大URB的缓冲,这样可以降低每个USB事务中握手信息所占比例,提高有效数据的输速度。但是受限于总线带宽和具体的USB设备芯片,单纯扩大URB的缓冲不能无限制地解决问题。USB在操作系统中每次传输都要包括URB的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此可以建立两个URB,在等待一个URB被回收时,也就是图像正在被传感器采集时,处理、初始化另一个URB,并在回收后立刻将其发出。两个URB交替使用,大大减少了额外时间。

由于嵌入式平台上运行的Linux2.4.20内核,内部已经集成了对USB2.0的支持,所以无需移植相应的USB驱动。

在设计中,摄像头芯片采用中星微的Z301系列芯片,Linux2.4内核并不支持这种芯片,所以我们通过移植芯片驱动程序来达到目的。芯片的驱动程序是spca5**系列,如果不重新编译内核的话,将驱动程序动态加载就可以正常使用。设计中动态加载的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加载模块时不用指定模块文件的绝对路径,也不用带模块文件的后缀.o或.ko;而insmod需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的.o或者.ko。但是在功能上,它们所达到的效果基本相同[13]。22

第5章视频采集功能的设计

视频采集程序是基于V4L开发的,包括摄像头的初始化、打开/关闭、参数设置和数据读取等操作,视频采集程序流程图如图5.1所示[14]。

开始初始化摄像头init_videoIn()打开摄像头open_v4l()获取摄像头参数icotl(int->vd,int cmd,..)设置摄像头参数ioctl()获取一帧图像N一帧是否截取完毕Y存储并准备传输N是否终止视频采集Y关闭摄像头终止 图5.1 视频采集程序流程图

5.1基于V4L的编程 5.1.1摄像头相关数据结构

摄像头的组成部分是传感器、DSP、镜头、外壳、USB连线、电路板和周边电路构成,其中最重要的是传感器和DSP(数字信号处理器)。本系统选用的摄像头采用了CMOS传感器和中星微301处理器。

V4L[15]提供了一系列的接口应用程序,可以利用这些程序实现对摄像头的调用,其中有read、open、ioctl等。V4l同时将这些函数和参数封装成一个数据结构vdIn。struct vdIn {

int fd;char *videodevice;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param videoparam;

int cameratype;char *cameraname;char bridge[9];int sizenative;int sizeothers;int palette;int norme;int channel;int grabMethod;unsigned char *pFramebuffer;unsigned char *ptframe [4];

};int framelock [4];pthread_mutex_t grabmutex;int framesizeIn;volatile int frame_cour;int bppIn;int hdrwidth;int hdrheight;int formatIn;int signalquit;

int fd :打开摄像头时,open函数返回的文件描述符,其他函数使用这个描述符对摄像头进行操作。

struct video_mmap vmmap: 用于内存映射的结构体。

struct video_capability videocap :描述摄像头基本信息,如设备名称、支持的最大分辨率、信号源信息、信道数等。

struct video_mbuf videombuf :在进行内存映射时读取帧的信息,实际上是输入到摄像头存储缓存中的帧信息。

struct video_picture videopict :摄像头采集图像的属性,如亮度、色调、对比度、色度、深度等。

struct video_window videowin :表示采集窗口参数,如分辨率等。struct video_channal videochan :关于信号源的属性。

5.1.2摄像头基本功能实现

(1)初始化摄像头参数

在对摄像头进行操作之前,要对摄像头进行初始化,即对vdIn这个结构进行初始化。使用init_videoIn 函数。

int init_videoIn(struct vdIn *vd, char *device, int width, int height, int format, int grabmethod){

int err =-1;int i;if(vd == NULL || device == NULL)return-1;

} if(width == 0 || height == 0)return-1;grabmethod = 1;//read by default;if(grab method < 0 || grabmethod > 1)// check format

vd->videodevice = NULL;vd->cameraname = NULL;vd->videodevice = NULL;vd->videodevice =(char *)realloc(vd->videodevice, 16);vd->cameraname =(char *)realloc(vd->cameraname, 32);snprintf(vd->videodevice, 12, “%s”, device);if(debug)printf(“video %s n”,vd->videodevice);memset(vd->cameraname, 0, sizeof(vd->cameraname));memset(vd->bridge, 0, sizeof(vd->bridge));vd->signalquit = 1;vd->hdrwidth = width;vd->hdrheight = height;vd->formatIn = format;

vd->bppIn = GetDepth(vd->formatIn);vd->grabMethod = grabmethod;vd->pFramebuffer = NULL;err = init_v4l(vd);for(i = 0;i < OUTFRMNUMB;i++){

} vd->frame_cour = 0;pthread_mutex_init(&vd->grabmutex, NULL);return err;vd->ptframe[i] = NULL;(unsigned char *)realloc(vd->ptframe[i], sizeof(struct frame_t)+(size_t)vd->framelock[i] = 0;vd->framesizeIn);

(2)打开摄像头

在Linux中,类似摄像头的设备是作为文件来看待的,叫做设备文件。我们可以使用open函数来对设备进行打开操作,open带有两个参数,第一个为设备文件名称,本实验的摄像头设备名称是/dev/video0,第二个则是打开的类型。

在使用open函数打开摄像头之前,要判断是否有摄像头设备,即检查参数videodevice是否为空。Open函数执行结束后会返回摄像头的文件描述符,如果返回值为-1,则说明打开设备出错。

int open_v4l(char *vd->videodevice){

if(!vd->videodevice){

printf(“No device file, ERROR opening V4L interface”);

return-1;}

if((vd->fd=open(vd->videodevice, O_RDWR))==-1){

printf(“ERROR opening V4L interface”);

return-1;} return vd->fd;}(3)获取摄像头参数

成功打开摄像头后,需要获取摄像头的一些参数,利用ioctl函数控制I/O通道来实现。Ioctl函数的使用是ioctl(int->fd, int cmd,……),fd代表文件描述符,cmd表示用户对设备的控制命令,第三个参数是一个其他的参数。其中,cmd包括VIDIOCGCAP(获得video_capbility中有关摄像头的信息)、VIDIOCGPICT(获取图像信息)、VIDIOCSPICT(改变图像信息)、VIDIOCGMBUF(获取摄像头存储缓冲区帧信息)、VIDIOCAMCAPTURE(获取视频图像)、VIDIOSYNC(判断摄像头是否截取成功)等。

读取video_capability中有关摄像头的信息

if(ioctl(vd->fd, VIDIOCGCAP, &(vd->videocap))==-1){ printf(“Fail to get video_capability!/n”);return-1;} 读取video_picture中的图像信息 printf(“Fail to get video_picture!/n”);return-1;} if(ioctl(vd->fd, VIDIOCGPICT, &(vd->videopict))==-1){

读取video_window信息

if(ioctl(vd->fd,VIDIOCGWIN,&(vd->videowin))==-1){

printf(“Fail to get video_window!/n”);

return-1;}(4)设置摄像头参数

在对摄像头参数进行设置的时候,应该按照以下步骤:比如更改图像信息,首先,先给video_picture结构中所要修改的变量赋值,如vd->videopict.palette=vd->formaIn;vd->videopict.depth=GetDepth(vd->formatIn);然后通过ioctl函数的VIDIOCSPICT来设置,如if(ioctl(vd->fd,VIDIOCSPICT,&(vd->videopict))<0){ printf(Fail to set videopict params with VIDIOCSPICT!/n“);return-1;} 在设置好了之后可以通过VIDIOCGPICT命令来查询图像信息设置是否成功。(5)关闭摄像头

在Linux编程过程中,必须养成一个好的编程习惯,就是在开启一个设备后一定要关闭它,这样可以避免很多诸如内存泄露等严重的问题。

本系统支持两种读取方式来获得视频流,它们是内存映射和直接读取,所以首先需要判断视频采集的方式,如果是内存映射,则在系统任务完成后关闭内存映射,然后关闭摄像头设备。同样道理,如果采用的是直接读取,则在任务完成后关闭直接读取,然后在关闭摄像头设备。在代码中,采用了一个判断语句,判断vd->grabMethod的值来判断系统采用哪种读取方式。int close_v4l(struct vdIn *vd){

int i;if(vd->grabMethod){

} else { free(vd->pFramebuffer);vd->pFramebuffer = NULL;if(debug)printf(“unmapping frame buffern”);munmap(vd->pFramebuffer, vd->mmapsize);

} } if(debug)printf(“close video_devicen”);close(vd->fd);/* dealloc the whole buffers */ if(vd->videodevice){

} if(vd->cameraname){

} for(i = 0;i < OUTFRMNUMB;i++){

} pthread_mutex_destroy(&vd->grabmutex);if(vd->ptframe[i]){

} free(vd->ptframe[i]);vd->ptframe[i] = NULL;vd->framelock[i] = 0;if(debug)printf(“freeing output buffer %dn”, i);

free(vd->cameraname);vd->cameraname = NULL;free(vd->videodevice);vd->videodevice = NULL;5.1.3视频数据采集

视频数据的采集是系统实现的第一步,是所有工作的前提。嵌入式Linux系统支持两种视频数据采集的方式:内存映射、直接读取视频。

(1)内存映射

内存映射方式是通过mmap系统调用函数来实现的。mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间

后,进程可以像访问普通内存一样对文件进行访问,不必再调用read()、write()等操作。

首先,使用ioctl系统调用的VIDIOCSFBUF命令获得摄像头存储缓冲区的帧信息,之后初始化video_mbuf,修改video_mmap中的设置,重新设置图像信息,如帧的垂直及水平分辨率、彩色显示格式等。为了防止缓冲区的内容与有用信息叠加产生干扰,在初始化之前可以先调用memset(&(vd->videombuf),0,sizeof(vd->videombuf)来清零缓冲区。然后使用函数vd->map=(unsigned char*)mmap(O,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,ff_t offset)使设备内容映射到内存区,其中第一个参数为共享内存的起始地址,一般设为0,表示由系统分配;第二个参数为映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起;第三个参数指定共享内存的访问权限(PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行));第四个参数可以是MAP_SHARED或者MAP_PRIVATE;第五个参数为设备描述符。mmap()成功调用后返回系统实际分配的起始地址。

内存映射方式下真正进行视频截取的是ioctl系统调用的VIDIOCMCAPTURE命令,若函数成功调用,再用VIDIOCSYNC命令来判断图像截取是否己经完毕,若该函数调用成功,则表明一帧图像的截取已完成,便开始下一帧图像数据的截取,并将当前截取的帧号按缓冲区总帧数的模加上l。

vd->vmmap.height=vd->hdrheight;vd->vmmap.width=vd->hdrwidth;vd->vmmap.format=vd->formatln;/*判断图像截取是否完成*/ if(ioctl(vd->fd,VIDIOCSYNC,&vd->vmmap.frame)<0){ perror(„‟cvsync errn);erreur=-I;} while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)usleep(1000);temps=ms_time();

pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(struct frame_t),vd->pFramebuffer+vd->videombuf.offsets[vd->vmmap.frame],vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeIn);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];

snprintf(headerframe->header, 5,”%s”.”SPCA”);

headerframe->seqtimes=ms_time();headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;pthread_mutex_unlock(&vd->grabmutex);/*截取视频帧*/ if((ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<0){ perror(“cmcapture”);

if(debug)printf(“>>cmcapture err n”);erreur=-l;} vd->vmmap.frame=(vd->vmmap.frame+1)%vd->videombuf.frames;vd->frame_cour=(vd->frame_cour+l)%OUT FRMNUMB;(2)直接读取方式

直接读取视频数据是通过read系统调用函数来实现。read是一个用来从指定的文件或设备中读取数据的系统调用。参数表为read(fd,(void*)pFramebuff,(size_t)framesizeln)。其中fd为文件描述符,pFramebuffer为指向存放数据的内存的指针,framesizeln为需要读取的数据的长度。对于摄像头设备的读取,需要先分配内存空间,用来存储从摄像头读取过来的视频数据,然后直接调用read系统调用读取视频数据,返回值为实际读取的视频帧大小,也正是在视频传输过程中发送的视频数据大小。

size=vd->framesizeln;vd->pFramebuffer=(unsigned char*)realloc(vd->pFramebuffer,(size_t)size);Len=read(vd->fd, vd->pFramebuffer, size);if(len<0){ if(debug)printf(“v41 read errorn”);

if(debug)printf(“len %d asked %dn”, len, size);return 0;}

/*是否有其他进程正在使用该视频帧*/ while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)

headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);

usleep(1000);temps=ms_time();

pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(structframe_t),vd->pFramebuffer,vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeln);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];snprintf(headerframe->header, 5,”%s”,”SPCA”);headerframe->seqtimes=ms_time();headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;vd->frame_cour=(vd->frame_cour+1)%OUTFRMNUMB;pthread_mutex_unlock(&vd->grabmutex);5.2图像编解码 5.2.1编解码介绍

通过摄像头采集到数据后,还并不能把它们直接通过网卡传输,因为这样的数据很大,网络不能承担如此庞大的数据传输。所以,必须将采集到得数据进行编码,压缩数据大小。通过这样的操作,我们采集到得数据就会变得很小,然后再把这些数据通过网络传输。同样的道理,在输出端我们还要把接收到的已经压缩的数据还原回来,这就涉及到解码的内容。通过这一系列的操作,图像和视频数据就实现的远程的传输。如果没有编解码,远程传输就是实际上不可能的事情,所以图像的编解码是非常重要的。

现在普遍使用的编解码技术。对于静态图像,普遍使用静态压缩JPEG标准;对于动态视频,普遍使用动态压缩MPEG标准。

JPEG是由ISO和CCITT为静态图像压缩所建立的国际上第一个静态图像压缩标准,JPEG有着较高的压缩比,复杂度适中,既可以用硬件实现,也可以用软件实现,实用性强,被广泛使用于计算机和通信行业。

MPEG中文译名为动态图像专家组。到目前为止,MPEG标准主要有五个,32

MPEG-

1、MPEG-

2、MPEG-

4、MPEG-7和MPEG-21。它是由ISO/IEC1172压缩编码标准得出的视频压缩格式,MPEG的出现使视听传播进入数码化时代。MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减少时间冗余度,利用DCT技术以减少图像的空间冗余度,利用熵编码技术在信息表示方面减少了统计冗余度。通过一系列技术,极大的体现了压缩性能[16]。

5.2.2系统压缩技术

由于本系统要求实现远程视频传输,为了达到预计的设计要求,设计采用基于MJPEG算法的压缩技术进行视频压缩。MJPEG和MPEG的不同点在于MJPEG不使用帧间编码。可是MJPEG与MPEG仍然是一脉相承的,它对MEPG进行了一些改进和发展,功能更加强大,能发送高质图片、清晰视频,编码容易实现。但MJPEG也有一些缺点,由于功能的提升,MJPEG对带宽的要求很高,编码效率低。

参考文献

1.张永强,赵勇勇,李崇德.嵌入式远程视频采集系统的设计与实现[J].现代电子技术,2006,05(02):57-60.2.Jing Li, Weidong Hao.Research and Design of Embedded Network Video Monitoring System Based on Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 1310-1313.3.陈章龙,唐志强,涂时亮.嵌入式技术与系统——Intel Xscale 结构与开发[M].北 京:北京航空航天大学出版社,2004,143.4.奥尔博公司.PXA270嵌入式实验开发系统——Linux实验指导[M],2007.5.Seon Gyu Kim and Sung Ho Cho.Implementation of an Embedded Software Modem Platform[J].Division of Electrical & Computer Engineering,2006,04(2):5-9 6.杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.7.朱珍民,隋雪青.嵌入式实时操作系统及其应用开发[M].北京:北京邮电大学出版社,2006.8.李亚峰 欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京:清华大学 33

7.温度采集系统课程设计 篇七

本文针对有线温度数据采集传输过程中存在的问题和不足, 提出了一种基于Zig Bee技术的温度数据采集系统。

1 系统的总体设计

本系统采用Zig Bee技术组成星型网络结构, 整个系统由一个协调器、多个测温终端节点以及PC用户终端组成。其系统总体设计框图如图1所示。终端节点主要通过温度传感器测量温度数据, 对采集到的数据信息进行处理, 并通过无线收发芯片CC2530发送给协调器。协调器主要的功能是组建网络和允许其它节点加入网络, 并将终端节点发送过来的数据通过串口发送给PC机, 从而进行实时监测。

2 系统硬件设计

本系统采用TI公司的CC2530作为Zig Bee模块的主控芯片, CC2530单片机是一款完全兼容8051内核, 同时支持IEEE802.15.4协议的无线射频单片机[1]。可用于各种Zig Bee或类似Zig Bee的无线网络节点, 包括协调器、路由器和终端设备。本系统的Zig Bee协调器节点由CC2530、射频天线RF、电源模块、和串口电路组成[2], 负责接收终端节点发送过来的温度信息, 接收到数据后通过串口输出到PC机, 传感器节点由温度传感器、CC2530、射频天线RF、电源模块组成, 用于对待测点的温度进行采集并处理, 并通过Zig Bee无线网络传输给协调器。

温度传感器采用热电阻温度传感器Pt100。根据其工作特性, 只需测量出其热敏电阻的阻值, 就可得到相应的温度值。Pt100:代表在0℃时铂电阻的阻值为100Ω。Pt100在0~100℃之间的线性度非常好。在0~100℃时, 最大非线性偏差小于0.5℃。

3 系统软件设计

本系统采用IAR软件集成开发环境和Zig Bee2007协议栈ZStack进行系统应用程序的开发。ZStack完全支持符合IEEE802.15.4/ZigBee标准的CC2530片上系统 (Soc) 。ZStack集成了Zig Bee协议体系结构的各层功能, 用户只需要根据实际需要对其应用层进行修改就可以实现相应的功能[3]。

3.1 Zig Bee无线网络的组建

Zig Bee有三种网络拓扑结构:星型网络、树型网络、网型网络, 本系统采用星型网络, 首先协调器使用Zig Bee协议栈组建一个新的网络, 协调器上电后, 会按照编译时给定的参数, 选择合适的信道、合适的网络号建立无线网络, 终端节点上电后, 会进行硬件电路的初始化, 然后自动加入到该网络。

3.2 终端节点编程

对于终端节点而言, 需要周期性的采集温度数据, 然后把采集到数据进行处理发给协调器。传感器采集的信号类型为电压型, 需要进行AD转换。因此需要在hal_board_cfg.h中添加底层ADC采集硬件驱动#define HAL_ADCTRUE, 使能AD转换。然后在应用层任务处理函数Sample App_Process Event () 中添加温度数据采集和处理函数, 首先对数据通信的格式进行设置, 然后对ADC采集数据进行软件滤波滤除干扰, 最后对采集的数据进行处理, 转换成实际的温度值通过Zig Bee无线网络发送到协调器。其流程图如图2所示。

3.3 协调器编程

对于协调器而言, 只需要将接收到的温度数据通过串口发送到PC机即可。因此只需要在应用层任务处理函数Sample App_Process Event () 中添加无线接收数据处理函数Sample App_Message MSGCB (MSGpkt) 。网络协调器接收无线信号时, 首先判断接收到无线信号的类型是哪一种 (无线组播、无线广播、点对点通信、节点入网信息) 。根据不同的信号相应有不同的处理, 具体为:无线广播和无线组播, 相应的LED灯点亮;点对点通信 (即传感器采集数据信息) 和节点入网信息, 则通过串口上传到PC机。

4 结论

本文将Zig Bee技术引入温度数据采集系统之中, 通过各个终端节点的温度传感器进行温度数据采集, 并由CC2530单片机对数据进行处理, 最终将数据信息通过协调器传到PC机实现远程监控的功能。此种方法弥补了有线设备因布线而带来的成本问题, 具有成本低、组网灵活、可靠性高、易于组网的优点。因此, 采用Zig Bee无线传感器网络是解决温度数据采集的一种切实可行的方法。

摘要:针对有线温度采集系统存在的诸多问题, 提出了利用ZigBee技术实现无线温度采集系统的设计方案, 本系统采用星型网络拓扑结构组建ZigBee无线网络, 利用CC2530芯片构建强大的网络节点, 对温度传感器采集的温度信息进行处理, 并通过ZigBee无线网络发送给协调器, 然后由协调器通过串口发送给PC机, 从而实现实时监测。

关键词:ZigBee,温度,CC2530,无线网络

参考文献

[1]王小强, 欧阳骏, 黄宁淋.Zig Bee无线传感器网络设计与实现[M].北京:化学工业出版社, 2014.

上一篇:大班体育教案:《小青蛙捉害虫》下一篇:小班数学教案:森林运动会教案