1. 程式人生 > >【微控制器筆記】NodeMcu入坑—LUA指令碼語言PWM調光

【微控制器筆記】NodeMcu入坑—LUA指令碼語言PWM調光

先上程式碼

--pwm.lua
pin = 4
dutyMAX = 1023
dutyMIN = 0
flag = 0
pwm.setup(pin,100,dutyMAX)
pwm.start(pin)
function changeDuty()
    local duty = pwm.getduty(pin);
    print(duty);
    if(flag == 0) then
        if (duty > dutyMIN+10) then
            pwm.setduty(pin,duty - 10);
        else
            flag = 1;
        end
    else
        if (duty < dutyMAX-10) then
            pwm.setduty(pin,duty + 10);
        else
            flag = 0;
        end
    end
end
tmr.alarm(0 , 50 , tmr.ALARM_AUTO , changeDuty);

這個程式功能很簡單,就是每50ms呼叫一次changeDuty功能函式,而這個函式採用的是定時器回撥的方式去實現,

tmr.alarm(0 , 50 , tmr.ALARM_AUTO , changeDuty);

上面這個句話就是把changeDuty這個函式註冊到定時器,定時器每50ms會回撥一次。在這個功能函式裡面就更簡單了,每次進入都會列印一次當前的pwm佔空比,以及改變佔空比,實現pwm調光呼吸燈。

下面一步步講解:

管腳初始化 PWM功能函式:

pwm.setup(pin,clock,duty)
pin 1〜12, IO 指數
clock 1〜1000, pwm 頻率
duty 0〜1023, pwm 佔空比, 最大 1023(10bit)
自定義函式
function 函式名()
程式碼塊
end 
if 流程控制
if (判斷條件) then
[條件滿足是執行的語句]
else
[條件不滿足是執行的語句]
end 
定時器
NodeMCU 提供 7 個靜態定時器, 編號為 0-6
使用此計時器釋放資源時, 請呼叫
tmr.unregister()
tmr.alarm([id/ref], interval_ms, mode, func())
引數:
id/ref 定時器 ID(0-6) 或物件,
interval_ms 定時器間隔(以毫秒為單位) 。 最大值是 6870947。
mode 定時器模式:
tmr.ALARM_SINGLE 一次性報警(不需要呼叫 tmr.unregister())
tmr.ALARM_SEMI 手動重複報警(呼叫 tmr.start()重啟)
tmr.ALARM_AUTO 自動重複報警
func(timer) 用定時器物件作為引數呼叫的回撥函式 

有兩個參考資料很值得去下載,度娘一下就有,這裡就不上傳了

1.nudemcu中文版API


2.LUA程式設計指南



By Urien 2018年7月4日 15:48:21