STM32输入捕获精确测频率

[复制链接]
21327|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 | 显示全部楼层
有没有做到的?现在我也在做,挠头中
jw_andy 发表于 2011-4-9 15:06 | 显示全部楼层
这个只能怪TIMER是16位的,如果是32位就没问题了,其实这个问题也很简单,用两个TIMER就可以了,一个用来做PWM输入触发,另外一个TIMER用来计时,同时用一个变量来保存另外一个TIMER的时间,当然,如果TIMER紧张不够用,用一个TIMER的一个通道来计时也可以。不过,第一个中断只能用来做开始时间,从第二个开始就可以精确计算了。
figureyang 发表于 2011-11-18 12:14 | 显示全部楼层
有没有发现CCR2的值直接读出来不对,要加一个延时呢!
zlg2011 发表于 2011-11-27 21:29 | 显示全部楼层
怎么加一个延时还是不行啊。
lzfbillie 发表于 2011-12-17 18:34 | 显示全部楼层
我也遇到这个问题了,有没有高手出来说明一下
bobo5650 发表于 2011-12-19 15:34 | 显示全部楼层
CCR2溢出了是什么意思?是timer计数值溢出了吧?是的话就记录溢出次数呗,定时器溢出反正有中断可用。
不过要预估一下中断处理所需的时间,避免溢出次数多+1的问题。
570wql570 发表于 2015-4-14 19:34 | 显示全部楼层
我也遇到了这个问题额,等待解决中
木林森1 发表于 2016-9-19 16:52 | 显示全部楼层

我是参考下面这个链接的方法写出来的。楼主转的这个程序变量 IC2Value来的莫名其妙,但是这个变量又是最关键的!!!
呃呃呃  发不了链接,那直接搜“STM32F0xx_TIM输入捕获(计算频率)配置详细过程”——找strong-博客园。
我自己找了好久的,网上鱼龙混杂,心累
木林森1 发表于 2016-9-19 16:52 | 显示全部楼层
木林森1 发表于 2016-9-19 16:54 | 显示全部楼层
网上真的鱼龙混杂,最关键,最精华的变量往往找不到
SMILEHUA 发表于 2017-8-5 21:51 | 显示全部楼层
从两个不同管脚分别输入不同pwm,要求在两个不同的管脚分别输出对应的pwm,可是一个输入管脚对应的不是一个输出管脚,两个输出管脚都有pwm出现,如何解决才使他们互不影响,输入管脚对应的是同一个定时器,也就是一个中断。不懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部