stm32f051 TIM15、16、17 无法出PWM
今天調(diào)了一塊stm32f051,號稱有11個timers,其中有6個可以產(chǎn)生pwm波。由于項目需要一塊板子帶著5個步進電機,所以需要五個單獨的timer產(chǎn)生PWM,所以上手了這樣一塊板子,TIM2、TIM3和TIM14很輕松實現(xiàn),結(jié)果TIM17怎么調(diào)也調(diào)不出來,我研究了半天包括網(wǎng)上的資料也很少,寫下來幫助后人踏過這個坑。
首先將TIM2的代碼貼在下面,我用PB10選擇的TIM2_CH3產(chǎn)生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?ü?¨ê±?÷1ê±?óRCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //ê1?üGPIO?£?éê±?óGPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_2);//????PB103éμúèy1|?üòy??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);//3?ê??ˉGPIO//3?ê??ˉTIM2TIM_TimeBaseStructure.TIM_Period = arr; //éè???ú??ò????üD?ê??t×°è????ˉμ?×??ˉ??×°????′??÷?ü?úμ??μTIM_TimeBaseStructure.TIM_Prescaler =psc; //éè??ó?à′×÷?aTIMxê±?ó?μ?ê3yêyμ??¤·??μ?μ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè??ê±?ó·???:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?òé???êy?£ê?TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //?ù?YTIM_TimeBaseInitStruct?D???¨μ?2?êy3?ê??ˉTIMxμ?ê±???ùêyμ¥??//3?ê??ˉTIM2 Channel PWM?£ê? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨ê±?÷?£ê?:TIM??3??í?èμ÷???£ê?2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?üTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //ê?3???D?:TIMê?3?±è????D???TIM_OCInitStructure.TIM_Pulse = (arr+1)/2; //éè??????±è?a50%TIM_OC3Init(TIM2, &TIM_OCInitStructure); //ê1?üTIM2?úCCR3é?μ??¤×°????′??÷TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //ê1?üTIM2TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE); }好吧,從萬惡的MDK編輯器里復(fù)制過來,中文注釋不見了,再貼一張圖:
好的,我想這個TIM16依葫蘆畫瓢也應(yīng)該很easy,我用PA6選擇的TIM16_CH1產(chǎn)生PWM編寫代碼如下:
坑爹的情況出現(xiàn)了,這玩意一直給我輸出一個高電平,壓根不是PWM。
我仔細檢查了N遍,debug了無數(shù)次,百思不得其解,后來研究了半天,找到了答案。
看下圖:
你沒有看錯,就這玩意有問題了。
咋一看,其實沒看出來什么。其實是TIM15、16、17這個三個定時器和TIM2等不一樣,
結(jié)構(gòu)體 TIM_OCInitTypeDef TIM_OCInitStructure ;
里面有些默認沒有賦值的參數(shù)對TIM15、16、17的初始化會影響它產(chǎn)生PWM,所以代碼將結(jié)構(gòu)體申明的時候直接給初始值就好,例如:
TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };
自此完美解決TIM15、16、17無法產(chǎn)生PWM的情況。總結(jié)
以上是生活随笔為你收集整理的stm32f051 TIM15、16、17 无法出PWM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动div盒子 原生js
- 下一篇: mysql导入dat文件_后缀名为dat