ws2812驅(qū)動(dòng)相信有不少人都用過,大家對(duì)這款彩色LED真的是又愛又恨,愛的是它它使用簡(jiǎn)單,采用單總線通信方式,節(jié)約IO口,而且可以多級(jí)串聯(lián)。而普通的彩色LED不是共陰就是共陽,每個(gè)顏色一個(gè)引腳,一般都是用PWM驅(qū)動(dòng),想要控制亮度、顏色就要分別控制每個(gè)引腳上的PWM占空比,想要驅(qū)動(dòng)多個(gè)LED就更麻煩了。恨的是ws2812對(duì)時(shí)序的要求比較高,對(duì)低速單片機(jī)不太友好而且開發(fā)比較復(fù)雜。
今天我們就針對(duì)基于ME8S003硬件PWM如何快速實(shí)現(xiàn)控制ws2812的驅(qū)動(dòng)。其中ME8S003提供的2路PWM模塊可以輕松實(shí)現(xiàn)當(dāng)下流行的LED驅(qū)動(dòng)WS2812的通信,不需要過多占用CPU時(shí)間。敏矽微提供整套軟、硬件解決方案,幫助用戶快速開發(fā);
1、概述
“WS2812”解決方案
ME8S003是內(nèi)嵌8051兼容的1T高性能8位微控制器。該系列控制器具有高性能、高適應(yīng)范圍和超低成本特點(diǎn)。內(nèi)置48MHz主時(shí)鐘和獨(dú)立的低速(30K/1.5M可切換)時(shí)鐘,常用外設(shè)8路1M高速12位的ADC轉(zhuǎn)換器,允許4路輸入2個(gè)比較器,2+3通道PWM,2個(gè)UART串口,SPI接口,I2C總線接口,3通用16位計(jì)數(shù)器/定時(shí)器。低功耗支持深度睡眠和掉電模式。提供M2調(diào)試端口,實(shí)現(xiàn)系統(tǒng)仿真。
2、WS2812基本說明
“WS2812”快速解決方案
WS2812B是一款全彩LED控制IC,單總線控制,何為單總線我的理解就是數(shù)據(jù)線在一根線上傳輸?shù)目刂品绞骄褪菃慰偩€。
WS2812是一個(gè)集控制電路與發(fā)光電路于一體的智能外控LED光源,外形一般為5050封裝,每個(gè)LED燈珠為一個(gè)像素點(diǎn),支持RGB無極調(diào)色,同時(shí)每顆燈珠內(nèi)部集成有智能數(shù)字接口數(shù)據(jù)鎖存信號(hào)整形放大驅(qū)動(dòng)電路,還包含有高精度的內(nèi)部振蕩器和可編程定電流控制部分,有效保證了像素點(diǎn)光的顏色高度一致。
3、ME8S003使用PWM實(shí)現(xiàn)數(shù)據(jù)移位輸出
“WS2812”快速解決方案
ME8S003內(nèi)嵌一個(gè)PWM模塊,可以支持兩個(gè)獨(dú)立的16位PWM輸出。同時(shí)還可以配置成為兩個(gè)定時(shí)器,或者兩路PWM合并支持載波輸出(如實(shí)現(xiàn)38K Irda應(yīng)用),或者配置兩個(gè)不同的PWM輸出來對(duì)應(yīng)bit數(shù)據(jù)0/1并合并在一起,從而實(shí)現(xiàn)使用PWM進(jìn)行bit流數(shù)據(jù)的移位輸出。
下面我們將討論如何使用PWM模塊實(shí)現(xiàn)bit流數(shù)據(jù)的移位輸出:
首先,我們將對(duì)PWM0和PWM1進(jìn)行周期和占空比分別配置,其中PWM0的周期(PWM0CRCH/ PWM0CRCL)和占空比(PWM0CCH/ PWM0CCL)將用來代表數(shù)據(jù)0,PWM1的周期(PWM1CRCH/ PWM1CRCL)和占空比(PWM1CCH/ PWM1CCL)將用來代表數(shù)據(jù)1。0和1的周期和占空比是不同的,以WS2812應(yīng)用為例,PWM0的周期和占空比分別為1.2us和0.3us,PWM0的周期和占空比分別為1.2us和0.9us。
當(dāng)我們使能PWM的數(shù)據(jù)移位功能時(shí),要輸出數(shù)據(jù)0,PWM移位輸出管腳(PWMSHT)就PWM0配置的波形;要輸出數(shù)據(jù)1,PWM移位輸出管腳就PWM1配置的波形。
最后的問題就是如何連續(xù)輸出一個(gè)bit數(shù)據(jù)流。ME8S003 PWM為這個(gè)移位功能設(shè)置一個(gè)乒乓緩存(PWMSHIFTDAT0/ PWMSHIFTDAT1),我們只需要來回切換并不斷把需要發(fā)出的數(shù)據(jù)喂入乒乓緩存即可。
當(dāng)所有數(shù)據(jù)傳輸結(jié)束,關(guān)閉PWM。
4、WS2812控制實(shí)程
“WS2812”快速解決方案
ME8S003提供了全套的驅(qū)動(dòng),其中關(guān)于PWM 移位數(shù)據(jù)功能有PWM配置函數(shù)和PWM數(shù)據(jù)移位輸出函數(shù);
PWM配置函數(shù):
voidPWM_DataShift_Cfg(unsignedlongcyclefreq,unsignedcharduty0inpercentage,unsignedcharduty1inpercentage) cyclefreq:PWM周期頻率,單位hz duty0inpercentage:數(shù)據(jù)0輸出占空比的百分比 duty1inpercentage:數(shù)據(jù)1輸出占空比的百分比 voidPWM_DataShift_Cfg(unsignedlongcyclefreq,unsignedcharduty0inpercentage,unsignedcharduty1inpercentage) { unsignedlongtemp,temp1; unsignedcharclkshift; clkshift=(PWMCON0 0x07)+1; if(clkshift>2) temp=SystemClock>>clkshift; else temp=SystemClock; temp=temp/cyclefreq; PWM0CRCL=temp 0xFF; PWM0CRCH=(temp>>8) 0xFF; PWM1CRCL=PWM0CRCL; PWM1CRCH=PWM0CRCH; temp1=(temp*duty0inpercentage)/100; PWM0CCL=temp1 0xFF; PWM0CCH=(temp1>>8) 0xFF; temp1=(temp*duty1inpercentage)/100; PWM1CCL=temp1 0xFF; PWM1CCH=(temp1>>8) 0xFF; set_PWMCON1_SHIFTDIR; }
PWM數(shù)據(jù)移位輸出函數(shù):
voidPWM_DataShift(unsignedchar*dataptr,unsignedcharlen) dataptr:輸出數(shù)據(jù)起始指針 len:數(shù)據(jù)長(zhǎng)度 voidPWM_DataShift(unsignedchar*dataptr,unsignedcharlen) { PWMSHIFTDAT0=*dataptr++; PWMSHIFTDAT1=*dataptr++;; PWM_DATASHIFT_START; len-=2; //shiftalldata while(len) { if(PWMSTA_DAT0BF==0) { PWMSHIFTDAT0=*dataptr++; len--; } if(len==0)break; if(PWMSTA_DAT1BF==0) { PWMSHIFTDAT1=*dataptr++; len--; } } while(PWM_DATASHIFT_BUSY); PWM_DATASHIFT_STOP; }
3個(gè)WS2812 驅(qū)動(dòng)的LED燈實(shí)例程序:
Main.c //----------------------------------------------------------------------------- //Includes //----------------------------------------------------------------------------- #include"me8s003.h"http://SFRdeclarations #include"io_mux.h" #include"sfr_macro.h" #include"sys.h" #include"pwm.h" //----------------------------------------------------------------------------- //main()Routine //----------------------------------------------------------------------------- //3ledunsignedcharcolor_data[9]={0xFF,0x80,0x40,0x40,0xFF,0x80,0x80,0x40,0xFF}; unsignedcharmax_data_no=9; unsignedintdata_index; voidmain(void) { Modify_System_Clock(HCLK_48M); P0_5_INIT(P0_5_PIO); P0_Output_Enable(IO_BIT5); P1_2_INIT(P1_2_PWMSHT); PWM_Init(PWM_CLK_DIVIDED_BY_1); PWM_DataShift_Cfg(833000,25,75);//833K=~1.2usPWMcycle,25%=~0.3us,75%=~0.9us while(1) { //shiftdata PWM_DataShift(color_data,max_data_no); //preparenextdata for(data_index=0;data_index<=max_data_no;data_index++) ????????{ ????????????color_data[data_index]=color_data[data_index]+1; ????????} ????????P0_5?=!P0_5;?????????????????????//?Turn?onoff?LE ????????Ddelay(800);?//Reset,?>80us } }
來源:敏矽MCU
審核編輯:湯梓紅
-
微控制器
+關(guān)注
關(guān)注
48文章
7649瀏覽量
152103 -
led
+關(guān)注
關(guān)注
242文章
23355瀏覽量
663160 -
PWM
+關(guān)注
關(guān)注
114文章
5198瀏覽量
214874 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115365 -
WS2812
+關(guān)注
關(guān)注
0文章
32瀏覽量
6252
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
WS2812是否可以反轉(zhuǎn)UART的輸出?
求一種使用SPI+DMA的方式進(jìn)行WS2812的控制方案
講講WS2812的數(shù)據(jù)協(xié)議
Arduino控制WS2812燈帶的方法
利用ESP32中的硬件SPI接口控制WS2812的顯示
WS2812驅(qū)動(dòng)的總結(jié)和時(shí)序的詳細(xì)資料分析
![<b class='flag-5'>WS2812</b>驅(qū)動(dòng)的總結(jié)和時(shí)序的詳細(xì)資料分析](https://file.elecfans.com/web1/M00/9F/8A/pIYBAF1ClCSALyFHAABcX-PBMoY757.png)
如何進(jìn)行WS2812的面板燈制作詳細(xì)資料合集免費(fèi)下載
![如何進(jìn)行<b class='flag-5'>WS2812</b>的面板燈制作詳細(xì)資料合集免費(fèi)下載](https://file.elecfans.com/web1/M00/94/A3/o4YBAFzuV--ARIUqAAHXD6YIhco191.png)
STM32使用LL庫PWM的DMA模式驅(qū)動(dòng)ws2812
![STM32使用LL庫PWM的DMA模式驅(qū)動(dòng)<b class='flag-5'>ws2812</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F103C8T6+PWM+DMA驅(qū)動(dòng) WS2812燈帶
![STM32F103C<b class='flag-5'>8</b>T6+PWM+DMA驅(qū)動(dòng) <b class='flag-5'>WS2812</b>燈帶](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
WS2811/WS2812擴(kuò)展器
![<b class='flag-5'>WS</b>2811/<b class='flag-5'>WS2812</b>擴(kuò)展器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
帶WS2812 LED燈條的DIY Arduino 1D乒乓球游戲
![帶<b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>燈條的DIY Arduino 1D乒乓球游戲](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
WS2812 RGB LED開源分享
![<b class='flag-5'>WS2812</b> RGB <b class='flag-5'>LED</b>開源分享](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
WS2812 LED芯片的使用筆記
![<b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>芯片的使用筆記](https://file1.elecfans.com/web2/M00/A5/09/wKgaomUIEF2AInN3AABL4lURhfk886.jpg)
論如何使用WS2812以及類似燈珠
![論如何使用<b class='flag-5'>WS2812</b>以及類似燈珠](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
評(píng)論