打印
[STM8]

STM8S003利用重复计数器产生固定脉冲PWM问题

[复制链接]
4486|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zykzykerer|  楼主 | 2014-5-29 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波水声换能器激励,每10ms产生固定脉冲个数(可控,1~20个),频率200K或500K,利用TIM1的重复计数器,始终不对,产生的个数总不对,跟踪发现CNTR到ARR值后没有让RCR减少,怎么回事?勘误表没发现有这方面的问题啊。

    TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,
                                 (uint32_t)CLK_GetClockFreq()/Freq - 1,
                                  MAXNUM);               //MAXNUM为脉冲实际个数
      TIM1_ARRPreloadConfig(ENABLE);
      TIM1_OC1Init( TIM1_OCMODE_PWM2,
                           TIM1_OUTPUTSTATE_ENABLE,
                           TIM1_OUTPUTNSTATE_ENABLE,
                            (uint32_t)CLK_GetClockFreq()/(Freq*2),
                            TIM1_OCPOLARITY_HIGH,
                            TIM1_OCNPOLARITY_HIGH,
                            TIM1_OCIDLESTATE_RESET,
                            TIM1_OCNIDLESTATE_RESET);
    TIM1_OC1PreloadConfig(ENABLE);
    TIM1_CtrlPWMOutputs(ENABLE);
    TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
     TIM1_Cmd(ENABLE);

我在UEV事件中关PWM,然后把TIM1延时时间改为大约10ms,下一次再设置为MAXNUM次的本频率重复计数。能产生脉冲,但示波器测量,个数不对,感觉产生脉冲时长相同,未正确触发中断的感觉
沙发
zykzykerer|  楼主 | 2014-5-29 13:39 | 只看该作者
是不是每次都触发了中断的感觉啊,貌似每次上升到最大值都产生了UEV事件触发中断

使用特权

评论回复
板凳
zykzykerer|  楼主 | 2014-5-29 14:14 | 只看该作者
有点慢慢摸到门道了,RCR值不变,不会减少,只是到了十次才出发UEV事件。现在关键就是脉冲个数问题了,单步调试中

使用特权

评论回复
地板
zykzykerer|  楼主 | 2014-5-29 14:31 | 只看该作者
解决了,初始化没问题,关键就在中断处理代码上,
   static unsigned char Status = 0;

    if(TIM1_GetITStatus(TIM1_IT_UPDATE) != RESET)
    {
          if(Status == 0)
         {
               //TIM1_CtrlPWMOutputs(DISABLE);
               TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP, 59999,0);
               Status = 1;
         }
        else
        {
               // TIM1_CtrlPWMOutputs(ENABLE);
               TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP, (uint32_t)CLK_GetClockFreq()/Freq - 1,MAXNUM);
               // TIM1_SelectOnePulseMode(TIM1_OPMODE_SINGLE);
               Status = 0      ;
        }

把开关PWM控制去掉即可,这样就相当于产生MAXNUM+1个脉冲(最少产生4个,中断处理速度原因)
        TIM1_ClearITPendingBit(TIM1_IT_UPDATE);

使用特权

评论回复
5
zykzykerer|  楼主 | 2014-5-29 14:40 | 只看该作者
上面错误,应该是MAXNUM+2个脉冲,因为MAXNUM为0时也产生一个脉冲,后面更改后的也会产生一个脉冲,故是MAXNUM+2,通过优化代码(中断代码),最少脉冲现在是3个。

使用特权

评论回复
6
mmuuss586| | 2014-5-29 19:20 | 只看该作者
如果是中断响应问题,尽量写寄存器吧;

使用特权

评论回复
7
ren2588| | 2015-8-22 20:28 | 只看该作者
本帖最后由 ren2588 于 2015-8-24 12:03 编辑

感觉很有用,也正遇到这方面的问题.

使用特权

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

本版积分规则

2

主题

10

帖子

2

粉丝