溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

STM32 PWM輸出的示例分析

發(fā)布時(shí)間:2021-12-27 11:41:38 來(lái)源:億速云 閱讀:296 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(guān)STM32 PWM輸出的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

01、PWM介紹

PWM定義:脈沖寬度調(diào)制(PulseWidthModulation,PWM)簡(jiǎn)稱(chēng)脈寬調(diào)制。通俗講,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過(guò)高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(wú)(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時(shí)候即是直流供電被加到負(fù)載上的時(shí)候,斷的時(shí)候即是供電被斷開(kāi)的時(shí)候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。

占空比定義:占空比就是高電平所占整個(gè)周期的時(shí)間,如下圖所示:

STM32 PWM輸出的示例分析

第一個(gè)PWM波,周期為10ms,高電平的時(shí)間為4ms,所以占空比為40%,同理第二個(gè)PWM波為60%,第三個(gè)為80%。

PWM的頻率: PWM的頻率的整個(gè)周期的倒數(shù),所以說(shuō)上圖PWM的周期為1/0.01,也就是100HZ。改變PWM的頻率是通過(guò)改變整個(gè)的周期實(shí)現(xiàn)的。所以通過(guò)改變高低電平總共的時(shí)間、改變高電平占總周期的比例就可以實(shí)現(xiàn)任意頻率、任意占空比的PWM波。

PWM的用途和優(yōu)點(diǎn):電機(jī)調(diào)速、功率調(diào)制、PID調(diào)節(jié)、通信等等,配置簡(jiǎn)單、抗干擾能力強(qiáng),從處理器到被控系統(tǒng)信號(hào)都是數(shù)字形式的,無(wú)需進(jìn)行數(shù)模轉(zhuǎn)換。并且讓信號(hào)保持為數(shù)字形式可將噪聲影響降到最小,噪聲只有在強(qiáng)到足以將邏輯1改變?yōu)檫壿?或?qū)⑦壿?改變?yōu)檫壿?時(shí),也才能對(duì)數(shù)字信號(hào)產(chǎn)生影響,這是PWM用于通信的主要原因。

02、STM32的管腳復(fù)用

STM32沒(méi)有專(zhuān)門(mén)的PWM引腳,所以使用IO口的復(fù)用模式。首先確認(rèn)PWM功能的輸出管腳,使用定時(shí)器9。從下面的框圖中得知,timer9只有兩個(gè)輸出通道,所以timer9只能輸出兩路PWM。

STM32 PWM輸出的示例分析

在STM32F207數(shù)據(jù)手冊(cè)中的Alternatefunction mapping圖片中,timer9的兩個(gè)通道分別可以復(fù)用為PA2,PA3,PE5和PE6。

STM32 PWM輸出的示例分析

03、STM32輸出PWM原理

下圖中的①部分,在《STM32基礎(chǔ)定時(shí)器詳解》講解過(guò)了,關(guān)于影子寄存器,也在《STM32影子寄存器》中講述,下文不再贅述了。本文將重點(diǎn)在②部分,捕獲/對(duì)比通道講解,其中STM32的PWM就是利用對(duì)比通道實(shí)現(xiàn)的。

STM32 PWM輸出的示例分析

Pulse Width Modulation mode allows you to generate a signal with afrequency determined by the value of the TIMx_ARR register and a dutycycle determined by the value of the TIMx_CCRx register。

節(jié)選自STM32F207 Reference manual手冊(cè)

脈沖寬度調(diào)制模式可以生成一個(gè)信號(hào),該信號(hào)頻率由TIMx_ARR 寄存器值決定,其占空比則由TIMx_CCRx 寄存器值決定。

從下圖可以看出,當(dāng)CCR寄存器和CNT計(jì)數(shù)器數(shù)值一樣時(shí),會(huì)產(chǎn)生動(dòng)作(改變通道對(duì)應(yīng)的GPIO電平)。由于CNT溢出時(shí),重載值由TIMx_ARR寄存器值決定的。所以說(shuō)TIMx_ARR寄存器值決定周期,而TIMx_CCRx寄存器值決定CNT溢出時(shí),經(jīng)過(guò)多久會(huì)產(chǎn)生動(dòng)作(改變通道對(duì)應(yīng)的GPIO電平),也就是決定了占空比。

STM32 PWM輸出的示例分析

以向上計(jì)數(shù)為例,重載值為ARR,比較值為CRRx

STM32 PWM輸出的示例分析

上圖可以看出:

  1. 0-t1段,定時(shí)器計(jì)數(shù)器TIMx_CNT值小于CCRx值,輸出低電平。

  2. t1-t2段,定時(shí)器計(jì)數(shù)器TIMx_CNT值大于CCRx值,輸出高電平。

當(dāng)TIMx_CNT值達(dá)到ARR時(shí),定時(shí)器溢出,重新向上計(jì)數(shù)...循環(huán)此過(guò)程至此一個(gè)PWM周期完成。

