单片机_PWM输出原理详解
單片機_PWM輸出原理詳解
理論篇
??博主自己的經歷告訴我,PWM波的理解和應用確實還是挺重要的,這里專門花一期詳細介紹一下
- 什么是PWM?
??PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,它是通過對一系列脈沖的寬度進行調制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數字編碼。
??通俗的說,就是控制在一個周期內,控制高電平多長時間,低電平多長時間(前面文章種有說過IO口就只有兩種狀態,0和1,對應就是0和5V或者0和3.3V)。也就是說通過調節高低電平時間的變化來調節信號、能量等的變化。
??圖為周期4毫秒的PWM波形
- 兩個重要的概念,頻率、占空比
??頻率是指每秒鐘信號從高電平到低電平再回到高電平的次數,為一個PWM波周期的倒數。上圖中頻率=1/(0.003+0.001)=250 HZ
??占空比是指高電平持續時間比一個周期持續的時間。上圖中占空比=1/(1+3)=25%,所以可以通過控制占空比,來控制輸出的等效電壓。
??所以對于方波的話,頻率和占空比就確定了一個波。
- 怎么能產生一個PWM波?
??方法1:利用芯片內部模塊輸出PWM信號,STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出,這樣, STM32 最多可以同時產生 30 路 PWM 輸出! 但是!!!同一個定時器TIM只能產生一個頻率的PWM波,你只能改變占空比。 具體例程見一下實戰篇STM32部分。
??方法2:利用IO口高低電平轉變輸出PWM信號,比如上圖中先把電平置1,維持1ms,然后將電平拉低,維持3ms,再將電平置高,如此循環往復下去,就可以產生一個周期4毫秒占空比為25%的PWM波了。具體方法就是給IO口加一個定時器,用定時器中斷來實現及時切換高低電平。 具體歷程見以下51單片機部分。
- 定時器
??要想使用51單片機來產生一路PWM,根據上述的方法2,首先你應該知道什么是定時器?定時器是怎么工作的?
??定時器:和計數器說的是一個東西,因為它既能計時也能計數。定時器的實質是,由機器頻率向一個16位寄存器累加,累加滿溢出時觸發中斷。為了產生一個我們想要的時間間隔。比如說1s,所以我們要在這個寄存器里設定一個初值,以至于讓它在這個初值上累加可以產生一個1s的倍數。這樣我們就得到了穩定的時間間隔。
??這個寄存器分為TH(高八位)和TL(低八位)。所以我們需要把計算好的初值分成兩部分分別放入TH和TL。
??過程
??首先,我們通過單片機的晶振頻率得知其時鐘周期,再尤其乘以12得到機器周期。每一個機器周期在寄存器內+1,直到加滿溢出產生中斷。
??舉例說明
??若單片機頻率為12Mhz,其時鐘周期就是1/12μs,機器周期為1μs,也就是每1μs寄存器+1。16位的寄存器加到溢出最多需要(2^16)-1=65535μs,溢出也需要一個機器周期,所以總共要65536μs。但這個值太別扭,和我們要的1s沒什么關系。我們最好讓它記50000μs產生一次中斷,所以其初值就設為65536-50000=15536。但我們還要將這個值分別放在高八位和低八位,所以要將這個十進制數,轉換為4位十六進制數再分開賦值。十進制計算法:TH = 15536/256; TL = 15536%256;,進制計算問題這里不細討論。這樣的話,每50ms就會產生一次中斷。我們只要用程序判斷其中斷20次就記1s。
??定時器部分摘自:https://www.jianshu.com/p/90ea43a7b4fd
- PWM的應用
1 輸出模擬電壓(通過電壓的高低來控制如LED的亮度,直流電機的速度等)
??PWM對模擬信號電平進行數字編碼的方法,計算機只能輸出0或5V的數字電壓值而不能輸出模擬電壓,而我們如果想獲得一個模擬電壓值(介于0 - 5V的電壓值),則需通過使用高分辨率計數器,改變方波的占空比來對一個模擬信號的電平進行編碼。電壓是以一種連接(1)或斷開(0)的重復脈沖序列被夾到模擬負載上去的,連接即是直流供電輸出,斷開即是直流供電斷開。通過對連接和斷開時間的控制,只要帶寬足夠,可以輸出任意不大于最大電壓值的模擬電壓。
??輸出電壓=(接通時間/脈沖時間)*最大電壓值12
?? PWM輸出等效電壓
解釋部分引自 http://www.eeworld.com.cn/mcu/article_2018061939827.html
2 控制舵機
??大一大二期間做項目經常用到的一個元件就是舵機,而舵機的控制就是通過一個固定周期但是不同占空比來控制舵機擺角的位置的。
??舵機的控制一般需要一個20ms左右的時基脈沖(頻率為50HZ),該脈沖的高電平部分一般為0.5ms-2.5ms范圍內的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應的控制關系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
此圖可以表現脈沖寬度(也可以轉換成占空比)和舵機擺臂的位置圖
3 控制步進電機
??之前在做項目的過程中,一般涉及到精確控制位移的時候,這個時候往復式驅動原件(舵機)就不適合了,所以就會經常用到步進電機。
??步進電機把電脈沖信號變換成角位移以控制轉子轉動的微特電機。在自動控制裝置中作為執行元件。每輸入一個脈沖信號,步進電動機前進一步,故又稱脈沖電動機。 !!!這里注意一點,直接控制單片機的話是脈沖控制,就是進來一個脈沖信號,步進電機轉動一個步進角(一般為1.8°)。所以控制步進電機速度的方式就是通過控制 頻率 (占空比一般都是50%)但是!!!現在可以通過接入步進電機驅動板的方式(比如博主之前使用的一款步進電機驅動板Tb6560)細分步進角。比如細分為2,一個脈沖步進電機就轉動半個脈沖(0.9°)
PS:這里由于篇幅原因,舵機、步進電機的控制代碼就不上傳了,網上一搜一大堆,也可以聯系博主私法給你嘍!
實戰篇
??這里使用51和STM32實現呼吸燈的功能,同樣原理也可以控制直流電機,舵機是頻率一定的情況下控制占空比來控制擺臂的方向,而步進電機是通過控制頻率的方式來控制速度。
51部分
??例程使用51單片機將P1.0接一個二極管。運用PWM輸出等效模擬電壓完成呼吸燈功能。引
??例程部分引自 http://www.eeworld.com.cn/mcu/article_2018061939827.html 有刪改
32部分
??轉自正點原子庫函數手冊PWM部分教程
??這里用到了 TIM3 的部分重映射功能(重映射:可以理解成把管腳的外設功能映射到另一個管腳,具體哪個引腳可以映射見參考手冊), 例程把 TIM3_CH2 直接映射到了 PB5 上。
皮一下,歡迎交流啊! 共同學習,共同進步。
總結
以上是生活随笔為你收集整理的单片机_PWM输出原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++麻将
- 下一篇: 【前端开发基础】CSS基础知识以及CSS