天天看點

STM32定時器各種功能實驗

定時器實驗

  • 前言
  • 1.脈寬測量輸入捕獲實驗
    • 1.1 硬體設計
    • 1.2 軟體設計
  • 2.PWM 輸出
    • 2.1 硬體設計
    • 2.2 軟體設計
  • 3.PWM 互補輸出
    • 3.1 硬體設計
    • 3.2 軟體設計
  • 4.PWM 輸入
    • 4.1 硬體設計
    • 4.2 軟體設計
  • 4.電容按鍵檢測
    • 5.1 硬體設計
    • 5.1 軟體設計
  • 後記

前言

TIM定時器有很多種應用,這裡挑五個比較典型的實驗展示。

1.脈寬測量輸入捕獲實驗

1.1 硬體設計

根據開發闆引腳使用情況,我們選用通用定時器 TIM5 的 CH1, 就 PA0 這個 GPIO 來測量信号的脈寬。在開發闆中 PA0 接的是一個按鍵,預設接 GND, 當按鍵按下的時候 IO口會被拉高,這個時候我們可以利用定時器的輸入捕獲功能來測量按鍵按下的這段高電平的時間,通過序列槽顯示出來。按鍵的具體原理圖見圖,包含硬體消抖。

STM32定時器各種功能實驗

1.2 軟體設計

程式設計要點:

(1) 定時器用到的 GPIO 初始化

(2) 定時器時基結構體 TIM_TimeBaseInitTypeDef 初始化

(3) 定時器輸入捕獲結構體 TIM_ICInitTypeDef 初始化

(4) 編寫中斷服務函數,讀取捕獲值, 計算出脈寬的時間

軟體部分見如下連結工程(MDK5環境下)

連結: 嵌入式定時器應用之脈寬測量輸入捕獲實驗.

2.PWM 輸出

2.1 硬體設計

使用pwm輸出達到部分點亮綠色led的效果,pwm輸出最終引到pb0腳,低電平有效,輸出pwm波為20Khz,占空比為94%。觀察led亮暗程度,可知占空比越小,燈越亮。

2.2 軟體設計

注意:定時器比較輸出是不需要中斷的

程式設計要點:

(1) 定時器用到的 GPIO 初始化

(2) 定時器時基結構體 TIM_TimeBaseInitTypeDef 初始化

(3) 定時器輸入捕獲結構體TIM_OCInitTypeDef初始化

軟體部分見如下連結工程(MDK5環境下)

連結: 嵌入式定時器應用之輸出pwm波形.

3.PWM 互補輸出

3.1 硬體設計

輸出比較模式比較多,這裡我們以 PWM 輸出為例講解,并通過示波器來觀察波形。實驗中不僅在主輸出通道輸出波形,還在互補通道輸出與主通道互補的的波形,并且添加了斷路和死區功能。

使用進階定時器TIM1 的通道 1 及其互補通道作為本實驗的波形輸出通道,對應選擇 PA8 和 PB13 引腳。将示波器的兩個輸入通道分别與 PA8 和 PB13 引腳連接配接,用于觀察波形,還有注意共地。 在指南者開發闆裡面, PA8 通過一個調帽預設連接配接了蜂鳴器, 如果調帽不拔掉的話, PA8 輸出的 PWM 信号會讓蜂鳴器響。

為增加斷路功能,需要用到 TIM1_BKIN 引腳,這裡選擇 PB12 引腳。程式我們設定該引腳為高電平有效,當 BKIN 引腳被置高低電平的時候,兩路互補的 PWM 輸出就被停止,就好像是刹車一樣。

3.2 軟體設計

程式設計要點:

(1) 定時器用到的 GP IO 初始化

(2) 定時器時基結構體 TIM_TimeBaseInitTypeDef 初始化

(3) 定時器輸出比較結構體 TIM_OCInitTypeDef 初始化

(4) 定時器刹車和死區結構體 TIM_BDTRInitTypeDef 初始化

軟體部分見如下連結工程(MDK5環境下)

連結: 嵌入式定時器應用之PWM 互補輸出實驗.

4.PWM 輸入

4.1 硬體設計

輸入捕獲的一個特例—PWM 輸入。普通的輸入捕獲可以使用定時器的四個通道,一路捕獲占用一個捕獲寄存器,而 PWM 輸入則隻能使用兩個通道,即通道 1 和通道 2, 且一路 PWM 輸入要占用兩個捕獲寄存器,一個用于捕獲周期,一個用于捕獲占空比。

在本節實驗中,我們用通用定時器産生一路 PWM 信号,然後用進階定時器的通道 1 或者通道 2 來捕獲。

