STM32 嵌入式學習入門(4)——PWM原理

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/FelikZhang/article/details/79237573

STM32 嵌入式學習入門(4)——PWM原理


本文先對STM32F103的通用定時器作一簡單介紹,然後詳細介紹通用定時器的一個應用——輸出PWM波形的原理。整個文章以介紹“怎麼用”爲主,對於通用定時器以及PWM相關的理論和概念只是點到爲止。對於具體的用STM32輸出PWM波,寫好了會把鏈接放過來。


一、STM32F103通用定時器簡介:

通用定時器是一個通過可編程預分頻器驅動的16位自動裝載計數器構成的定時器。它適用於多種場合,包括測量輸入信號的脈衝長度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)。使用定時器預分頻器和RCC時鐘控制器預分頻器,脈衝長度和波形週期可以在幾個微秒到幾個毫秒間調整。每個定時器都是完全獨立的,沒有互相共享任何資源。它們可以一起同步操作。


STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定時器功能特點包括:
  ①位於低速的APB1總線上(APB1)
  ②16 位向上、向下、向上/向下(中心對齊)計數模式,自動裝載計數器(TIMx_CNT)。
  ③16 位可編程(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘頻率的分頻係數 爲 1~65535 之間的任意數值。
  ④4 個獨立通道(TIMx_CH1~4),這些通道可以用來作爲: 
  輸入捕獲 
  輸出比較
  PWM 生成(邊緣或中間對齊模式) 
  單脈衝模式輸出 
⑤可使用外部信號(TIMx_ETR)控制定時器和定時器互連(可以用 1 個定時器控制另外一個定時器)的同步電路。

如下事件發生時產生中斷/DMA(6個獨立的IRQ/DMA請求生成器): 
①更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發) 
②觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數) 
③輸入捕獲 
④輸出比較 
⑤支持針對定位的增量(正交)編碼器和霍爾傳感器電路 
⑥觸發輸入作爲外部時鐘或者按週期的電流管理
STM32 的通用定時器可以被用於測量輸入信號的脈衝長度(輸入捕獲)或者產生輸出波形(輸出比較和 PWM)等。   
使用定時器預分頻器和 RCC 時鐘控制器預分頻器,脈衝長度和波形週期可以在幾個微秒到幾個毫秒間調整。STM32 的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。



二、PWM原理:

(一)PWM簡介:

PWM是英文“Pulse Width Modulation” 的縮寫,中文名稱爲:脈衝寬度調,簡稱脈寬調製。

脈衝是指短時間內出現電壓或電流的突然變化,脈衝寬度指的是脈衝持續的時間,即高電平或低電平持續的時間。脈衝寬度調製就是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點來說,就是對脈衝寬度的控制。就是說在一週期內(每個週期的時間都是相等的),脈衝可能全部表現爲高電平,也可能全部表現爲低電平,也可能在一個週期的一部分時間內表現爲高電平,剩餘部分時間表現爲低電平。

PWM的作用:脈衝寬度調製要做的就是控制一個週期內高電平(或低電平)持續的時間。舉個例子:

PWM控制電機轉速:我們要控制電機的轉速,可以有這麼兩個思路,一個思路是改變電機兩端的電壓值,讓電機的轉速發生變化。這個想法有很大的缺陷,實現起來也不好實現。第二個思路是PWM電機調速法。通俗點可以這麼解釋這個事情:比方說一個額定電壓3.3V的電機,以1秒爲一個時間週期。第一個週期內,我給電機通電1秒鐘(通電電壓大小3.3V),也就是說這1秒內所有時間電機應當都是全速轉動的。第二個週期內,給電機通電0.5秒鐘(通電電壓大小仍爲3.3V),剩餘0.5秒電機兩端電壓爲0,這樣的話,這個週期內電機只有一半的時間在全速轉動,另一半時間電機靠慣性在轉動。顯而易見,上述兩個過程電機的轉速是不同的,這就是PWM調速的原理:在一個週期內,高低電平持續的時間是可變的,通過改變在一個週期內高電平所佔整個週期的時間的長短去控制電機的轉速。這裏有一個專有名詞——佔空比(佔空比:佔空比是指在一個脈衝循環內,通電時間相對於總時間所佔的比例)。

再舉一個LED燈的例子。我們經常能看到一些燈由全滅的狀態逐漸變亮,然後達到最亮,再慢慢變滅的過程,最典型的就是有些手機的消息提示的那個燈,或者有些霓虹燈也有這種效果。我不知道這些例子具體到底是不是通過PWM實現的,但是這些效果都可以通過PWM去實現。比方還是以1秒爲一個週期,第一個週期中,整個一秒鐘時間內燈兩端的電壓爲0,下一個週期中,前0.1秒燈兩端電壓爲燈正常工作時的電壓,後0.9秒燈兩端電壓爲0……通電時間增加到1秒時燈最亮,然後通電時間再以一個週期0.1秒的值遞減,直到減爲0,有慢慢增加,以此類推,就能實現上述的燈漸亮漸滅的過程。

注:這裏要注意的是我爲了舉例子方便說週期爲1秒,但實際上要實現這些效果,週期非常小,可能只有0.1秒甚至更小。

通過上面的介紹和兩個例子相信大家對PWM這個東西應該有所瞭解了,也就不難理解PWM是通用定時器的一個應用這件事情了。這裏再強調一下,PWM改變的是佔空比,是高電平在一個週期內週期總時間的長度。而不是改變電壓的值,不要搞錯了。我就碰到過有同學把這個搞混了。

(二)PWM原理


上面這張圖能很清楚地解釋清楚PWM的工作過程,這裏要介紹兩個寄存器:自動重裝載寄存器(ARR)、捕獲比較寄存器(CCRx)。

自動重裝載寄存器(TIMx_ARR):



捕獲比較寄存器(TIMx_CCR1):


PWM的工作過程如下:首先ARR寄存器裏面的值確定了一個PWM週期,就是我們上面舉的那兩個例子中的“1秒”(注意這個週期是在PWM系統初始化的時候寫入ARR寄存器的,寫入以後一般就不再改動了)。然後CCR寄存器裏面的值是PWM工作過程中確定的,它可以爲一個定值,也可以是一個變化的值。

當它是一個定值時(就像圖片裏的那樣),佔空比就是一個定值,如果放到上面那個LED燈的例子,那麼實驗現象就不是燈會漸亮漸滅,而是始終維持一個比較暗的亮度,如果CCR裏面的值設定得越靠近ARR寄存器裏面的值(只是靠近,但不大於),那麼按照圖上來看,就是每個週期內高電平持續的時間越短,至於燈到底是更亮了還是更暗了就得實際情況具體分析了。

當它是一個變化的值的時候,在程序裏就可以設置一個變量,讓這個變量按照一定規律遞增(或遞減)。然後把這個值寫入到CCR寄存器中,這樣每個週期中PWM的佔空比就是不同的。宏觀上,就能看到上面的LED燈的漸亮漸滅的過程。


相關的概念和基本原理介紹完了,下面就是一些細節和代碼的實現了,下篇文章會寫到這些內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章