PWM視頻代碼剖析與解釋

1、不同頻率LED燈閃爍
接下來(lái)我們以下面LED燈的閃爍代碼為例子,改變延時(shí)長(zhǎng)短來(lái)看LED燈的效果



通過(guò)三個(gè)對(duì)比實(shí)驗(yàn)我們發(fā)現(xiàn)隨著頻率的升高,我們的LED燈慢慢的開(kāi)始感覺(jué)不到閃爍,由于我們?nèi)搜鄣囊曈X(jué)停留效應(yīng),一般大于50Hz的刷新率就能滿足我們的要求

2、高頻率LED閃爍變形過(guò)程
我們還是以這個(gè)代碼,將頻率固定在50Hz,然后保持周期不變即高低電平加起來(lái)的時(shí)間等于40ms,然后改變高低電平的占空比(高低電平占總周期的百分比),我們通過(guò)調(diào)節(jié)高低電平的延時(shí)的長(zhǎng)度來(lái)調(diào)節(jié)亮度的占比
代碼部分:




我們把上面的動(dòng)作連貫起來(lái),也就是說(shuō)把亮度延時(shí)做成連續(xù)變化,為了在實(shí)際中效果更好,我們將延時(shí)改成延時(shí)200個(gè)us,這樣連續(xù)變化效果更好
代碼部分:

我們?cè)龠M(jìn)一步修改下,讓它變成一個(gè)呼吸的效果
代碼部分:


LED“流星雨”
首先我們先來(lái)分析下流星雨的邏輯:
首先我們要實(shí)現(xiàn)一個(gè)這樣的效果,第一個(gè)最亮,然后后一個(gè)是前一個(gè)的45%的亮度

代碼部分:

代碼解釋:
我門首先給亮度數(shù)組ledPwm[12]儲(chǔ)存按比例分配的數(shù)值,這里我是按70%的一個(gè)比例來(lái)計(jì)算
比如說(shuō)最暗是100,那么次暗的就是100*70% = 70,以此類推,然后我們就按照分配的亮度來(lái)把燈分別點(diǎn)亮
這部分代碼是把所有LED燈先點(diǎn)亮
這部分代碼根據(jù)LED燈的亮暗程度來(lái)分別控制滅的時(shí)間,我們先根據(jù)最大亮度值“maxPWM”來(lái)將亮度分為100份,每份的延時(shí)是1us,然后在內(nèi)部的循環(huán)里面檢查當(dāng)前的亮度值是否到達(dá)分配的份數(shù),如果到達(dá)了,那就熄滅,沒(méi)有到達(dá),就繼續(xù)保持亮

讓LED”流星雨“運(yùn)動(dòng)
顯然這樣靜態(tài)的流星雨還是滿足不了我們的要求,接下來(lái)我們讓流星雨先動(dòng)起來(lái)
我們需要它這樣動(dòng)

我們先試著讓它動(dòng)一位,我只需要把ledPwm[12]這個(gè)數(shù)組里面的值重新進(jìn)行排列就可以了,這其實(shí)就是對(duì)數(shù)組操作


LED“流星雨”連續(xù)運(yùn)動(dòng)
從上面我們知道,我們?nèi)绻修k法對(duì)數(shù)組進(jìn)行連續(xù)的操作,那么就能實(shí)現(xiàn)“流星雨”流動(dòng)的效果
所有代碼參考這個(gè)哥們的:https://www.cnblogs.com/starsnow/p/4570462.html
其中下面這一點(diǎn)代碼是arduino自帶的時(shí)間計(jì)數(shù)器,可以直接讀取里面的數(shù)值,用來(lái)輔助計(jì)數(shù)用的,其實(shí)你也可以不用這個(gè),可以自己直接在里面計(jì)數(shù)也可以的
完整版代碼:把所有需要改動(dòng)的數(shù)值變量全部放在最前面,這是編寫可復(fù)用程序常用的一種做法,可以靈活適應(yīng)多個(gè)燈,同時(shí)可以調(diào)節(jié)速度,調(diào)節(jié)亮度比例


總結(jié):
1、我們了解了PWM的實(shí)現(xiàn)方式
2、LED在不同的頻率下,會(huì)“欺騙”我們的眼睛,這樣是玩單片機(jī)中慣用的一種思路
3、通過(guò)剖析LED"流星雨",我們發(fā)現(xiàn)其實(shí)它就用了一些簡(jiǎn)單的處理方式實(shí)現(xiàn)的,沒(méi)有我們想象中的那么復(fù)雜
4、LED"流星雨"里面有一點(diǎn)簡(jiǎn)單的算法,算法是獨(dú)立于單片機(jī)的,在其他平臺(tái)(51,STM32等)上面同樣可以實(shí)現(xiàn),同時(shí)算法也是一個(gè)程序的靈魂