基于TMS320F2812事件管理器的一种测频方法
扫描二维码
随时随地手机看文章
引言
频率测量是电力系统测量中一个十分重要的环节。电力系统中采样对测频要求有一定的实时性。电网频率范围在45Hz与55Hz之间,一般在49.5与50.5之间波动。在精度要求不需要特别高的电网频率测量中,本文给出一种基于DSP芯片TMS320F2812的一种简易测频方法。该方法有效利用F2812的片内外设事件管理器(EV)的捕获功能,在被测信号的有效电平跳变沿捕获计数,电路实现多靠软件设置,运算简单,实时性好,精度达10-3,完全能够满足要求。
1 测频原理及常用方法
测频是电子测量技术中最基本的测量之一,通常采用的直接测频方法有测频法和测周法两种。
测频法就是在确定的闸门时间Tw内,记录被测信号的变化周期数(或脉冲个数)Nx,则被测信号的频率为:fx=Nx/Tw。测周期法需要有标准信号的频率fs,在待测信号的一个周期Tx内,记录标准频率的周期数Ns,则被测信号的频率为:fx=fs/Ns。这两种方法都会产生±1误差(计数脉冲和门控信号不同步而产生)和标准频率误差(所使用的晶振不稳定引起),且±1误差较标准频率误差更大。为了保证测试精度,一般采用低频端测周高频端测频。电网频率在50Hz左右,采用测周法能达到较高的精度。捕获测频原理波形图见图1。精度更高的等精度测频方法有多周期同步测频法和多周期完全同步测频法。但这两种方法实现都比较复杂,可参看参考文献[5].
2 测频的硬件设计
2.1 TMS320F2812芯片简介
TMS320F2812是TI公司2000系列的新型DSP芯片,具有32位低功耗定点处理器,最高主频150MHz,有强大的操作能力和迅速的中断响应处理能力。片内有18K字高速RAM,128K字的可加密Flash ROM。片上还集成了丰富的片内外设,有SPI、SCI、eCAN和McBSP等多个串口外围设备,16通道的12位模数转换器(ADC),两个事件管理器(EVA,EVB),56个独立的可编程、多用途通用I/O口(GPIO)。该DSP芯片集成了大量工业控制领域应用的外设接口,能大大简化电路设计,同时它也具有足够的处理能力,是应用于控制领域的一款高性能DSP处理器。
2.2 事件管理器及其捕获单元
其片内外设事件管理器含有两个模块EVA和EVB,每个模块都包括2个通用目的(GP)定时器、3个全比较/PWM单元、3个捕捉单元和1个正交编码脉冲电路。事件管理器为用户提供了众多的功能和特点,在运动控制和马达控制中特别有用。图2是捕获单元模块图,标出了一些相应的寄存器设置。
[!--empirenews.page--]
这里利用EV模块的定时器,可以节省一个CPU定时器去处理其他工作。捕获单元捕捉被测信号的有效电平跳变沿,由内部的计数器记录一个周波内标频脉冲个数,并通过相应的运算来得到被测频率的大小。频率测量时应在接入DSP前接一比较电路,将被测信号整形为方波信号后输出到DSP捕获引脚。图3为硬件电路模块图。
捕获单元可以记录捕获单元引脚的变化,用户可以指定诊断变化的方式(上升沿、下降沿或两个边沿)。当捕捉输入引脚CAPx(x=1、2、3属于EVA;x=4、5、6属于EVB)检测到变化时,它将捕捉所选择的GP定时器的当前计数值,并把该计数值存储在两级深度的16位FIFO堆栈中。这里每个捕捉单元都有一个专用的2级深度FIFO堆栈,顶层堆栈由CAPFIFOx组成,底层由CAPxFBOT组成。测频分两次捕捉,第一次捕捉到引脚发生的指定变化时,捕获单元将捕捉所选用计数器的计数值并把该值写入FIFO堆栈的上层寄存器(如果堆栈为空)。如果在第一次捕捉的值读取之前发生第二次捕捉,一个新的捕捉值会被送入底层寄存器。捕获单元捕捉到数值后,相应的中断标志位置1,如果没有屏蔽中断,就会产生外围设备中断请求。这里第一次捕捉屏蔽中断,第二次设置为和第一次捕捉相同的跳变沿捕捉,并开中断。响应中断,就可以通过中断服务程序读出一对捕捉的数值。这样的一对捕捉值正好是一个被测频率周期的两次计数。堆栈中的数值个数可以通过16位的FIFO状态寄存器CAPFIFOA(或CAPFIFOB)检测到。读出堆栈中两次存入的新旧捕获值,就能计算出一个周波内的标频脉冲数,进而得出被测周波的频率。
3 测频软件设计
3.1 事件管理器的初始化
初始化事件管理器时,在EVA的定时器1控制寄存器(T1CON)中设为连续增计数模式,64分频(由于被测的电网频率范围在45Hz-55Hz,而TMS320F2812主频为150MHz,计数器最大计数为0xFFFF,即65535.为使精度最高,选64分频,150M/64/50=46875),并使能定时器T1。通过设置捕获单元控制寄存器A(CAPCONA)的相应位来选用EVA模块的CAP1和GP定时器T1,并设为上升沿捕获。这里选用连续增计数模式,写0xFFFF到周期寄存器T1PR以使两次捕获的计数值之差尽可能大。GP定时器T1根据输入时钟进行增计数直到计数器的计数值与周期寄存器(T1PR)的值相等时为止,在产生匹配后的下一个输入时钟上升沿定时器复位为0并重新开始计数。捕获前要清中断标志位,开捕获中断。初始化子程序下所示。
void InitEv(void)
{
EvaRegs.T1PR = 0xFFFF; //周期寄存器设为FFFF
EvaRegs.T1CNT=0;
EvaRegs.T1CON.all=0; //定时器控制寄存器
EvaRegs.T1CON.bit.TMODE=2; //连续增计数模式
EvaRegs.T1CON.bit.TPS=5; //4分频
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器
EvaRegs.CAPCON.all=0; //捕捉控制寄存器
EvaRegs.CAPCON.bit.CAPQEPN=1; //使能捕捉
EvaRegs.CAPCON.bit.CAP1EDGE=1; /检测上升沿
EvaRegs.CAPCON.bit.CAP12TSEL=1; //选定时器1
EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //CAP1FIFO空
EvaRegs.EVAIFRC.bit.CAP1INT=1;//清捕获中断1标志位
EvaRegs.EVAIMRC.bit.CAP1INT=1; //捕获1中断使能
}
3.2 捕获中断子程序[!--empirenews.page--]
进入捕获中断子程序时,保护现场后首先清CAP1中断标志位,从2级深度FIFO中依次读出两次捕获的计数值capnum1和capnum2。如果capnum2大于capnum1,则直接相减,之差即为在被测频率的一个周波内记的定时器T1脉冲数t。若capnum2小于capnum1,则说明在计数过程中有计数溢出,即计数到周期寄存器T1PR内写入的0xFFFF后回零重新计数,因此在求脉冲数t时要在capnum2与capnum1之差上加上0xFFFF。被测的信号频率:f = 时基T1的频率/ t,这里时基T1的频率为时钟主频除以分频系数,即fT1=150M/64,因此所测频率f=150M/64t。下面为捕获中断子程序。
unsigned int capnum1;
unsigned int capnum2;
float f;
float pinlvf[5];
int fnum=0;
interrupt void CAPINT1_ISR(void) // EV-A捕获中断子程序
{
unsigned int temp;
EvaRegs.EVAIFRC.bit.CAP1INT=1;// 清捕获中断1标志位
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.CAP1FIFO;
if(capnum2 > capnum1)
temp = capnum2-capnum1;
else
temp = capnum2+(0xFFFF-capnum1);
pinlvf[fnum++] =temp;
if(fnum>4) fnum=0;//取5个数值后回零
f= 2343750.0/(float)temp;//f= 150M/64/temp
PieCtrl.PIEACK.bit.ACK3 = 1;//开外设中断应答
}
结语
本文给出了基于DSP芯片TMS320F2812的一种测频方法,主要利用了其自带的片内外设事件管理器的捕获功能。方法简单,实时性好,所测频率精度达到10-3,完全能够满足电力系统中经常要用到的测频精度。并已在电网自动化FTU上应用,有较大的实用价值。