打印

STM32输入捕获精确测频率

[复制链接]
20016|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiangzhiwu|  楼主 | 2010-10-29 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32做PWMI的输入捕获模式,测量20-20Khz的方波,20-1098hz时就不准确,发现时TIM3-CCR2的16位计满溢出了,请问怎么把它的溢出挂在中断上,查询的方式计算,越详细越好。
void Timer3(void)/
{
   TIM_ICMode=TIM_PWMI,输入PWM模式
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道选择,共四个通道
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//输入活动沿(下降沿,上升沿)
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系 TIM2选择对应和IC1 或 IC2 或 IC3 或 IC4 相连
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器 ,在捕获输入每检测到一个边沿执行一次,DIV2,3,4每捕获2,3,4个事件执行一次
   TIM_ICInitStructure.TIM_ICFilter = 0x4;//选择输入比较滤波器,滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
   TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
   TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择时钟输入触发源 ,经过滤波定时器输入2
   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM2复位模式为从模式,选择触发信号(TRGI)的上升沿重初始化计数器并触发寄存器的更新
   TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //选择主从模式,主从模式使能,启动定时器的被动触发
   
   TIM_ITConfig(TIM3, TIM_IT_CC2 , ENABLE); //使能捕获/比较4中断源
   TIM_Cmd(TIM3, ENABLE);  //启动TIM2
  }

void TIM3_IRQHandler(void)
{
      TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);//清除中断挂起位
           if(IC3Value!=0)   
   {
      DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC3Value;
      Frequency=72000000/IC3Value;//捕获时从输入波形的上升沿开始,对主时钟沿进行计数,得到的是主时钟的个数,即为输入脉冲的周期
        }
   else
   {
     Frequency=0;
    DutyCycle = 0;
     }   

   
}

SYSTICK是72Mhz,其他配置没问题
沙发
xiangzhiwu|  楼主 | 2010-10-29 21:15 | 只看该作者
请高手啊。

使用特权

评论回复
板凳
robinren| | 2011-4-9 13:39 | 只看该作者
1# xiangzhiwu

使用特权

评论回复
地板
robinren| | 2011-4-9 13:39 | 只看该作者
有没有做到的?现在我也在做,挠头中

使用特权

评论回复
5
jw_andy| | 2011-4-9 15:06 | 只看该作者
这个只能怪TIMER是16位的,如果是32位就没问题了,其实这个问题也很简单,用两个TIMER就可以了,一个用来做PWM输入触发,另外一个TIMER用来计时,同时用一个变量来保存另外一个TIMER的时间,当然,如果TIMER紧张不够用,用一个TIMER的一个通道来计时也可以。不过,第一个中断只能用来做开始时间,从第二个开始就可以精确计算了。

使用特权

评论回复
6
figureyang| | 2011-11-18 12:14 | 只看该作者
有没有发现CCR2的值直接读出来不对,要加一个延时呢!

使用特权

评论回复
7
zlg2011| | 2011-11-27 21:29 | 只看该作者
怎么加一个延时还是不行啊。

使用特权

评论回复
8
lzfbillie| | 2011-12-17 18:34 | 只看该作者
我也遇到这个问题了,有没有高手出来说明一下

使用特权

评论回复
9
bobo5650| | 2011-12-19 15:34 | 只看该作者
CCR2溢出了是什么意思?是timer计数值溢出了吧?是的话就记录溢出次数呗,定时器溢出反正有中断可用。
不过要预估一下中断处理所需的时间,避免溢出次数多+1的问题。

使用特权

评论回复
10
570wql570| | 2015-4-14 19:34 | 只看该作者
我也遇到了这个问题额,等待解决中

使用特权

评论回复
11
木林森1| | 2016-9-19 16:52 | 只看该作者

我是参考下面这个链接的方法写出来的。楼主转的这个程序变量 IC2Value来的莫名其妙,但是这个变量又是最关键的!!!
呃呃呃  发不了链接,那直接搜“STM32F0xx_TIM输入捕获(计算频率)配置详细过程”——找strong-博客园。
我自己找了好久的,网上鱼龙混杂,心累

使用特权

评论回复
12
木林森1| | 2016-9-19 16:52 | 只看该作者

使用特权

评论回复
13
木林森1| | 2016-9-19 16:54 | 只看该作者
网上真的鱼龙混杂,最关键,最精华的变量往往找不到

使用特权

评论回复
14
SMILEHUA| | 2017-8-5 21:51 | 只看该作者
从两个不同管脚分别输入不同pwm,要求在两个不同的管脚分别输出对应的pwm,可是一个输入管脚对应的不是一个输出管脚,两个输出管脚都有pwm出现,如何解决才使他们互不影响,输入管脚对应的是同一个定时器,也就是一个中断。不懂

使用特权

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

本版积分规则

0

主题

2

帖子

1

粉丝