共2条
1/1 1 跳转至页
LPC2104 有没有用过LPC2104的捕获啊!我怎么捕获的数值跳变很大啊
问
这是初始化
/****************************************************************************
【功能说明】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
/****************************************************************************
【功能说明】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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |