打印

F207的捕获功能应用中,信号沿的问题。

[复制链接]
1922|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
水工鸟|  楼主 | 2013-2-21 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用TIM3的3通道来做脉冲信号的频率采集,使用下降沿来捕获时间,但是在测试中有时会出现2倍的频率值,即使我用下降沿来捕获也一样会出现这个问题。难道TIM3偶尔进入到PWM捕获模式了?但是CC3不是没有这个功能么?我的初始化程序如下:
void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  /* GPIOB clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  
  /* TIM3 channel 3 pin (PB.0) configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Connect TIM pins to AF2 */
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
  
  TIM_DeInit( TIM3);//

  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  
//  TIM_InternalClockConfig(TIM3);

  /* TIM3 configuration *****************************************
  **************************************************************/
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_Prescaler = 99;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
  /* TIM3 configuration: Input Capture mode ---------------------
     The external signal is connected to TIM3 CH3 pin (PB.0)  
     The Rising edge is used as active edge,
     The TIM3 CCR3 is used to compute the frequency value
  ------------------------------------------------------------ */
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//or TIM_ICPolarity_Rising
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);

  /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);
}
沙发
水工鸟|  楼主 | 2013-2-21 17:49 | 只看该作者
void TIM3_IRQHandler(void)
{
  uint16_t temp;
  
  if(TIM_GetITStatus(TIM3, TIM_IT_CC3) == SET)
  {
    /* Clear TIM3 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
   
    IC3ReadValue[CaptureNumber] = TIM_GetCapture3(TIM3);
    CaptureNumber = (~CaptureNumber)&0x0001;
    CC_flag = 1;
  }
}

使用特权

评论回复
板凳
uet_cache| | 2013-2-21 19:47 | 只看该作者
你可以把预分频值调大点。至少得保证能测到你的频率值,不能漏掉。

使用特权

评论回复
地板
水工鸟|  楼主 | 2013-2-22 17:43 | 只看该作者
多谢回答,程序本身没有问题。是运放悲催的震荡了,原因不明……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:70后老电工

18

主题

230

帖子

1

粉丝