你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 tim脉宽测频率法 问题-经典BUG 求解

[复制链接]
zhuerwei 提问时间:2013-8-21 14:31 /
 使用STM32F103VCT6. 用脉宽法测量外部脉冲频率值,TIM4的配置 CNT计数频率4Mhz,CNT计数0~65535应该65536个数后溢出。
void TIM4_IRQHandler(void)
{               
         if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)   
        {
           TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
           PluseWidthFreqConutOverflowCh0++;
           if(PluseWidthFreqConutOverflowCh0 > 20)
           {               
                g_PluseWidthFreqValueCh0 = 0;   
            }       
        }       
        if (TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET)
        {              
                TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);                    
                if(CntModeCh0==PULSE_WIDTH_FREQ)
                {               
 g_PluseWidthFreqValueCh0 = (float)(4000000.0/(TIM_GetCapture2(TIM4)+1 + (PluseWidthFreqConutOverflowCh0 - 1) * 0xffff ));                      PluseWidthFreqConutOverflowCh0 = 0;               
                }       
        }
        OSIntExit();
}
下面是TIM4的配置
    TIM_TimeBaseStructure.TIM_Period = 0xffff;       
    TIM_TimeBaseStructure.TIM_Prescaler = 17;    //72Mhz/17+1 =4Mhz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;          
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 
   
    TIM_ICInitStructure.TIM_ICFilter = 0x0;     
    TIM_ICInit(TIM4, &TIM_ICInitStructure);
   
    //TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);  
    TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
 
    TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); 

问题:
使用信号发生器产生各种频率段的信号,均可以测量到准确的频率(使用低频测量)。但是在61Hz时 测量频率会出现各种异常大值如下:
信号发生器61Hz方波,单片机测量的频率值:
   0x00073aa0  -> 473760Hz
   0x00072eca  -> 470730Hz
   0x0007caca  -> 510666Hz
   0x000861d3 -> 549331Hz
   0x0007edc2  -> 519618Hz
   0x0008f429  -> 586793Hz
其他频率都正常比如60Hz,单片机测量值为:
 0x0000003c  稳定测量为 60Hz。
问题分析:4Mhz的tim计数频率,溢出计数值为65536,4Mhz / 65536 = 61.035Hz,所以当外部输入脉冲频率为61Hz时候,刚好TIM4的捕获中断和溢出中断同时产生,而STM32的TIM4中断只有一个配置优先级,估计在61Hz下 溢出中断频繁丢失,导致测量频率跳大值。。。
目前还在试验 解决中,希望碰到同样问题的朋友可以 一起讨论,有已经解决的 希望能分享下大家宝贵的经验。。。
QQ284054948 --- 嵌入式研发 
纯技术交流,本帖是新号,没有赠分 请谅解。
收藏 评论2 发布时间:2013-8-21 14:31

举报

2个回答
我的晴天 回答时间:2016-5-7 17:57:30
努力学习中。
中山无雪 回答时间:2016-5-10 13:38:11
应该是到达极限值了,而晶振本身有一定的误差,造成这样的结果,试着调整下计数频率,例如2MHz试一下

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版