打印

请教关于定时器PWM的更新中断处理

[复制链接]
6412|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gz_ddc|  楼主 | 2012-4-19 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gz_ddc 于 2012-4-19 16:34 编辑

请教关于定时器PWM的更新中断处理
我看了这个贴:https://bbs.21ic.com/viewthread.php?tid=175841&extra=&highlight=pwm&page=1
里面5楼处提到:在更新中断中改变参数,这样就不会有任何的停顿。
有几个问题想请教下。
1. 什么叫更新中断?对于定时器3来说,是指这个吗?
void TIM3_IRQHandler(void)
{
  if(TIM3->SR&0X0001)//溢出中断
  {
     ....     //A处
  }
  TIM3->SR&=~(1<<0);//清除中断标志位
}
2. 如果问题1正确,那如果我要改CCR2的参数(更改pwm的占空比),那是在上面A处那里赋值给CCR2吗?
3. 定时器3来产生PWM信号,那么定时器3的更新中断是和它的PWM信号更新中断是指同一样东西吗?
4. 假设当前定时器周期的计数器溢出/下溢时,产生了更新中断,而在更新中断里面赋新值给CCR2(新的占空比),那么接下来的定时器周期是马上使用新的占空比吗?
5. 如果问题4成立,那么在更新中断做了一些判断等处理,导致有3uS或5uS的处理时间,那么这3uS或5uS中,PWM是输出什么信号的?是延续上一个波形的电平吗?如果这个更新中断的处理很长,那是不是要等更新中断里面的代码都执行完,才产生下一个pwm波?但这样的话,上一个PWM波的周期不就变了?
沙发
airwill| | 2012-4-19 17:18 | 只看该作者
本帖最后由 airwill 于 2012-4-19 17:20 编辑

更新事件 (UEV) 这是我的笔记里的内容, 摘自数据手册
  ●  当计数器(上溢/下溢), TIMx_CR1 寄存器中的 UDIS 位为0时,产生更新事件。
  ●  在向上模式中,计数到"自动加载值"再从0重新开始, 产生一个向上溢出事件。
  ●  在向下模式中,计数到0再从"自动加载值"重新开始, 产生一个向下溢出事件。
  ●  在中央对齐模式,计数到"自动加载值"-1,产生一个向上溢出事件;
                       然后向下计数到1, 产生一个向下溢出事件。
  ●  如果使用了重复计数器功能,在"上溢/下溢" 达到(TIMx_RCR)时,才产生更新事件(UEV);
    否则每次计数器溢出时都产生更新事件。
  ●  更新事件并非只能由"上溢/下溢" 事件产生:
    由软件或从模式控制器在 TIMx_EGR 寄存器中设置 UG 位也会产生一个更新事件。

  ●  计数器由预分频器的时钟输出 CK_CNT 驱动,
    仅当设置了 TIMx_CR1 寄存器中的计数器使能位 (CEN) 时,CK_CNT 才有效。
    (更多有关使能计数器的细节,请参见控制器的从模式描述)。
  ●  UG 位置 1:重新初始化计数器,并产生一个更新事件。
    注意预分频器的计数器也被清’0’(但是预分频系数不变)。
        若为中心对称模式或 DIR=0(向上计数) 则计数器被清 ’0’;
        若 DIR=1(向下计数) 则计数器取 TIMx_ARR 的值。

使用特权

评论回复
板凳
airwill| | 2012-4-19 17:21 | 只看该作者
如果问题1正确,那如果我要改CCR2的参数(更改pwm的占空比),那是在上面A处那里赋值给CCR2吗?


不合适, 最好在更新之前就更改 CCR2

使用特权

评论回复
地板
airwill| | 2012-4-19 17:22 | 只看该作者
这么多问题, 基础的, 还是仔细看看数据手册吧

使用特权

评论回复
5
gz_ddc|  楼主 | 2012-4-19 17:42 | 只看该作者
我把STM32中文参考手册定时器部分看了几次,你说的中央对齐模式和软件方式能产生更新中断,这我都知道。我只是用上/下溢这种情况做例子来提问。

那些问题再尽量详细的答答我好吗?

使用特权

评论回复
6
gz_ddc|  楼主 | 2012-4-19 18:07 | 只看该作者
我看<<STM32参考手册V10>>,只是见到TIM1和TIM8有自己的单独更新中断,TIM2-7都只有全局中断。也就是我的第一点是对的是吗?
我看<<STM32参考手册V10>>257,258页关于ARPE的时序,看不明白,你看计数器溢出,同时就发生了一个更新事件。那有了这个更新事件是不是进了更新中断?那更新中断中对CCR2进行了修改,那究竟是接下来的周期是用新的CCR2的值,还是再后一个周期用新的CCR2 的值?如果更新中断处理时间比较长,那么cpu处理更新中断的这段时间,PWM脚是输出什么东西的啊?

如果按你说的要在更新中断之前就要更改 CCR2,那么这个贴里,香水城说的不就是错的了?
https://bbs.21ic.com/viewthread.p ... ight=pwm&page=1
而且如果需要在更新中断之前就更改CCR2,而不能在更新中断里面改。如果我要每一个pwm波都调整CCR2,那么不就很麻烦?

使用特权

评论回复
7
lut1lut| | 2012-4-20 17:59 | 只看该作者
本帖最后由 lut1lut 于 2012-4-21 16:27 编辑

TIM1和TIM8在NVIC中有多个中断向量(比如T1_BKP、T1_UP、T1_TRG、T1_CC);而TIM3这些普通定时器在NVIC中就只有一个向量,即所谓的“TIM3全局中断”。因此对于TIM3的“更新中断”,需要在TIM3_IRQHandler()通过状态寄存器SR来区别该定时器不同的中断源。因此你的1)是正确的;
APRE是控制对ARR寄存器(定时器的counter何时溢出)的修改是立马生效,还是在更新事件(UEV)时才生效。
如果ARPE=0,即preload=0,即修改立即生效,那很好理解;如果ARPE=1,即preload=1,那么新值在UEV生效,而修改ARR的操作是本次UEV引起的中断里做的,本次UEV已经过去;所以在下一个UEV,即下次counter计数溢出时才生效。

使用特权

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

本版积分规则

0

主题

12

帖子

0

粉丝