进入捕获中断子程序时,保护现场后首先清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上应用,有较大的实用价值。