STM32學(xué)習(xí)筆記:通用定時(shí)器PWM輸出_第1頁
STM32學(xué)習(xí)筆記:通用定時(shí)器PWM輸出_第2頁
STM32學(xué)習(xí)筆記:通用定時(shí)器PWM輸出_第3頁
STM32學(xué)習(xí)筆記:通用定時(shí)器PWM輸出_第4頁
STM32學(xué)習(xí)筆記:通用定時(shí)器PWM輸出_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、STM32學(xué)習(xí)筆記(5):通用定時(shí)器PWM輸出1.TIMER輸出PWM基本概念脈沖寬度調(diào)制(PWM),是英文“PulseWidthModulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡單一點(diǎn),就是對脈沖寬度的控制。一般用來控制步進(jìn)電機(jī)的速度等等。STM32的定時(shí)器除了TIM6和TIM7之外,其他的定時(shí)器都可以用來產(chǎn)生PWM輸出,其中高級(jí)定時(shí)器TIM1和TIM8可以同時(shí)產(chǎn)生7路的PWM輸出,而通用定時(shí)器也能同時(shí)產(chǎn)生4路的PWM輸出。11PWM輸出模式STM32的PWM輸出有兩種模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM

2、位確定的(“110”為模式1,“111”為模式2)。決式1和模式2的區(qū)別如下:110:PWM模式1在向上計(jì)數(shù)時(shí),一旦TIMx_CNTvTIMx_CCR1時(shí)通道1為有效電平,否則為無效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNTTIMx_CCR1時(shí)通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。111:PWM模式2在向上計(jì)數(shù)時(shí),一旦TIMx_CNTvTIMx_CCR1時(shí)通道1為無效電平,否則為有效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNTTIMx_CCR1時(shí)通道1為有效電平,否則為無效電平。由此看來,模式1和模式2正好互補(bǔ),互為相反,所以在運(yùn)用起來差別也并不太大。而從計(jì)數(shù)模式

3、上來看,PWM也和TIMx在作定時(shí)器時(shí)一樣,也有向上計(jì)數(shù)模式、向下計(jì)數(shù)模式和中心對齊模式,關(guān)于3種模式的具體資料,可以查看STM32參考手冊的“1439PWM模式”一節(jié),在此就不詳細(xì)贅述了。1.2PWM輸出管腳PWM的輸出管腳是確定好的,具體的引腳功能可以查看STM32參考手冊的“8.3.7定時(shí)器復(fù)用功能重映射”一節(jié)。在此需要強(qiáng)調(diào)的是,不同的TIMx有分配不同的引腳,但是考慮到管腳復(fù)用功能,STM32提出了一個(gè)重映像的概念,就是說通過設(shè)置某一些相關(guān)的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這些重映像的管腳也是由參考手冊給出的。比如說TIM3的第2個(gè)通道,在沒有重映像的時(shí)候,指

4、定的管腳是PA.7,如果設(shè)置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了,如果設(shè)置了完全重映像的話,TIM3_CH2的輸出就被映射到PC.7上了。13PWM輸出信號(hào)PWM輸出的是一個(gè)方波信號(hào),信號(hào)的頻率是由TIMx的時(shí)鐘頻率和TIMx_ARR預(yù)分頻器所決定的,具體設(shè)置方法在前面一個(gè)學(xué)習(xí)筆記中有詳細(xì)的交代。而輸出信號(hào)的占空比則是由TIMx_CRRx寄存器確定的。其公式為“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通過向CRR中填入適當(dāng)?shù)臄?shù)來輸出自己所需的頻率和占空比的方波信號(hào)。2.TIMER輸出PWM實(shí)現(xiàn)步驟設(shè)置RCC時(shí)鐘;設(shè)置GPIO時(shí)鐘;設(shè)置TI

5、Mx定時(shí)器的相關(guān)寄存器;設(shè)置TIMx定時(shí)器的PWM相關(guān)寄存器。第1步設(shè)置RCC時(shí)鐘已經(jīng)在前文中給出了詳細(xì)的代碼,在此就不再多說了。需要注意的是通用定時(shí)器TIMx是由APB1提供時(shí)鐘,而GPIO則是由APB2提供時(shí)鐘。注意,如果需要對PWM的輸出進(jìn)行重映像的話,還需要開啟引腳復(fù)用時(shí)鐘AFIO。第2步設(shè)置GPIO時(shí)鐘時(shí),GPIO模式應(yīng)該設(shè)置為復(fù)用推挽輸出GPIO_Mode_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數(shù)進(jìn)行設(shè)置。第3步設(shè)置TIMx定時(shí)器的相關(guān)寄存器時(shí),和前一篇學(xué)習(xí)筆記一樣,設(shè)置好相關(guān)的TIMx的時(shí)鐘和技術(shù)模式等等。具體設(shè)置參看“TIMER