上圖更加形象的說(shuō)明了

  1. 信號(hào)頻率由 TIMx_ARR 寄存器值決定。

  2. 占空比則由 TIMx_CCRx 寄存器值決定。

STM32輸出PWM的過(guò)程:

1、首先配置GPIO,配置定時(shí)器,具體參考一下代碼。定時(shí)器配置參考《STM32基礎(chǔ)定時(shí)器詳解》。

2、捕獲/比較通道使能比較通道。

STM32 PWM輸出的示例分析

上圖看到,①寄存器名字為:Capture/Compare1register??梢赃x擇從②處輸入捕獲,也可以選擇從從③中輸出,也就是我們需要的PWM輸出功能。選擇捕獲通道,還是選擇比較通道,在框圖中沒(méi)有找到具體的說(shuō)明,但在TIMx_CCMR1寄存器CC1S[1:0]控制位使能。

STM32 PWM輸出的示例分析

3、使能完輸出,就要配置PWM輸出了

STM32 PWM輸出的示例分析

①TIMx_CCMR1寄存器的OC1M[2:0]位,設(shè)置輸出模式控制器

110:PWM模式1,111:PWM模式2。

②計(jì)數(shù)器值TIMx_CNT與通道1捕獲比較寄存器CCR1進(jìn)行比較,通過(guò)比較結(jié)果輸出有效電平和無(wú)效電平。

OC1REF=0 無(wú)效電平,OC1REF=1無(wú)效電平。

③通過(guò)輸出模式控制器產(chǎn)生的信號(hào)。TIMx_CCER寄存器的CC1P位,設(shè)置輸入/捕獲通道1輸出極性。

0:高電平有效,1:低電平有效。

④TIMx_CCER:CC1E位控制輸出使能電路,信號(hào)由此輸出到對(duì)應(yīng)引腳。

0:關(guān)閉,1:打開(kāi)。

首先對(duì)PWM模式1和PWM模式2進(jìn)行介紹:

模式1

在向上計(jì)數(shù)時(shí),一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為有效電平,否則為無(wú)效電平;在向上計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為無(wú)效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

模式2

在向上計(jì)數(shù)時(shí),一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為無(wú)效電平,否則為有效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為有效電平,否則為無(wú)效電平。

TIMx_CNT>TIMx_CCR1時(shí)通道1為有效電平,否則為無(wú)效電平。

PWM輸出高低電平由TIMx_CCMR1:OC1M位和TIMx_CCER:CC1P位共同決定。


總結(jié)下來(lái):

模式1:

    CNT<CCR為有效電平//(OC1REF =1)

    CNT>CCR為無(wú)效電平//(OC1REF =0)

模式2:

    CNT<CCR為無(wú)效電平//(OC1REF =0)

    CNT>CCR為有效電平//(OC1REF =1)

CC1P:

    0:高電平有效

    1:低電平有效


04、STM32輸出PWM配置

分析了原理,那么下面就分析STM32生成PWM的過(guò)程。

1、首先要將GPIO設(shè)置為復(fù)用輸出

/* GPIOE clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  
/* GPIOE Configuration: TIM9 CH2 (PE6)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOE, &GPIO_InitStructure); 
 
/* Connect TIM9 pins to AF3 */  
GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_TIM9);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9);

2、配置定時(shí)器向上計(jì)數(shù),配置定時(shí)器頻率

/* TIM9 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
 
/* Compute the prescaler value */
PrescalerValue = (uint16_t) ((SystemCoreClock) / 2000000) - 1;
 
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 1000-1;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);

3、配置PWM輸出

上面分析過(guò)程較為麻煩,ST提供了標(biāo)準(zhǔn)外設(shè)庫(kù),我們只需要配置TIM_OCInitTypeDef結(jié)構(gòu)體即可。

TIM_OCInitTypeDef  TIM_OCInitStructure;
 
/* PWM Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100-1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
 
TIM_OC1Init(TIM9, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);

TIM_OCInitTypeDef結(jié)構(gòu)體解析

typedef struct
{
  uint16_t TIM_OCMode;      //PWM模式1或者模式2
  uint16_t TIM_OutputState; // 輸出使能OR失能
  uint16_t TIM_OutputNState;  // PWM輸出不需要
  uint32_t TIM_Pulse; // 比較值
  uint16_t TIM_OCPolarity;// 比較輸出極性
  uint16_t TIM_OCNPolarity;   // PWM輸出不需要
  uint16_t TIM_OCIdleState;// PWM輸出不需要
 uint16_t TIM_OCNIdleState; // PWM輸出不需要
}TIM_OCInitTypeDef;

其中TIM_Pulse可以在初始化時(shí)設(shè)置,設(shè)置完畢后,也可以通過(guò)以下接口再次更新。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)

4、使能定時(shí)器

TIM_ARRPreloadConfig(TIM9, ENABLE);
 
/* TIM9 enable counter */
TIM_Cmd(TIM9, ENABLE);

使用timer9輸出PWM的波形

STM32 PWM輸出的示例分析

感謝各位的閱讀!關(guān)于“STM32 PWM輸出的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI