这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» 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 跳转至

回复

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