0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ME8S003實現(xiàn)WS2812 LED調(diào)光快速解決方案

jf_pJlTbmA9 ? 來源:敏矽MCU ? 作者:敏矽MCU ? 2023-09-18 10:56 ? 次閱讀

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)部振蕩器和可編程電流控制部分,有效保證了像素點光的顏色高度一致。

wKgZomUDv4eAUsNQAAHl2oy5CRE109.png

wKgaomUDv4qAcdXqAAEQZErR4hM337.png

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進行bit流數(shù)據(jù)的移位輸出。

下面我們將討論如何使用PWM模塊實現(xiàn)bit流數(shù)據(jù)的移位輸出:

首先,我們將對PWM0和PWM1進行周期和占空比分別配置,其中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配置的波形。

wKgZomUDv4uAd8tIAABCpxQFJVY269.png

最后的問題就是如何連續(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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7334

    瀏覽量

    150093
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    22905

    瀏覽量

    650085
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5057

    瀏覽量

    212178
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113669
  • WS2812
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    6029
收藏 人收藏

    評論

    相關(guān)推薦

    WS2812是否可以反轉(zhuǎn)UART的輸出?

    是否可以反轉(zhuǎn) UART 的輸出。輸出 1 而不是 0,輸出 0 而不是 1。 問題背景:按照以下方案使用 UART 控制 WS2812: (1)XX XXX XX(0). 具有 7 個數(shù)據(jù)位的 UART。 WS2812 的 3
    發(fā)表于 07-15 07:37

    WS2812實時時鐘程序

    文件名大小更新時間WS2812實時時鐘程序\APP\24Cxx\24cxx.c54102019-04-05WS2812實時時鐘程序\APP\24Cxx
    發(fā)表于 07-13 07:33

    求一種使用SPI+DMA的方式進行WS2812的控制方案

    怎樣使用SPI+DMA的方式進行WS2812的控制呢?如何實現(xiàn)SPI控制WS2812燈呢?
    發(fā)表于 12-21 06:37

    講講WS2812的數(shù)據(jù)協(xié)議

    可編程定電流控制部分,可以保證LED亮度一致。下面來講講WS2812的數(shù)據(jù)協(xié)議。WS2812采用的是一種叫做單線歸零碼的通訊方式。首先要注意的是,單線歸零碼通過識別電平轉(zhuǎn)換來判別0和1信號,與一般的電平...
    發(fā)表于 01-11 07:25

    Arduino控制WS2812燈帶的方法

    設(shè)計者:STCode(公眾號同名)Arduino控制WS2812燈帶(燈環(huán))1) WS2812WS2812燈帶WS2812燈環(huán)WS2812
    發(fā)表于 01-12 08:08

    利用ESP32中的硬件SPI接口控制WS2812的顯示

    1、利用硬件SPI控制WS2812智能集成LED光源 WS2812通過簡單的外部接口、特有的級聯(lián)方案便于利用MCU完成多個LED控制,極大簡
    發(fā)表于 06-21 15:17

    WS2812驅(qū)動的總結(jié)和時序的詳細(xì)資料分析

    WS2812相信有不少人都用過,大家對這款彩色LED真的是又愛又恨,愛的是它它使用簡單,采用單總線通信方式,節(jié)約IO口,而且可以多級串聯(lián)。而普通的彩色LED不是共陰就是共陽,每個顏色一個引腳,一般
    發(fā)表于 08-01 17:35 ?64次下載
    <b class='flag-5'>WS2812</b>驅(qū)動的總結(jié)和時序的詳細(xì)資料分析

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

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何進行WS2812的面板燈制作詳細(xì)資料合集免費下載包括了:DMX512轉(zhuǎn)WS2812 面板燈程序,STC8系列單片機技術(shù)參考手冊,WS2812燈板照片,
    發(fā)表于 05-29 17:36 ?162次下載
    如何進行<b class='flag-5'>WS2812</b>的面板燈制作詳細(xì)資料合集免費下載

    dfrobot炫彩WS2812 RGB LED可剪裁白色燈帶介紹

    WS2812 RGB裸板白燈條是由一系列的全彩LED組成。
    的頭像 發(fā)表于 12-27 15:35 ?4373次閱讀
    dfrobot炫彩<b class='flag-5'>WS2812</b> RGB <b class='flag-5'>LED</b>可剪裁白色燈帶介紹

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

    驅(qū)動n個,當(dāng)然n是有限制的。時序超級簡單,也有一定難度。類似的帖子網(wǎng)上有很多,在此不再贅述。WS2812驅(qū)動方式大概有以下幾種:1.使用GPIO模擬,中間加延時實現(xiàn)“0”、“1”的時序,延時需要...
    發(fā)表于 11-30 10:21 ?66次下載
    STM32使用LL庫PWM的DMA模式驅(qū)動<b class='flag-5'>ws2812</b>

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

    #STM32+PWM+DMA驅(qū)動 WS2812燈帶#文章目錄1.理論:2代碼:理論:使用STM32F103C8T6驅(qū)動WS2812燈帶,每個燈由24位組成三種顏色RGB,每8位控制一種
    發(fā)表于 12-27 19:29 ?211次下載
    STM32F103C<b class='flag-5'>8</b>T6+PWM+DMA驅(qū)動 <b class='flag-5'>WS2812</b>燈帶

    WS2811/WS2812擴展器

    電子發(fā)燒友網(wǎng)站提供《WS2811/WS2812擴展器.zip》資料免費下載
    發(fā)表于 07-04 09:35 ?14次下載
    <b class='flag-5'>WS</b>2811/<b class='flag-5'>WS2812</b>擴展器

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

    電子發(fā)燒友網(wǎng)站提供《帶WS2812 LED燈條的DIY Arduino 1D乒乓球游戲.zip》資料免費下載
    發(fā)表于 11-04 14:38 ?0次下載
    帶<b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>燈條的DIY Arduino 1D乒乓球游戲

    WS2812 RGB LED開源分享

    電子發(fā)燒友網(wǎng)站提供《WS2812 RGB LED開源分享.zip》資料免費下載
    發(fā)表于 02-01 14:05 ?23次下載
    <b class='flag-5'>WS2812</b> RGB <b class='flag-5'>LED</b>開源分享

    WS2812 LED芯片的使用筆記

    最接接觸了WS2812 LED,相信有不少人都用過。大家對這款彩色LED肯定是又愛又恨,愛的是它使用簡單,采用單總線通信方式,節(jié)約IO口,而且可以多級串聯(lián)。而普通的彩色LED不是共陰就
    的頭像 發(fā)表于 10-01 09:58 ?4075次閱讀
    <b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>芯片的使用筆記