打印
[STM8]

有偿请解决 STM8输入捕获测量脉宽 问题

[复制链接]
1552|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
287213431|  楼主 | 2016-10-10 13:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM8, TI, TE, BLE, hz
本帖最后由 287213431 于 2016-10-10 13:38 编辑

有偿请解决STM8输入捕获测量PWM脉宽问题
问题是:测量20Hz—450Hz的频率不准确。
用中断方式或者查询方式都得不到正确的结果。
实验硬件:STM8S003F3P6
TIM2CH1PC5)输出PWM(频率:20Hz—450Hz),(频率用示波器测量 准确!)
TIM1——CH3PC3)输入捕获通道,
测量TIM2CH1输出的PWM频率(如图)。





有偿100元解决问题。测试成功立即转账 微信红包或者支付宝。



下面是测试代码(有问题的):

int main(void)
{
   /*设置内部高速时钟16M为主时钟*/
   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

   TIM2_DeInit();
   TIM2_TimeBaseInit(TIM2_PRESCALER_32, 25000);
   TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 2500, TIM2_OCPOLARITY_HIGH);
   TIM2_Cmd(ENABLE);


   GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
    //初始化TIM1输入捕捉通道3
   TIM1_DeInit();
   //16分频
   TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 20000, 0);
   TIM1_ICInit(TIM1_CHANNEL_3,TIM1_ICPOLARITY_RISING,TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV4, 0x00);
     IM1_ClearFlag(TIM1_FLAG_CC3);
   TIM1_ITConfig( TIM1_IT_CC3 , ENABLE); //去掉是查询方式,否则是中断方式
   //TIM1_ITConfig( TIM1_IT_UPDATE, ENABLE);
   TIM1_CCxCmd(TIM1_CHANNEL_3, ENABLE);//使能输入捕获通道3
   TIM1_Cmd(ENABLE);   //使能定时器
     __enable_interrupt();//启动全局中断
   while(1)
    {

   }  // main loop
}


中断部分:
#pragma vector=0xD
__interrupt voidTIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
  F01++ ;
  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
#pragma vector=0xE
__interrupt voidTIM1_CAP_COM_IRQHandler(void)
{
   if((TIM1_GetITStatus(TIM1_FLAG_CC3)) != RESET)
    {
       switch(temp)
       {
       case 0:
           ICValue1=TIM1_GetCapture3();
           TIM1_ITConfig( TIM1_IT_UPDATE, ENABLE);
           temp=1;
           break;
       case 1:
           ICValue2=TIM1_GetCapture3();
           TIM1_ITConfig( TIM1_IT_UPDATE, DISABLE);
           temp=2;
           break;
       default:
           TIM1_CCxCmd(TIM1_CHANNEL_3, DISABLE);
           TIM1_ITConfig(TIM1_IT_CC3, DISABLE);
           temp=3;
           break;
       }

       TIM1_ClearITPendingBit(TIM1_IT_CC3);
       TIM1_ClearFlag(TIM1_FLAG_CC3);
    }
   if(temp==2)
       {
         Period = 20000*(u32)F01 + ICValue2-ICValue1;
         Hz_V=4000000/Period ;
         T_V=10000/Hz_V;
         F01=0;
       }
   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}

TIM1输入捕获TIM2PWM.rar (1.19 MB)





上面的代码,测量20Hz 40Hz 80Hz 120Hz、…… 很准(在IARST-LINK V2 仿真 结果)。
前提只改变函数TIM2_TimeBaseInit(TIM2_PRESCALER_32,25000);函数里的TIM2_PRESCALER_32分频系数,比如改16分频,8分频,4分频,2分频等 都很准。

改变计数值就不准了,比如吧25000 10000.测量结果就不准了。
这是问题一。
还有就是改变 输入捕获TIM1函数TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP, 20000, 0);的计数值也测量不准了。比如把20000改成30000 就不准了。改小还是准的(如改成10000或者5000)。

搞了一个星期了 没有搞出来,我甚至怀疑硬件有BUG。欢迎高手不惜赐教!
微信号:18806541688    2016-10-10


沙发
287213431|  楼主 | 2016-10-11 17:52 | 只看该作者
本帖最后由 287213431 于 2016-10-11 17:57 编辑

使用特权

评论回复
板凳
xmshao| | 2016-10-11 17:59 | 只看该作者
中间是否发生了多次溢出? 有无考虑这点。

使用特权

评论回复
地板
cos12a| | 2016-11-4 12:59 | 只看该作者
搞定了么?

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