这是最近写的关于电网捕获测频的一段程序,分享一下,互相学习!
/****************************************************
** 捕获单元测频 **
** **
****************************************************/
#include"DSP28_Device.h"
#include"DSP28_GlobalPrototypes.h"
unsigned int temp;
float f;
unsigned int capnum1;
unsigned int capnum2;
interrupt void CAPINT_ISR(void);
void IintEv(void);
void main(void)
{
InitSysCtrl(); //初始化函数
DINT; // 关总中断
IER=0x0000; //清除所有中断
IFR=0x0000; //清除所有中断标志位
InitPieCtrl(); //初始化Pie控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitGpio();
InitEv();
EALLOW;
PieVectTable.CAPINT1=&CAPINT_ISR; //将捕获单元的中断服务程序入口地址填写到PIE向量表中
EDIS;
PieCtrl.PIEIER3.bit.INTx5=1; //使能PIE中断,T1定时器中断CAPPINT1位于INT3.5
IER|=M_INT3; //开CPU中断INT3,中断使能寄存器的的第二位
EINT; //开总中断
ERTM; //开实时中断
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1的计数操作
EvaRegs.T2CON.bit.TENABLE=1; //使能定时器T2的计数操作
for(;;)
{ }
}
interrupt void CAPINT_ISR(void) //捕获单元1中断
{
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除中断标志位
capnum1=EvaRegs.CAP1FIFO;
capnum2=EvaRegs.CAP1FIFO;
if(capnum2>capnum1)
temp=capnum2-capnum1;
else
temp=capnum2+(0xFFFF-capnum1);//做定时器上溢处理
f=2343750.0/(float)temp;
PieCtrl.PIEACK.all=PIEACK_GROUP3;//响应同组其他中断
EINT; //开全局中断
// 中断返回
}
void InitEv(void)
{
EvaRegs.T2CON.bit.TMODE=2; //连续增计数模式
EvaRegs.T2CON.bit.TPS=5; //进行64分频
EvaRegs.T2CON.bit.TENABLE=0; //暂时禁止T2的计数操作
EvaRegs.T2CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.T2PR=0xFFFF; //给T2定时器设终值
EvaRegs.T2CNT=0; //设置计数初值为0
EvaRegs.CAPCON.all=0; //初始化捕获控制寄存器
EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //CAP1FIFO为空
EvaRegs.CAPCON.bit.CAPQEPN=1; //使能捕获功能
EvaRegs.CAPCON.bit.CAP12TSEL=0; //设置捕获单元1的定时器
EvaRegs.CAPCON.bit.CAP1EDGE=1; //检测上升沿
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除捕获单元1的捕获中断标志位
EvaRegs.EVAIMRC.bit.CAP1INT=1; //使能捕获单元1的捕获中断
}
void InitGpio(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=1; //设置捕获引脚CAP1_QEP1
EDIS;
}
|