這篇文章給大家分享的是有關STM32 PWM輸出的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
為鄉(xiāng)寧等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及鄉(xiāng)寧網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為做網(wǎng)站、網(wǎng)站設計、鄉(xiāng)寧網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
PWM定義:脈沖寬度調制(PulseWidthModulation,PWM)簡稱脈寬調制。通俗講,PWM是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進行編碼。
占空比定義:占空比就是高電平所占整個周期的時間,如下圖所示:
第一個PWM波,周期為10ms,高電平的時間為4ms,所以占空比為40%,同理第二個PWM波為60%,第三個為80%。
PWM的頻率: PWM的頻率的整個周期的倒數(shù),所以說上圖PWM的周期為1/0.01,也就是100HZ。改變PWM的頻率是通過改變整個的周期實現(xiàn)的。所以通過改變高低電平總共的時間、改變高電平占總周期的比例就可以實現(xiàn)任意頻率、任意占空比的PWM波。
PWM的用途和優(yōu)點:電機調速、功率調制、PID調節(jié)、通信等等,配置簡單、抗干擾能力強,從處理器到被控系統(tǒng)信號都是數(shù)字形式的,無需進行數(shù)模轉換。并且讓信號保持為數(shù)字形式可將噪聲影響降到最小,噪聲只有在強到足以將邏輯1改變?yōu)檫壿?或將邏輯0改變?yōu)檫壿?時,也才能對數(shù)字信號產(chǎn)生影響,這是PWM用于通信的主要原因。
STM32沒有專門的PWM引腳,所以使用IO口的復用模式。首先確認PWM功能的輸出管腳,使用定時器9。從下面的框圖中得知,timer9只有兩個輸出通道,所以timer9只能輸出兩路PWM。
在STM32F207數(shù)據(jù)手冊中的Alternatefunction mapping圖片中,timer9的兩個通道分別可以復用為PA2,PA3,PE5和PE6。
下圖中的①部分,在《STM32基礎定時器詳解》講解過了,關于影子寄存器,也在《STM32影子寄存器》中講述,下文不再贅述了。本文將重點在②部分,捕獲/對比通道講解,其中STM32的PWM就是利用對比通道實現(xiàn)的。
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手冊
脈沖寬度調制模式可以生成一個信號,該信號頻率由TIMx_ARR 寄存器值決定,其占空比則由TIMx_CCRx 寄存器值決定。
從下圖可以看出,當CCR寄存器和CNT計數(shù)器數(shù)值一樣時,會產(chǎn)生動作(改變通道對應的GPIO電平)。由于CNT溢出時,重載值由TIMx_ARR寄存器值決定的。所以說TIMx_ARR寄存器值決定周期,而TIMx_CCRx寄存器值決定CNT溢出時,經(jīng)過多久會產(chǎn)生動作(改變通道對應的GPIO電平),也就是決定了占空比。
以向上計數(shù)為例,重載值為ARR,比較值為CRRx
上圖可以看出:
0-t1段,定時器計數(shù)器TIMx_CNT值小于CCRx值,輸出低電平。
t1-t2段,定時器計數(shù)器TIMx_CNT值大于CCRx值,輸出高電平。
當TIMx_CNT值達到ARR時,定時器溢出,重新向上計數(shù)...循環(huán)此過程至此一個PWM周期完成。
上圖更加形象的說明了
信號頻率由 TIMx_ARR 寄存器值決定。
占空比則由 TIMx_CCRx 寄存器值決定。
STM32輸出PWM的過程:
1、首先配置GPIO,配置定時器,具體參考一下代碼。定時器配置參考《STM32基礎定時器詳解》。
2、捕獲/比較通道使能比較通道。
上圖看到,①寄存器名字為:Capture/Compare1register。可以選擇從②處輸入捕獲,也可以選擇從從③中輸出,也就是我們需要的PWM輸出功能。選擇捕獲通道,還是選擇比較通道,在框圖中沒有找到具體的說明,但在TIMx_CCMR1寄存器CC1S[1:0]控制位使能。
3、使能完輸出,就要配置PWM輸出了
①TIMx_CCMR1寄存器的OC1M[2:0]位,設置輸出模式控制器
110:PWM模式1,111:PWM模式2。
②計數(shù)器值TIMx_CNT與通道1捕獲比較寄存器CCR1進行比較,通過比較結果輸出有效電平和無效電平。
OC1REF=0 無效電平,OC1REF=1無效電平。
③通過輸出模式控制器產(chǎn)生的信號。TIMx_CCER寄存器的CC1P位,設置輸入/捕獲通道1輸出極性。
0:高電平有效,1:低電平有效。
④TIMx_CCER:CC1E位控制輸出使能電路,信號由此輸出到對應引腳。
0:關閉,1:打開。
首先對PWM模式1和PWM模式2進行介紹:
模式1
在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向上計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。
模式2
在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平。
TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平。
PWM輸出高低電平由TIMx_CCMR1:OC1M位和TIMx_CCER:CC1P位共同決定。
總結下來:
模式1:
CNT<CCR為有效電平//(OC1REF =1)
CNT>CCR為無效電平//(OC1REF =0)
模式2:
CNT<CCR為無效電平//(OC1REF =0)
CNT>CCR為有效電平//(OC1REF =1)
CC1P:
0:高電平有效
1:低電平有效
分析了原理,那么下面就分析STM32生成PWM的過程。
1、首先要將GPIO設置為復用輸出
/* 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ù),配置定時器頻率
/* 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輸出
上面分析過程較為麻煩,ST提供了標準外設庫,我們只需要配置TIM_OCInitTypeDef結構體即可。
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結構體解析
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可以在初始化時設置,設置完畢后,也可以通過以下接口再次更新。
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)
4、使能定時器
TIM_ARRPreloadConfig(TIM9, ENABLE); /* TIM9 enable counter */ TIM_Cmd(TIM9, ENABLE);
使用timer9輸出PWM的波形
感謝各位的閱讀!關于“STM32 PWM輸出的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
網(wǎng)站題目:STM32PWM輸出的示例分析
文章來源:http://www.rwnh.cn/article22/ghcsjc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、搜索引擎優(yōu)化、網(wǎng)站導航、靜態(tài)網(wǎng)站、自適應網(wǎng)站、網(wǎng)站設計公司
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)