stm32f051 TIM15、16、17 无法出PWM

来源:互联网 发布:java写qq登入跳出聊天 编辑:程序博客网 时间:2024/06/10 12:28

今天调了一块stm32f051,号称有11个timers,其中有6个可以产生pwm波。由于项目需要一块板子带着5个步进电机,所以需要五个单独的timer产生PWM,所以上手了这样一块板子,TIM2、TIM3和TIM14很轻松实现,结果TIM17怎么调也调不出来,我研究了半天包括网上的资料也很少,写下来帮助后人踏过这个坑。

首先将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_CH3GPIO_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   //³õʼ»¯TIM2TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµTIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_timTIM_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);  //ʹÄÜTIM2TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);}
好吧,从万恶的MDK编辑器里复制过来,中文注释不见了,再贴一张图:


好的,我想这个TIM16依葫芦画瓢也应该很easy,我用PA6选择的TIM16_CH1产生PWM编写代码如下:

坑爹的情况出现了,这玩意一直给我输出一个高电平,压根不是PWM。

我仔细检查了N遍,debug了无数次,百思不得其解,后来研究了半天,找到了答案。

看下图:

你没有看错,就这玩意有问题了。


咋一看,其实没看出来什么。其实是TIM15、16、17这个三个定时器和TIM2等不一样,

结构体 TIM_OCInitTypeDef TIM_OCInitStructure ;

里面有些默认没有赋值的参数对TIM15、16、17的初始化会影响它产生PWM,所以代码将结构体申明的时候直接给初始值就好,例如:

TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };

自此完美解决TIM15、16、17无法产生PWM的情况。