这是最近两天写的一段电网捕获测频的程序段,给大家分享一下,互相学习!
/***************************************************
** 捕获单元的捕获测频技术 **
** **
****************************************************/
#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 Gpio(void);
void main(void)
{
InitSysCtrl(); // 初始化函数
DINT; // 关总中断
IER=0x0000; // 清除所有中断
IFR=0x0000; // 清除所有中断标志位
InitPieCtrl(); // 初始化Pie控制寄存器
InitPieVectTable(); // 初始化PIE中断向量表
InitGpio(); // 初始化GPIO口
InitEv(); // 初始化EV
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; // 频率计算(150MHZ/64)/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_QEP
EDIS;
}
|