ws2812驅(qū)動相信有不少人都用過,大家對這款彩色LED真的是又愛又恨,愛的是它它使用簡單,采用單總線通信方式,節(jié)約IO口,而且可以多級串聯(lián)。而普通的彩色LED不是共陰就是共陽,每個顏色一個引腳,一般都是用PWM驅(qū)動,想要控制亮度、顏色就要分別控制每個引腳上的PWM占空比,想要驅(qū)動多個LED就更麻煩了。恨的是ws2812對時序的要求比較高,對低速單片機不太友好而且開發(fā)比較復(fù)雜。
今天我們就針對基于ME8S003硬件PWM如何快速實現(xiàn)控制ws2812的驅(qū)動。其中ME8S003提供的2路PWM模塊可以輕松實現(xiàn)當(dāng)下流行的LED驅(qū)動WS2812的通信,不需要過多占用CPU時間。敏矽微提供整套軟、硬件解決方案,幫助用戶快速開發(fā);
1、概述
“WS2812”解決方案
ME8S003是內(nèi)嵌8051兼容的1T高性能8位微控制器。該系列控制器具有高性能、高適應(yīng)范圍和超低成本特點。內(nèi)置48MHz主時鐘和獨立的低速(30K/1.5M可切換)時鐘,常用外設(shè)8路1M高速12位的ADC轉(zhuǎn)換器,允許4路輸入2個比較器,2+3通道PWM,2個UART串口,SPI接口,I2C總線接口,3通用16位計數(shù)器/定時器。低功耗支持深度睡眠和掉電模式。提供M2調(diào)試端口,實現(xiàn)系統(tǒng)仿真。
2、WS2812基本說明
“WS2812”快速解決方案
WS2812B是一款全彩LED控制IC,單總線控制,何為單總線我的理解就是數(shù)據(jù)線在一根線上傳輸?shù)目刂品绞骄褪菃慰偩€。
WS2812是一個集控制電路與發(fā)光電路于一體的智能外控LED光源,外形一般為5050封裝,每個LED燈珠為一個像素點,支持RGB無極調(diào)色,同時每顆燈珠內(nèi)部集成有智能數(shù)字接口數(shù)據(jù)鎖存信號整形放大驅(qū)動電路,還包含有高精度的內(nèi)部振蕩器和可編程定電流控制部分,有效保證了像素點光的顏色高度一致。
3、ME8S003使用PWM實現(xiàn)數(shù)據(jù)移位輸出
“WS2812”快速解決方案
ME8S003內(nèi)嵌一個PWM模塊,可以支持兩個獨立的16位PWM輸出。同時還可以配置成為兩個定時器,或者兩路PWM合并支持載波輸出(如實現(xiàn)38K Irda應(yīng)用),或者配置兩個不同的PWM輸出來對應(yīng)bit數(shù)據(jù)0/1并合并在一起,從而實現(xiàn)使用PWM進(jìn)行bit流數(shù)據(jù)的移位輸出。
下面我們將討論如何使用PWM模塊實現(xiàn)bit流數(shù)據(jù)的移位輸出:
首先,我們將對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ù)據(jù)0,PWM移位輸出管腳(PWMSHT)就PWM0配置的波形;要輸出數(shù)據(jù)1,PWM移位輸出管腳就PWM1配置的波形。
最后的問題就是如何連續(xù)輸出一個bit數(shù)據(jù)流。ME8S003 PWM為這個移位功能設(shè)置一個乒乓緩存(PWMSHIFTDAT0/ PWMSHIFTDAT1),我們只需要來回切換并不斷把需要發(fā)出的數(shù)據(jù)喂入乒乓緩存即可。
當(dāng)所有數(shù)據(jù)傳輸結(jié)束,關(guān)閉PWM。
4、WS2812控制實程
“WS2812”快速解決方案
ME8S003提供了全套的驅(qū)動,其中關(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ù)長度 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個WS2812 驅(qū)動的LED燈實例程序:
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文章
7846瀏覽量
153415 -
led
+關(guān)注
關(guān)注
242文章
23617瀏覽量
669328 -
PWM
+關(guān)注
關(guān)注
116文章
5320瀏覽量
217466 -
定時器
+關(guān)注
關(guān)注
23文章
3273瀏覽量
116808 -
WS2812
+關(guān)注
關(guān)注
0文章
33瀏覽量
6473
發(fā)布評論請先 登錄
WS2812是否可以反轉(zhuǎn)UART的輸出?
求一種使用SPI+DMA的方式進(jìn)行WS2812的控制方案
講講WS2812的數(shù)據(jù)協(xié)議
Arduino控制WS2812燈帶的方法
利用ESP32中的硬件SPI接口控制WS2812的顯示
WS2812驅(qū)動的總結(jié)和時序的詳細(xì)資料分析

如何進(jìn)行WS2812的面板燈制作詳細(xì)資料合集免費下載

STM32使用LL庫PWM的DMA模式驅(qū)動ws2812

STM32F103C8T6+PWM+DMA驅(qū)動 WS2812燈帶

帶WS2812 LED燈條的DIY Arduino 1D乒乓球游戲

WS2812 LED芯片的使用筆記

論如何使用WS2812以及類似燈珠

評論