打印

应该是40K的PWM为什么结果是20K?

[复制链接]
2650|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fish2bear|  楼主 | 2009-4-13 08:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM, TI, rc, IO, pi
有如下两个程序,RCC_Configuration用于配置Clock,Timer2_Configuration配置TIM2,能在A0管脚输出10K的PWM波形;把RCC_PCLK1Config(RCC_HCLK_Div4)改成RCC_PCLK1Config(RCC_HCLK_Div2),能输出20K的PWM波,符合期望;但是改成RCC_PCLK1Config(RCC_HCLK_Div1)后,应该输出40K的PWM波形,结果却是20K的PWM;请问是什么原因。

多谢帮助!

void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
     RCC_DeInit();    
     RCC_HSICmd(ENABLE);
   /* PLLCLK = 8MHz * 9 = 72 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
    /* Enable PLL */ 
     RCC_PLLCmd(ENABLE);
     FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     RCC_HCLKConfig(RCC_SYSCLK_Div1);   
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    /* PCLK1 = HCLK */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* 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 and GPIOB clock enable */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); 

   
      /* Enable GPIOA, GPIOB and AFIO clocks */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE);
}


void Timer2_Configuration(void)
{
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
   /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 1800;          
  TIM_TimeBaseStructure.TIM_Prescaler = 0x00;       
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Output Compare */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          
  TIM_OCInitStructure.TIM_OutputState =   TIM_OutputState_Enable;         
  TIM_OCInitStructure.TIM_Pulse = 900;   
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM2, ENABLE);
  TIM_Cmd(BUCK_PWM_TIM, ENABLE);
}
沙发
香水城| | 2009-4-13 08:39 | 只看该作者

请问你是如何计算的?

把你的计算过程列出来就可以看出哪里错了。

使用特权

评论回复
板凳
lut1lut| | 2009-4-13 12:03 | 只看该作者

时钟树上的

如果APB1/2有大于1的预分频,则从APB1/2到TIM的时钟会*2;

如果APB1/2的预分频是1,则从APB1/2到TIM的时钟没有*2

使用特权

评论回复
地板
PXJ_520| | 2009-4-13 14:27 | 只看该作者

你的配置有问题

RCC_PCLK1Config(RCC_HCLK_Div1)是低速时钟的时钟源吧
手册上说:“APB1操作速度限于36MHz”

还有“当HSI被用于作为PLL时钟的输入时,系统时钟的最大频率不得超过64MHz。”所以,你这里用做72M,没问题吗

使用特权

评论回复
5
lut1lut| | 2009-4-13 14:49 | 只看该作者

配置没有问题

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);

人家是用HSI/2作为PLL输入,4*9=36MHz,没有问题的。原因就是我说的

1.PCLK1 = 36/4=9MHZ --> TIM CLK=9*2=18MHz
2.PCLK1 = 36/2=18MHz --> TIM CLK=18*2=36MHz
3.PCLK1 = 36/1=36MHz --> TIM CLK=18*1=36MHz

使用特权

评论回复
6
PXJ_520| | 2009-4-13 15:00 | 只看该作者

“RCC_PLLSource_HSI_Div2”没看到这个

没注意看到

使用特权

评论回复
7
fish2bear|  楼主 | 2009-4-13 15:05 | 只看该作者

高手不少啊! 还有问题请教

3楼4楼说的都很对,参考手册71页图8画的很清楚;都怪自己读的时候没有足够仔细。

不过还有一个问题请教,我现在希望做一个50K的PWM输出,为了保证分辨率,希望TIM_TimeBaseStructure.TIM_Period能大于1000;现在APB1操作速度限于36MHz,我能得到的最大的TIM_TimeBaseStructure.TIM_Period=36M/50K=720,请问有什么其它的方法可以提高分辨率?

谢谢

使用特权

评论回复
8
香水城| | 2009-4-13 15:55 | 只看该作者

请问你用的是什么芯片?

如果使用的是STM32F101xxx,因为SYSCLK的最高频率只能达到36MHz,7楼说的已经是最好的结果。

如果使用的是STM32F103xxx,SYSCLK的最高频率可以达到72MHz,这样你可以提高SYSCLK和HCLK。如果使用HSI,则SYSCLK可以达到64MHz,这样可以得到64MHz的HCLK,此时APB1预分频系数是2,PCLK1只能使用64/2=32MHz,但因为定时器时钟信号上的倍频效应,定时器时钟也可以达到64MHz,精度可以因此得到提高。 

使用特权

评论回复
9
fish2bear|  楼主 | 2009-4-14 12:14 | 只看该作者

用的是F101xxx.

用的是STM32F101xxx. 看来是没得救了
用TIM1有帮助么?

使用特权

评论回复
10
香水城| | 2009-4-14 12:19 | 只看该作者

提高分辨率的唯一办法就是提高计数器的输入频率

你现在使用STM32F101xxx,36MHz已经是最大的计数器输入频率,使用TIM1也是一样。

除非超频,但这样有很大风险,所以不建议这样做。

使用特权

评论回复
11
fish2bear|  楼主 | 2009-4-14 14:13 | 只看该作者

谢谢香主

也许可以采用通断率的方法,用平均值的方式“提高”分辨率

使用特权

评论回复
12
香水城| | 2009-4-14 15:14 | 只看该作者

请11楼介绍一下这个通断率的方法

我们可以一起分析这个方法的效率和有效性。

使用特权

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

本版积分规则

8

主题

24

帖子

0

粉丝