打印

捕获测频技术

[复制链接]
1131|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang112411|  楼主 | 2013-8-9 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ev, pi, TE, ni, gp
这是最近两天写的一段电网捕获测频的程序段,给大家分享一下,互相学习!
/***************************************************
**           捕获单元的捕获测频技术                          **
**                                                                                   **
****************************************************/
#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;
}               
       

相关帖子

沙发
zhangmangui| | 2013-8-10 13:40 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

77

帖子

0

粉丝