at89 发表于 2015-4-19 17:45:40

官方库3.5版本的输入捕获模式

最近研究电机,输入捕获外部编码器的脉冲输入,参考了一下官方库里面的例子,输出的频率值一直在变化啊,明显不准。有没有用过的小伙伴讨论下。中断里面的程序计算频率为什么是 TIM3Freq = (uint32_t) SystemCoreClock / Capture;

zhangdaijin 发表于 2015-4-19 17:51:25

学习一下!!

at89 发表于 2015-4-19 23:32:01

zhangdaijin 发表于 2015-4-19 17:51
学习一下!!

讨论一下,可以试试一起来嘛

stary666 发表于 2015-4-20 13:58:16

用PWM输入可以解决

at89 发表于 2015-4-21 00:13:58

stary666 发表于 2015-4-20 13:58
用PWM输入可以解决

PWM可以获取占空比和频率,我看了,频率求解的程序是一样的,但是串口输出总是在变化,贴出中断代码
if(TIM_GetITStatus(TIM3, TIM_IT_CC2|TIM_IT_CC1) == SET)
{
    /* Clear TIM3 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
                TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
    if(CaptureNumber == 0)
    {
      /* Get the Input Capture value */
      IC3ReadValue1 = TIM_GetCapture2(TIM3)+TIM_GetCapture1(TIM3);
      CaptureNumber = 1;
    }
    else if(CaptureNumber == 1)
    {
      /* Get the Input Capture value */
      IC3ReadValue2 = TIM_GetCapture2(TIM3)+TIM_GetCapture1(TIM3);
      
      /* Capture computation */
      if (IC3ReadValue2 > IC3ReadValue1)
      {
      Capture = (IC3ReadValue2 - IC3ReadValue1);
      }
      else
      {
      Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
      }
      /* Frequency computation */
      TIM3Freq = (u32) SystemCoreClock / Capture;
      CaptureNumber = 0;
                        //printf("%d",TIM3Freq);
                       
                       
                        printf("%ld\t\t",60*TIM3Freq/64);
                TIM2->CCR1+=0;
                TIM2->CCR2+=0;
    }
               
}用AB相编码器,所以开了两个通道的捕获,转一圈64个脉冲

dwwzl 发表于 2015-4-21 07:47:48

测量脉宽频率比较精细的活,我都是直接用寄存器操作的:P

at89 发表于 2015-4-22 00:29:25

dwwzl 发表于 2015-4-21 07:47
测量脉宽频率比较精细的活,我都是直接用寄存器操作的

寄存器还不是很了解,不过渐渐发现直接寄存器很有用,好吧我再看看

cxtarm 发表于 2015-4-22 09:37:28

没有这方面的经验
页: [1]
查看完整版本: 官方库3.5版本的输入捕获模式