新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > STM32通用定時器(TIM2-5)PWM輸出

STM32通用定時器(TIM2-5)PWM輸出

作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制。一般用來控制步進電機的速度等等。STM32的定時器除了TIM6和TIM7之外,其他的定時器都可以用來產(chǎn)生PWM輸出,其中高級定時器TIM1和TIM8可以同時產(chǎn)生7路的PWM輸出,而通用定時器也能同時產(chǎn)生4路的PWM輸出。

本文引用地址:http://butianyuan.cn/article/201611/322176.htm

PWM輸出模式

STM32的PWM輸出有兩種模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位確定的(“110”為模式1,“111”為模式2)。模式1和模式2的區(qū)別如下:

110:PWM模式1-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

111:PWM模式2-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為有效電平,否則為無效電平。

由此看來,模式1和模式2正好互補,互為相反,所以在運用起來差別也并不太大。

而從計數(shù)模式上來看,PWM也和TIMx在作定時器時一樣,也有向上計數(shù)模式、向下計數(shù)模式和中心對齊模式,關(guān)于3種模式的具體資料,可以查看《STM32參考手冊》的“14.3.9 PWM模式”一節(jié),在此就不詳細贅述了。

PWM輸出管腳

PWM的輸出管腳是確定好的,具體的引腳功能可以查看《STM32參考手冊》的“8.3.7定時器復用功能重映射”一節(jié)。在此需要強調(diào)的是,不同的TIMx有分配不同的引腳,但是考慮到管腳復用功能,STM32提出了一個重映像的概念,就是說通過設(shè)置某一些相關(guān)的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這些重映像的管腳也是由參考手冊給出的。比如說TIM3的第2個通道,在沒有重映像的時候,指定的管腳是PA.7,如果設(shè)置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了,如果設(shè)置了完全重映像的話,TIM3_CH2的輸出就被映射到PC.7上了。

PWM輸出信號

PWM輸出的是一個方波信號,信號的頻率是由TIMx的時鐘頻率和TIMx_ARR預分頻器所決定的,具體設(shè)置方法在前面一個學習筆記中有詳細的交代。而輸出信號的占空比則是由TIMx_CRRx寄存器確定的。其公式為“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通過向CRR中填入適當?shù)臄?shù)來輸出自己所需的頻率和占空比的方波信號。

按以下步驟配置:

1.設(shè)置RCC時鐘;

2.設(shè)置GPIO時鐘;

3.設(shè)置TIMx定時器的相關(guān)寄存器;

4.設(shè)置TIMx定時器的PWM相關(guān)寄存器;

第1步設(shè)置RCC時鐘已經(jīng)在前文中給出了詳細的代碼,在此就不再多說了。需要注意的是通用定時器TIMx是由APB1提供時鐘,而GPIO則是由APB2提供時鐘。注意,如果需要對PWM的輸出進行重映像的話,還需要開啟引腳復用時鐘AFIO。

第2步設(shè)置GPIO時鐘時,GPIO模式應該設(shè)置為復用推挽輸出GPIO_Mode_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數(shù)進行設(shè)置。

第3步設(shè)置TIMx定時器的相關(guān)寄存器時,和前一篇學習筆記一樣,設(shè)置好相關(guān)的TIMx的時鐘和技術(shù)模式等等。

第4步設(shè)置PWM相關(guān)寄存器,首先要設(shè)置PWM模式(默認情況下PWM是凍結(jié)的),然后設(shè)置占空比(根據(jù)前面所述公式進行計算),再設(shè)置輸出比較極性:當設(shè)置為High時,輸出信號不反相,當設(shè)置為Low時,輸出信號反相之后再輸出。最重要是是要使能TIMx的輸出狀態(tài)和使能TIMx的PWM輸出使能。相關(guān)設(shè)置完成之后,就可以通過TIM_Cmd()來打開TIMx定時器,從而得到PWM輸出了。

以下是我寫的參考程序:

void GPIO_PA_Init()
{//PA13管腳配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOA);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP ;//復用推挽輸出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能端口時鐘A
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIMER3_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseStructure.TIM_Period=10000-1;//ARR的值周期10K
TIM_TimeBaseStructure.TIM_Prescaler=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
}

void TIMER3_PWM_Init()
{
TIM_OCInitTypeDef TIMOCInitStructure;
TIMOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式1輸出
TIMOCInitStructure.TIM_Pulse =0;//占空比=(CCRx/ARR)*100%
TIMOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM輸出比較極性高
TIMOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能輸出狀態(tài)
TIM_OC2Init(TIM3, &TIMOCInitStructure);//TIM3的CH2輸出
TIM_CtrlPWMOutputs(TIM3,ENABLE);//設(shè)置TIM3的PWM輸出為使能

TIM_Cmd(TIM3, ENABLE); //開啟時鐘
}



評論


技術(shù)專區(qū)

關(guān)閉