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