實驗中用到兩個引腳,一個是通用定時器 TIM3 的通道 1, 即 PA6, 用于輸出PWM 信号,另一個是進階控制定時器 TIM1 的通道 1, 即 PA8, 用于 PWM 輸入捕獲,實驗中直接用一根杜邦線短接即可 PA6 和 PA8 即可,同時可用示波器監控 PA6 的波形,看看實驗捕獲的資料是否正确。

4.2 軟體設計

程式設計要點:

(1) 通用定時器産生 PWM 配置

(2) 進階定時器 PWM 輸入配置

(3) 編寫中斷服務程式, 計算測量的頻率和占空比,并列印出來比較

程式設計的要點主要分成兩部分,一個是通用定時器的 PWM 信号輸出, 另一個是 PWM信号輸入捕獲。

軟體部分見如下連結工程(MDK5環境下)

連結: 嵌入式定時器輸入捕獲應用之捕獲pwm.

4.電容按鍵檢測

電容按鍵不需要任何外部機械部件,使用友善,成本低,很容易制成與周圍環境相密封的鍵盤,以起到防潮防濕的作用。電容按鍵優勢突出使得越來越多電子産品使用它代替傳統的機械按鍵.

5.1 硬體設計

STM32定時器各種功能實驗

在電路闆未上電時,可以認為電容 Cx 是沒有電荷的,在上電時,在電阻作用下,電容 Cx 就會有一個充電過程,直到電容充滿,即 Vc 電壓值為 3.3V,這個充電過程的時間長短受到電阻 R 阻值和電容 Cx 容值的直接影響。

但是在我們選擇合适電阻 R 并焊接固定到電路闆上後,這個充電時間就基本上不會變了,因為此時電阻 R 已經是固定的,電容 Cx在無外界明顯幹擾情況下基本上也是保持不變的。

現在,我們來看看當我們用手指觸摸時會是怎樣一個情況?如圖 ,當我們用手指觸摸時,金屬感應片除了與地信号形成一個等效電容 Cx 外,還會與手指形成一個 Cs 等效電容。

此時整個電容按鍵可以容納的電荷數量就比沒有手指觸摸時要多了,可以看成是 Cx和 Cs 疊加的效果。在相同的電阻 R 情況下,因為電容容值增大了,導緻需要更長的充電時間。也就是這個充電時間變長使得我們區分有無手指觸摸,也就是電容按鍵是否被按下。

STM32定時器各種功能實驗

現在最主要的任務就是測量充電時間。充電過程可以看出是一個信号從低電平變成高電平的過程,現在就是要求出這個變化過程的時間。我們可以利用定時器輸入捕獲功能計算充電時間,即設定 TIMx_CH 為定時器輸入捕獲模式通道。這樣先測量得到無觸摸時的充電時間作為比較基準,然後再定時循環測量充電時間與無觸摸時的充電時間作比較,如果超過一定的門檻值就認為是有手指觸摸。

圖 為 Vc 跟随時間變化情況,可以看出在無觸摸情況下,電壓變化較快;而在有觸摸時,總的電容量增大了,電壓變化緩慢一些。

為測量充電時間,我們需要設定定時器輸入捕獲功能為上升沿觸發, 圖 中 VH 就是被觸發上升沿的電壓值,也是 STM32 認為是高電平的最低電壓值,大約為 1.8V。 t1 和t2 可以通過定時器捕獲/比較寄存器擷取得到。

不過,在測量充電時間之前,我們必須想辦法制作這個充電過程。之前的分析是在電路闆上電時會有充電過程,現在我們要求在程式運作中循環檢測按鍵,是以必須可以控制充電過程的生成。我們可以控制 TIMx_CH 引腳作為普通的 GPIO 使用,使其輸出一小段時間的低電平,為電容 Cx 放電,即 Vc 為 0V。當我們重新配置 TIMx_CH 為輸入捕獲時電容Cx 在電阻 R 的作用下就可以産生充電過程。

5.1 軟體設計

程式設計要點:

(1) 編寫定時器輸入捕獲相關函數

(2) 測量電容按鍵空載的充電時間 T1

(3) 測量電容按鍵有手觸摸的充電時間 T2

(4) 隻需要比較 T2 與 T1 的時間即可檢測出按鍵是否有手指觸摸

軟體部分見如下連結工程(MDK5環境下)

連結: 利用定時器輸入捕獲檢測電容按鍵.

後記

這幾個實驗可以幫助我們了解STM32定時器的注意功能,即:

輸入捕獲

輸出比較

斷路功能