STM32 嵌入式学习入门(4)——PWM原理
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燈的漸亮漸滅的過程。
相關的概念和基本原理介紹完了,下面就是一些細節和代碼的實現了,下篇文章會寫到這些內容。
總結
以上是生活随笔為你收集整理的STM32 嵌入式学习入门(4)——PWM原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32 flymcu开始连接...
- 下一篇: 【计网】第三章 数据链路层(5)广域网协