脈沖寬度調制(PWM),即“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是在數字電路中達到模擬輸出效果的一種手段,常見應用電機調速,照明燈調光等。
在MCU中,主要通過定時器單元來時實現PWM輸出,以CW32L083VxTx為例,LPTIM,GTIM,ATIM都可以輸出PWM信號。
低功耗寄存器(LPTIM)中,LPTIM 在連續模式下可以輸出 PWM 波,在單次模式下可以輸出單脈沖波或單次置位波形。連續模式下輸出PWM波的周期和占空比由自動重載寄存器 LPTIM_ARR 和比較寄存器 LPTIM_CMP決定。
通用定時器(GTIM)中,通過設置輸出比較功能,可以產生一個由重載寄存器 GTIMx_ARR 確定頻率、由比較捕獲寄存器 GTIMx_CCRy 確定占空比的PWM信號。每個GTIM對應有4個GTIMx_CCRy寄存器,可輸出4路PWM信號。向 GTIMx_CCMR 寄存器中的 CCyM 位寫入 0xE 或 0xF,能夠獨立地控制每個 CHy 輸出PWM信號的波形。
●設置 GTIMx_CMMR.CCyM 為 0xE,當 GTIMx_CNT >= GTIMx_CCRy 時,CHy 通道輸出高電平,否則輸出低電平。如果 GTIMx_CCRy 中的比較值大于重載寄存器 GTIMx_ARR 的值,則 CHy 通道輸出保持為低電平;如果 GTIMx_CCRy 中的比較值為 0,則 CHy 通道輸出保持為高電平。
●設置 GTIMx_CMMR.CCyM 為 0xF,當 GTIMx_CNT < GTIMx_CCRy 時,CHy 通道輸出高電平,否則輸出低電平。如果 GTIMx_CCRy 中的比較值大于重載寄存器 GTIMx_ARR 的值,則 CHy 通道輸出保持為高電平;如果 GTIMx_CCRy 中的比較值為 0,則 CHy 通道輸出保持為低電平。
下圖是 GTIMx_CMMR.CCyM 為 0xE、GTIMx_ARR 為 0x08 時PWM波形實例圖:
高級定時器(ATIM)中有獨立PWM輸出模式和互補PWM輸出兩種模式。
●獨立PWM模式可獨立輸出6路PWM,PWM的周期和占空比由重載寄存器ATIM_ARR和比較捕獲寄存器ATIM_CHxCCRy寄存器確定。PWM 輸出模式需要設置控制寄存器 ATIM_CR、濾波寄存器 ATIM_FLTR 和死區寄存器 ATIM_DTR,如下表所示:
另外比較通道 CHx 的 A 路可通過控制寄存器 ATIM_CR 的 PWM2S 位域配置為單點比較或雙點比較 工作方式。在單點比較方式下,使用比較捕獲寄存器 ATIM_CHxCCRA 控制比較輸出;在雙點比較方式下,使用 比較捕獲寄存器 ATIM_CHxCCRA 和 ATIM_CHxCCRB 控制比較輸出。比較通道的 B 路只能使用單點比較,由比較 捕獲寄存器 ATIM_CHxCCRB 控制比較輸出。
●互補PWM模式可輸出3對互補輸出的PWM波形,通常用于電機控制。設置控制寄存器 ATIM_CR 的 COMP 位域為 1 選擇互補 PWM 輸出模式,比較輸出通道 CHxA 與通道 CHxB 產生一 對互補 PWM。在互補 PWM 輸出模式下,通道 CHx 的 A 路控制輸出信號, B 路比較捕獲寄存器 CHxCCRB 不再控制 CHxB 輸出,但仍可用作內部控制,比如觸發 ADC 或 DMA。
另外互補 PWM 輸出模式,也可通過控制寄存器 ATIM_CR 的 PWM2S 位域選擇單點比較或雙點比較工作方式:單點比 較時使用比較捕獲寄存器 ATIM_CHxCCRA 控制比較輸出;雙點比較時使用比較捕獲寄存器 ATIM_CHxCCRA 和 ATIM_CHxCCRB 控制比較輸出。
實例演示
以CW32L083VxTx的通用定時器GTIM1為例,實現PWM輸出例程:GTIM1的CH3通道(PB08)輸出周期為500uS,占空比遞增遞減循環改變的PWM信號。
1.配置不同的系統時鐘。
voidRCC_Configuration(void) { /*0.HSI使能并校準*/ RCC_HSI_Enable(RCC_HSIOSC_DIV6); /*1.設置HCLK和PCLK的分頻系數*/ RCC_HCLKPRS_Config(RCC_HCLK_DIV1); RCC_PCLKPRS_Config(RCC_PCLK_DIV1); /*2.使能PLL,通過HSI倍頻到48MHz*/ RCC_PLL_Enable(RCC_PLLSOURCE_HSI,8000000,6); //PLL輸出頻率48MHz RCC_PLL_OUT(); ///
2.配置GPIO口
voidGPIO_Configuration(void) { /*PB08作為GTIM1的CH3PWM輸出*/ __RCC_GPIOB_CLK_ENABLE(); PB08_AFx_GTIM1CH3(); PB08_DIGTAL_ENABLE(); PB08_DIR_OUTPUT(); PB08_PUSHPULL_ENABLE(); }
3.配置中斷使能
voidNVIC_Configuration(void) { __disable_irq(); NVIC_EnableIRQ(GTIM1_IRQn); __enable_irq(); }
4.配置GTIM為PWM輸出功能
voidPWM_OutputConfig(void) { GTIM_InitTypeDefGTIM_InitStruct={0}; __RCC_GTIM1_CLK_ENABLE(); GTIM_InitStruct.Mode=GTIM_MODE_TIME;/*!
5.GTIM標志清零函數
voidGTIM_ClearITPendingBit(GTIM_TypeDef*GTIMx,uint32_tGTIM_IT) { GTIMx->ICR=~GTIM_IT; }
6.GTIM 比較值設置函數
voidGTIM_SetCompare3(GTIM_TypeDef*GTIMx,uint32_tValue) { GTIMx->CCR3=0x0000FFFF Value; }
7.GTIM中斷處理函數
voidGTIM1_IRQHandler(void) { /*USERCODEBEGIN*/ //中斷每500us進入一次,每50ms改變一次PosWidth staticuint16_tTimeCnt=0; GTIM_ClearITPendingBit(CW_GTIM1,GTIM_IT_OV); if(TimeCnt++>=100)//50ms { TimeCnt=0; if(Dir) { PosWidth+=15;//5us } else { PosWidth-=15; } if(PosWidth>=Period*3) { Dir=0; } if(0==PosWidth) { Dir=1; } GTIM_SetCompare3(CW_GTIM1,PosWidth); } /*USERCODEEND*/ }
8.主函數
uint32_tPeriod=500;//周期,單位us uint32_tPosWidth=0;//正脈寬,單位us uint8_tDir=1;//計數方向1增加,0減少 int32_tmain(void) { /*系統時鐘配置*/ RCC_Configuration(); /*GPIO配置*/ GPIO_Configuration(); PWM_OutputConfig(); /*NVIC配置*/ NVIC_Configuration(); while(1) { /*中斷服務程序見GTIM1_IRQHandler()*/ }
9.實驗演示
系統時鐘由HSI提供,通過PLL倍頻到48MHz。GTIM1經16分頻后,以3MHz的頻率計數,ARR設置為1499,GTIM1的溢出周期為500us。GTIM1每500us進入一次中斷,每50ms改變一次CH3的CCR寄存器的值,即改變PWM的正脈寬,步長為5us,先遞增到ARR,然后遞減到0,如此反復。通過示波器圖像顯示,PB08處的信號波的占空比隨時間進行周期性變化。截取2個波形如下:
來源:武漢芯源半導體
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5317瀏覽量
120002 -
PWM
+關注
關注
114文章
5141瀏覽量
213390 -
定時器
+關注
關注
23文章
3237瀏覽量
114467
發布評論請先 登錄
相關推薦
評論