luoqiang10605 发表于 2013-12-7 13:30

DSP频率捕获

/******************************************************************/
/*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd.                  */
/*Module Name   :                                                                                    */
/*File Name   : main.c                                                                                     */      
/*Author             : 侯长波                                        */   
/*Create Date   : 2010/4/4                                    */      
/*Version             : 1.0                                           */         
/*Function      : 采用事件管理器驱动步进电机                                      */                     
/*Description   :                                                                               */            
/*Support       : www.LT430.com                                                   */            
/******************************************************************/

/*****************头文件********************/
#include "DSP281x_Device.h"
#include "System.h"
#include "DSP281x_Ev.h"
#include "DSP281x_GlobalPrototypes.h"


interrupt void CAPINT1_ISR(void);

void Init_EVA(void);
void Init_GPIO(void);

void Display(float temp);
// Uint16number ;

Uint16phase2;
Uint16num;




/***************全局变量定义****************/

//interrupt void CAPINT1_ISR(void);

/****************端口宏定义*****************/

#define IN3_DAT GpioDataRegs.GPADAT.bit.GPIOA2//PWM3
#define IN3_DIR GpioMuxRegs.GPADIR.bit.GPIOA2

#define DUAN_DIR GpioMuxRegs.GPFDIR.bit.GPIOF0
#define duan   GpioDataRegs.GPFDAT.bit.GPIOF0

#define WEI_DIR GpioMuxRegs.GPFDIR.bit.GPIOF1
#define wei   GpioDataRegs.GPFDAT.bit.GPIOF1

#define LED_DIR GpioMuxRegs.GPBDIR.all
#define LED_DAT GpioDataRegs.GPBDAT.all


const char LEDData[]=
{
        0x003F,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f
};
const charweixuan[]=
{
0x0004,0x0008,0x0010,0x0020
};
/****************常量宏定义*****************/



