OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5570|回复: 7

输入捕获计数值与实际不符。大家来看看。

[复制链接]

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
发表于 2013-7-26 09:01:33 | 显示全部楼层 |阅读模式
//情况是这样的,我用T2做输入捕获,输入的脉冲有两种产生方式
//1.定时器T3.产生一个50HZ的脉冲信号
//2.延时函数(其实也是个定时器,原子里的), 产生一个50HZ的脉冲信号 
//T2.时钟72MHz,7200分频,也就是10KHz频率,也就是0.1Ms,计数一次,50Hz为20ms,T2的捕获值应该为200.
//两个脉冲用示波器看过都是50Hz无疑,实际捕获结果T3,捕获值200,延时捕获值314--315.
//大家帮我看看吧!程序运行都是正常的。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
// u16 i=0;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600);  //串口初始化
delay_init(72);     //延时初始化 
LED_Init();   //初始化与LED连接的硬件接口 
Timer2_Init(4999,7199);//外部计数2模式,上升沿 ETRF ,计数99+1个脉冲中断
Timer3_Init(99,7199);//外部计数2模式,上升沿 ETRF ,计数99+1个脉冲中断 
 
/* for(i=0;i<800;i++)
{
LED0=0;
delay_ms(10);
LED0=1;
delay_ms(10);
} */
while(1); 
}
//////////////////////定时器///////////////////////////////////////////////////////////////////////
void TIM2_IRQHandler(void)
{
u16 k=0;      
if(TIM2->SR&0X0002)//溢出中断
{
k=TIM2->CCR1; 
printf("CCR1=%d\r\n",k);                
}

if(TIM2->SR&0X0001)//溢出中断
{
LED1=!LED1;              
}
  
TIM2->SR&=~(1<<1);//清除中断标志位    
TIM2->SR&=~(1<<0);//清除中断标志位    
}

void TIM3_IRQHandler(void)
if(TIM3->SR&0X0001)//溢出中断
{
LED0=!LED0;              
}  
TIM3->SR&=~(1<<0);//清除中断标志位    
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器2!
void Timer3_Init(u16 arr,u16 psc)
{ //1.时钟使能
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM3->SC=psc;  //预分频器7200,得到10Khz的计数时钟
TIM3->DIER|=1<<0;   //允许更新中断
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
TIM3->CR1|=1<<0;//启动定时器  

void Timer2_Init(u16 arr,u16 psc)
{ //1.时钟使能
RCC->APB1ENR|=1<<0;//TIM2时钟使能
RCC->APB2ENR|=1<<2;//PA时钟使能
GPIOA->CRL|=0x00000008;//PA0输入
GPIOA->CRL|=1<<0;//下拉输入

TIM2->CCMR1|=1<<0;//CC1连接到TI1
TIM2->CCMR1|=0<<4;//不滤波
TIM2->CCMR1|=0<<2;//不分频
TIM2->CCER|=1<<0; //允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=1<<1;   //允许捕获中断
////////////////////////////////////////////////////////
//这两个东东要同时设置才可以使用中断
TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟
TIM2->DIER|=1<<0;   //允许更新中断
MY_NVIC_Init(2,3,TIM2_IRQChannel,2);//抢占2,子优先级3,组2
TIM2->CR1|=1<<0;//启动定时器  
}






一知半解!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 10:52:10 | 显示全部楼层
回复【楼主位】liawei123:
---------------------------------
你这输入捕获的原理没看懂啊...
这么简单就实现了?我看你就开启了一个输入捕获中断,一个溢出中断,捕获上升沿?上升沿来到的时候,TIM2->CNT不等于0怎么算?
等于0的时候,捕获到上升沿,CCR1也是0.那何时判断捕获结束?

表示看不太懂....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-7-26 14:38:06 | 显示全部楼层
原子哥可能理解错了,脉冲是由T3产生的,T2溢出中断只是限制计数5000个脉冲,(可以看做0.5s的定时),前期以为时钟。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
T2,中断是这样的。一个捕获,一个溢出,两个都不影响的。
开始定时器自动计数,溢出会重载。在这个过程中,有T3产生的脉冲,上升沿被捕获,
假设T2_CNT=100;T2_CNT的值装载到了T2_CCR1里面,K=100;
在下一个上升沿来的时候又会被捕获,假设T2_CNT=300;T2_CNT的值装载到了T2_CCR1里面,K=300;
K的值一直被打印在串口上,通过相减得出脉冲周期200个计数值,0.1ms计数一个,200也就是50Hz,
在捕获是T2_CNT怎么会被清0,两个不会有影响的,(判断了中断标志的),只是计数5000个脉冲,才会溢出。
50Hz,安程序计算,就是计数200个脉冲
///////////////////////////////////////////////////////////////////
程序应为测试所以简单了些,下面是串口数据,
T3定时器的。相减位200


下面是延时的 相减位314-315. 





一知半解!
回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-7-26 14:41:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
//////////////////程序方面不会有太大问题,只是现象不太理解!,原子哥帮我分析分析///////////////////////////////////////
//情况是这样的,我用T2做输入捕获,输入的脉冲有两种产生方式
//1.定时器T3.产生一个50HZ的脉冲信号
//2.延时函数(其实也是个定时器,原子里的), 产生一个50HZ的脉冲信号 
//T2.时钟72MHz,7200分频,也就是10KHz频率,也就是0.1Ms,计数一次,50Hz为20ms,T2的捕获值应该为200.
//两个脉冲用示波器看过都是50Hz无疑,实际捕获结果T3,捕获值200,延时捕获值314--315.
//大家帮我看看吧!程序运行都是正常的。
一知半解!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 16:25:26 | 显示全部楼层
明白 了
你接T3连接T2的时候,用示波器看看他们的波形,还准确么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-7-29 15:54:04 | 显示全部楼层
定时器,和延时的波形我用示波器看过都是50Hz,相差也就0.0几个Hz。
一知半解!
回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-7-30 14:43:42 | 显示全部楼层
回复【6楼】liawei123:
---------------------------------
后来我发现,其实计数值是一样的,罪魁祸首是printf()这个函数,
也不是是什么原因printf()好像与某个有冲突(怀疑和delay函数可能有共用),
导致计数值混乱。建议和我一样的新手们慎用printf();
一知半解!
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-1-25
在线时间
16 小时
发表于 2019-3-15 22:33:19 | 显示全部楼层
不是慎用,你要把printf打印到数组,然后主任务里面把数组再打到串口
诚交各路大侠
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 04:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表