打印

TIMx输入捕捉问题不得要领,请帮忙(已解决)

[复制链接]
4144|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lixun00|  楼主 | 2008-8-28 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
mx, TI, ST, TE, IO
按照手册上13.3.5上讲的
The following example shows how to capture the counter value in TIMx_CCR1 when TI1
input rises. To do this, use the following procedure:
● Select the active input: TIMx_CCR1 must be linked to the TI1 input, so write the CC1S
bits to 01 in the TIMx_CCMR1 register. As soon as CC1S becomes different from 00,
the channel is configured in input and the TIMx_CCR1 register becomes read-only.
● Program the input filter duration you need with respect to the signal you connect to the
timer (when the input is one of the TIx (ICxF bits in the TIMx_CCMRx register). Let’s
imagine that, when toggling, the input signal is not stable during at must 5 internal clock
cycles. We must program a filter duration longer than these 5 clock cycles. We can
validate a transition on TI1 when 8 consecutive samples with the new level have been
detected (sampled at fDTS frequency). Then write IC1F bits to 0011 in the
TIMx_CCMR1 register.
● Select the edge of the active transition on the TI1 channel by writing CC1P bit to 0 in
the TIMx_CCER register (rising edge in this case).
● Program the input prescaler. In our example, we wish the capture to be performed at
each valid transition, so the prescaler is disabled (write IC1PS bits to 00 in the
TIMx_CCMR1 register).
● Enable capture from the counter into the capture register by setting the CC1E bit in the
TIMx_CCER register.
● If needed, enable the related interrupt request by setting the CC1IE bit in the
TIMx_DIER register, and/or the DMA request by setting the CC1DE bit in the
TIMx_DIER register.

得到如下初始化代码(TIM3_Ch4)捕捉

  TIM_ICInitTypeDef  TIM_ICInitStructure;
  
  GPIO_InitTypeDef GPIO_InitStructure;
  
  #ifdef DEBUG
    debug();
  #endif
  /* GPIOB Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |    RCC_APB2Periph_AFIO,   ENABLE);
  
  /* GPIOB Configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);


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

  /* TIM3 configuration:  Input mode ------------------------
     The external signal is connected to TIM3 CH4 pin (PB.01), 
     The Rising edge is used as active edge,
  ------------------------------------------------------------ */
            
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;           
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;         
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;       
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  
  TIM_ICInit(TIM3, &TIM_ICInitStructure);

  
  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE); 

  /* Enable the CC4 Interrupt Request */
  TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); 

中断
void TIM3_IRQHandler(void) 
{
  /* Clear TIM3 Capture compare interrupt pending bit */
  CPU_INT16U IC3_Value;
  CPU_SR      cpu_sr;
  
  OS_ENTER_CRITICAL();                                        /* Tell uC/OS-II that we are starting an ISR                */
  OSIntNesting++;
  OS_EXIT_CRITICAL();
  
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC4); 
  
  /* Get the Input Capture value */
  IC3_Value = TIM_GetCapture2(TIM3);
  
  if(IC3_Value != 0)
  {
    IC3_Value = IC3_Value;
  }
  else
  {
    
  }
  OSIntExit(); 
}

始终进不了
沙发
lixun00|  楼主 | 2008-8-29 00:12 | 只看该作者

输入捕获值会变化,就是进不了中断

使用特权

评论回复
板凳
lixun00|  楼主 | 2008-8-29 04:08 | 只看该作者

半夜三更终于调通了,原来忘了NVIC配置

使用特权

评论回复
地板
lixun00|  楼主 | 2008-8-29 05:31 | 只看该作者

新问题又来了,测一固定的方波,其捕捉值(下降沿)始终是变化

使用特权

评论回复
5
lixun00|  楼主 | 2008-8-29 06:45 | 只看该作者

CCR4难道是累加的??

CCR4 is the counter value transferred by the last input capture 4 event (IC4).
输入一个25us的低电平,测得的值保存在0x3d70左右,外围设备时钟分频为1/2
,怎么也算不出来25us

这个0x3d70是把当前的CCR4值减去上次的CCR4得到的.

看了一晚,手册讲得不明不明的,晕.
还请高人帮忙.

使用特权

评论回复
6
violet520| | 2008-8-29 14:04 | 只看该作者

这一块是很不清楚

使用特权

评论回复
7
香水城| | 2008-8-29 17:07 | 只看该作者

你是否要测量低电平的宽度?你应该捕捉下降沿和上升沿

输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。

如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。

如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIMx通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。PWM输入模式也是需要用到两个通道。使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIMx框图。

使用特权

评论回复
8
lixun00|  楼主 | 2008-8-29 18:39 | 只看该作者

是测量周期(两次下降沿之间的时间),现在关键是测得的值不

使用特权

评论回复
9
香水城| | 2008-8-29 21:02 | 只看该作者

请问你的计数器设置的是什么模式?

自动重装载寄存器是如何初始化的?

使用特权

评论回复
10
lixun00|  楼主 | 2008-8-29 23:42 | 只看该作者

上面包含了除NVIC的全部代码

使用特权

评论回复
11
lixun00|  楼主 | 2008-8-30 00:58 | 只看该作者

现在捕获时可以得到正确的值,但...

CCRx是连续的累加的值,写0也不能改变
难道是自动重装在作怪?
但禁止自动重装只有CR1的ARPE是说这个功能,写1也没用
就不明白,捕获捕获还要相减?难道就不能复位?
奇怪的是PWM_Input能很好的复位

另外调试是发现当单步要得到相对正确的值要写相应的DBGMCU的TIMx_Stop位

使用特权

评论回复
12
lixun00|  楼主 | 2008-8-30 04:33 | 只看该作者

终于弄明白了,可以复位计数器了,具体见下面

在初始化时加入
/* Select the TIM2 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);

就可以了
解释:
要复位计数器:
必须设置SMCR的SMS位为100b
100: Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and
generates an update of the registers.
事实上在下降沿也也会复位计数器!
注意:selected trigger input
所以还必须设置TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
这个可以看图就明白了

ST的这个手册写得确实是糟糕,个人觉得.
也可能自己理解能力不够.

使用特权

评论回复
13
lixun00|  楼主 | 2008-8-30 10:48 | 只看该作者

换到TIM3,TIM4就不行了,没有见TIxFPy(2

使用特权

评论回复

14
hjiongh| | 2008-11-13 09:26 | 只看该作者

用的是哪个例程?

um0427FWLibexamplesTIM  里面的哪个例程

使用特权

评论回复
15
soso| | 2008-11-13 23:21 | 只看该作者

看来这么多层楼,也搞不懂到底LZ在YY什么!

看来这么多层楼,也搞不懂到底LZ在YY什么!
“也可能自己理解能力不够.”!

先  标题是什么“TIMx输入捕捉问题不得要领”
然后 立马180度转是 进不了中断!

请看它用的是 ”TIM3 CH4  “,下面

再 又说 ”测一固定的方波“ 注意这时LZ弹出一个 
”CCR4难道是累加的??“来!

接着 这家伙却又弹出“复位计数器!”注意这是却是”TIM2“!


我真是佩服 香版主!这么有耐心。







使用特权

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

本版积分规则

56

主题

683

帖子

3

粉丝