一、硬件定時器
- 高級控制定時器 Advanced Control Timers (TIM1/TIM8)
- 通用定時器 General Purpose Timers (TIM2/TIM3/TIM4/TIM5)
- 通用定時器 General Purpose Timers (TIM15/TIM16/TIM17)
- 基本定時器 Basic Timers (TIM6/TIM7)
![]()
表 1 定時器種類
二、TIM 中 PWM 概念
PWM 的基本原理就是通過 ++ / -- 計數
2.1 PWM 概念
PWM:Pulse width modulation - 脈沖寬度調制 (定時器)
脈沖:方波信號
方波信號:一個高電平和一個低電平組成的波形
脈沖寬度調制:調制一個方波信號中高電平或者低電平的占比
方波周期:一個方波信號持續的時間
方波頻率:單位時間可以生成的方波個數????????????????周期和頻率成反比
周期的單位:s? ? ? ? ms? ? ? ? μs? ? ? ? ns頻率的單位:Hz(bps) KHz(Kbps) MHz(Mbps) GHz(Gbps)
占空比:高電平信號在一個方波周期內的占比
![]()
圖 1 不同占空比 ? ? ? ? 圖1(1)占空比為 50%,(2)占空比為 70%.
1)PWM 的作用
? ? ? ? 通過 PWM 調節周期內高低電平的占比,對基于頻率參數控制的外設(蜂鳴器、馬達、直流電機等)可以進行更加有效的控制。
![]()
圖 2 PWM 信號
三、分析電路圖
底板上的蜂鳴器引腳:PA15 - TIM2_CH1風扇引腳:PC6 - TIM3_CH1震動馬達引腳:PC7 - TIM3_CH2
![]()
圖 3? 查找蜂鳴器引腳 ![]()
圖 4 查找風扇引腳 按圖 3 - 圖 5 所示查找到三個外設的引腳。![]()
圖 5 查找震動馬達引腳
四、分析芯片手冊
4.1 定時器介紹
1)介紹
![]()
圖 6 通用定時器 TIM2 - TIM5 介紹 ? ? ? ? TIM2/TIM3/TIM4/TIM5 都是通用可編程的定時器。
????????通用定時器由一個可編程預分頻器驅動的?16 位或?32位自動重載計數器組成。
? ? ? ? 它們可用于多種用途:測量輸入信號的脈沖長度(輸入捕獲)或生成輸出波形(輸出比較和脈沖寬度調制(PWM))。
? ? ? ? 利用定時器預分頻器和 RCC(復位和時鐘控制)時鐘控制器預分頻器,脈沖長度和波形周期可在幾微秒到幾毫秒的范圍內進行調制。
? ? ? ? 這些定時器之間完全相互獨立,不共享任何資源。
2)主要特性
![]()
圖 7 通用定時器 TIM2 - TIM5 主要特性
- 16 位或 32 位向上、向下、向上/向下自動重載計數器。
- 16 位可編程預分頻器,可將計數器時鐘頻率從 1 到 65535 之間的任意系數分頻(也可動態分頻)。
- 最多 4 個獨立通道,用于
- 輸入捕獲
- 輸出比較
- 脈沖寬度調制(PWM)生成(邊沿對齊和中心對齊模式)
- 單脈沖模式輸出
3)功能描述
![]()
圖 8 通用定時器 TIM2 - TIM5 功能描述 ? ? ? ? 定時器基本單元。
????????可編程定時器的主要模塊是一個帶有相關自動重載寄存器的 16 位 / 32 位計數器。計數器可以向上計數、向下計數,或者既向上又向下計數。計數器時鐘可由預分頻器分頻。
? ? ? ? 定時器基本單元包括:
- 計數寄存器 - TIMx_CNT
- 分頻寄存器 - TIMx_PSC
- 自動重載寄存器 - TIMx_ARR
4)預分頻系數發生變化波形圖
![]()
圖 9?預分頻系數發生變化波形圖
4.2 框
![]()
圖 10 TIMx 定時器內部框圖 ????????分頻器的分頻范圍: 16 位(分頻系數的使用范圍: 1 - 65535);
計數器的計數范圍: 16 位(計數數值范圍: 0 - 65535)32 位的(計數范圍: 0 - (2^32) - 1);
計數器 / 定時器的計數方式:邊沿對齊方式(遞增計數方式、遞減計數方式 / 向下計數方式)、中心對齊計數方式(先遞增再遞減計數方式)。遞增計數方式:
????????CNT 計數器由分頻后的時鐘 CK_CNT 驅動工作,每來一個分頻后的時鐘,CNT 計數器中的值從 0 開始 + 1;
首先,需要設置自動重載寄存器中的值(ARR = 1000)和計數器的計數方式(遞增計數方式);
當計數器開關開始工作時,自動重載寄存器中的值會被加載到計數器,每來 1 個時鐘信號,計數器會從 0 開始 + 1;
????????直到計數器中的值加到和自動重載寄存器中的值相等時,此時就代表一個 PWM 方波產生了
當產生一個 PWM 方波后,會產生一個溢出事件(標志位),CNT 計數器又會回到 0,重新開始 + 1,循環操作。遞減計數方式:
首先,需要設置自動重載寄存器中的值(ARR = 1000)和計數器的計數方式(遞減計數方式);
當計數器開關工作時,自動重載寄存器中的值(ARR = 1000)會被加載到計數器中,每來 1 個時鐘信號,計數器中的值會從 1000 開始 - 1;
直到計數器中的值遞減到 0 時,此時就代表一個 PWM 方波產生了;
當產生一個 PWM 方波后,會產生一個溢出事件(標志位),CNT 計數器中的值又會回到 1000,重新開始 - 1,循環操作。先遞增再遞減計數方式:
首先,需要設置自動重載寄存器中的值(ARR = 1000)和計數器的計數方式(先遞增再遞減計數方式);
當計數器開關開始工作時,自動重載寄存器中的值會被加載到計數器,每來 1 個時鐘信號,計數器會從 0 開始 + 1;
當計數器中的值加到和自動重載寄存器中的值相等時,開始遞減,也就是每來 1 個時鐘信號,計數器會從 1000 開始 - 1;
????????直到計數器中的值遞減到 0 時,此時就代表一個 PWM 方波產生了;
當產生一個 PWM 方波后,會產生一個溢出事件(標志位),循環上述操作。目的:為了生成一個自定義脈寬的 PWM 波信號(可以人為改變高低電平占比的方波信號,也就是可以人為改變占空比的方波信號)
生成一個自定義脈寬的方波信號的流程:
- 準備工作:(默認以初始給出的頻率值為頻率甲)
1.1 由 RCC 產生并分配給 TIM 一個分頻前的時鐘頻率 CK_PSC = 160MHz
1.2 設置分頻寄存器中的分頻系數 PSC = 160,分頻后的時鐘頻率 CK_CNT = 100MHz,分頻后的時鐘可以驅動計數工作(遞增 / 遞減計數)
1.3 設置自動重載寄存器的值(ARR = 1000),設置計數器的計數方式為遞增計數方式,設置捕獲比較存儲的值 CCR1 = 700- 自動重載寄存器中的值(ARR)會被加載到計數器(CNT)中
- 每來 1 個時鐘信號,計數器中的值從 0 開始 + 1
- 當計數器中的值(CNT)加到和比較 / 捕獲寄存器中的值(CCR1)相等時,此時輸出的電平發生翻轉
- 接著,計數器中的值繼續 + 1,直到加到和自動重載寄存器中的值(ARR)相等時,此時就代表一個自定義脈寬的 PWM 方波產生了
![]()
圖 11 默認初始輸出電平不同時的占空比
????????分頻前時鐘 CK_PSC = 160 MHz,分頻系數 PSC = 160,自動重載寄存器 ARR = 1000,計數器計數方式為遞增計數,捕獲/比較寄存器 CCR1 = 700;
? ? ? ? 默認輸出初始電平為高電平。
則:
分頻后的時鐘頻率 CK_CNT = CK_PSC / PSC = 160MHz / 160 = 1MHz(1s內產生1M個時鐘信號) 分頻后的時鐘周期 = 1 / 分頻后的時鐘頻率 = 1 / 1MHz = 1us(產生一個時鐘信號需要1us)
生成的PWM方波的頻率 = 分頻后的時鐘頻率CK_PSC / 自動重載寄存器的值ARR = 1MHz / 1000 = 1000Hz = 1KHz 生成的PWM方波的周期 = 1 / 生成的PWM方波的頻率 = 1 / 1000Hz = 0.001s = 1ms
生成的PWM方波的周期 = 分頻后的時鐘周期 * +1次數 = 分頻后的時鐘周期 * ARR = 1us * 1000 = 1ms 生成的PWM方波的頻率 = 1 / 生成的PWM方波的周期 = 1 / 1ms = 1KHz
生成的PWM方波的占空比 = 700 / 1000 * 100% = 捕獲/比較寄存器的值CCR1 / 自動重載寄存器的值ARR * 100% = 70%
- PWM方波的頻率、周期 與 分頻寄存器的分頻系數 PSC、自動重載寄存器的值 ARR 有關;
- PWM方波的占空比 與 自動重載寄存器的值 ARR、捕獲/比較寄存器的值 CCR1、輸出的初始電平(有效電平)、PWM 的工作模式 有關。
4.3 邊沿對齊方式 - 遞增計數

