|
相信大家學習單片機的第一課就是點亮第一盞LED燈了吧,初次點亮LED的時候的心情肯定是很激動的,可以操控眼前這個小小的芯片完成自己編寫的指令,頓時感覺到很奇妙。初次了解之后便會激發我們的探索精神,當學習了PWM之后,控制RGB彩燈隨意調出千變萬化的顏色肯定不再是難事,用在各種項目上,RGB燈會讓作品更加鮮艷動人。在這美麗的背后,其實隱藏了很多的科學道理,RGB燈的顏色能千變萬化的原因是因為其內部集成了3個獨立的3原色燈珠,然后使用PWM波控制每個燈珠處在不同的亮度,便可以得到不同的色彩。但是一個RGB燈可能會占用多個端口,想控制很多個RGB燈便是有些難度,好在隨著集成工藝的發展,這一切不再是問題,如今的工藝促使了一種新型燈珠的出現,那就是單總線LED。
簡單點來說就是這種類型的燈珠內置了一個驅動電路,它控制著燈珠發出的顏色,并且有一個數據輸入口,意味著我們可以往在這個燈珠里面輸入數據,然后燈珠內部的電路就會驅動的燈珠發出我們想要的顏色。這個電路呢還有一個數據的輸出口,也就是說它可以將接受到的數據再次發送出去,送給下一個燈珠的輸入,所以這使得所有的燈珠都可以連在一起,只需要使用一個IO口控制,這就相比傳統的RGB燈節省了很多的端口。
這種類型的燈珠主要的核心就在它里面集成的那樣一個驅動電路,這種類型的驅動電路有很多種,例如常見的WS2811,2812,SK6812等等,所以用其制作完成的燈珠一般都使用驅動電路的名字來命名。對于燈珠的大小型號呢,則有很多種類,例如5050,3535以及2020等封裝,大家搜索的時候,搜索驅動電路的型號加上封裝型號就可以找到想要的單總線LED了。下面是WS2812采用5050封裝的圖片。
2345截圖20190522154003.png (76.72 KB, 下載次數: 166)
下載附件
2019-5-22 16:53 上傳
本文會就WS2812這款最常用的驅動芯片來講解其的控制方法以及在最后我會寫一些控制這類單總線LED的方法。
由于是單總線通訊,自然沒有時鐘信號線,所以通訊的時序變得非常重要,我找到一份WS2812的數據手冊,查看到了其中提到的輸入數據時序圖。
2345截圖20190522154127.png (25.33 KB, 下載次數: 170)
下載附件
2019-5-22 16:53 上傳
2345截圖20190522154138.png (24.71 KB, 下載次數: 148)
下載附件
2019-5-22 16:53 上傳
可以看到,2812芯片對著時序有著較為嚴格的需要,所以對于0碼和1碼,我們需要嚴格控制單片機延時的時間。并且這款芯片的時序大概都在納秒級的延時,所以對于單片機的要求還是比較高的,我采用的是增強型的51單片機,速度上足夠完成納秒級的延時。
下面看到的數據的輸入方法,可以看到每個數據包都是24bit長,也就是3個字節,發送完第一個24bit數據包之后就是接著發送第二個,可以看到在D2線上,第一個24bit數據包自動被忽略了,這是由于WS2812的轉發機制,在其接受到第一個完整的24bit數據包之后,再接受到的數據包他會自動將其發送給下一個燈珠,這就是為什么可以一根線控制所有LED燈的秘密。并且WS2812芯片還有鎖存的功能,也就是說送一次數據后,在下一回改變顏色之前都不需要再送數據了,內部的鎖存電路會自動記住當前的顏色值,并控制燈珠一直保持著色彩。
2345截圖20190522154235.png (55.33 KB, 下載次數: 147)
下載附件
2019-5-22 16:53 上傳
對于每一個24bit數據包,其格式如下:每一個字節都表示著顏色的亮度,從高位到低位分別是綠色(G),紅色(R),藍色(B),控制這三個顏色的亮度,我們就可以得到千變萬化的色彩。
2345截圖20190522154312.png (16.18 KB, 下載次數: 141)
下載附件
2019-5-22 16:53 上傳
了解到了數據包的格式,數據手冊里面還給了一張應用電路的圖片,很好的說明了這種單總線LED的連接方法。
2345截圖20190522154320.png (47.43 KB, 下載次數: 132)
下載附件
2019-5-22 16:53 上傳
看完了數據手冊,下面就是對單片機編程,使其可以輸出對應的波形了!
首先是對發送0碼和1碼的程序編寫,由于需要用到納秒級的延時,我使用空語句來進行軟件延時,下面是發送0碼和1碼的代碼截圖。我這里是使用的STC15系列單片機,使用內部時鐘11.0592MHZ,如果有使用相同單片機的朋友請直接參考我的代碼,如果你的單片機類型不一樣或者時鐘頻率不一樣,最好使用示波器或者邏輯分析儀來得到精確的延時。
2345截圖20190522154408.png (6.81 KB, 下載次數: 160)
下載附件
2019-5-22 16:53 上傳
完成了發送0碼和1碼之后,接著就是發送一個字節了,核心思路就是每次判斷字節高位的值來決定發送0還是1
2345截圖20190522154438.png (8.54 KB, 下載次數: 159)
下載附件
2019-5-22 16:53 上傳
經過簡單的編程,所有代碼就完成了,簡單的寫了一個程序,讓前三個燈亮起,呈紅色:
微信圖片_20190522153450.jpg (1.72 MB, 下載次數: 153)
下載附件
2019-5-22 16:56 上傳
其實WS2812的編程較為容易,下面就來說一些我的改進地方。
我編寫了一個使用串口控制RGB燈的程序,就是我可以在串口上發送數據,實時的控制每個LED燈的顏色,這樣會方便后期一些動畫效果的控制。我定義了一個數據格式,一個數據包含有5個字節,分別是幀頭,LED燈的編號,紅色(R)亮度值,綠色(G)亮度值以及藍色(B)亮度值。例如我想要控制第五個燈變成最亮的白色,我就發送
FFH 05H FFH FFH FFH 就可以了,下面是使用這個程序調出來的顏色:
微信圖片_20190522161641.jpg (1.79 MB, 下載次數: 142)
下載附件
2019-5-22 16:56 上傳
其思路就是當串口收到幀頭之后,就開始讀取燈的編號以及各個顏色的亮度值,然后再發送給LED燈珠即可。
這些就是單總線LED燈珠的使用方法了,其實編寫程序較為簡單,主要難點就是大家的時序一定要準確,這樣才可以確保燈珠正常的點亮。
|
評分
-
查看全部評分
|