微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LPC2292定时器捕获外部的频率

LPC2292定时器捕获外部的频率

时间:10-02 整理:3721RD 点击:
我的处理器是LPC2292的。需要用定时器捕获一个外部的频率,
利用本身LPC2292的定时时间内获得的上升沿个数,通过计算得到外部的频率
可是我还是新手,写了很多次的不是很成功,特意发帖希望各位有时间看看
代码贴上来。
/*********************************************************************************************************
** Function name:        timer0Init
** Descriptions:        定时器0初始化程序
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void timer0Init (void)
{
     PINSEL0|= 0xc00;                 //将P0.20管脚选择为 CAP1.3 功能
     T0TCR  = 0x02;                     //复位计数定时
     T0IR   =0x10;                     //清除中断
     //T0CTCR = 0;                     //定时模式
     T0TC   = 0;                     //计数清零
     T0PR   = 0;                     //预分频
     T0MR0  = Fpclk/2;               // 匹配寄存器 0.5秒定时
     T0MCR=0x03;                     //设置T0MR0匹配后产生中断并且复位T0TC
     T0CCR = 0x05;                     //上升沿捕获,捕获事件中断
     timer0Isr();                    // 设置中断并使能
     T0TCR  = 0x01;                                                      // 还没启动定时器
}
/*********************************************************************************************************
* Function Name:        timer0Isr
* Description:         
* Input:                这个函数就是用来计算这个频率的函数
* Output:               无
* Return:               无
*********************************************************************************************************/
void timer0Isr (void)
{
   
     char j,i;
     unsigned char HZ_FLG2=0;
     INT32U temp;
     FP32 F2;
     INT32U cap_cou[10],cap_i;
   
    if(HZ_FLG2==0)
      {   
        if(cap_i<10)
        cap_cou[cap_i]=T0CR0;   //计数得到的上升沿个数
        cap_i++;
        if(cap_i>=10)
        {
          for(j=0;j<10;j++)
           { for (i=0;i<10-j;i++)
             if(cap_cou>cap_cou[i+1])
                { temp=cap_cou;
                  cap_cou=cap_cou[i+1];
                  cap_cou[i+1]=temp;
                }
           }
         cap_cou[0]=(cap_cou[3]+cap_cou[4]+cap_cou[5]+cap_cou[6])/4    ;
         F2=24000000/(FP32)(cap_cou[0]);
         cap_i=0;
          HZ_FLG2=255;
        }
      }
    T0TC  = 0;
    T0IR  = 1<<4;
}

希望帮忙看下,或是有做个这个方面的同仁帮忙。邮箱:liwenkede@126.com
不甚感激!

INT32U tempwjj,wujiajin,cap;
fp32 WBJZ;
/****************************************************************************
* 名    称:IRQ_Time0()
* 功    能:定时器0中断服务程序,取反BEEPCON控制口。
* 入口参数:无
* 出口参数:无  11/12/2013 liwenke
******************************************************* *********************/
/* void DoubleInterlockTimer(BYTE byClkTick500ms);        //单位 500ms
void DoubleMeasureTimer(BYTE byClkTickms);
*/
void   IRQ_Time0(void)        __irq
{  
        wujiajin = T0TC;
        cap=T0CR0;
        WBJZ=((cap/12)/32);
        T0IR = 255;
        T0TC  = 0;
    VICVectAddr=0X00;     // 通知VIC中断处理结束
}
/****************************************************************************
* 名    称:Time0Init()
* 功    能:初始化定时器0,定时时间为2mS,并使能中断。
* 入口参数:无
* 出口参数:无  11/12/2013 liwenke
****************************************************************************/
void  Time0Init(void)
{   
     PINSEL1 |= (2<<12);                                //捕获方式  P0.22 CAP0.0 PINSEL1 定时器0
         PCONP   |= 3<<1;
         T0IR   = 1<<4;                              //复位计数定时
         T0TC   = 0;                                                  //计数清零
     T0PR   = 0;                                                  //预分频
     T0MR0  = 0XFFFFFFFE;                 // 匹配寄存器
         T0MCR  = 1;                    // 匹配后不中断、复位、停止
         T0CCR  = 0X05;                                          //上升沿捕获,捕获事件中断
         T0TCR  = 0x03;
     T0TCR  =0x01;
         VICVectCntl4 = 0x24;                                        // 定时器0中断通道分配最高优先级(向量控制器0)
         VICVectAddr4 = (uint32)IRQ_Time0;                 // 设置中断服务程序地址向量
         VICIntEnable |= 0x00000010;                                // 使能定时器0中断       
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top