李正东 周志强 袁学文 刘章文
摘 要: 96通道变形镜驱动器内含6个驱动模块,每个驱动模块含有16个输出通道,为了更加有效地管理控制这6个驱动模块,并实现与上位机、图像处理模块的交互通信,设计了变形镜驱动器控制电路。该电路包含了硬件设计和软件设计,其中硬件设计包含了电源设计、接口设计和FPGA设计,旨在实现高速向CPCI总线传输来自SPI接口的驱动矢量数据,同时把这些数据以适当的速度发给上位机。软件设计包括FPGA程序和NIOS系统程序设计,其中NIOS程序旨在实现上位机对上位机指令或数据的接收、处理和发送,以及对系统参数的配置以及驱动模块参数的保存等。结果表明,该电路不仅能够以200 f/s的速率正确接收并发送来自图像处理模块的驱动矢量数据,还能够正确收发来自上位机网口或者串口的控制指令,实现单通道与驱动矢量的切换、驱动矢量数据源的切换、单通道电压设置、放大器参数调试和保存以及通道数据读取、回传等功能,达到了预定的设计目标。
关键词: 变形镜; 控制电路; 硬件设计; 软件设计; FPGA; NIOS系统
中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2017)22?0125?06
Abstract: The 96?channel deformable mirror driver includes 6 driver modules, and each module has 16 output channels. In order to manage the 6 driver modules more efficiently, and realize the interactive communication with the upper computer and image processing module, a control circuit of the deformable mirror driver was designed. The hardware design and software design of the circuit are introduced. The hardware design contains the power supply design, interface design and FPGA design, which can transmit the driving vector data from SPI to CPCI bus in high speed, and send the data to the upper computer with proper speed. The software design includes the FPGA program design and NIOS system program design. The NIOS program is used to receive, process and send the instructions or data of the upper computer, configure the system parameters, and save the parameters of the driving module. The experimental results show that the circuit can accurately receive and send the driving vector data from the image processing module with the speed of 200 f/s, correctly transmit and receive the control instructions from the network interface or serial port of the upper computer, and realize the switchover between the single channel and driving vector, switchover between the driving vector data, voltage set of single channel, amplifier parameter debugging and saving, read and postback of the channel data. It achieves the scheduled design target.
Keywords: deformable mirror; control circuit; hardware design; software design; FPGA; NIOS system
0 引 言
主動光学系统的目的就是改善光束质量,其涉及到的关键器件是变形镜。变形镜是由一定数量的压电陶瓷单元组成的面阵系统,通过合理的改变加在压电陶瓷单元上的电压,从而改变压电陶瓷单元的形变,最终达到改善光束装量的目的。变形镜驱动器[1]就是负责将一组对应电压的矢量数据施加到变形镜上,其中的每一路电压负责变形镜一个陶瓷单元的驱动。但由于陶瓷单元的驱动电压值较高,故陶瓷单元的末级电压放大器都是高电压模拟放大器。再考虑到放大电路的散热要求,故每块驱动模块设计成仅仅输出16通道驱动电压的电路板。这样96通道的变形镜驱动器就需要6块驱动板,这些驱动板卡通过CPCI物理总线集成在一个机箱内,并在机箱内设计一块控制模块,用来为了更加有效的控制、管理这6块驱动板卡,并实现与上位机、图像处理板卡的交互通信,以及每通道放大器参数的调试和加载。
1 变形镜驱动器的原理设计endprint
变形镜驱动器主要由控制模块、图像处理模块、驱动模块、总线电路和电源模块组成[2?3],其拓扑结构如图1所示。它的基本框架采用CPCI总线结构,其内含1块控制模块、1块图像处理模块以及6块驱动模块,其中每个驱动模块有16个输出通道,每个通道可以用于驱动变形镜的一个陶瓷单元。所以,整个驱动器可以驱动最多96单元的变形镜。所有这些模块均挂在CPCI总线上,其中控制模块有两种工作模式,当其工作在调试模式时,通过以太网与上位机相连,接收并处理上位机指令后,通过CPCI总线向驱动模块发出控制指令,从而实现驱动模块驱动电压的输出或者驱动模块参数的调试和设置;当其工作在运行模式时,控制模块通过CPCI总线,直接接收来自图像处理模块的驱动矢量数据,经过整形处理后,再通过CPCI总线,发送到各驱动模块,从而实现驱动模块驱动电压的输出,从而实现对96通道变形镜的驱动。
具体来说,其中的总线电路板相当于整个变形镜驱动器的主板,其提供了整个变形镜驱动器基本的CPCI总线,电源模块正是通过CPCI总线为变形镜驱动器的控制模块、图像处理模块和6块驱动模块供电,控制模块、图像处理模块和6块驱动模块之间的控制信号、数据信号以及反馈信号也是通过该CPCI总线实现互联;其中的电源模块采用了一款成熟的商业化电源模块来实现,其有四组输出端子,分别输出150 V,-50 V,15 V,
-15 V四种电压,它们通过CPCI总线给控制模块、图像处理模块和6块驱动模块供电,其中150 V和-50 V为6块驱动模块内部的末级高压放大器提供正、负电源,15 V电源通过CPCI总线为控制模块、图像处理模块和6块驱动模块提供工作电源,-15 V结合15 V为驱动模块内含的前级放大器提供负、正电源;其中的图像处理模块对图像数据处理完成后,得出一组驱动变形镜所需的电压驱动矢量数据,并通过CPCI总线发送到控制模块,再经过控制模块的处理,发送到驱动模块,最终通过驱动模块的输出电压控制变形镜的形变,实现光束质量的控制。
2 变形镜驱动器控制模块的硬件设计
变形镜驱动器控制模块硬件框架如图2所示。基本上基于CPCI总线结构,其设计主要包括三个部分,分别为电源部分、接口部分和FPGA部分,其中电源部分将来自CPCI总线的15 V电源,经过不同的电压转换芯片给整个驱动模块的供电。来自CPCI总线的15 V电源首先经过过压保护电路和由電容组成的滤波电路,再经过两片LMZ14201电压转换芯片,分别输出5.0 V 和3.3 V的电压,其中5.0V电压作为控制模块中RS 485串口芯片的工作电压,3.3 V电压作为控制模块中FPGA的I/O电压和控制模块其他接口芯片的工作电压。同时,3.3 V电压再经过NCP5661?1.2芯片输出1.2 V的电压用来作为FPGA的内核电压。图3给出了3.3 V电压的设计原理图。
接口部分的设计分为两个部分:CPCI接口设计;面板接口设计。其中CPCI接口设计包含有DSP图像处理模块接口设计、RS 485总线设计、并行总线设计和网络接口设计,其中图像处理模块接口主要用来通过CPCI总线接收来自于图像处理模块输出的驱动矢量数据。该矢量数据利用SPI协议传输,SPI的时钟、数据和帧同步3根信号经过SN54HC244芯片的驱动,送入到FPGA。同时,FPGA发往图像处理模块的反馈信号也经过SN54HC244芯片的驱动,发往CPCI总线;RS 485总线主要用来实现控制模块和其他6块驱动模块在调试工作模式下的信息交互,尤其在逐个对放大器参数进行标定时,上位机的通道切换指令、通道电压设置指令等均是通过本总线发往各驱动模块,各驱动模块的反馈信号也是通过本总线经控制模块传回上位机。此功能由SP485EL芯片来实现。控制模块的FPGA为RS 485总线的主设备,6块驱动模块为RS 485总线的从设备。其中SP485EL_B和SP485EL_A为一对差分信号,连接至CPCI总线上,其他信号连接到FPGA。并行总线主要用来实现控制模块在运行工作模式下,采用全硬件方式,将来自图像处理模块或者来自上位机的驱动矢量数据高速地通过CPCI总线,再发往各驱动模块。此功能主要由DS91M040芯片来实现。电路设计上,通RS 485总线设计一致,即DS91M040的单端信号为信号输入端,包括数据信号和控制信号,均接入到FPGA。其4对差分信号为输出端,均接到CPCI总线上。这样有利于提高总线数据传输的速度和可靠性,当然,具体的数据传输协议由用户制定。图3仅给出总线电路的设计。
网络接口设计主要用来实现控制模块在调试工作模式下,接收上位机指令,并将指令进行解析处理,然后发往各驱动模块,或者将各驱动模块的状态数据收集打包并通过网口返回给上位机等功能,此功能由DP83848芯片来实现,具体的实现电路如图4所示。面板接口设计则相对比较简单,它主要用于显示控制模块的工作状态,包含控制模块的3.3 V电源状态显示、通信状态显示、故障显示以及蜂鸣器报警设计。另外,面板上还备用了RS 422串口,在网络不方便的时候,可利用串口进行网络调试。RS 422功能利用ADM2582EBRW2芯片来实现,芯片的单端信号接入FPGA,差分信号输出到面板的DB15接头,在此不再赘述。
FPGA是整个控制模块的核心部件,实现对控制模块所有指令和数据的控制和交互。FPGA部分的设计主要包含FPGA电源设计、时钟设计、JTAG口设计、配置芯片设计和存储器设计。其中存储器包含1片SDRAM芯片和1片EPCS16;而这里的EPCS16作为EPROM不同于FPGA的配置芯片,它主要存储控制模块的所有配置参数,上电后,NIOS系统先要从该EPROM中读取参数,并利用这些参数进行系统的初始化,这些工作完成后,矢量数据通道都切换正常后,系统才进入工作模式。网络接口原理图如图5所示。
3 变形镜驱动器控制模块的软件设计endprint
变形镜驱动器控制模块的软件设计包含两个部分:FPGA的设计;NIOS程序设计。FPGA程序的主要目的是当变形镜驱动器工作在运行模式时,使用硬件完成来自图像处理模块或者经NIOS来自上位机的驱动矢量数据的处理后,以较高的速度向CPCI总线发送,驱动模块从CPCI总线接收驱动矢量数据,实现对变形镜的驱动;NIOS程序的主要目的是当变形镜驱动器工作在调试模式时,接收并解析上位机命令,并将相应的指令或数据通过CPCI总线上发送到驱动模块中去,实现对驱动模块每个通道放大器参数的标定,并给各驱动模块发送命令,把这些参数存储各驱动模块的EPROM中,供驱动模块上电时调用装载,同时NIOS程序,还根据上位机指令,收集驱动模块的状态信息并上传给上位机。下面分别介绍FPGA和NIOS程序的设计。
3.1 FPGA的程序设计
控制模块对驱动矢量数据的接收有两个途径,一个途径是通过CPCI总线接收来自图像处理模块发出的驱动矢量数据;另一个途径是通过NIOS接收来自上位机的驱动矢量数据。当接收到驱动矢量数据后,FPGA利用硬件把驱动矢量数据通过CPCI总线发往挂在CPCI总线的驱动模块中,FPGA程序的逻辑框图如图6所示。
图6中图像处理模块有DSPA和DSPB两路输出,其中DSPB的输出作为系统备份之用,两路输出数据格式、传输协议均相同,故这里仅对DSPA输出的数据做出说明,图像处理模块输出的每帧驱动矢量数据含有106个数据,每个数据含有16 b数据,16 b的数据采用SPI协议传输,帧数据协议如图7所示。
帧协议中,帧头包括4个FFFF和1个FFFE,长度项表示每帧中所含的16 b字的数目,具体为0x0065(不包含帧头),长度反码为0xFF9A,命令字为0x0840,表示本帧数据为驱动矢量数据。帧计数主要是为了检测是否存在丢帧现象而设置的。相邻帧计数之差为1,则说明不存在丢帧现象。帧计数之后是96个驱动电压的数值,每个驱动电压对应驱动器的一个输出通道。最后是一个16 b的校验码,校验码是从帧长度开始计算,按字节相加的方式进行计算,直至最后一个电压数据,其中超出16 b的高位数据做舍弃处理。
SPI数据存储控制模块主要用来实现对来自CPCI总线的SPI数据的接受和存储。为了兼顾上位机对SPI驱动矢量数据的监控,SPI数据存储控制后端设置了两个存储器DPRAM1和DPRAM2。其中DPRAM2是为上位机监视查询而设置的,其存储容量为128个16 b的字,足可以存储驱动矢量数据中的96个驱动电压值。由于这仅仅为是为了满足监视要求,故只当上位机设置成读完成标志后,才容许SPI数据存储控制模块向DPRAM2写入新的驱动矢量数据;并在写入完成后,向NIOS系统发送中断;NIOS再利用SPI数据上传读控制模块进行驱动矢量数据的读取,再通过NIOS的网络内核,上传给上位机。而DPRAM1是SPI数据存储控制模块发往CPCI总线上的驱动矢量存储器,为了提高系统工作频率,SPI存储器容量设置为256个16 b的字,分为A,B两个半区,分别为128个字,读/写操作均采用乒乓操作,由此提高了系统的带宽。当系统开始工作时,SPI数据存储控制向A区写入数据,当A区数据写操作完成时,SPI数据存储控制模块通知SPI数据发送读控制模块A区写入完成,同时准备将下一帧的驱动矢量数据写入B区,SPI数据发送读控制模块收到SPI数据存储控制模块的A区写完成信号后,从A区读取驱动矢量数据,并按照总线协议把这些数据发送到CPCI总线。反之亦然,不再赘述,SPI数据存储控制流程图如图8所示。
SPI数据发送读模块的功能是将驱动矢量数据发送到CPCI总线上,采用4对差分信号实现输出的传输。其中一对差分信号作为时钟信号;另外三对差分信号作为数据线,以字节方式从DPRAM1中读出数据,在字节数的最高位前再填一个0,组成9 b数据,依据高位先传,低位后传的原则实现传输,这样一个字节的数据需要3个周期完成传输。当SPI数据发送读模块检测到帧数据有效时时,首先在6个时钟周期传输2组帧头,即“111_111_111”和“111_010_101”,然后从DPRAM1的有效地址开始以字节方式读出数据,组成9 b数据开始传输,直至1帧的96个字传输完成,由此完成1帧驱动矢量数据的发送。图6中的上位机矢量数据发送读模块采用和SPI数据发送读模块完全相同的协议,二者的主要区别是驱动矢量数据来源不同,在此不做另外的说明。SPI数据发送读模块的FPGA框图如图9所示。
3.2 NIOS的设计
NIOS的设计包括QSYS组件定制和程序设计[4?5],其中QSYS组件定制除一些必要的JTAG、定时器、配置存储器等内核外,还包含其他一些内核,具体介绍如下。QSYS组件定制界面如图10所示。
在NIOS系统中clk_0为处理器内核,onchip_ram_descriptor为片内存储器内核,用于存储程序代码以及程序运行空间,在系统中设置其为复位地址。sdram_0为SDRAM控制器内核,它用于实现和外部SDRAM的通信,从而为应用程序提供运行空间,为NIOS系统的异常地址。po_0为并行输入/输出类型内核,它用于实现NIOS系统对输入/输出I/O的电平控制,從而通过FPGA,在面板显示控制模块电源、通信、报错以及蜂鸣器的工作状态,同时还通过FPGA,实现对驱动矢量数据源的开/关切换。tse_mac为三速以太网内核,用于实现NIOS系统和DP83848硬件的通信功能,进而实现和上位机通信。epcs_config为EPCS内核,对应于配置芯片EPCS16,用于存储PFGA配置数据。而epcs_flash_controller_0也为EPCS内核,但在本系统中配置为EPROM使用,用于存储程序所需的一些全局配置参数,包括输出最大电压、最低电压等。DPRAM16_DrvVecIn和DPRAM16_DrvVecOut为双口RAM内核。其中前者实现与FPGA中DPRAM2的通信,当FPGA程序将来自图像处理模块的驱动矢量数据写入DPRAM2后,中断通知NIOS系统,NIOS通过读取DPRAM2中的数据,进而通过网口上传给上位机,用来监视来自图像处理模块的工作状况;后者实现与FPGA中DPRAM3的通信,在调试模式下,NIOS利用它把来自网口的上位机驱动矢量数据写入DPRAM3,再通知FPGA读取并发往CPCI总线,写另一个存储模块用于将图像处理模块通过SPI协议发送到FPGA的驱动矢量写入模块。uart_0和uart_0均为串口内核,其中前者用于实现与CPCI总线测RS 485芯片的通信,继而通过CPCI总线与挂在总线上的全部驱动模块通信,而后者用于实现与面板侧RS422芯片的通信,用于实现控制模块工作在串口调试模式时,与上位机串口的通信,由此构成了NIOS系统的内核设计。endprint
NIOS程序设计上则以UCOS嵌入式操作系统运行轻量级的TCP/IP协议为基础[6],创建了taskUdpRecv,taskUdpSend和taskTelnetServer三个任务,分别代表UDP接收任务、UDP发送任务以及网络服务任务。其中taskUdpRecv用于接收处理来自上位机网口的指令或者数据,taskUdpSend用于将控制模块或者驱动模块的状态信息,以及通过CPCI总线来自图像处理系统SPI接口的驱动矢量数据传回上位机。在taskUdpSend中首先利用wtInit()函数进行系统初始化。初始化包含禁止任何来自FPGA的硬件中断、DPRAM16_DrvVecIn、DPRAM16_DrvVecOut和po_0内核初始化、所有串口初始化、控制模块对各驱动模块的呼叫应答以及FPGA程序中断信号的使能等。系统初始化完成后,进入UDP发送任务的主循环,即wtMainloop()函数。
在wtMainloop()函数中,该函数首先判断是否有来自上位机新的字符串指令,若有新的字符串指令,则调用procNetCommand()对新的字符串指令进行处理。字符串指令大体分为3类:一类为set类命令,包括驱动矢量数据源在SPI(图像处理模块)和NIOS(上位机)之间的切换,配置参数中电压极值设置,通道映射设置,单通道电压设置与驱动矢量数据切换等;一类为get类指令,这类指令主要是为了确认set类命令执行结果是否正确而设置的,基本对应着set指令;最后一类指令为其他指令,如save指令,设计这个指令主要是因为驱动模块每个通道的末级电压放大器含有两个参数,这些参数需在单通道电压调试模式下通过调试获得,并最终通过控制模块的save命令将这些参数固化到相应驱动模块的ROM中,上电工作时加载。例如<0.0/set_ vec _source:0>指令,其中<>为字符串指令的首尾标志;0.0表示指令接收方为第一个机箱的控制模块;set_vec_source表示驱动矢量数据的来源;0表示驱动矢量源来自图像处理模块输出的SPI接口;1则表示驱动矢量源来自上位机通过网络送到的NIOS系统的DPRAM3,又如<0.2/set_DA:12=43525>。其中:0.2表示操作的对象为第1个机箱的第2个驱动模块;set_DA表示本指令是设置通道的电压值;12=43 525表示将本驱动模块的12通道的电压设置为43 525(65 535对应电压最大值),这个通道映射为驱动器系统的第28号通道,即(2-1)×16+12=28。相反<0.0/get_ vec _source>表示获取驱动矢量的数据源,<0.2/get_DA:12>表示获取第28号通道的设置电压值。这些指令执行完成后,调用netSendStrCommand()函数将获得的字符串指令的反馈信息打包,组成符合UDP协议的数据包,发往上位机以供监视。
在wtMainloop()函数中,还设计有串口字符串指令处理函数procSuartCommand(),它主要用于接收處理来自面板串口的上位机调试指令。其处理过程几乎和procNetCommand()函数一样,不同之处在于其操作对象是来自面板侧的RS 422串口,接收指令或发送反馈信息均通过该串口来实现,由于受速度限制,串口指令集中不涉及驱动矢量的操作。
在wtMainloop()函数中,还设计有netSendVec()函数,其用来实现对存储在DPRAM2中的SPI接口提供的驱动矢量数据的读取,并通过网络上传给上位机。当DPRAM2写操作有效时,且FPGA程序将来自SPI的驱动矢量数据写入DPRAM2后,FPGA将DPRAM16_DrvVecIn内核的DPRAM2ReadBufReady[0]信号设置为高电平,并向DPRAM16_DrvVecIn发送一个中断信号,DPRAM16_DrvVecIn接收到中断后,拷贝DPRAM2的数据到内核,并设置hasNewVecFromBus为true,当netSendVec()判断hasNewVecFromBus为true后,将数据打包,并发往上位机。
taskUdpRecv首先侦听本地端口,判断是否有上位机数据包,如果有上位机数据包,则判断数据包是连接指令、断开连接指令、数据或字符串指令和应答指令(没有数据传输时,判断并告知上位机,网络是否连通)四种类型中的那一种类型。如果是数据或字符串指令类型,则再判断是字符串指令,还是驱动矢量数据;如果是来自上位机的驱动矢量数据,则调用dpramWriteBlock()函数。首先从网络数据包中读出驱动矢量数据,再通过DPRAM16_DrvVecOut内核把驱动矢量数据写入DPRAM3。当写入完成后,设置dpramDrvOut_WriteBufReady信号线,使其发出一个正脉冲触发FPGA程序。FPGA程序识别到这个脉冲后,开始读取DPRAM3中的驱动矢量数据,再发往CPCI总线,供驱动模块读取。如果是字符串矢量,则调用scmdParsetStr()函数检查数据包是否符合命令格式协议,若符合字符串指令的格式协议,则提取出字符串指令供taskUdpSend调用,同时设置新的网络命令标志变量netHasNewStrCommand为True, 当taskUdpSend中的主循环Mainloop()函数判断此变量为true时,调用上述procNetCommand()对新的字符串指令进行处理。图11为NIOS程序中taskUdpRecv和taskUdpSend两个主要任务的流程图。
4 结 论
根据上述设计原理,研制了集成在96通道变形镜驱动器内的控制电路板,该电路板不仅能够以200 f/s的速率正确接收并发送来自SPI的驱动矢量数据,而且能够正确收发来自上位机网口或者串口的控制指令,实现单通道与驱动矢量的切换、驱动矢量数据源的切换、单通道电压设置、放大器参数调试和保存以及通道数据读取、回传等功能,达到了预定的设计目标。当然,相对变形镜的响应速度而言,如何在后续工作中进一步提高系统带宽,提高数据频率仍有许多工作要做。
参考文献
[1] 董理治,雷翔,刘文劲,等.腔内双压电变形镜光强分布优化[J].强激光与粒子束,2012,24(7):1691?1694.
[2] 朱晓锦,曹浩.基于PA95功放芯片的压电功率放大器开发[J].压电与声光,2008,30(5):561?563.
[3] 王慧,宫赤坤,王宏峰.基于PA95的新型压电陶瓷驱动电源[J].微计算机信息,2011,27(12):58?59.
[4] 周立功.SOPC嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2006.
[5] 潘松,黄继业.SOPC技术实用教程[M].北京:清华大学出版社,2005.
[6] 任哲.嵌入式实时操作系统μC/OS?Ⅱ原理及应用[M].北京:北京航空航天大学出版社,2005.
[7] 谭浩强.C程序设计[M].北京:清华大学出版社,1991.endprint