这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » LPC2104 有没有用过LPC2104的捕获啊!我怎么捕获的数值跳变很大啊

共2条 1/1 1 跳转至

LPC2104 有没有用过LPC2104的捕获啊!我怎么捕获的数值跳变很大啊

院士
2006-09-17 18:14:16     打赏
LPC2104 有没有用过LPC2104的捕获啊!我怎么捕获的数值跳变很大啊



关键词: LPC2104     有没有     用过     捕获     怎么     数值         

院士
2006-12-22 22:43:00     打赏
2楼
问 这是初始化
/****************************************************************************
【功能说明】Time捕获初始化
****************************************************************************/
void Time0_cap(void)
{
    T0PR    =2;
    T0CCR    =0;
    T0EMR    =0; //无匹配输出
    T0MCR    =3;    //匹配中断,复位,HOLD
    T0IR    =0xff;
    T0TCR    =1;
    T0MR0    =3125;    //匹配625uS
    
    T1PR    =2; //    (Fpclk/4)3分频        15M/3  5M/0.2us
    T1CCR    =6; //    上升!沿捕获,事件中断
    T1EMR    =0;    //  无匹配输出
    T1MCR    =1; //  匹配中断
    T1IR    =0xff;
    T1TCR    =1; //  E T0
    T1MR0    =0xffffffff;    //溢出中断
    
}
这是中断程序,匹配一次都没发生过
/***************************************************
**      周期计数
***************************************************/
void __irq IRQ_T1cap(void)     // T1捕获中断到向量中断1(5)
{
uint32    i;//,bakVIC;

    //bakVIC         = VICIntEnable;        // 备份当前VICIntEnable的值
    //VICIntEnClr = (1<<4);    // 禁止当前优先级中断及低优先级中断

    i            =T1IR;
       T1IR        =0xff;
    
       if((i&0x1)==1)
       {
           WattInp++;
           T1MR0    +=freq_sample;
           //U0THR    ='M';
       }
       if((i&0x10)==0x10)                                                
       {
           freqcount        &=0x7;
           freqtime[freqcount]    =T1CR0;//50Hz/200k
           freqcount++;
           if((freqcount%2)==1)
           IOCLR        =(1<<9);//test
           else    IOSET        =(1<<9);//test
    }
    //VICIntEnable = bakVIC;
       VICVectAddr = 0x00;    
}
一开始我输入的是50HZ,测p0.9是25HZ很准,但数值跳变大!
然后我用T0中断信号直接给t1.0捕获,数值还是跳变 1: 我的程序/********************************************************************************
  文件: timer.c
  说明:将跟timer相关的脉冲输入驱动函数写在本文件中
  原理:定时器有2个32位定时器,分别具有4路捕获输入÷4路比较匹配输出。定时器是增量计数的,但
       上溢时不会产生中断标志,而只能通过比较匹配或者捕获输入产生中断标志。
       脉冲输入的频率测量方法:测量一定脉冲所用的时间。
       常用数字频率测量方法有M法、T法和M/T法。M法是在给定的闸门时间内测量被测信号的脉冲个数,
       进行换算得出被测信号的频率。这种测量方法的测量精度取决于闸门时间和被测信号频率。
       当被测信号频率较低时将产生较大误差,除非闸门时间取得很大。所以这种方法比较适合测量
       高频信号的频率。T法是通过测量被测信号的周期然后换算出被测信号的频率。这种测量方法的
       测量精度取决于被测信号的周期和计时精度,当被测信号频率较高时,对计时精度的要求就很高。
       这种方法比较适合测量频率较低的信号。M/T法具有以上两种方法的优点,它通过测量被测信号
       数个周期的时间然后换算得出被测信号的频率,可兼顾低频与高频信号,提高了测量精度。
  编写者: robinsun
  版本控制:
    ----------------------------------------------------------------------------
    版本号        日期                修改内容                        修改者
    ----------------------------------------------------------------------------
    1.0        2004.12.30            初稿                        robinsun
    ----------------------------------------------------------------------------
********************************************************************************/
//定义是否打印调试语句,定义了就打印
//#define _PRINT_DEBUG 1
#define _TIMER_C

#include "config.h"
#include "include\timer.h"
#include "include\serial.h"

