定時器PWM輸出功能
1 PWM工作原理
脈沖寬度調制(PWM:Pulse Width Modulation)是一種對模擬信號電平進行數字編碼的方法。廣泛應用于電機控制、燈光的亮度調節、功率控制等領域。
1.1 PWM信號的兩個基本參數
- 周期(Period): 一個完整PWM波形所持續的時間
- 占空比(Duty): 高電平持續時間(Ton)與周期時間(Period)的比值
1.2 PWM信號的電壓調節原理
- 不同占空比的PWM信號等效于不同的平均電壓
- 平均電壓 = 峰值 x 占空比
1.3 定時器通道結構
- 時基單元工作于定時模式,預分頻時鐘CK_PSC等于定時器時鐘TIMx_CLK。
- 每個定時器具備1~4個獨立的通道,各個通道具有獨立的 輸入捕獲單元 、捕獲/比較寄存器和 輸出比較單元 ,但共享同一個時基單元。
- x表示定時器編號,每個通道有對應的GPIO引腳作為通道的輸入/輸出引腳,每個通道可以選擇作為輸入捕獲或者輸出比較功能,但是只能二選一。
1.4 功能單元的作用
- 輸入捕獲單元: 用于捕獲外部觸發信號,捕獲方式為上升沿/下降沿/雙邊沿捕獲。發生捕獲事件時,將此刻計數器的值鎖存到捕獲比較寄存器中,供用戶讀取,同時可以產生捕獲中斷。
- 捕獲/比較寄存器: TIMx_CCR寄存器在輸入捕獲模式下用于存放發生捕獲事件時的當前計數值;在輸出比較模式下用于存放預設的比較值。該寄存器具備預裝載功能。
- 輸出比較單元: 用于信號輸出。定時器通過將預設的比較值與計數器的值做匹配比較,以實現各類輸出,如PWM輸出、單脈沖輸出等。預設的比較值存放在捕獲/比較寄存器中。
1.5 PWM輸出的工作原理
- 實例:假設預分頻時鐘CK_PSC為100MHz,產生周期為1ms,占空比為47.5%的PWM信號。Period = 1ms,可以設置 PSC = 99,ARR = 999,Duty = 47.5%,則 CRR = 475。
定時器的每個通道都可以輸出PWM信號,對于同一個定時器而言,它的多個通道共享同一個自動重載寄存器,因此可以輸出占空比不同,但周期相同的PWM信號。
2 PWM功能的數據類型和接口函數
2.1 輸出比較單元
成員變量:
輸出比較模式:成員變量OCMode的取值范圍
宏常量定義 | 含義 |
---|---|
IM_OCMODE_TIMING | 輸出比較凍結模式,匹配時無通道輸出 |
TIM_OCMODE_ACTIVE | 輸出比較凍結模式,匹配時無通道輸出 |
TIM_OCMODE_INACTIVE | 匹配時設置通道輸出為無效電平 |
TIM_OCMODE_TOGGLE | 匹配時設置通道輸出電平翻轉 |
TIM_OCMODE_PWM1 | PWM輸出模式1 |
TIM_OCMODE_PWM2 | PWM輸出模式2 |
TIM_OCMODE_FORCED_ACTIVE | 不進行匹配,強制通道輸出為有效電平 |
TIM_OCMODE_FORCED_INACTIVE | 不進行匹配,強制通道輸出為無效電平 |
- PWM模式1:遞增計數時,當TIMx_CNT (當前計數值)
- PWM模式2:遞增計數時,當TIMx_CNT (當前計數值)
有效電平極性:成員變量OCPolarity的取值范圍
宏常量定義 | 含義 |
---|---|
TIM_OCPOLARITY_HIGH | 輸出有效電平為高電平 |
TIM_OCPOLARITY_LOW | 輸出有效電平為低電平 |
快速輸出使能:成員變量OCFastMode的取值范圍
宏常量定義 | 含義 |
---|---|
TIM_OCFAST_DISABLE | 不使能快速輸出模式 |
TIM_OCPOLARITY_LOWTIM_OCFAST_ENABLE | 使能快速輸出模式 |
可以加快觸發輸入事件對通道輸出的影響,默認配置為不使能
接口函數:
定時器PWM輸出啟動函數:
HAL_TIM_PWM_Start
函數原型 HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
功能描述 在輪詢方式下啟動PWM信號輸出 入口參數 htim:定時器句柄的地址 返回值 HAL狀態值 注意事項 1. 該函數在定時器初始化完成之后調用2. 函數需要由用戶調用,用于啟動定時器的指定通道輸出PWM信號 定時器比較/捕獲寄存器設置函數:
__HAL_TIM_SET_COMPARE
函數原型 __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
功能描述 設置捕獲/比較寄存器TIMx_CCR的值。在PWM輸出時, 用于改變PWM 信號的占空比 入口參數 HANDLE : 定時器句柄的地址__CHANNEL__: 定時器通道號, 取值范圍是TIM_CHANNEL_1 ~TIM_CHANNEL_4__COMPARE__ :寫入捕獲/比較寄存器TIMx_CCR的值 返回值 無 注意事項 1. 該函數是宏函數,進行宏替換,不發生函數調用2. 函數需要由用戶調用,用于PWM輸出時,改變PWM信號的占空比
任務實踐
用PWM信號控制發板上的指示燈LED1。設置PWM周期為 20 ms,占空比從0%開始,步進為20%。遞增到100%后,又從0%開始,并重復整個過程。占空比修改的時間間隔為200ms。
經過計算可得,可以取值:PSC=799,ARR=199,CRR從0到200,步進值為40。
- 配置定時器2時鐘源為內部時鐘 (8MHz),通道1配置為PWM輸出模式,設置PSC=799,ARR199,Pulse設置為0。
- 編寫代碼
在main.c
中/* USER CODE BEGIN PV */ uint16_t CCR = 0; uint16_t Step = 40; /* USER CODE END PV */ /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ for (CCR = 0; CCR <= 200; CCR = CCR + Step) { __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, CCR); HAL_Delay(200); } } /* USER CODE END 3 */
-
寄存器
+關注
關注
31文章
5390瀏覽量
121901 -
PWM
+關注
關注
114文章
5211瀏覽量
215835 -
STM32
+關注
關注
2276文章
10947瀏覽量
359163 -
定時器
+關注
關注
23文章
3259瀏覽量
115890 -
脈沖寬度調制
+關注
關注
7文章
81瀏覽量
13834
發布評論請先 登錄
相關推薦
評論