10512|10

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于定时器定时周期的计算 [复制链接]

/* ---------------------------------------------------------------
  TIM2 Configuration: Output Compare Toggle Mode:
  TIM2CLK = 36 MHz, Prescaler = 0x2, TIM2 counter clock = 12 MHz
  CC1 update rate = TIM2 counter clock / CCR1_Val = 366.2 Hz
  CC2 update rate = TIM2 counter clock / CCR2_Val = 732.4 Hz
  CC3 update rate = TIM2 counter clock / CCR3_Val = 1464.8 Hz
  CC4 update rate = TIM2 counter clock / CCR4_Val =  2929.6 Hz
--------------------------------------------------------------- */
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0x02;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Output Compare Toggle Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 2047;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 1023;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 511;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 255;
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);

以上是例程里的一段程序,功能是对TIM2定时器进行控制,使得TIM2通道1产生频率为183.1Hz的方波,通道2产生频率为366.2Hz的方波,通道3产生频率为732.4赫兹的方波,通道4产生频率为1464.8赫兹的方波。在软件设计里面也写了“配置TIM2各通道均为输出比较模式(预分频系数设为2),设置各通道的参数(TIM2 CC1=0x8000、TIM2 CC2=0x4000、TIM2 CC31=0x2000、TIM2 CC4=0x1000、).在相应的TIM2定时器中断服务处理程序中根据定时器的值翻转输出电平,以输出方波。”

我现在的疑问是各通道输出的频率是怎样计算出来的?
TIM_OCInitStructure.TIM_Pulse = 2047 和 TIM2 CC1=0x8000是什么关系?

请明白的人不吝赐教,我琢磨了好几天了都没有琢磨出来。
此帖出自stm32/stm8论坛

最新回复

                                 RCC的配置如下: void RCC_Configuration(void) {      /* RCC system reset(for debug purpose) */   RCC_DeInit();   /* Enable HSE */   RCC_HSEConfig(RCC_HSE_ON);   /* Wait till HSE is ready */   HSEStartUpStatus = RCC_WaitForHSEStartUp();   if(HSEStartUpStatus == SUCCESS)   {     /* HCLK = SYSCLK */     RCC_HCLKConfig(RCC_SYSCLK_Div1);        /* PCLK2 = HCLK */     RCC_PCLK2Config(RCC_HCLK_Div1);     /* PCLK1 = HCLK/4 */     RCC_PCLK1Config(RCC_HCLK_Div4);     /* Flash 2 wait state */     FLASH_SetLatency(FLASH_Latency_2);     /* Enable Prefetch Buffer */     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);     /* PLLCLK = 8MHz * 9 = 72 MHz */     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     /* Enable PLL */     RCC_PLLCmd(ENABLE);     /* Wait till PLL is ready */     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)     {     }     /* Select PLL as system clock source */     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);     /* Wait till PLL is used as system clock source */     while(RCC_GetSYSCLKSource() != 0x08)     {     }   }   /* TIM2 clock enable */   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   /* GPIOA clock enable */   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); } 以下是我的分析:     RCC_PCLK1Config(RCC_HCLK_Div4);     /* PLLCLK = 8MHz * 9 = 72 MHz */     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); 所以TIM2的时钟应该为36M,对吗?  详情 回复 发表于 2009-9-8 10:15
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你这个例程从哪里抄来的?

我刚刚看了STM32固件库3.1.0,有一个类似的例子,但使用的事TIM3,而且参数比一样,但结果都是:
CCR1 = 366.2 Hz
CCR2 = 732.4 Hz
CCR3 = 1464.8 Hz
CCR4 =  2929.6 Hz

你下载这个最新版的看看吧。
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 
此帖出自stm32/stm8论坛
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 我这是固件库2.0的一个例子。我把程序下载到板子上看过了,测量出的波形的频率都是正确的。但就是不知道是怎样计算的。
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
我没有找到固件库2.0,但在固件库2.0.3中的参数与你列出的不一致。

要么是你抄错了,要么是固件库2.0中的注释写错了,不应该是TIM2CLK = 36 MHz
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 那个STM32的文档下不下来,速度太慢了。能不能麻烦你把那段程序帮我粘贴到这儿来呢?我挺着急的。如果太麻烦的话就不用了。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 请看附件,这是来自固件库3.1.0。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 非常感谢!我看看。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
3.1.0的这个程序看起来才对。它与我上面的程序的区别如下:
2.0如下:
TIM_OCInitStructure.TIM_Pulse = 2047;
TIM_OCInitStructure.TIM_Pulse = 1023;
TIM_OCInitStructure.TIM_Pulse = 511;
TIM_OCInitStructure.TIM_Pulse = 255;
3.1.0如下:
__IO uint16_t CCR1_Val = 32768;
__IO uint16_t CCR2_Val = 16384;
__IO uint16_t CCR3_Val = 8192;
__IO uint16_t CCR4_Val = 4096;

TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

不知道为什么两个程序的结果都是正确的。
另外还有一个疑问是:TIM3CLK = 36 MHz, Prescaler = 0x2, TIM3 counter clock = 12 MHz
这三个数之间有什么联系吗?
为什么TIM3CLK 为 36 MHz,TIM3 counter clock 为 12 MHz呢?
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
36MHz / (2+1) = 12MHz

关于固件库2.0的问题,你要看RCC的配置,定时器的时钟是否为36MHz,我认为应该不是,但你给出的程序中看不出来。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
RCC的配置如下:
void RCC_Configuration(void)
{   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}

以下是我的分析:
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
所以TIM2的时钟应该为36M,对吗?
此帖出自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
快速回复 返回顶部 返回列表