6652|11

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

应该是40K的PWM为什么结果是20K? [复制链接]

有如下两个程序,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);
}
此帖出自stm32/stm8论坛

最新回复

                                 我们可以一起分析这个方法的效率和有效性。   详情 回复 发表于 2009-4-14 15:14
点赞 关注
 

回复
举报

173

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

请问你是如何计算的?

                                 把你的计算过程列出来就可以看出哪里错了。
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

时钟树上的

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

如果APB1/2的预分频是1,则从APB1/2到TIM的时钟没有*2
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 

你的配置有问题

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

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

此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 

配置没有问题

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
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 

“RCC_PLLSource_HSI_Div2”没看到这个

                                 没注意看到
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 

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

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

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

谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 

请问你用的是什么芯片?

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

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

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 

用的是F101xxx.

用的是STM32F101xxx. 看来是没得救了
用TIM1有帮助么?
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 

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

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

除非超频,但这样有很大风险,所以不建议这样做。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 

谢谢香主

                                 也许可以采用通断率的方法,用平均值的方式“提高”分辨率
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

宇宙尘埃

12
 

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

                                 我们可以一起分析这个方法的效率和有效性。
此帖出自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
快速回复 返回顶部 返回列表