當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]STM32產(chǎn)生PWM是非常的方便的,要需要簡單的設(shè)置定時器,即刻產(chǎn)生!(1)使能定時器時鐘:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);(2)定義相應(yīng)的GPIO:/* PA2,3,4,5,6輸出->Key_Up,Key_Down,Key_Left

STM32產(chǎn)生PWM是非常的方便的,要需要簡單的設(shè)置定時器,即刻產(chǎn)生!


(1)使能定時器時鐘:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


(2)定義相應(yīng)的GPIO:


/* PA2,3,4,5,6輸出->Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉接地,檢測輸入的高電平


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度


GPIO_Init(GPIOA, &GPIO_InitStructure);


/* PA7用于發(fā)出PWM波 */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度


GPIO_Init(GPIOA, &GPIO_InitStructure);


(3)如果是產(chǎn)生PWM(頻率不變,占空比可變),記得打開PWM控制,在TIM_Configuration()中。


TIM_Cmd(TIM3,ENABLE);


/* TIM1 Main Output Enable */


TIM_CtrlPWMOutputs(TIM1,ENABLE);


利用定時器產(chǎn)生不同頻率的PWM有時候,需要產(chǎn)生不同頻率的PWM,這個時候,設(shè)置與產(chǎn)生相同PWM的程序,有關(guān)鍵的不一樣。


(一) 設(shè)置的原理


利用改變定時器輸出比較通道的捕獲值,當(dāng)輸出通道捕獲值產(chǎn)生中斷時,在中斷中將捕獲值改變,這時, 輸出的I/O會產(chǎn)生一個電平翻轉(zhuǎn),利用這種辦法,實現(xiàn)不同頻率的PWM輸出。


(二)關(guān)鍵設(shè)置


在定時器設(shè)置中:TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);


在中斷函數(shù)中:


if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)


{


  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);


  capture = TIM_GetCapture2(TIM3);


  TIM_SetCompare2(TIM3, capture + Key_Value);


}


一個定時器四個通道,分別產(chǎn)生不同頻率(這個例子網(wǎng)上也有)


vu16 CCR1_Val = 32768;


vu16 CCR2_Val = 16384;


vu16 CCR3_Val = 8192;


vu16 CCR4_Val = 4096;


void TIM_Configuration(void)


{


  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


  TIM_OCInitTypeDef TIM_OCInitStructure;


  /* TIM2 clock enable */


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


  /* ---------------------------------------------------------------


  TIM2 Configuration: Output Compare Toggle Mode:


  TIM2CLK = 36 MHz, Prescaler = 0x2, TIM2 counter clock = 12 MHz


  CC1 update rate = TIM2 counter clock / CCR1_Val = 366.2 Hz


  CC2 update rate = TIM2 counter clock / CCR2_Val = 732.4 Hz


  CC3 update rate = TIM2 counter clock / CCR3_Val = 1464.8 Hz


  CC4 update rate = TIM2 counter clock / CCR4_Val = 2929.6 Hz


  --------------------------------------------------------------- */


  /* Time base configuration */


  TIM_TimeBaseStructure.TIM_Period = 65535;


  TIM_TimeBaseStructure.TIM_Prescaler = 2;


  TIM_TimeBaseStructure.TIM_ClockDivision = 0;


  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;


  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


  /* Channel 1 Configuration in PWM mode */


  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //PWM模式2


  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效


  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道無效


  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//占空時間


  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性


  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互補端的極性


  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;


  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;


  TIM_OC1Init(TIM2,&TIM_OCInitStructure); //通道1


  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);



  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //占空時間


  TIM_OC2Init(TIM2,&TIM_OCInitStructure);//通道2


  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);



  TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //占空時間


  TIM_OC3Init(TIM2,&TIM_OCInitStructure); //通道3


  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);



  TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //占空時間


  TIM_OC4Init(TIM2,&TIM_OCInitStructure);//通道4


  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);


  /* TIM2 counter enable */


  TIM_Cmd(TIM2,ENABLE);



  /* TIM2 Main Output Enable */


  //TIM_CtrlPWMOutputs(TIM2,ENABLE);


   /* TIM IT enable */


  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);


}



void GPIO_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;



/*允許總線CLOCK,在使用GPIO之前必須允許相應(yīng)端的時鐘.


從STM32的設(shè)計角度上說,沒被允許的端將不接入時鐘,也就不會耗能,


這是STM32節(jié)能的一種技巧,*/



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);




/* PA2,3,4,5,6,7輸出->LED1,LED2,LED3,LED4,LED5,LED6 */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏輸出


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度


GPIO_Init(GPIOA, &GPIO_InitStructure);




