打印

请问用stm32产生6相pwm波形有问题

[复制链接]
6443|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问用stm32产生6相pwm波形,产生svpwm的调制波形,pwm方式设为边沿对齐模式,
如图示:
设 tim1_RCR=1, 则每一个向下计数溢出计算占空比。但图最下面一行所描述的更新事件
  更新事件:  如果重复计数器下溢发生在计数器与自动重装载数值相等时。
这句话是什么意思呢?

1111.gif (25.91 KB )

1111.gif
沙发
zhq_0510|  楼主 | 2010-8-14 13:06 | 只看该作者
更新事件:  如果重复计数器下溢发生在计数器与自动重装载数值相等时。

我理解: 计数器下溢发生时计数器的值(TIM1_CNT)已等于0,这时总不会与自动重装载数值相等。晕,这句话是什么意思呀

使用特权

评论回复
板凳
香水城| | 2010-8-14 17:00 | 只看该作者
更新事件:  如果重复计数器下溢发生在计数器与自动重装载数值相等时。

我理解: 计数器下溢发生时计数器的值(TIM1_CNT)已等于0,这时总不会与自动重装载数值相等。晕,这句话是什么意思呀 ...
zhq_0510 发表于 2010-8-14 13:06


请注意: 计数器(TIM1_CNT)与重复计数器(TIM1_RCR)不是同一个寄存器。

请看我在图中用红线圈出的地方,你有疑问的图中那句话,指的是重复计数器发生下溢时才会发生更新事件,重复计数器没有下溢时在那个时刻,不会发生更新事件。

不管怎样,在那个时刻,计数器(TIM1_CNT)与自动重装载数值是相等的,所以计数器的计数方向改变了。

STM32_Repetition_Counter.GIF (30.94 KB )

STM32_Repetition_Counter.GIF

使用特权

评论回复
地板
zhq_0510|  楼主 | 2010-8-14 23:23 | 只看该作者
谢谢香水城的回复,只是还是有一点点不理解您讲的这句.
"  不管怎样,在那个时刻,计数器(TIM1_CNT)与自动重装载数值是相等的,所以计数器的计数方向改变了"
当tim1重复计数器发生下溢时,TIM1_CNT=0,方向变为向上计数. 这是您指的自动重装载数值是具体指那一个寄存器呢?
还有,是不是可以这样理解.  当tim1_RCR=1,只有重复计数器发生下溢时才发生更新事件,计数器上溢在任何时候都不会发生更新事件,对吗?
谢了

使用特权

评论回复
5
zhq_0510|  楼主 | 2010-8-15 09:13 | 只看该作者
香水城,你好,
你在图中用红线圈出的地方,是指发生上溢时会发生更新事件呀
而条件是   (更新事件:  如果重复计数器下溢发生在计数器与自动重装载数值相等时).
真的不理解,请香大哥详细解释一下好吗?

使用特权

评论回复
6
香水城| | 2010-8-15 11:14 | 只看该作者
本帖最后由 香水城 于 2010-8-15 14:43 编辑

看样子你的问题是没有看懂那个图示。

在上图中央对齐模式下,在①点TIM1_CNT=0,在②点TIM1_CNT=TIM1_ARR,在③点TIM1_CNT=0,从①至②是向上计数,到达②时计数器(上)溢出,同时按照重复计数器的规则,TIM1_RCR减一;从②至③是向下计数,到达③时计数器(下)溢出,TIM1_RCR再减一。

当重复计数器递减至0时,就会发生更新事件。如果重复计数器的初值为奇数时,TIM1_RCR必然在TIM1_CNT=TIM1_ARR的时候,重复计数器递减至0;这种情况,就是楼主位图中注释的第二行所描述的情况。

不好意思,上面的斜体字有错,正确的描述如下:当重复计数器递减至0时,再次递减就会发生更新事件;图中①点时TIM1_RCR=1,图中②点时TIM1_RCR=0;如果没有重复计数器的作用,即如果不存在重复计数器,则在②这个时刻会发生更新事件,即图中细箭头指示的点;图中③点时TIM1_RCR会再次递减而产生下溢,此时才发生真正的更新事件,即图中粗箭头指示的点。

STM32_Repetition_Counter_Rule.GIF (9.11 KB )

STM32_Repetition_Counter_Rule.GIF

使用特权

评论回复
7
zhq_0510|  楼主 | 2010-8-15 13:06 | 只看该作者
谢谢香主的回复 .真的感谢.
是不是可以这样理解. 引用您的图示.
当设定TIM1_RCR=1时有:
从①至②是向上计数,到达②时计数器(上)溢出,TIM1_RCR减一;
  这时:             TIM1_RCR=TIM1_RCR-1=1-0=0;
   发生的更新事件只有(TIM1_CNT=TIM1_ARR)一个寄存器更新, 这时并不产生中断请求。
