呼吸燈,這個在手機或者其他設備設備上面都有類似的燈,生活中比較常見的。
單片機中怎么實現呢,通常是兩種2中方案,1、硬件pwm輸出控制,2、使用io模擬
0、視覺殘留,人的眼睛有視覺殘留,對於快速閃爍的東西無法分辨出來,看電影電視就是這個道理,其實就是快速的播放很多張靜止的畫面,就以為是動起來了,放映室里的交卷就是這樣的快速播放,我們就可以看電影了。日光燈也有閃爍,只是我們看不到,通常就是50HZ,和交流電是一樣的頻率,周期就是20ms。呼吸燈就是快速的改變占空比二導致看起來漸亮漸暗,而不會有閃爍的感覺。
1、硬件pwm,在高級的單片機中都有,和定時器相結合的,就是快速的更新pwm的占空比,來欺騙人的眼睛,周期設置為20ms左右,每一個周期分100份,那么200us就可以翻轉一次,也可以快一點,快慢需要根據led的翻轉速率。如果周期不變,分成50份,那么每400us就可以翻轉一次。400us就稱為最小分辨率。
假設,周期=20ms,細分50等分,那么從全滅到全亮的過程,單片機每20ms更新一次占空比,可以更新50次,(0%~100%=0-49)每一次更新一次占空比的大小,就可以實現呼吸燈的效果,使用硬件pwm可以很方便的實現這個效果,而且單片機處理起來很輕松。
2、如果用io模擬,就稍微需要點技巧,還是上面的假設,假設,周期=20ms,細分50等分,那么從全滅到全亮的過程,單片機每20ms更新一次占空比,可以更新50次,(0%~100%=0-49)每一次更新一次占空比的大小。
哪里更新呢?就是定時器中斷中,定時器中斷設置為400us,每一次調用定時中斷,都計數一次,然后和當前的占空比對比,比如占空比=0,那么計數50次(時間就累計了20ms),如果計數器都不小於占空比,則熄滅led燈,50次比較后,占空比+1,那么led燈就會燈亮2%的時間,下次點亮4%的時間,以此類推。。。到98%,每20ms多2%的點亮時間。
漸暗的過程,就是將占空比漸漸減少即可。計數器依然是0-50的計數,然后進行對比。
如果定時中斷=100us,那么可以將一個pwm周期(20ms)細分成200份,更加精細控制。
3、小結
不過io模擬的方式是比較耗費定時器資源的,尤其是幾百us級別的中斷,而且led的翻轉速率也是有上限的,因此,中斷里的函數執行速度不可能因為主頻上升了,就能提升很多。畢竟瓶頸在led燈的翻轉速度,中斷里的語句至少是us級別的執行時間。
這個原理不難,具體到過程我也是看來網上的代碼,運行后分析得出。