閑言碎語
上篇文章里面的一個綜合例子里面有用到用tmr模塊來模擬pwm輸出實現(xiàn)呼吸燈效果兰迫。不過信殊,tmr模塊最小時間單位是1ms,模擬出來的pwm效果實在是不理想汁果。剛好鸡号,nodeMCU有提供pwm模塊。這回就來講講pwm模塊须鼎。
模塊函數(shù)
數(shù)了一下鲸伴,總共有8個函數(shù)府蔗。單從函數(shù)名字上來看,還是很好理解的汞窗。讓我們快速的過一下姓赤。
序號 | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | pwm.close() | pin | nil |
2 | pwm.getclock() | pin | number |
3 | pwm.getduty() | pin | number |
4 | pwm.setclock() | pin, clock | nil |
5 | pwm.setduty() | pin, duty | nil |
6 | pwm.setup() | pin, clock, duty | nil |
7 | pwm.start() | pin | nil |
8 | pwm.stop() | pin | nil |
- .close用來讓一個pin退出pwm模式。pin的范圍從1~12仲吏。pin_0不支持pwm功能不铆。
- .getclock可以獲取一個pin的pwm頻率。
- .getduty獲取一個pin的占空比裹唆。
-
.setclock設置pwm的頻率誓斥。文檔中提到,使用時只能設置一個頻率许帐。頻率范圍從11000劳坑。然而,查閱esp8266的技術文檔成畦,其中提到頻率是從100Hz1KHz距芬。通過,用示波器抓取pwm發(fā)現(xiàn),當參數(shù)傳入1的時候循帐,pwm的頻率就是1Hz框仔;傳入1000,則輸出1KHz拄养。nodeMCU項目組不知道使用了黑科技离斩,竟然比官方的頻率更低。
- .setduty用于設置一個pin的占空比瘪匿。取值范圍0~1023捐腿。
- .setup設置pin的pwm模式。文檔中提到最多支持6個pin同時為pwm模式柿顶。
- .start啟動pwm輸出茄袖。
- .stop暫停pwm輸出。注意嘁锯,和.close的區(qū)別宪祥。
函數(shù)很簡單,沒必要一個一個舉例子了家乘。找個RGB的三色led燈蝗羊,接在pin1~pin3上。我手上的led是共陽的仁锯。
pwm.setup(1, 500, 128)
pwm.setup(2, 500, 258)
pwm.setup(3, 500, 512)
pwm.start(1)
pwm.start(2)
pwm.start(3)
接著可以通過使用.setduty手動調節(jié)單個led的亮度耀找,數(shù)字越大,亮度越低。使用.stop來暫停pwm輸出野芒。不過蓄愁,使用.stop后,發(fā)現(xiàn)燈更亮了狞悲。說明pwm停止了撮抓,pin輸出低電平。
綜合小例子
這次摇锋,用pwm來實現(xiàn)上一篇文章實現(xiàn)的呼吸燈丹拯。看看效果如何荸恕。
pwm.setup(2, 500, 1023)
pwm.start(2)
up = 0
function changeDuty()
local duty = pwm.getduty(2)
if(up == 1) then
if(duty < 900) then
pwm.setduty(2, duty + 1)
else
up = 0
end
else
if(duty > 0) then
pwm.setduty(2, duty - 1)
else
up = 1
end
end
end
tmr.alarm(0, 1, tmr.ALARM_AUTO, changeDuty)
一點問題
在嘗試動態(tài)調節(jié)兩路pwm的占空比的時候乖酬,這玩意總是重啟了。不知道是不支持亮度動態(tài)調節(jié)融求,還是程序上有什么BUG咬像。
簡書評論不能貼圖, 如有需要可以到我的GitHub上提issues