OpenEdv-开源电子网

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

外部脉冲计数不准

[复制链接]

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-11-12
在线时间
0 小时
发表于 2013-12-16 09:45:17 | 显示全部楼层 |阅读模式
如题,我用信号发生器提供的脉冲,脉冲周期为50us,而捕获的时间如图。希望大神们帮忙解决!附程序。



#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"

extern u8   TIM2CH1_CAPTURE_STA;    //输入捕获状态           
extern u16  TIM2CH1_CAPTURE_VAL;    //输入捕获值
int main(void)
{
float temp=0;

delay_init(72);            //延时函数初始化 
NVIC_Configuration();      //设置 NVIC 中断分组 2
uart_init(9600);      //串口初始化波特率为 9600

TIM2_Cap_Init(2000,72);  //以 1Mhz 的频率计数
while(1)
{
delay_ms(10);
   
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=0XFFFF;                  //溢出时间总和
temp=TIM2CH1_CAPTURE_VAL;    //得到总的高电平时间
printf("HIGH:%f us\r\n",temp);  //打印总的高点平时间

TIM2CH1_CAPTURE_STA=0;    //开启下一次捕获
}
}
}



#include "timer.h"

//定时器 2 通道 1 输入捕获配置
TIM_ICInitTypeDef   TIM2_ICInitStructure;
void TIM2_Cap_Init(u16 arr,u16 psc)
{   
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  //①使能 TIM2 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //①使能 GPIOA 时钟
//初始化 GPIOA.0  ①
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;         //PA0 设置 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //PA0  输入 
GPIO_Init(GPIOA, &GPIO_InitStructure);    //初始化 GPIOA.0
//GPIO_ResetBits(GPIOA,GPIO_Pin_0);             //PA0  下拉

//②初始化 TIM2 参数     
TIM_TimeBaseStructure.TIM_Period = arr;            //设定计数器自动重装值 
TIM_TimeBaseStructure.TIM_Prescaler =psc;      //预分频器  
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM 向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);      //初始化 TIMx
//③初始化 TIM2 输入捕获通道 1
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1;    //选择输入端  IC1 映射到 TI1 上
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //上升沿捕获
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;      //配置输入分频,不分频 
TIM2_ICInitStructure.TIM_ICFilter = 0x00;         //IC1F=0000  配置输入滤波器  不滤波
TIM_ICInit(TIM2, &TIM2_ICInitStructure);  //初始化 TIM2 输入捕获通道 1
//⑤初始化 NVIC 中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;           //TIM2 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //先占优先级 2 级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //从优先级 0 级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure);                          //初始化 NVIC
TIM_ITConfig( TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断
TIM_Cmd(TIM2,ENABLE );                             //⑥使能定时器 2
}
u8   TIM2CH1_CAPTURE_STA=0;  //输入捕获状态             
u16  TIM2CH1_CAPTURE_VAL;  //输入捕获值
//⑤定时器 5 中断服务程序   
void TIM2_IRQHandler(void)
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{  
if(TIM2CH1_CAPTURE_STA&0X40)             //已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;      //标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}
else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)            //捕获 1 发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40)                    //捕获到一个下降沿
{   
TIM2CH1_CAPTURE_STA|=0X80;      //标记成功捕获到一次上升沿
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获
}else                           //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0;        //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40;      //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //设置为下降沿捕获
}   
}                       
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-16 10:26:32 | 显示全部楼层
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=0XFFFF;                  //溢出时间总和
temp=TIM2CH1_CAPTURE_VAL;    //得到总的高电平时间

这里有问题,上面溢出计数的时间怎么没用到?
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2013-12-16 14:33:54 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
哦,但是把这个改掉还是不对呢!另外我想计上升沿的个数,直接if下面T++可以么?怎么计出来不对呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 10:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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