OpenEdv-开源电子网

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

输入捕获实验测周期出错 是正确周期的两倍

[复制链接]

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-6-3
在线时间
2 小时
发表于 2015-1-13 22:30:06 | 显示全部楼层 |阅读模式
5金钱
 
u16  TIM2CH2_CAPTURE_STA=0;   
u16 TIM2CH2_CAPTURE_VAL;   
u16 TIM2CH2_CAPTURE_VAL2;   
uint8_t FistCap =0;        
uint8_t SecondCap =0;     

void TIM3_IRQHandler(void)
{
// if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 
// {
// TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
// }
// TIM3->SR&=~(1<<0);                       
}





TIM_ICInitTypeDef  TIM2_ICInitStructure;

void TIM2_Cap_Init(u16 arr,u16 psc)
{
  GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  TIM_Cmd(TIM2,DISABLE ); //?????¨?±?÷2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //????TIM2?±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //????GPIOA?±??


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;  //PA1 ?????®?°?è??  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA1 ????  
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA1 ????

TIM_DeInit(TIM2);
TIM_ICStructInit(&TIM2_ICInitStructure);//???±????

//???????¨?±?÷2 TIM2  
TIM_TimeBaseStructure.TIM_Period = arr; 
TIM_TimeBaseStructure.TIM_Prescaler =0;   
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
TIM2_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); 

TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);
  TIM_Cmd(TIM2,ENABLE );
}

void TIM2_IRQHandler(void)


  if((SecondCap==0) && (FreqMeasureFlag == FreqMeasure_ON))                       
{  
   if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
if(!FistCap)                          
{

TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);
TIM2CH2_CAPTURE_STA=0;
SecondCap =0;
FistCap = 1;
}else  
     {
  EXTI1_ENABLE();
    
TIM2CH2_CAPTURE_VAL2=TIM_GetCapture2(TIM2);//????TIM2_CNT
SecondCap = 1; //??????????????????
  EXTI1_DISABLE();
   }
}  
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(FistCap)//??????????????????????
{
if(TIM2CH2_CAPTURE_STA>2198)//??????????2S
{
SCH_Add_Task(FrequencyLow, 1, 0);//±¨?í????·??ú????????
}
else
{
TIM2CH2_CAPTURE_STA++;
}
}  
}         
  }
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //????????±ê????
}


================================================================
uint8_t Overflow = 0;
uint64_t OverflowVal = 0;
uint8_t FreqMeasureFlag = 0;
void HFFrequencyCounter(void)
{
FreqMeasureFlag = FreqMeasure_ON;//????????
FistCap=0;
SecondCap = 0;
TIM2CH2_CAPTURE_STA = 0;
SCH_Add_Task(FreqMeasureHandle, 500, 10);
}
void FreqMeasureHandle(void) 
{
uint64_t temp=0; 
if(FreqMeasureFlag && SecondCap)//????????????????
{
    OverflowVal=TIM2CH2_CAPTURE_STA&0X3FFF;//??????????
if(OverflowVal)
{
OverflowVal<<=16;
temp=OverflowVal-(uint64_t)TIM2CH2_CAPTURE_VAL+(uint64_t)TIM2CH2_CAPTURE_VAL2;//?????±??×???
}
else  //????????
{
temp = (uint64_t)TIM2CH2_CAPTURE_VAL2 - (uint64_t)TIM2CH2_CAPTURE_VAL;
}

if(temp > 576000)
{
temp = ((uint64_t)72*(uint64_t)1000000*(uint64_t)100/(uint64_t)HFPsc/temp)*(uint64_t)4;
DecimalLength = DecimalToChar(temp, CharBuffer,2);
     CharToString(Frequency2,CharBuffer,DecimalLength);
}
else
{
temp = ((uint64_t)(72*1000000)/(uint64_t)HFPsc/temp)*(uint64_t)4;
DecimalLength = DecimalToCharKHz(temp, CharBuffer);
     CharToString(Frequency2,CharBuffer,DecimalLength);
}
temp = 0;
FreqMeasureFlag = FreqMeasure_OFF;
}
}

void FrequencyLow(void)
{
TIM2CH2_CAPTURE_STA = 0;
FreqMeasureFlag = FreqMeasure_OFF;//??±?????
FistCap=0;
SecondCap = 0;

}

这个代码是从原子哥的输入捕获实验改来的,测方波的周期并打印出来。问题:连续测100次,并将这100次的结果打印出来,有个别数值出错,为正确的周期的两倍,请问这是怎么回事。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-14 00:10:40 | 显示全部楼层
这个你得结合实际情况去分析了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 00:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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