打印

关于定时器定时周期的计算

[复制链接]
3246|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
boboluoluo|  楼主 | 2009-9-7 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* ---------------------------------------------------------------
  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是什么关系?

请明白的人不吝赐教,我琢磨了好几天了都没有琢磨出来。:dizzy:
沙发
香水城| | 2009-9-7 16:26 | 只看该作者
你这个例程从哪里抄来的?

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

你下载这个最新版的看看吧。

使用特权

评论回复
板凳
boboluoluo|  楼主 | 2009-9-7 16:52 | 只看该作者
2# 香水城

使用特权

评论回复
地板
boboluoluo|  楼主 | 2009-9-7 16:54 | 只看该作者
我这是固件库2.0的一个例子。我把程序下载到板子上看过了,测量出的波形的频率都是正确的。但就是不知道是怎样计算的。

使用特权

评论回复
5
香水城| | 2009-9-7 17:04 | 只看该作者
我没有找到固件库2.0,但在固件库2.0.3中的参数与你列出的不一致。

要么是你抄错了,要么是固件库2.0中的注释写错了,不应该是TIM2CLK = 36 MHz

使用特权

评论回复
6
boboluoluo|  楼主 | 2009-9-7 17:19 | 只看该作者
那个STM32的文档下不下来,速度太慢了。能不能麻烦你把那段程序帮我粘贴到这儿来呢?我挺着急的。如果太麻烦的话就不用了。

使用特权

评论回复
7
香水城| | 2009-9-7 17:33 | 只看该作者
请看附件,这是来自固件库3.1.0。

OCToggle.zip

7.51 KB

使用特权

评论回复
8
boboluoluo|  楼主 | 2009-9-7 17:35 | 只看该作者
非常感谢!我看看。:)

使用特权

评论回复
9
boboluoluo|  楼主 | 2009-9-7 17:47 | 只看该作者
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呢?

使用特权

评论回复
10
香水城| | 2009-9-7 18:07 | 只看该作者
36MHz / (2+1) = 12MHz

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

使用特权

评论回复
11
boboluoluo|  楼主 | 2009-9-8 10:15 | 只看该作者
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,对吗?

使用特权

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

本版积分规则

17

主题

51

帖子

1

粉丝