呼吸燈與pwm
pwm是什么?
PWM的全稱是脈沖寬度調制(Pulse-width modulation),是通過將有效的電信號分散成離散形式從而來降低電信號所傳遞的平均功率的一種方式;
簡而言之,使用矩形方波(離散信號)來等價表示正弦波(連續信號)的方式。只要對方波調頻,在輸出端看來,就等價於輸出了一個連續信號。
不是專業的,通俗的解釋建議看這個知乎問題
在micropython里操作pwm
作為一盞呼吸燈,我們希望它有如下幾個變量我們能夠控制。①呼吸閃亮一次所用時間,②能夠達到的最大亮度
在代碼里,duty_range代表了要達到的最大亮度。這個取值在mpy里是0-1023。第9行的for循環,從0到1000,步長為4,那就意味着一共有1000/4=250級亮度變化。而10行的語句不需要花費時間,只是在給燈一個具體的亮度duty。
則for循環所花費的時間,主要由11行sleep語句確定。通過把延遲系數設定為2ms,這樣,250次循環正好花費了500ms來使燈從亮度0上升到亮度1000
改進
sleep函數是阻塞的,整個程序都會停止,這樣或許會程序執行效率低。可以使用定時器中斷來改進這個過程。
在21和22行,設置了一個定時器,各個參數可以百度查閱,不多贅述。作用是,每隔給定的延時時間過后,就調用一次回調函數。需要注意的是,回調函數需要有一個形參t,用來接收定時器本身,以便在回調函數內部停止定時器,正如12、13行那樣。接收定時器本身的形參不可省略,否則會報形參數量不等的錯誤。