4.4 邊沿對齊方式 - 遞減計數

4.5 中心對齊計數

4.6 TIMx_CR1 寄存器

1)Bit 6:5
位 6:5?CMS[1:0]:中心對齊模式選擇
00:邊沿對齊模式。計數器根據方向位(DIR)進行遞增或遞減計數。
01:中心對齊模式 1。計數器交替進行遞增和遞減計數。配置為輸出的通道(TIMx_CCMRx 寄存器中 CCxS=00)的輸出比較中斷標志僅在計數器遞減計數時置位。
10:中心對齊模式 2。計數器交替進行遞增和遞減計數。配置為輸出的通道(TIMx_CCMRx 寄存器中 CCxS=00)的輸出比較中斷標志僅在計數器遞增計數時置位。
11:中心對齊模式 3。計數器交替進行遞增和遞減計數。配置為輸出的通道(TIMx_CCMRx 寄存器中 CCxS=00)的輸出比較中斷標志在計數器遞增或遞減計數時都會置位。
注意:只要計數器使能(CEN=1),就不允許從邊沿對齊模式切換到中心對齊模式。
2)Bit 4
位 4?DIR:計數方向位
0:計數器用作向上計數器,遞增計數
1:計數器用作向下計數器,遞減計數
3)Bit 0
位 0?CEN:計數器使能
0:計數器不使能
1:計數器使能
4.7 TIM_CCMR1 寄存器

