1.定時器中斷
-
1.關於定時器中斷:記得使用中斷時啓動對應定時器的中斷(此處使用了TIM4)
/* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim4);//Starts the TIM Base generation in interrupt mode. /* USER CODE END 2 */
-
2.定時器的中斷不需要手動清理標誌位。
-
3.注意回調函數要對定時器的句柄進行判斷,看是哪一個定時器發生了中斷。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==htim4.Instance){ cnt++; } }
2.PWM
-
使用高級定時器輸出互補PWM時需要手動啓動各通道(包括互補通道)的PWM輸出。
(【注】:PWM模式爲輸出比較模式的特殊形式,pwm模式在對應定時器上的四個通道產生的頻率是同步的(即相同的),而輸出比較模式在四個通道可以產生的頻率不同。)
/* 啓動通道PWM輸出 */ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); // HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); /* 啓動定時器互補通道PWM輸出 */ HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3); 另:PWM模式可以通過htim1.Instance->CCR4 = i;修改CCR4(ch4的CCR)寄存器的值,從而實現呼吸燈的效果。
-
使用定時器輸出PWM時(普通的輸出比較模式),需要使用HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);使能某個通道的PWM。
__HAL_TIM_SET_COMPARE() // 設置比較寄存器CCRx,一般是用於PWM輸出時控制PWM佔空比(當計數器CNT的值與CCR的值相等的時候,輸出參考信號OCxREF的信號的極性就會改變) //也可以直接控制CCR寄存器。htim1.Instance->CCR4 = i
3.輸出比較和PWM模式的對比
-
輸出比較模式,可以輸出PWM波,而且一個通用定時器的4個通道的PWM波可以頻率、佔空比互不干擾,完全獨立。(????不明白啊。。。。中斷函數來實現嗎?)
而PWM模式產生的波在對應定時器上的四個通道頻率是一致的,只有佔空比是獨立的。 -
PWM是特殊的比較輸出模式,可以調節頻率週期波長(ARR)、佔空比(CCR);比較輸出是可以輸出各種類型的波形,但是佔空比固定50%。
-
兩種模式的區別是 CCRx在不同模式下的作用是不一樣的:
- 輸出比較模式下,CCRx控制的是初相位.即初相位可調。
- PWM模式下,CCRx控制的是高電平的計數週期.初相位不可調,脈寬可調
-
另一個博客:(這個比較清楚了)
- TIM_OCMode_Timing 輸出比較時間模式 (輸出引腳凍結無效)
- TIM_OCMode_Active 輸出比較主動模式 (匹配時設置輸出引腳爲有效電平,當計數值爲比較/捕獲寄存器值相同時,強制輸出爲高電平)
- TIM_OCMode_Inactive 輸出比較非主動模式 (匹配時設置輸出引腳爲無效電平,當計數值爲比較/捕獲寄存器值相同時,強制輸出爲低電平)
- TIM_OCMode_Toggle 輸出比較翻轉觸發模式(當計數值與比較/捕獲寄存器值相同時,翻轉輸出引腳的電平)
- TIM_OCMode_PWM1 向上計數時,當TIMx_CNT < TIMx_CCR*時,輸出電平有效,否則爲無效
向下計數時,當TIMx_CNT > TIMx_CCR*時,輸出電平無效,否則爲有效 - TIM_OCMode_PWM2 與PWM1模式相反
PWM模式就不說了,通過函數設置頻率與佔空比。
其餘幾個所說的“當計數值爲比較/捕獲寄存器值相同時” 即CCRX=CNT;這時候會觸發後面所說的事件,而TIM_OCMode_Active與TIM_OCMode_Inactive
僅觸發一次,所以之後就會出現一直爲高電平或者低電平。TIM_OCMode_Toggle會每次都翻轉,所以也形成一個PWM,而佔空比只會是百分之五十,
週期爲參數period的兩倍,頻率爲1/2,因爲一個period只翻轉一次!翻轉是在CCRX=CNT時翻轉,並不是CNT=ARR(ARR=TIM_TimeBaseStructure.TIM_Period)。
4.輸入捕獲功能
- 重要函數
- uint32_t HAL_TIM_ReadCapturedValue (TIM_HandleTypeDef *htim, uint32_t Channel)
- Function description:Read the captured value from Capture Compare unit.
- Parameters:
- htim: : TIM handle.
- Channel: TIM Channels to be enabled This parameter can be one of the following values:
- TIM_CHANNEL_1 : TIM Channel 1 selected
- TIM_CHANNEL_2 : TIM Channel 2 selected
- TIM_CHANNEL_3 : TIM Channel 3 selected
- TIM_CHANNEL_4 : TIM Channel 4 selected
- __HAL_TIM_GET_COUNTER(&htimx)
- Function description: Gets the TIM Counter Register value on runtime.
- Parameters: __HANDLE__: TIM handle.
- 注意:CCR寄存器是 捕獲/比較寄存器。輸出比較時存放要比較的計數值;輸入捕獲時用來所存捕獲到目標信號時計數器的值
CNT寄存器是 計數器計數值(一直在遞增或者遞減)。
- 這兩個函數的區別:一個讀取CCR寄存器,一個讀取CNT寄存器。
5.定時器編碼器模式
- 配置很簡單
- 三行代碼實現編碼器讀數
uint16_t cnt = 0;
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
cnt = __HAL_TIM_GET_COUNTER(&htim4);
- 注意你購買的編碼器原理圖
- 我用的是NPN開路集電極輸出,需要通過電阻外接電源。
- 我用的是NPN開路集電極輸出,需要通過電阻外接電源。