stm32f051 TIM15、16、17 无法出PWM
2017-07-26 23:45
225 查看
今天调了一块stm32f051,号称有11个timers,其中有6个可以产生pwm波。由于项目需要一块板子带着5个步进电机,所以需要五个单独的timer产生PWM,所以上手了这样一块板子,TIM2、TIM3和TIM14很轻松实现,结果TIM17怎么调也调不出来,我研究了半天包括网上的资料也很少,写下来帮助后人踏过这个坑。
首先将TIM2的代码贴在下面,我用PB10选择的TIM2_CH3产生PWM1:
![](https://img-blog.csdn.net/20170726233014789)
好的,我想这个TIM16依葫芦画瓢也应该很easy,我用PA6选择的TIM16_CH1产生PWM编写代码如下:
![](https://img-blog.csdn.net/20170726233201200)
坑爹的情况出现了,这玩意一直给我输出一个高电平,压根不是PWM。
我仔细检查了N遍,debug了无数次,百思不得其解,后来研究了半天,找到了答案。
看下图:
![](https://img-blog.csdn.net/20170726233608455)
你没有看错,就这玩意有问题了。
![](https://img-blog.csdn.net/20170726233858866)
4000
咋一看,其实没看出来什么。其实是TIM15、16、17这个三个定时器和TIM2等不一样,
结构体 TIM_OCInitTypeDef TIM_OCInitStructure ;
里面有些默认没有赋值的参数对TIM15、16、17的初始化会影响它产生PWM,所以代码将结构体申明的时候直接给初始值就好,例如:
TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };
自此完美解决TIM15、16、17无法产生PWM的情况。
首先将TIM2的代码贴在下面,我用PB10选择的TIM2_CH3产生PWM1:
void PWM1_Init(int arr,int psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure ; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //ʹÄܶ¨Ê±Æ÷1ʱÖÓ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //ʹÄÜGPIOÄ£¿éʱÖÓ GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_2);//ÅäÖÃPB10³ÉµÚÈý¹¦ÄÜÒý½Å GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM2_CH3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIO //³õʼ»¯TIM2 TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î» //³õʼ»¯TIM2 Channel PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß TIM_OCInitStructure.TIM_Pulse = (arr+1)/2; //ÉèÖÃÕ¼¿Õ±ÈΪ50% TIM_OC3Init(TIM2, &TIM_OCInitStructure); //ʹÄÜTIM2ÔÚCCR3ÉϵÄԤװÔؼĴæÆ÷ TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //ʹÄÜTIM2 TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); }好吧,从万恶的MDK编辑器里复制过来,中文注释不见了,再贴一张图:
好的,我想这个TIM16依葫芦画瓢也应该很easy,我用PA6选择的TIM16_CH1产生PWM编写代码如下:
坑爹的情况出现了,这玩意一直给我输出一个高电平,压根不是PWM。
我仔细检查了N遍,debug了无数次,百思不得其解,后来研究了半天,找到了答案。
看下图:
你没有看错,就这玩意有问题了。
4000
咋一看,其实没看出来什么。其实是TIM15、16、17这个三个定时器和TIM2等不一样,
结构体 TIM_OCInitTypeDef TIM_OCInitStructure ;
里面有些默认没有赋值的参数对TIM15、16、17的初始化会影响它产生PWM,所以代码将结构体申明的时候直接给初始值就好,例如:
TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };
自此完美解决TIM15、16、17无法产生PWM的情况。
相关文章推荐
- STM32高级定时器TIM1、TIM15输出PWM
- Cocos2d 卡牌塔防 游戏 cocos2d-x游戏开发之旅 第14 15 16 章 源代码调试 注意点 出现无法打开包括文件:“cocos2d.h”: No such file or direct
- Node与Express开发:13 14 15 16 17 18 章
- LeetCode (1) Two Sum (15)Three sum (16)Three sum closest (17)Four sum
- 现有杂乱无序的1-20二十个数,这二十个数为:1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20,试依次求出相邻四个数之和的最大和最小值
- Install Google Chrome in Fedora 19 / 18 / 17 / 16 / 15 / 14
- 传两个整型参数(如 15,24)建一张表15,16,17。。。24 每个数为一条记录的表
- text1.txt begin10 11 12 20 21 22 30 31 32 end text2.txt begin 15 16 17 25 26 27 35 36 37 得到text3.txt
- Get audio/video codecs on Fedora 15/16/17,Cent OS
- Fedora15/16/17 启动sshd服务
- 模版引擎详解-兄弟连新版thinkphp 15、16、17、18
- 13、14、15、16、17
- vb写的考试大题答案14,15,16,17,18
- |1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20所有这些字符串,把它的数字一个个剥离??
- 180中国跳棋(12)186(13)191(14)196(15)201(16)205(17)209.5(18)
- P51第二章练习题14、15、16、17、18、19、20
- devexpress 16 17打包发布后,程序无法启动
- EffectiveC++学习笔记-条款15|16|17
- int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)