void DelayMS(int ms)
{
        unsigned char i;
        while(ms--)
        {
               for(i=0;i<20;i++);
        }
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                              */
/*函数描述:主函数                                      */
/*------------------------------------------*/
void main(void)
{
   InitSysCtrl();// 系统初始化子程序,在DSP28_sysctrl.c中/99          
   DINT;                        // 关总中断
   IER=0x0000;                     //清除所有中断
   IFR=0x0000;                   //清除所有中断标志位
   InitPieCtrl();                  //初始化Pie控制寄存器
   InitPieVectTable();          //初始化PIE中断向量表

        InitSysCtrl();// 系统初始化子程序,在DSP28_sysctrl.c中/99          
        Init_EVA();                                                                                                                  
    Init_GPIO();
       
        EALLOW;
        PieVectTable.CAPINT1=&CAPINT1_ISR;
        EDIS;

        PieCtrlRegs.PIEIER3.all=M_INT5;// enable interrupt 3.5 for capture1
        IER|=M_INT3;//enable cpu interrupt 3.        phase2/100.0

   
        EINT;
        ERTM;//open all interrupt
    //EvaRegs.T2CON.bit.TENABLE=1; //enabletimer1
       while(1)
       {
            Display(EvaRegs.CAP1FBOT/100.0);
                DelayMS(50);
        }

}

void Init_GPIO(void)
{
        EALLOW;
        GpioMuxRegs.GPBMUX.all=0x0000;
        GpioMuxRegs.GPFMUX.all=0x3F00;
//        GpioMuxRegs.GPAMUX.all=0xFF00;
        GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=1;
        GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=1;
        GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=0;
//        CAP1_DIR=1;
//        CAP2_DIR=1;
        IN3_DIR=0;
        DUAN_DIR=1;   //设置为输出
        WEI_DIR=1;
        LED_DIR=0xFFFF;

        EDIS;
    duan=0;               
        wei=0;
        LED_DAT=0x0000;
}
/*------------------------------------------*/
/*形式参数:void                                            */
/*返回值:void                                                          */
/*函数描述:初始化事件管理器A                         */
/*------------------------------------------*/
void Init_EVA(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=0x0000;                        //设置计数初值为0
      EvaRegs.CAPCONA.all=0x0000;                  //初始化捕获控制寄存器
      EvaRegs.CAP1FIFO=0x0000;          //CAP1FIFO为空
                               
      EvaRegs.CAPCONA.bit.CAP12EN=1;   //使能捕获1、2功能
      EvaRegs.CAPCONA.bit.CAP12TSEL=0;   //设置捕获单元1的定时器
      EvaRegs.CAPCONA.bit.CAP1EDGE=1;    //检测上升沿
      //EvaRegs.CAPCONA.bit.CAP2EDGE=1;         
      
      EvaRegs.EVAIFRC.bit.CAP1INT=1;      //清除捕获单元1的捕获中断标志位
      EvaRegs.EVAIMRC.bit.CAP1INT=1;   //使能捕获单元1的捕获中断
                //EvaRegs.EVAIFRC.bit.CAP2INT=1;      //清除捕获单元2的捕获中断标志位
       //EvaRegs.EVAIMRC.bit.CAP2INT=1;   //使能捕获单元2的捕获中断
      EvaRegs.T2CON.bit.TENABLE=1; //enabletimer1
           // EvaRegs.CAPCONA.bit.CAP12EN=1; //enablecap1 cap2

      EvaRegs.CAPFIFOA.all=0x0200;
      
   
}

/*------------------------------------------*/
/*形式参数:void                                            */
/*返回值:void                                                          */
/*函数描述:扫描键值                               */
/********************************************/


   
interrupt void CAPINT1_ISR(void)
   {
            
            EvaRegs.EVAIFRC.bit.CAP1INT=1;   //清除中断标志位
            num=EvaRegs.CAP1FIFO;
                        phase2=EvaRegs.CAP1FBOT;
                  
                  //EvaRegs.CAP1FIFO=0;
                        PieCtrlRegs.PIEACK.bit.ACK3=1; //清中断标志 以接收新的中断。
            EINT; //开全局中断
         // 中断返回
               // Display(phase2/35000.0);
                  

    }                                                  
   
void Display(float d)

                 //数码管任意数显式,
{
    int t;        chari;
               
if (0.0<d&&d<10.0)                                               //        0<d<1.000         {
    {
    t=d*1000;       i=0;                                       //t=d*1000表示小数点移位,把float类型转换成int类型,具体移动多少位有语句if (0<d&&d<10) 判断
    }                                                                       //i的值为小数点显示的位置。
if (10.0<d&&d<100.0)
        {
        t=d*100;       i=1;
        }
if (100.0<d&&d<1000.0)
        {
        t=d*10;             i=2;          
        }
if(1000.0<d&&d<10000.0)
        {
        t=d*1;             i=3;                     
        }       

   // LED_DAT=0x00FF;                                    
        wei=1;
        LED_DAT=~weixuan;                                                  //while(1)中的语句为一般的数码管显示方法 故不作详细注解。
        wei=0;


        duan=1;                                                                 //第一位数码管显示
        LED_DAT   = LEDData;       
        duan=0;
        DelayMS(50);

//        LED_DAT=0x00FF;
        wei=1;
        LED_DAT=~weixuan;       
        wei=0;

        duan=1;
        LED_DAT= LEDData;                                  //第二位数码管显示   
        duan=0;
        DelayMS(50);
       
   //        LED_DAT=0x00FF;
        wei=1;
    LED_DAT=~weixuan;       
        wei=0;

        duan=1;
        LED_DAT= LEDData;                                  //第三位数码管显示   
        duan=0;
        DelayMS(50);

        //LED_DAT=0x00FF;
        wei=1;
    LED_DAT =~weixuan;;       
        wei=0;

        duan=1;
        LED_DAT= LEDData;                                        //第四位数码管显示
        duan=0;
        DelayMS(50);       
       
//        LED_DAT=0x00FF;
        wei=1;
        LED_DAT =~weixuan;       
        wei=0;

        duan=1;
        LED_DAT=0x80;                                               //    小数        点显示
        duan=0;
        DelayMS(50);
   
       

}

哪位高手帮我看下这个程序 显示部分没有问题,就是CAP1中FIFO的数值读取不出来 显示不了

zhangmangui 发表于 2013-12-8 00:15

是读出来的数据不变 还是直接读不出来啊
我也做过周一可以供你参考一下配置部分

luoqiang10605 发表于 2013-12-8 09:12

谢谢 已经调试出来了 捕捉显示的时间跟示波器测得的相差不大 是由于以前计数值没有清零

zhangmangui 发表于 2013-12-8 18:21

luoqiang10605 发表于 2013-12-8 09:12 static/image/common/back.gif
谢谢 已经调试出来了 捕捉显示的时间跟示波器测得的相差不大 是由于以前计数值没有清零...

OK谢谢分享

897345389 发表于 2015-5-29 13:10

谢谢分享
页: [1]
查看完整版本: DSP频率捕获