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中断
}