OpenEdv-开源电子网

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

void TIM3_PWM_Init(u16 arr,u16 psc)//我给参数参数,怎么输出的PWM频率不对。。有图

[复制链接]

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
发表于 2014-8-15 10:17:53 | 显示全部楼层 |阅读模式
5金钱
void TIM3_PWM_Init(u16 arr,u16 psc)//我给的参数是TIM3_PWM_Init(99,72)

72M然后72分频,TIM3时钟应该是1M。。然后100次计数后重载。PWM频率就是1M除以100等于10KHZ。
为什么示波器观察,频率大概为100hz.      如果要输出10KHZ的PWM,要怎么给这个函数参数。

最佳答案

查看完整内容[请看2#楼]

确实是TIM3_PWM_Init(99,71)才是72分频,10khz。你想想,要是给TIM3_PWM_Init(99,0),照你的算法不就0分频,频率无穷大了?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-15 10:17:54 | 显示全部楼层
确实是TIM3_PWM_Init(99,71)才是72分频,10khz。你想想,要是给TIM3_PWM_Init(99,0),照你的算法不就0分频,频率无穷大了?
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-8-15 10:17:54 | 显示全部楼层
解决了。。程序没有问题,主要是示波器使用不当,测量出来的波形不对。。。。我使用示波器,总是喜欢把时间调到100ms全局扫描模式,然后抓出波形再按暂停,然后再放大观察波形。。。这样就有问题,频率低的可以这样。我抓1KHZ的PWM波,这样可以。但是抓10KHZ的PWM,如果示波器扫描时间100ms,时间过大,抓出的高频波形,根本不准。按暂停,再放大观察PWM波形抓出来的是很烂的正弦波。。。把扫描时间调到1ms抓出来的PWM波形就是好的。。
   不知道是我示波器是低端的原因,还是示波器抓高频波,扫描时间本来就应该设置1ms以下。。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-15 12:36:38 | 显示全部楼层
坐等大神出现。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-8-15 12:38:20 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);  //开启PB时钟


 
   //设置TIM3管脚为复用输出PB0->CH3   B1->ch4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH3 CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置重装值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置分频数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3
?
//设置TIM3 Channe3 WM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择PWM2模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性高
TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //CH3初始化TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能CH3
 
 
 

//设置TIM3 Channe4 WM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择PWM2模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ///比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性高
TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //CH4初始化TIM3 OC4

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能CH4
 


TIM_Cmd(TIM3, ENABLE);  //使能TIM3
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1817
金钱
1817
注册时间
2014-6-27
在线时间
975 小时
发表于 2014-8-15 13:34:56 | 显示全部楼层
首先,你应该这样给TIM3_PWM_Init(99,71),然后通过示波器把波形的频率给显示出来,是多少再说。
回复

使用道具 举报

92

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2014-3-14
在线时间
95 小时
 楼主| 发表于 2014-8-15 14:46:33 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
不行啊。。。大神,。。(99,71),PWM波周期700ms循环。。。
能不能给个TIM3,ch3 ch4输出10KHZPWM波的代码,给小弟研究啊。。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1817
金钱
1817
注册时间
2014-6-27
在线时间
975 小时
发表于 2014-8-15 14:51:54 | 显示全部楼层
反正是这样调用了,不行就是其他问题了。我用的没有这样的问题,你看系统时钟对不对,我的是寄存器版的,你不一定用得上,多检查一下代码吧。
回复

使用道具 举报

19

主题

234

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-8
在线时间
10 小时
发表于 2014-8-15 15:19:12 | 显示全部楼层
我建意你不要呼叫那麼上層的API , 我用 F207 做的 20K , 你可以照這方式改回你要的, 反正有示波器很容易看的
 

void F20K_GPIO_Config(void){
   GPIO_InitTypeDef GPIO_InitStructure;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
   GPIO_Init(GPIOB, &GPIO_InitStructure); 
   /* Connect TIM2 pins to AF2 */  
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_TIM2);
}
void F20K_init(void){
UINT16 rescalerValue = 0;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//
F20K_GPIO_Config();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   PrescalerValue =(UINT16) ((RCC_Clocks.SYSCLK_Frequency /2) / 20000000) - 1;
//debug("## TIM2 rescale >>%d\r\n",PrescalerValue);
   TIM_TimeBaseStructure.TIM_Period = 2000; //100uSec @25n 1Count
   TIM_TimeBaseStructure.TIM_Prescaler = rescalerValue;
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
   //
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_Pulse = 1000;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-15 23:11:30 | 显示全部楼层
楼主这个修改下我们的开发板例程,很容易解决吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-2-14
在线时间
0 小时
发表于 2015-8-23 16:44:17 | 显示全部楼层
楼主,TIM3_PWM_Init函数里我和你的编程方法一样,main函数里的while循环里是TIM_SetCompare3(TIM3,led0pwmval);TIM_SetCompare4(TIM3,led1pwmval); (占空比都是50%),但是仿真结果出来一个是正确的,另一个一直是高电平,这是为什么?
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2015-8-24 14:10:20 | 显示全部楼层
http://www.openedv.com/posts/list/0/58052.htm?privmsg=39618&&sysid=4#330318
这个帖里面有完整的程序
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
发表于 2015-9-9 16:32:48 | 显示全部楼层
学习了!!!!!!
回复

使用道具 举报

1

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-8-29
在线时间
31 小时
发表于 2019-9-6 10:53:02 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 12:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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