从②至③是向下计数,到达③时计数器(下)溢出。TIM1_RCR减一;
  这时:             TIM1_RCR=0-1= -1;   
  发生更新事件,这时输出比较寄存器,重复计数器寄存器,TIM1_PSC.TIM1_ARR.TIM1_RCR都更新,并产生中断请求。
香主这样理解对吗?

使用特权

评论回复
8
香水城| | 2010-8-15 14:25 | 只看该作者
你的理解不完全对。

发生更新事件时,所有该更新的寄存器都会被更新,如果使能更新中断,就会产生中断。

重复计数器递减为0时产生的更新事件,与其它条件产生的更新事件没有任何区别。

使用特权

评论回复
9
香水城| | 2010-8-15 14:44 | 只看该作者
请注意:6楼的解释曾经有错,已经做了更正。

使用特权

评论回复
10
zhq_0510|  楼主 | 2010-8-15 20:46 | 只看该作者
真的感谢香主耐心回复
终于弄理解了.
当设定TIM1_RCR=1时并 使能重复计数器有效时:
存在重复计数器
      从①至②是向上计数,到达②时计数器(上)溢出,TIM1_RCR减一;
    这时:             TIM1_RCR=TIM1_RCR-1=1-0=0> -1;   不产生更新事件,.
     从②至③是向下计数,到达③时计数器(下)溢出。TIM1_RCR减一;
    这时:             TIM1_RCR=0-1= -1;  
     发生更新事件,中断请求.
     所以:  在一个完整的pwm波形中( 即①到②至③ ).只发生一次更新事件在③中,( ②去不更新)              这样可以在前面的pwm周期计算下一个pwm波的比较寄存器的值.   直到在③处寄存器更新
     香主这样理解对吗?

使用特权

评论回复
11
香水城| | 2010-8-15 21:39 | 只看该作者
总算搞清楚了,10楼理解正确,:lol

使用重复计数器能控制PWM波形的脉冲个数,所以用起来很方便。

使用特权

评论回复
12
tigerchen| | 2010-8-18 22:44 | 只看该作者
mark

使用特权

评论回复
13
lixiaoxu2meng| | 2010-9-13 11:23 | 只看该作者
mark

使用特权

评论回复
14
无心成神| | 2011-3-22 11:21 | 只看该作者
弱弱的问一下 为什么不论我TIM1_RCR设成几 中心对称模式上溢下溢都产生中断

使用特权

评论回复
15
nudtzmh| | 2011-10-15 17:51 | 只看该作者
经过我的实际测试,并非如香版所讲那样

使用特权

评论回复
16
nudtzmh| | 2011-10-15 17:56 | 只看该作者
经过我的实际测试,并非如香版所讲那样!

根据原英文资料,细箭头(图中2位置)在RCR=1是也是完全可能发生更新事件的,其条件是就是if the repetition counter underflow occurs when the counter is equal to to the auto-reload value.控制器无法选择在上溢还是下溢是开始递减RCR,所以在1点和2点都有可能发生更新事件.我的实际测试也是这样.资料上写的太模糊,太坑爹了.在电机控制上,很多时候需要确定在上溢点或下溢点发生更新中断,在stm32中根本无法确定.

使用特权

评论回复
17
airwill| | 2011-10-15 19:47 | 只看该作者
是的, 这个跟我的理解和我的测试结论相同. 即使 RCR=1, 是不能保证一定在计数器下溢时更新的. 也有可能是在每次上溢时更新. 完全看你初始化时的状态. 中间也有可能因其他的溢出条件(比如强制updata位)改变.
所以, 我不采用 RCR=1 来选溢出条件. 而是在 溢出中断里判断计数方向来确定上下溢.
在电机控制上, 确实有麻烦. FOC 的库里也没有处理好这个问题

使用特权

评论回复
18
kuyu20| | 2013-10-10 16:40 | 只看该作者
谁说的对?晚上我也测试一下。

使用特权

评论回复
19
ysmz4| | 2014-12-4 13:27 | 只看该作者
没懂中央对齐模式有什么意义(跟向上/下计数有什么优势)?

使用特权

评论回复
20
Alisa_song| | 2015-6-23 15:17 | 只看该作者
airwill 发表于 2011-10-15 19:47
是的, 这个跟我的理解和我的测试结论相同. 即使 RCR=1, 是不能保证一定在计数器下溢时更新的. 也有可能是在 ...

你好,请问你在“溢出中断里判断计数方向来确定上下溢.”是怎么做的?可否指导下,谢谢,我用在更新中断中判断计数器的值怎么不对,判断如下:
        if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
                if(TIM_GetCounter(TIM1) == 0)                                        {
                                       
                  }
        }
现在是中断中能够正常进来,但是判断if(TIM_GetCounter(TIM1) == 0)中始终进不来是什么原因?谢谢

使用特权

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

本版积分规则

82

主题

120

帖子

2

粉丝