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

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

[复制链接]
台多牛 提问时间:2016-10-10 11:15 /
本帖最后由 台多牛 于 2016-10-10 13:26 编辑

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

硬件

硬件


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


下面是测试代码(有问题的):
(在IAR下ST-LINK V2 仿真 结果)
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 void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
   F01++ ;
   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
#pragma vector=0xE
__interrupt void TIM1_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, 下载次数: 520)
收藏 2 评论14 发布时间:2016-10-10 11:15

举报

14个回答
埃斯提爱慕 回答时间:2016-10-10 18:08:15
提示: 作者被禁止或删除 内容自动屏蔽
zcl201207 回答时间:2016-10-10 19:58:38
jinglixixi 回答时间:2016-10-11 08:17:45
主要是分频系数大将捕捉的脉冲被滤除了。
台多牛 回答时间:2016-10-11 09:26:44
jinglixixi 发表于 2016-10-11 08:17
主要是分频系数大将捕捉的脉冲被滤除了。


分频系数改小后 靠近 靠近标准值! 加我微信 100元红包给你!
jinglixixi 回答时间:2016-10-11 11:33:26
台多牛 发表于 2016-10-11 09:26
分频系数改小后 靠近 靠近标准值! 加我微信 100元红包给你!

别客气,在频率测量方面我的感觉是不如单片机好用,因为单片机是直接对脉冲计数,只要电路的响应速度达得到且脉冲波形符合要求,一般就不会出大问题;而ARM 等多是采用中断或查询来计数,这样就需要中断处理的速度要足够的快,否则中断还没响应处理完,后面的中断又到了,就造成计数不准。ARM的计数功能基本上是服务于PWM调节等要求,对纯的脉冲计数尤其是高频的会差一些,这与其设计结构及服务方向相关。
台多牛 回答时间:2016-10-11 17:48:54
jinglixixi 发表于 2016-10-11 11:33
别客气,在频率测量方面我的感觉是不如单片机好用,因为单片机是直接对脉冲计数,只要电路的响应速度达得 ...

虽然不多,别嫌弃,希望领取
jinglixixi 回答时间:2016-10-13 12:29:29
台多牛 发表于 2016-10-11 17:48
虽然不多,别嫌弃,希望领取

没费什么事,多谢你的诚意。
1)低频,分频数接近1时,应该偏差接近1或0
2)频率高时,实际值约等于=测量值*分频数+偏差(<分频值)
3)注意测量值不要出现溢出,否则需加以补偿。
台多牛 回答时间:2016-10-14 15:30:21
jinglixixi 发表于 2016-10-13 12:29
没费什么事,多谢你的诚意。
1)低频,分频数接近1时,应该偏差接近1或0
2)频率高时,实际值约等于=测量 ...

谢谢!
现在正常运行了,代码是正确的。 就是你说的 “主要是分频系数大将捕捉的脉冲被滤除了。”
ynwscfsfi 回答时间:2016-10-15 11:07:09
看看,帮顶
cxzx 回答时间:2018-10-9 15:53:38
sincomaster 回答时间:2018-10-10 09:29:30
学习了,谢谢
JN1128 回答时间:2018-10-27 22:24:22
学习了 谢谢  希望每天都进步
lhshengshi 回答时间:2018-11-9 10:41:11
感谢热心的楼主
kakafu 回答时间:2019-7-24 17:13:39
这个程序 捕获是只有一次吗
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版