打印

DSP频率捕获

[复制链接]
2876|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luoqiang10605|  楼主 | 2013-12-7 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP, gp, IO, pi, GPIO
/******************************************************************/
/*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);
// Uint16  number ;

Uint16  phase2;
Uint16  num;




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

//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 char  weixuan[]=
{
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; //enable  timer1
         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; //enable  timer1
           // EvaRegs.CAPCONA.bit.CAP12EN=1; //enable  cap1 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;        char  i;
               
  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[0];                                                  //while(1)中的语句为一般的数码管显示方法 故不作详细注解。
        wei=0;


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

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

        duan=1;
        LED_DAT  = LEDData[t%1000/100];                                    //第二位数码管显示   
        duan=0;
        DelayMS(50);
       
   //        LED_DAT=0x00FF;
        wei=1;
    LED_DAT  =~weixuan[2];       
        wei=0;

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

        //LED_DAT=0x00FF;
        wei=1;
    LED_DAT =~weixuan[3];;       
        wei=0;

        duan=1;
        LED_DAT  = LEDData[t%10];                                        //第四位数码管显示
        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
谢谢 已经调试出来了 捕捉显示的时间跟示波器测得的相差不大 是由于以前计数值没有清零  ...

OK  谢谢分享

使用特权

评论回复
5
897345389| | 2015-5-29 13:10 | 只看该作者
谢谢分享

使用特权

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

本版积分规则

9

主题

448

帖子

3

粉丝