OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8933|回复: 4

【求助】STM32输出PWM的计算问题

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-9-7
在线时间
0 小时
发表于 2012-9-9 09:34:56 | 显示全部楼层 |阅读模式

芯片:STM32F103RBT6,库:3.4.0,晶振:外部8MHz

时钟设置

void RCC_cfg()
{  ErrorStatus HSEStartUpStatus;
   RCC_DeInit();
   RCC_HSEConfig(RCC_HSE_ON);  
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)      
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);  
    RCC_PCLK1Config(RCC_HCLK_Div2); 
    FLASH_SetLatency(FLASH_Latency_2);  
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);     
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08) {}   
  }
}

两种方法输出PWM:

1、定时器比较输出法:示波器显示的结果6kHz.
TIM_Pulse = 2000;TIM_Period = 65535;TIM_Prescaler = 2;
TIM_SetCompare1(TIM2, 2000);

这种比较输出法我不知道是怎么计算出来的。

2、PWM输出法:示波器显示结果1.2MHz.
TIM_Pulse = 14;TIM_Period = 29;TIM_Prescaler = 0;

这种方法和我计算出来的不一样啊,为什么?按照我计算的TIM_Period = 59,才输出的1.2MHz,请高手指点小弟一下吧。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2012-8-7
在线时间
7 小时
发表于 2012-9-9 10:09:58 | 显示全部楼层
TIM_Pulse /TIM_Period = 14/(29+1),这是输出的占空比为46.7%。。。。。。


TIM_Prescaler = 0;这个不能为0,
要输出1.2MHz的话,比如时钟是72MHz,可以将TIM_Prescaler=1;TIM_Period = 59;就可以了。。。
或者将TIM_Prescaler=2;TIM_Period = 29;就是1.2M了。。。。。。。。
计算公式为:时钟频率/((TIM_Prescaler+1)* TIM_Period) =输出频率

希望能够帮到你。。。。。。。。。。。。。。。

【好好学习天天向上】
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-9 11:06:39 | 显示全部楼层
回复【楼主位】asdy00000:
---------------------------------
建议你好好看看《STM32参考手册》关于定时器的章节。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-9-7
在线时间
0 小时
 楼主| 发表于 2012-9-9 11:57:53 | 显示全部楼层
回复【2楼】yougen1314:
---------------------------------
您好!像你说的,比如时钟是72MHz,TIM_Prescaler=1;TIM_Period = 59;frequency=72M/((1+1)* (59+1)) =600kHz,不是1.2M啊?
或者将TIM_Prescaler=2;TIM_Period = 29;frequency=72M/((2+1)* (29+1)) =800kHz,也不是1.2M啊?

能在QQ上加您嘛?!我的QQ:71170626!
回复 支持 反对

使用道具 举报

15

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2012-8-7
在线时间
7 小时
发表于 2012-9-11 15:10:43 | 显示全部楼层
回复【4楼】asdy00000:
---------------------------------
时钟是72MHz,TIM_Prescaler=1;TIM_Period = 29;
frequency=72M/((1+1)* (29+1)) =1.2M 

这样就是的了。。计算的时候分母的TIM_Prescaler和TIM_Period都要加一(第一次打错了。。。不好意思)
【好好学习天天向上】
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 20:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表