stm32定時器相關知識點總結

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開路集電極輸出,需要通過電阻外接電源。
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章