1)Bit 7
位 7?OC1CE:輸出比較 1 清除使能(通道 1 的輸出比較寄存器清除使能位)
0:OC1Ref 不受 ETRF 輸入的影響
1:一旦在 ETRF 輸入上檢測到高電平,OC1Ref 就會被清除
2)Bits 16, 6:4
![]()
圖 17 TIM_CCMR1 的?Bits 16, 6:4 ![]()
圖 18?TIM_CCMR1 的?Bits 16, 6:4 設置為 0110(PWM 模式 1) ![]()
圖 19?TIM_CCMR1 的?Bits 16, 6:4 設置為 0111(PWM 模式 2)
4.8?TIM_CCER 寄存器
![]()
圖 20?TIM_CCER 位 3 CC1NP:捕獲 / 比較 1 輸出極性。
CC1 通道配置為輸出:在這種情況下,CC1NP 必須保持清零。位 1 CC1P:捕獲 / 比較 1 輸出極性。
CC1 通道配置為輸出:
0:OC1 高電平有效 - 通道1的活躍電平(有效電平)為高電平信號,不活躍電平(無效電平)為低電平信號
1:OC1 低電平有效 -?通道1的活躍電平(有效電平)為低電平信號,不活躍電平(無效電平)為高電平信號位 0 CC1E:捕獲 / 比較 1 輸出使能 -?通道 1 的捕獲 / 比較功能使能
CC1 通道配置為輸出:
?0:關閉 - OC1 未激活
?1:開啟 - OC1 信號在相應的輸出引腳上輸出 -?使能比較輸出的功能
4.9?TIM_CNT 寄存器

計數器中的值可以人為手動寫入;
一般需要手動寫入時,應用在對計數器清0 / 設置閥值;
一般計數器中的值從自動重載寄存器(ARR)中來。==========================================================
位 31 CNT [31]:計數器值的最高有效位(在 TIM2 和 TIM5 上)
在其他定時器上為保留位。位 30:16 CNT [30:16]:計數器值的最高有效部分(在 TIM2 和 TIM5 上)
位 15:0 CNT [15:0]:計數器值的最低有效部分
4.10?TIM_PSC 寄存器

分頻后的時鐘頻率 = 分頻前的時鐘頻率 / (PSC寄存器中的值 + 1)
4.11?TIM_ARR 寄存器

4.12?TIM_CCR1 寄存器

五、CubeMX 配置
以震動馬達為例:
將 PC7 引腳配置為 TIM3_CH2 模式,設置 TIM3 的 時鐘源和通道 2 的模式![]()
圖 25 配置 PC7 引腳
![]()
圖 26 TIM3 參數含義 ![]()
圖 27 TIM3 參數設置 ? ? ? ? 按照如圖所示設定 TIM3 的參數。
? ? ? ? 之后和之前一樣設置 Debug、時鐘頻率 160Mhz、工程設置。直接生成代碼。
六、API 接口
6.1?HAL_TIM_PWM_Start 函數
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
1)功能
? ? ? ??HAL庫提供的用于開啟某個定時器下某個通道的PWM功能的函數
2)參數
????????htim:可以代表TIM3外設控制器的句柄
????????Channel:需要開啟PWM功能的通道
3)返回值
????????成功,返回 HAL_OK(0)
????????失敗,返回錯誤碼
6.2?__HAL_TIM_SET_COMPARE 宏函數
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
1)功能
????????HAL庫提供的用于設置捕獲/比較寄存器中數值的函數(向捕獲/比較寄存器中寫入值)
2)參數
????????__HANDLE__:TIM3外設控制器的句柄對象
????????__CHANNEL__:需要寫入數值的通道(1/2/3/4)
????????__COMPARE__:需要寫入到捕獲/比較寄存器中的值
七、代碼
int main(void)
{/* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){for(int i=100;i<=900;i+=100){__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,700);HAL_Delay(2000);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}