/* PB0,1輸出->LED7,LED8*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏輸出


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度


GPIO_Init(GPIOB, &GPIO_InitStructure);



/* PA0,1->KEY_LEFT,KEY_RIGHT*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? //上拉輸入


GPIO_Init(GPIOA, &GPIO_InitStructure);



/* PC13->KEY_UP*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? //上拉輸入


GPIO_Init(GPIOC, &GPIO_InitStructure);



/* PB5->KEY_DOWN*/


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? //上拉輸入


GPIO_Init(GPIOB, &GPIO_InitStructure);



/* GPIOA Configuration:TIM2 Channel1, 2, 3 and 4 in Output */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_Init(GPIOA, &GPIO_InitStructure);


}



void NVIC_Configuration(void)


{


NVIC_InitTypeDef NVIC_InitStructure;



/* Configure one bit for preemption priority */


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);



NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;


NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;


NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;


NVIC_Init(&NVIC_InitStructure);


}



u16 capture = 0;


extern vu16 CCR1_Val;


extern vu16 CCR2_Val;


extern vu16 CCR3_Val;


extern vu16 CCR4_Val;


void TIM2_IRQHandler(void)


{


/* TIM2_CH1 toggling with frequency = 183.1 Hz */


if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)


{


  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );


  capture = TIM_GetCapture1(TIM2);


  TIM_SetCompare1(TIM2, capture + CCR1_Val );


}


/* TIM2_CH2 toggling with frequency = 366.2 Hz */


if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)


{


  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);


  capture = TIM_GetCapture2(TIM2);


  TIM_SetCompare2(TIM2, capture + CCR2_Val);


}



/* TIM2_CH3 toggling with frequency = 732.4 Hz */


if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)


{


   TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);


  capture = TIM_GetCapture3(TIM2);


  TIM_SetCompare3(TIM2, capture + CCR3_Val);


}



/* TIM2_CH4 toggling with frequency = 1464.8 Hz */


if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)


{


  TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);


  capture = TIM_GetCapture4(TIM2);


   TIM_SetCompare4(TIM2, capture + CCR4_Val);


}



}


一個定時器一個通道,產(chǎn)生不同頻率



其它的設(shè)置都一樣,就是在主函數(shù)中修改一個參數(shù),然后在定時器中斷中,根據(jù)這個參數(shù),改變頻率。



#include "stm32lib\stm32f10x.h"


#include "hal.h"



volatile u16 Key_Value=1000;? //用于保存按鍵相應(yīng)的PWM波占空比值




int main(void)


{


ChipHalInit();


ChipOutHalInit();



while(1)


{?


? if( (!Get_Key_Up)&(!Get_Key_Down)&(!Get_Key_Left)&(!Get_Key_Right)&(!Get_Key_Ctrl) )


? {


? ? Key_Value=12000;


? }


? else


? {


? ? if(Get_Key_Up)? ? //按鍵前進按下 ,對應(yīng)1kHz


? ? {


? ? Key_Value=6000;


? ? }


? ? else if(Get_Key_Down)? //按鍵后退按下 ,對應(yīng)2kHz


? ? {


? ? ? Key_Value=3000;


? ? }


? ? Delay_Ms(20);? ? ? //10ms延時



? ? if(Get_Key_Left)? ? //按鍵左轉(zhuǎn)按下,對應(yīng)3kHz


? ? {


? ? Key_Value=2000;


? ? }


? ? else if(Get_Key_Right) //按鍵右轉(zhuǎn)按下,對應(yīng)4kHz


? ? {


? ? ? Key_Value=1500;


? ? }?


? ? Delay_Ms(20);? ? ? //10ms延時



? ? if(Get_Key_Ctrl)? ? //按鍵控制按下,對應(yīng)5kHz


? ? {


? ? ? Key_Value=1200;


? ? }


? ? Delay_Ms(20);? ? ? //10ms延時


? }


}


}



extern volatile u16 Key_Value;


u16 capture=0;


void TIM3_IRQHandler(void)


{


/* TIM2_CH2 toggling with frequency = 366.2 Hz */


if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)


{


? ? TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);


capture = TIM_GetCapture2(TIM3);


? ? TIM_SetCompare2(TIM3, capture + Key_Value);


}


}



void TIM3_Configuration(void)


{


TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


TIM_OCInitTypeDef TIM_OCInitStructure;



/* TIM2 clock enable */


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);



/*TIM1時鐘配置*/


TIM_TimeBaseStructure.TIM_Prescaler = 5;? ? ? //預(yù)分頻(時鐘分頻)72M/6=12M


TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;? //向上計數(shù)


TIM_TimeBaseStructure.TIM_Period = 65535;? ? ? ? //裝載值選擇最大


TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;


TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;


TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);



/* Channel 1 Configuration in PWM mode */


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //PWM模式2


TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效


TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道無效


TIM_OCInitStructure.TIM_Pulse = Key_Value; //占空時間


TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性


TIM_OCInitStruct

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