深圳市赋安安全系统有限公司 吴晓娜
电力系统的频率主要和系统负荷有关。大型机组的投切、大功率负荷的变化都可能引起电力系统频率的变化;发电量大于用电负荷时或有部分线路跳闸时,系统频率会升高;当负荷突增或发电机跳闸时,系统频率会下降,进而使电压水平下降。频率或电压不稳定,对发电厂及电力系统本身带来危害,更重要的是不能满足用户对电能质量的要求,直接影响用户的产品质量,影响电子计算机的正常工作。为确保电力系统安全稳定运行和提供优质电能,有必要对电力系统的频率和电压进行测量,通过调度管理系统调整电网上的电力供应与负荷的平衡,保证电网的运行频率维持在允许变动范围内,来维持整个电力系统安全稳定地运行[1]。
本文的配电终端设计了基于VxWorks实时操作系统的频率和电压采集方法。通过将被测电压信号经过过流比较器得到方波信号,利用定时器的捕获模式进行被测信号频率的测量。通过一个周波采集32个点进行电压的测量,采样时间间隔根据测量得到的频率进行动态调整,保证了在交流信号波动时频率和遥测的测量精度。
本文设计的频率采样采用的是过零相位比较方法,利用周期信号相继过零点的时间宽度来计算频率。一次高压10kV通过电压互感器PT转换成额定100V的低电压,然后通过配电终端内部的电压变换器将PT转换的低电压进一步转换成-5V- +5V的电压,以适应于配电终端的嵌入式系统。采用过零电压比较器电路将正弦波信号转换成方波,通过测量方波的周期从而计算出周期信号的频率。
配电终端的核心硬件采用ATMEL的ATSAM9X25微处理器,包含两个定时器/计数器(TC0、TC1),每个定时器有三个相同的32 位定时器/计数器通道(0、1、2),每个通道有两个信号口线(TIOA、TIOB)。每个通道可独立编程,以执行不同功能包括频率测量,事件计数,间断测量,脉冲发生,延迟定时和脉宽调制。定时器的捕获模式允许定时器通道对输入的TIOA 和TIOB 信号上的脉冲时序,频率,周期,占空比和相位进行测量。被测周期信号经过电压变换器转换成小电压,然后通过过零比较器,信号由正电压过零时,跳变为低电平,信号由负电压过零时,跳变为高电平,从而可以将正弦波转换成方波信号,将方波信号输入ATSAM9X25微处理器的定时器/计数器的捕获模式通道TIOA 口线,即可测量出被测周期信号的频率。电压变换器的小电压经过模数转换器转换成数字信号,处理器采集到数字信号经过处理后转换成对应的PT侧的二次电压,即可求出遥测值[2]。硬件设计原理如图1所示。
当在TIOA 信号上产生一个可编程事件时可用计数器值装载RA和RB。寄存器A 和B(RA 和RB)被用作捕获寄存器。通过设置通道模式寄存器定义装载寄存器A 和B的TIOA 边沿、外部触发信号的边沿、时钟选择以及时钟反转。当被测信号通过过零比较器得到的方波信号的上升沿到来时,产生触发信号,计数器将当前计数值复制到RA/RB捕获寄存器,计数器清零,当再一个上升沿到来时,再次产生触发信号,计数器又将当前计数值复制到RA/RB寄存器,然后计数器清零。RA/RB捕获寄存器得到的计数值即为被测信号一个周波的计数值。根据一个周波的计数值,通过定时器的时钟便可计算出被测信号的频率为定时器的时钟频率/计数值,其中定时器的时钟频率为微处理器的主频经过分频得到的。
图1 硬件设计原理
配电终端基于VxWorks的开发平台,VxWorks 是美国 Wind River System风河公司推出的一个实时操作系统,可以满足配电终端的实时性要求。为了便于平台的移植,设计了基于VxBus的定时器驱动程序以及基于字符设备的频率采集的驱动程序。
VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。本文采用的VxWorks6.8版本的开发平台,各种驱动和支持组件的添加与删除完全可以在Workbench集成开发环境的工程中进行,不需要BSP和驱动相关的知识,也不会在添加或者删除驱动时增加管理VxWorks工程的额外工作。
定时器驱动根据VxBus驱动模型来设计,包括驱动的注册、驱动初始化和驱动设计[3]。
2.1.1 驱动的注册和初始化
VxWorks内核启动前,sysHwInit()函数调用hardWareInterFaceInit(),这个函数是VxBus驱动初始化的入口函数。这个函数首先初始化硬件内存分配机制,然后调用hardWareInterFaceBusInit( ),根据config.h包含的使用VxBus架构驱动的设备类型进行基于VxBus的定时器驱动的注册vxbAt91sam9x25TimerDrvRegister( )。
在完成注册后,程序调用vxbInit()进行设备扫描,读取hwconf.c文件中的hcfDeviceList[]数组,根据数组中的资源与已经注册了的驱动程序进行设备名字和驱动名字的匹配查找。如果找到匹配的会创建一个实例,即每个驱动和设备之间的一对关联关系[3]。vx-bInit()会建立实例链表,将所有实例统一管理,并调用定时器驱动的第一阶段初始化函数at91sam9x25TimerInstInit(),初始化内部数据结构,完成任何所需的硬件定时器初始化。
VxWorks内核启动后,sysHwInit2()函数调用vxbDevInit(),这个函数调用定时器驱动的第二阶段初始化函数at91sam9x25TimerInstInit2(),连接定时器中断服务程序到定时器中断源上。
sysHwInit2()函数接着以任务的形式运行vxbDevConnect(),这个函数调用定时器驱动的第三阶段初始化函数at91sam9x25TimerInstConnect(),用于设备的连接,通常可以不使用。至此,定时器驱动的初始化完成[4]。
2.1.2 驱动设计
一旦定时器驱动程序被注册,调用驱动函数func{vxbTimerFuncGet}( ),系统和驱动之间的所有交互发生通过vxbTimerFunctionality数据结构的返回指针。在一个定时器驱动中,{vxbTimerFuncGet}( )方法通过使用其驱动程序提供的例程实现,驱动在vxbTimerFunctionality结构体描述所需定时器的函数指针。下面部分,描述了定时器驱动所支持的服务程序[5]。
(*timerAllocate)( )程序被用来在运行的VxWorks系统中分配一个特定的定时器。
(*timerRelease)( )程序用来释放一个特定定时器通过(*timerAllocate)( ) 之前分配的。
(*timerCountGet)用来查询定时器当前值。
(*timerRolloverGet)( )程序用来查询最大值,值为定时器使用(*timerCountGet)( ) 程序返回的。
(*timerDisable)( )用来禁用底层硬件定时器产生的中断。(*timerEnable)( )用来使能底层硬件定时器产生的中断。
(*timerISRSet)( )被调用连接定时器中断服务程序到定时器中断源,一个定时器中断产生时调用一次定时器中断服务程序。
2.1.3 API接口设计
在定时器中断服务程序里,读取定时器状态寄存器判断是RC比较器中断还是捕获模式的装载中断,然后回调各自的用户定时器中断服务程序。当应用层用到硬件定时器时,需要底层驱动提供用户定时器的API接口函数。在内核启动过程中,完成用户定时器的初始化,包括调用函数vxbInstByNameFind()通过设备名和设备号查找实例。vxbDevMethodGet()查询到定时器实例支持{vxbTimerFunc-Get}( )方法,返回定时器驱动提供的相应函数的指针。
应用层通过调用usrClkConnect(),实现将特定硬件定时器通道号的中断服务程序连接到定时器中断源。调用usrClkRateSet()、usrClkRateGet()实现对定时器定时间隔的设置和读取。调用usrClkEnable()、usrClkDisable()实现对定时器RC比较器中断的使能和禁用。
频率采集驱动根据字符设备来设计。应用层首先调用标准的I/O子系统层的API接口函数,然后I/O子系统层调用频率采集驱动程序完成对频率的采集。为了实现这个过程,频率采集驱动程序需要向I/O子系统层注册,通过at91sam9x25FrqDrv() 调用iosDrvInstall(),完成频率采集驱动程序驱动列表的注册,驱动号即为ios-DrvInstall() 的返回值。
通过at91sam9x25FrqDevCreate() 调用iosDevAdd() 完成频率采集驱动程序设备列表的创建。
在at91sam9x25FrqDrv()对驱动的注册时调用iosDrvInstall (),可以对定时器/计数器的捕获模式进行初始化配置,设置用户定时器TC0的2通道用于频率的测量,连接用户定时器中断服务程序到定时器中断源。当应用层打开设备时,采用TIOA口线,使能捕获模式的捕获寄存器RA/RB装载中断。
当定时器/计数器的捕获模式捕获到有触发信号的上升沿到来时,计数器装载RA/RB寄存器,产生装载中断,进入中断服务程序。中断服务程序读取RA/RB捕获寄存器的值,对该值进行干扰处理,有效值即为一个周波的计数值。在驱动程序的读函数中,计算出被测信号的频率f = 定时器时钟频率/计数值。
频率的采集可用于对遥测采样间隔的时间跟随。应用程序首先打开频率采集的设备,此时RA/RB装载中断或RC比较器中断使能,通过设置用户定时器TC1的0通道进行遥测的定时采样,调用usrClkConnect()连接遥测定时器TC1的0通道中断服务程序到定时器中断源。使能定时器中断,开始测量遥测时先按照频率为50Hz,每周波采集32个点,采样的时间间隔为0.625ms。当定时时间间隔到时,进入遥测定时器中断服务程序,读取遥测瞬时值,计算定时中断次数,当次数为32时,表示采集了一个周波的值,当计数到32N时,表示采集了N个周波,N可以根据开发人员自己设置。当采集N个周波后,调用read()读取频率值,调用频率采集的驱动过程如上图3所示。根据读到的频率值f进行采样时间间隔的动态调整,采样间隔为(1/f)/32 s。应用软件实现遥测的采集以及频率跟随的过程如图2示。
图2 遥测的采集以及频率跟随流程图
本文通过对交流电压信号进行电压变换器转换成小电压信号,然后进行过零比较器的处理,得到方波信号,对方波信号的周波脉冲计数得到交流信号的频率。被测交流信号遥测的采集时间间隔可以根据频率进行跟随,从而保证在交流信号波动时的遥测精度。配电终端采用基于VxWorks的定时器驱动和频率驱动,具有多任务处理、实时性强、移植性好的特点,对于确保配电终端在配电自动化系统中的安全、稳定、可靠运行起到了重要作用。
[1]刘鹏,罗杉.电力系统频率及电压降低时的处理[J].科技资讯,2010(7).
[2]刘思宇.基于MK61的配网终端交流同步采集系统设计[J].无线互联科技,2013(9).
[3]赵永刚, 韩国义.基于VxBus的设备驱动开发[J].微型机与应用,2010(18).
[4]李海亮. VxWorks环境下定位系统显控软件设计[D].哈尔滨工程大学硕士论文,2007.
[5]李立哲,吕伟,樊丁.基于VxWorks的航空发动机控制系统软件设计[J].电光与控制,2010(9).