基于Nios平台的光信号采集片上系统设计
基于Nios平台的光信号采集片上系统设计摘要:介绍基于Altera Excalibur平台的光信号采集片上系统的设计,详细地分析片上系统各个组成部分的工作原理。作为一个新型的测量系统,它具有灵活、稳定、高效率等特点。
关键词:片上系统 光纤光栅 光信号采集 Nios
引言
一项很有发展前景的新技术-纤维光学及光纤光栅(FBG,Fiber Bragg Grating)技术,已经被应用于温度及形变在线测量中。FBG传感器的特征就是具有良好的稳定性、可靠性。除此之外,它还具有基于光纤传感器的一些共有优点,如对电磁的不敏感性、尺寸小、传感器和数据获取装置之间距离可以很远;因而能克服传统的温度和形变传感器(如热电偶和形变测量器)的很多缺点,如重量、硬度方面的缺陷以及对环境变化干扰的抵抗能力差等。
本文主要介绍对FBG传感器信号的快速获取方法,重点介绍基于FPGA的Altera公司的Excalibur开发板,设计一个片上嵌入式测量系统,用它来获取光信号。与目前具有同样功能的其它测量系统相比,它具有灵活、稳定、易维护、高效率等优点。本测量系统的硬件开发包括,使用Altera Excalibur开发板配置生成一个嵌有Nios处理器的“片上”测量系统,以及使用CCD和高速ADC设计光电信号的转换和采集电路;软件开发包括,在Apex EP20K FPGA中时序信号的Verilog实现,使用C语言对光电信号的获取。
1 系统结构
测量系统由以下几部分组成:光学系统、放置被测物体内的光纤光栅(FBG)和信号采集处理部分。其中的光学系统包括光源和分光仪,使用高亮度的激光发生器作为光源,用于产生入射被测物体内的光纤的光波。它的功率大于1mW,光频谱位于808~858nm,入射后其中某一波长的光波被光栅反射回来,并进入分光仪。分光仪是由若干面反射镜和全息光栅组成,主要作用是对光波进行光学处理后,使光波能够准确投射在CCD上,将光信号转换成电信号,便于信号的采集和处理。系统中信号采集处理部分是由CCD线列传感器ADC转换器以及Altera ExCalibur开发板组成。它的作用是将投射在CCD上的光信号先变为模拟电信号,而后通过ADC将信号再转换成数字量信号,然后通过Altera‘s Excalibur开发板上的片上Nios嵌入式系统,对这些数字量信号进行采集和处理,得到相应的温度值和应变值,以便完成整个测量过程。系统框架示意图如图1所示。
2 光纤光栅(FBG)传感器工作原理
光纤光栅(FBG)传感器是光纤传感器的一种。它不仅可以用于静态信号,还可以用于动态信号的采集,例如温度、形变和压力等。
以下结合图2介绍光纤光栅(FBG)的工作原理。
光纤光栅(FBG)传感器的工作原理就是用某一波长的光信号来表示我们希望采集的物理量。光纤中的光栅可以被看作是一个“滤波器”。根据光栅本身的物理特性,进入光纤的光波的某一波长部分被光栅反射回来,这一波长的光波就被从入身的光波中“滤除”了。这样,我们希望采集的物理量就被“调制”成了这一波长的光信号。
图3 缓冲接口电路
假设光栅的反射系数为neff,光栅之间的几何距离为dB,通过以下公式得出被反射回的光波的波长λB=2×neff×dB。机械应力将改变光栅之间的几何距离,而温度的变化将改变光栅的反射系数。可以试想,在已知温度T0和已知压力ε0条件下,反射波长为λB0,那么,可以通过检测未知温度T1和未知应力ε1所对应反射波长λ1与λB0之间的波长偏移,来计算得到此刻的温度T1和应力ε1,计算公式如下:
其中光栅的相关常系数c1、c2,由光栅的校准过程所决定。
应力ε1=(λ1-λB0)/[(1-Peff)]×λB0
其中光栅常系数的Peff是光栅光塑常系数。
3 CCD图像传感器的选择
为了方便系统对FBG输出的光信号进行处理,必须将其转换成电信号,我们采用光电信号转换器未完成这方面的工作。在本系统中,因为发光源的波谱范围是808~858nm,所以我们选用了波谱范围为200~1100nm的2048个像素的灰度线列CCD图像传感器ILX511B。
CCD将光信号转换成模拟电信号,每个像素产生一个模拟电信号,这样CCD每次进行光电转换就产生2048个模拟电信号;同时,它将这2048个像素位置串行地“封装”成一个有效数据字段,可以在外加时钟同步信号(CLK)和芯片使读端(ROG)作用下,从CCD中读出数据。外加的同步时钟信号由2087个时钟脉冲组成,在每个时钟脉冲作用下,一个数据位被读出。这2087个数据位由以下几部分组成:首部伪数据字段(33个数据位)、有效数据字段(2048个数据位)、尾部伪数据字段(6个数据位)。需要注意的是,为了提高电磁兼容性,CCD的工作方式应该选择为采样一保持方式;同时,CCD在上电后处于内部电路初始化阶段,为了避免得到错误的数据,最初22 500个时钟脉冲用于初始化CCD,不要在此阶段读出数据。
4 ADC接口设计与Altera Nios平台
4.1 ADC接口设计
经过CCD传感器转换输出的模拟量,必须通过ADC转换器转换成数字信号,这样系统才可以处理这些信号。因为CCD的动态范围是48.5dB,根据公式
ADC精度≥动态范围(dB)/20×log2
可以计算得到ADC精度≥8.06,所以选择ADC的精度必须是9位或9位以上的;同时,根据以下公式计算ADC的速度:
fs=1×2MHz(CCD的最大时钟频率)=2MHz(采样和保持方式)。
通过上述计算和分析,得到所需ADC的两个主要特性指标,即精度至少要9位,采样的速率必须至少2Msps。
现在,有很多ADC转换器可以应用于CCD图像处理。在综合考虑了诸多因素后,我们选择Linear的串行ADCLTC1402。
在设计ADC接口电路时,要注意以下一些问题。首先,由于LTC1402内部输入信号的“保持-采样”电路的速率达到80MHz,所以,外部的噪声和干扰都可以通过LTC1402的输入端对A/D转换产生影响。根据LTC1402数据手册的要求,我们解决的方法是,在LTC1402的输入端加上一阶的滤波电路,将输入信号的频率限制在一定的范围内。其次,CCD的输出对于外界的阻抗变化比较敏感,如果将ADC的输入端与CCD的输出直接相连,则CCD的负载可能随ADC输入端内部阻抗的变化而变化。基于以上两点考虑,我们在CCD和ADC之间设计了缓冲电路,用于阻抗匹配和滤波。缓冲接口电路如图3所示。
由图3可计算ADC的输入最高频率:
fg=1/[(2×π×R5×C3)]=10.3MHz。
4.2 Altera Nios平台
在细致分析系统的特点后,我们决定选择专门针对SOPC应用的Altera Excalibur开发套件。开发套件包括以下部分:
*Nios处理器以及外围接口;
*Quartus II开发软件;
*GNDUro编译器;
*基于APEX EP20K200E FPGA的开发板;
*相关的开发例程。
图5 时钟和控制信号发生器的仿真时序
我们使用集成在QuartusII中的SOPC Builder工具来配置生成片上系统。SOPC Builder是一个功能强大的基于图形界面的片上系统的定义和定制工具,可以在短时间内完成用户定制的SOPC设计。根据应用的需要,从SOPC Builder库中选择IP模块、存储器、外围接口和处理器,并且配置生成一个高集成度的SOPC系统,因而选取以下一些模块组成片上系统:Nios 32bit CPU、Boot Monitor ROM、Communication UART、debugging UART、Timer、Button PIO、User PIO、LCD PIO、LED PIO、DMA、SPI、Seven Segment PIO、External RAM Bus(Avalon TriState Bridge)、External RAM Interface、External Flash Interface。
同时,SOPC Builder自动产生一些必需的仲裁逻辑来协调系统中以上各个部件的工作,我们将系统的工作频率设为33MHz。定制完片上系统的硬件后,SOPC Builder还为编写操作这些片上硬件的软件代码提供了一个软件开发环境,这个软件环境包括语言头文件、外围接口的驱动以及实时操作系统的内核,极大地方便了软件的开发。
5 系统实现
以下分两部分来分析和介绍:①在ApexEP20K FPGA中,使用Verilog编写时钟和控制信号发生器用于驱动CCD和ADC,并且协调两者的工作;②使用C语言编写程序,通过SOPC Builder配置的SPI接口读取ADC输出的数据。
5.1 时钟和控制信号发生器
使用Verilog编写时钟和控制信号发生器,用于产生驱动CCD和ADC的时钟和控制信号。时钟发生器的工作原理是:使用频率为33MHz的系统时钟,作为时钟发生器的输入和同步售,用于产生所需的CCD和ADC驱动的时钟和控制信号。根据系统的要求和CCD以及ADC芯片特性,将产生的CCD时钟频率设为1MHz;同时把ADC的时钟频率设为33MHz。在时钟发生器中,还需对产生CCD和ADC两个高速设备的时钟和控制信号进行匹配,使得两者能够正常地工作。
现在详细地分析这两个高速设备如何完成时序的匹配。由于系统中的CCD和ADC都是依靠外加时钟同步的高速设备,因此,这两个设备之间的时序的匹配对于能否获取正确有效的数据来说至关重要。为了使两个设备协同工作,首先要分析每个设备所需的外加时钟和控制两个外加信号,分别是CCD_ROG和CCD_CLK。CCD_ROG信号使得CCD的输出数据有效,也就是每次从CCD读取数据时,都要先给CCD_ROG一个低电平,将CCD置光电转换后的数据一位位地输出。ADC进行模数转换也需要两个外加信号,分别是ADC_CONV和ADC_CLK。ADC_CONV信号使ADC芯片开始进行模数转换,每次进行转换前都要给ADC_CONV一个高电平;同时,转换过程和转换后的结果输出在ADC_CLK信号的同步完成。
由于需要先从CCD光电转换器读出模拟数据,所以,要通过CCD_ROG给CCD一个长度为t1(t1=4000ns)的低电平。在CCD_ROG重新变为高电平后,CCD就在CCD_CLK信号的同步下输出数据了,在每个CCD_CLK作用下输出一个模拟量数据。CCD每次输出的2087个模拟量分别由33个首部伪数据字段、2048个有效数据和6个尾部伪数据字段组成。其中的2048个有效数据和首部伪数据字段的后20个数据就是我们希望得到的,所以从第14个数据到第2081个数据中的每个模拟量,都通过ADC_CONV(ADC_CONV的高电平宽度为4ns),给出一个高电平启动ADC;同时,在ADC_CLK的作用下,完成模数转换过程和数字量输出。图4、图5是时钟和控制信号发生器的程序流程和仿真时序图。
5.2 SPI接口的编程
ADC将模拟信号转换成数字信号后,Nios通过SPI接口读入这些信号并进行相应的处理。我们通过Quartus II中的SOPC Builder为Nios核配置SPI接口。在我们的系统中,将SPI配置为从设备。软件通过访问存储器中映射的5个16位的寄存器来控制和读写SPI接口。读入的数据通过MOSI引脚逐位进入移位寄存器。通过移位寄存器的移位和缓冲后,一帧数据进入寄存器rxdata,同时将状态寄存器的rrdy位置1,通过访问rxdata就得到一帧数据。数据被读取后,rrdy位自动置回0。如果前一帧数据还未从rxdata读取,后一帧数据就会将原数据覆盖,造成错误,同时将状态寄存器的ROE(Read Overwrite Error)位置成1。SPI接口共有4个引脚,分别是MISO(Master Input Slave Output)、MOSI(Master Output Slave Input)、SCLK(同步时钟)和SS_n。当SS_n为低电平时,从设备可以在SCLK同步作用下读入数据。系统中的SPI接口是从设备,所以只使用MOSI、SCLK和SS_n三根引脚。图6是Nios中SPI与ADC的接口示意图。
从ADS的芯片特性可知,当ADC_CONV在一个高电平的作用下,ADC开始进行模数转换。ADC_CONV回复到电平后,因为SS_n和ADC_CONV连在一起,所以Nios中的SPI就处于可以读入数据的状态了;同时,在ADC_SCK的作用下ADC输出数据,而SPI也在相同的时钟SCLK的作用下,通过MOSI读入数据。为了能够准确得到数据,还要将SPI寄存器rxdata的位数设为13位。软件中,我们将通过等待SPI寄存器的rrdy位的置位,来读取rxdata中的数据,与此同时寄存器中roe的状态决定此帧数据的读取过程中是否存在数据溢出现象。以下是相关的读取数据的软件代码。
do{
//读一行CCD数据
for(i=0;i<2069;i++){
//等待,直到准备好
while(spi->np_spistatus&np_spistatus_rrdy_mask)==0)
;
//从SPI数据寄存器读数据
c=spi->np_spirxdata;
}
//读覆盖状态
b=spi->np_spistatus&np_spistatus_roe_mask;
}while(b==8);
结论
本系统经过仿真测试,其功能达到了设计要求,并用HP逻辑分析仪验证了系统功能。 谢谢分享!:D
页:
[1]