/******************************************
* 名称    :  void Timer_Init(void)
* 功能描述:  脉冲输入部分的初始化,一开始设置为输入捕获,同步测量脉冲
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void Timer0_Init(void)
{
    T0PR=99;                //设定定时器0的分频为100分频,的10592HZ
                            //采用11.0592M晶振,采用PLL部件,Fcclk=Fosc×4,外围时钟采用复位默认的Fpclk/4
                            //计数时钟频率=Fpclk/(N+1)
    T0MCR=0x03;             //匹配通道0匹配中断并复位T0TC
    T0MR0=11.0592;         
    T0TCR=0x03;
    T0TCR=0x01;             //启动复位
}


/******************************************
* 名称    :  void Timer_Init(void)
* 功能描述:  定时器0中断服务程序
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:  最后将脉冲的数据输出到全局变量
--------------—*/
void __irq  IRQ_Timer1(void)
{   
    uint32 TempCapTime;                                                                                   
   PluseNum++;

   if( (IO0SET&LEDCON) == 0 ) IO0SET = LEDCON;     //进行LED4的取反控制 控制LED4点亮
      else  IO0CLR = LEDCON;                            // 控制LED4熄灭          
/*
   Prints("push ");
   Puthexbyte(PluseNum>>8);
   Puthexbyte(PluseNum);
   Prints("\r\n");*/
   if(PluseNum==PULSE_TEST_NUM)                  //如果脉冲的的个数到了规定的5个
   {
         TempCapTime=T1CR3;                         //暂存输入捕获时钟
         TempCapTime=TempCapTime-CapTime;           //计算出5个脉冲的间隔时间
         Puthexbyte(TempCapTime>>8);
      Puthexbyte(TempCapTime);
         PluseFreq=5*110592/TempCapTime;
         Prints("\r\n");
         Puthexbyte(PluseFreq);
         Prints("\r\n");
      T1CCR |= (1<<9);                           //cap1.3上上升沿跳变将TC内容装入CR3
      T1CCR &= (0xFFFF-(1<<10));
      PluseNum=0;
      T1TC=0;
      DISABLE_TIMER_INT;
   }
   else
   {      
         CapTime=T1CR3;                             //将输入捕获寄存器的数据读出来
        /* Puthexbyte(CapTime>>24);
      Puthexbyte(CapTime>>16);
         Puthexbyte(CapTime>>8);
      Puthexbyte(CapTime);
      Prints("\r\n");*/
      T1CCR &= (0xFFFF-(1<<9));            
      T1CCR |= (1<<10);                         //cap1.3上下降沿跳变将TC内容装入CR3
      if (PluseNum>9) PluseNum=PULSE_TEST_NUM;  //防止意外        
   }
   
   T1IR = 0x80;                                          // 清除中断标志
   VICVectAddr = 0x00;                                  // 通知VIC中断处理结束
}


/******************************************
* 名称    :  void Timer1_Init(void)
* 功能描述:  初始化定时器0,设置为输入捕获,并打开中断。
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void  Timer1_Init(void)
{  /* 初始化定时器1,实现0.5S定时;定时器1实现0.1秒定时。
      Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
      Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
   */
   T1PR = 99;                                      // 设置定时器1分频为100分频,得110592Hz
   T1CCR |= (1<<9);                 //cap1.3上上升沿跳变将TC内容装入CR3
   //T1CCR |= (1<<10);              //cap1.3上下降沿跳变将TC内容装入CR3
   T1CCR |= (1<<11);                //cap1.3上捕获装载产生中断
   //T0MCR = 0x03<<3;                               // 匹配通道1匹配中断并复位T0TC
   //T0MR1 = 110592/2;                      // 设置MR1比较值(0.5S定时值)
   //T0MR0 = 110592/2;                           // 设置MR0比较值(0.5S定时值)
   //T0EMR = 0x30;                              // 设置定时器0的T0MR0匹配输出,输出方式为翻转
   T1TC=0;
   T1IR|=0x80;                      //清除中断标志
   T1TCR = 0x03;                                   // 启动并复位T0TC
   T1TCR = 0x01;
   
                                      // 设置定时器0中断IRQ
   VICIntSelect = 0x00000000;                  // 所有中断通道设置为IRQ中断
   VICVectCntl0 = 0x20|5;                          // 定时器0中断通道分配中断号为0(向量控制器1)
   VICVectAddr0 = (uint32)IRQ_Timer1; // 设置中断服务程序地址向量
   //VICIntEnable = (1<<5);                    // 使能定时器1中断
   ENABLE_TIMER_INT;                  // 使能定时器1中断
   
   PINSEL1|=(1<<10);                  //CAP1.3管脚连接模块,相应的位要变成11
     PINSEL1|=(1<<11);                  //   
     PINSEL1|=(1<<6);                   //CAP1.3管脚连接模块,相应的位要变成11
     PINSEL1|=(1<<7);                   //cap1.2也必须设置为11   
   T1IR|=0x80;                        //清除中断标志
   PluseNum=0;                        //清除为零
   PluseFreq=0;
   //IO0DIR |= LEDCON;
}
    2: 谢谢!谢谢!我现在发现了,原来定时器时间问题
    T1PR    =2; //    (Fpclk/4)3分频        15M/3  5M/0.2us
    T1CCR    =6; //    上升!沿捕获,事件中断
    T1EMR    =0;    //  无匹配输出
    T1MCR    =1; //  匹配中断
    T1IR    =0xff;
    T1TCR    =1; //  E T0
    T1MR0    =0xffffffff;    //溢出中断
我设的应该是多长时间计数器加一啊!好像不对哦
Fcclk/60M  Fpclk/15M 

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]