6、基本定時(shí)功能”的學(xué)習(xí)筆記。第4步設(shè)置PWM相關(guān)寄存器,首先要設(shè)置PWM模式(默認(rèn)情況下PWM是凍結(jié)的),然后設(shè)置占空比(根據(jù)前面所述公式進(jìn)行計(jì)算),再設(shè)置輸出比較極性:當(dāng)設(shè)置為High時(shí),輸出信號(hào)不反相,當(dāng)設(shè)置為Low時(shí),輸出信號(hào)反相之后再輸出。最重要是是要使能TIMx的輸出狀態(tài)和使能TIMx的PWM輸出使能。相關(guān)設(shè)置完成之后,就可以通過TIM_Cmd()來打開TIMx定時(shí)器,從而得到PWM輸出了。3.TIMER輸出PWM源代碼由于我現(xiàn)在手上的奮斗開發(fā)板是將PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要進(jìn)行引腳重映像。打開TIM3之后,PWM輸出,使得LED點(diǎn)亮,通過改變PWM

7、_cfg()中的占空比可以調(diào)節(jié)LED的亮度。#includestm32f10 x_lib.hvoidRCC_cfg();voidGPIO_cfg();voidTIMER_cfg();voidPWM_cfg();/占空比,取值范圍為0-100intdutyfactor=50;intmain()intTemp;RCC_cfg();GPIO_cfg();TIMER_cfg();PWM_cfg();/使能TIM3計(jì)時(shí)器,開始輸出PWMTIM_Cmd(TIM3,ENABLE);while(1);voidRCC_cfg()/定義錯(cuò)誤狀態(tài)變量ErrorStatusHSEStartUpStatus;/將RCC

8、寄存器重新設(shè)置為默認(rèn)值RCC_DeInit();/打開外部高速時(shí)鐘晶振RCC_HSEConfig(RCC_HSE_ON);/等待外部高速時(shí)鐘晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/設(shè)置AHB時(shí)鐘(HCLK)為系統(tǒng)時(shí)鐘RCC_HCLKConfig(RCC_SYSCLK_Div1);設(shè)置高速AHB時(shí)鐘(APB2)為HCLK時(shí)鐘RCC_PCLK2Config(RCC_HCLK_Div1);設(shè)置低速AHB時(shí)鐘(APB1)為HCLK的2分頻RCC_PCLK1Config(RCC_HCLK_Div2

9、);/設(shè)置FLASH代碼延時(shí)FLASH_SetLatency(FLASH_Latency_2);/使能預(yù)取指緩存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/設(shè)置PLL時(shí)鐘,為HSE的9倍頻8MHz*9=72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/使能PLLRCC_PLLCmd(ENABLE);等待PLL準(zhǔn)備就緒while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET);設(shè)置PLL為系統(tǒng)時(shí)鐘源RCC_SYSCLKConfig(R

10、CC_SYSCLKSource_PLLCLK);判斷PLL是否是系統(tǒng)時(shí)鐘while(RCC_GetSYSCLKSource()!=0 x08);開啟TIM3的時(shí)鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);開啟GPIOB的時(shí)鐘和復(fù)用功能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);voidGPIO_cfg()GPIO_InitTypeDefGPIO_InitStructure;部分映射,將TIM3_CH2映射到PB5/GPIO_PinRem

11、apConfig(GPIO_FullRemap_TIM3,ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);/選擇引腳5GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;輸出頻率最大50MHzGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/復(fù)用推挽輸出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);voidTIMER_cfg()TIM_T

12、imeBaseInitTypeDefTIM_TimeBaseStructure;重新將Timer設(shè)置為缺省值TIM_DeInit(TIM3);采用內(nèi)部時(shí)鐘給TIM3提供時(shí)鐘源TIM_InternalClockConfig(TIM3);預(yù)分頻系數(shù)為0,即不進(jìn)行預(yù)分頻,此時(shí)TIMER的頻率為72MHzTIM_TimeBaseStructure.TIM_Prescaler=0;/設(shè)置時(shí)鐘分割TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/設(shè)置計(jì)數(shù)器模式為向上計(jì)數(shù)模式TIM_TimeBaseStructure.TIM_CounterMode=

13、TIM_CounterMode_Up;設(shè)置計(jì)數(shù)溢出大小,每計(jì)7200個(gè)數(shù)就產(chǎn)生一個(gè)更新事件,即PWM的輸出頻率為10kHzTIM_TimeBaseStructure.TIM_Period=7200-1;將配置應(yīng)用到TIM3中TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);voidPWM_cfg()TIM_OCInitTypeDefTimOCInitStructure;/設(shè)置缺省值TIM_OCStructInit(&TimOCInitStructure);/PWM模式1輸出TimOCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;設(shè)置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%TimOCInitStructure.TIM_Pulse=dutyfactor*7200/100;/TIM輸出比較極性高TimOC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論