6163|11

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

定时器不同通道工作于不同方式的疑问 [复制链接]



官方发布的例程都是一个定时器只工作于一种方式的,我现在让TIM2的两个通道分别工作于不同的方式,得到的实际结果与用两个定时器工作于这两种方式得到的结果有差别,我没有找到相关的解释,请香版主指教。

以下为代码和相关说明。

/* TIM2CLK = 36 MHz, Prescaler = 0x0, TIM2 counter clock = 36 MHz */

/* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

  /* Output Compare Toggle Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

  TIM_ARRPreloadConfig(TIM2, ENABLE);
                                 
  /* TIM IT enable */
  TIM_ITConfig(TIM2,TIM_IT_CC2, ENABLE);

  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);

通道一工作于PWM方式,输出频率应该是 TIM2 counter clock/TIM_Period =549.316 Hz

通道二工作于输出比较方式,输出频率应该是TIM2 counter clock/CCR2_Val =4394.53 Hz

实测的结果:通道一输出频率没错,但是通道二输出频率却是2197.37 Hz,少了一半,不知道这个2197.37是怎么得到的? 
此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2009-5-8 17:35
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

你的计算好像有问题

通道二的输出频率也应该是TIM2 counter clock/TIM_Period/2 = 274.658Hz才对。

你选择的是输出比较,并在比较成功后翻转输出。

计数器是循环地从0计数至65535,当计数至CCR2_Val时输出翻转,经过65536次计数后,下次计数至CCR2_Val时再次翻转输出,既半周期为65536/36MHz。

不知道你的理解是否如此?
此帖出自stm32/stm8论坛
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

问题已解决,多谢

香主,是你的计算出问题了。

工作于PWM方式时,计数到CCR1_Val时输出翻转一次,计数到65535时再翻转一次,形成一个完整的周期。频率为 TIM2 counter clock/65535 = 549.316 Hz


我的问题也解决了。工作于输出比较方式是有中断的。程序如下。第一次计数到CCR2_Val输出翻转,第二次是计数到 (CCR2_Val+CCR2_Val)时翻转,两次翻转为一个完整周期。频率为 TIM2 counter clock/CCR2_Val/2 = 2197.37 Hz.

  if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
     TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
     capture = TIM_GetCapture2(TIM2);
     TIM_SetCompare2(TIM2, capture + CCR2_Val);
  }    
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 

哈哈,关键是这个中断处理

我在2楼说的是工作于输出比较方式的通道2,并且没有这个中断处理的情况。

问题解决了就好。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 

的确是

没有使能中断时,应该是counter clock/TIM_Period 
使能时,为 counter clock/TIM_Period/2
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 

关于3楼输出比较方式toggle

3楼说:工作于输出比较方式是有中断的。程序如下。第一次计数到CCR2_Val输出翻转,第二次是计数到 (CCR2_Val+CCR2_Val)时翻转,两次翻转为一个完整周期。频率为 TIM2 counter clock/CCR2_Val/2 = 2197.37 Hz.
----------------------------------------------------------

在使能中断时,我想:“第一次计数到CCR2_Val输出翻转”的时刻发生中断的了!那么“第二次是计数到 (CCR2_Val+CCR2_Val)时翻转”也发生中断了么?

还有:计数器是什么时候停止的?是计数到65535才停止的么?

65535与CCR2_Val的关系是什么?比如说是不是65535>2倍的CCR2_Val

有时候 如果不取65535这个值时,运行几个周期后,电平就一直为高 或 一直为低!
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 

为什么呢?

                                 有时候 如果不取65535这个值时,运行几个周期后,电平就一直为高 或 一直为低!
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 

回楼上 不清楚!!!

使能中断时候,

比如TIM_Period = 60000
CCR1_Val = 30000

则出现6个高电平后 然后 一直为高 !!! 这6个高电平还不一样宽!!!原因不清楚!!!

此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 

禁止中断的情况我可能有点清楚!!!

输出比较方式toggle ,禁止中断时:
计数到Period则重新计数,每计数到CRR1_Val则翻转,周期为2Period/TIM2 counter Clock.




crr1_VAL只需要<=Period<=65535都是这个周期。








==========================================

那么输出比较方式toggle ,使能中断时是怎么个情况呢??
谁能说下!!!!???
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 

如下

                                 使能中断就是在中断里重新设置下次的触发值
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 

输出比较方式toggle 不禁止中断 我也有点懂了!!!

我在8楼说:
------------------------
使能中断时候,

比如TIM_Period = 60000
CCR1_Val = 30000

则出现6个高电平后 然后 一直为高 !!! 这6个高电平还不一样宽!!!原因不清楚!!!
-----------------------------

这个例子有点难!!!


弄个简单点的例子解释一下!!
如果 比如TIM_Period = 59999
CCR1_Val = 30000

那么就是ARR=59999 也就是说计数器最大只能计数到59999,达不到30000+30000, 于是只能出现一个高电平了

============所以最好将period设置为65535 ,如果设置为别的值,就得在中断程序的TIM_SetCompare1(TIM2, capture + CCR1_Val );之前添个语句

===============我说的对不对啊???

此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

12
 

恩 楼上说的对

                                  
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表