0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ME8S003实现WS2812 LED调光快速解决方案

jf_pJlTbmA9 来源:敏矽MCU 作者:敏矽MCU 2023-09-18 10:56 次阅读

ws2812驱动相信有不少人都用过,大家对这款彩色LED真的是又爱又恨,爱的是它它使用简单,采用单总线通信方式,节约IO口,而且可以多级串联。而普通的彩色LED不是共阴就是共阳,每个颜色一个引脚,一般都是用PWM驱动,想要控制亮度、颜色就要分别控制每个引脚上的PWM占空比,想要驱动多个LED就更麻烦了。恨的是ws2812对时序的要求比较高,对低速单片机不太友好而且开发比较复杂。

今天我们就针对基于ME8S003硬件PWM如何快速实现控制ws2812的驱动。其中ME8S003提供的2路PWM模块可以轻松实现当下流行的LED驱动WS2812的通信,不需要过多占用CPU时间。敏矽微提供整套软、硬件解决方案,帮助用户快速开发;

1、概述

“WS2812”解决方案

ME8S003是内嵌8051兼容的1T高性能8位微控制器。该系列控制器具有高性能、高适应范围和超低成本特点。内置48MHz主时钟和独立的低速(30K/1.5M可切换)时钟,常用外设8路1M高速12位的ADC转换器,允许4路输入2个比较器,2+3通道PWM,2个UART串口,SPI接口I2C总线接口,3通用16位计数器/定时器。低功耗支持深度睡眠和掉电模式。提供M2调试端口,实现系统仿真

2、WS2812基本说明

“WS2812”快速解决方案

WS2812B是一款全彩LED控制IC,单总线控制,何为单总线我的理解就是数据线在一根线上传输的控制方式就是单总线。

WS2812是一个集控制电路与发光电路于一体的智能外控LED光源,外形一般为5050封装,每个LED灯珠为一个像素点,支持RGB无极调色,同时每颗灯珠内部集成有智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程电流控制部分,有效保证了像素点光的颜色高度一致。

wKgZomUDv4eAUsNQAAHl2oy5CRE109.png

wKgaomUDv4qAcdXqAAEQZErR4hM337.png

3、ME8S003使用PWM实现数据移位输出

“WS2812”快速解决方案

ME8S003内嵌一个PWM模块,可以支持两个独立的16位PWM输出。同时还可以配置成为两个定时器,或者两路PWM合并支持载波输出(如实现38K Irda应用),或者配置两个不同的PWM输出来对应bit数据0/1并合并在一起,从而实现使用PWM进行bit流数据的移位输出。

下面我们将讨论如何使用PWM模块实现bit流数据的移位输出:

首先,我们将对PWM0和PWM1进行周期和占空比分别配置,其中PWM0的周期(PWM0CRCH/ PWM0CRCL)和占空比(PWM0CCH/ PWM0CCL)将用来代表数据0,PWM1的周期(PWM1CRCH/ PWM1CRCL)和占空比(PWM1CCH/ PWM1CCL)将用来代表数据1。0和1的周期和占空比是不同的,以WS2812应用为例,PWM0的周期和占空比分别为1.2us和0.3us,PWM0的周期和占空比分别为1.2us和0.9us。

当我们使能PWM的数据移位功能时,要输出数据0,PWM移位输出管脚(PWMSHT)就PWM0配置的波形;要输出数据1,PWM移位输出管脚就PWM1配置的波形。

wKgZomUDv4uAd8tIAABCpxQFJVY269.png

最后的问题就是如何连续输出一个bit数据流。ME8S003 PWM为这个移位功能设置一个乒乓缓存(PWMSHIFTDAT0/ PWMSHIFTDAT1),我们只需要来回切换并不断把需要发出的数据喂入乒乓缓存即可。

当所有数据传输结束,关闭PWM。

4、WS2812控制实程

“WS2812”快速解决方案

ME8S003提供了全套的驱动,其中关于PWM 移位数据功能有PWM配置函数和PWM数据移位输出函数;

PWM配置函数:

voidPWM_DataShift_Cfg(unsignedlongcyclefreq,unsignedcharduty0inpercentage,unsignedcharduty1inpercentage)
cyclefreq:PWM周期频率,单位hz
duty0inpercentage:数据0输出占空比的百分比
duty1inpercentage:数据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数据移位输出函数:

voidPWM_DataShift(unsignedchar*dataptr,unsignedcharlen)
dataptr:输出数据起始指针
len:数据长度
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 驱动的LED灯实例程序:

Main.c
//-----------------------------------------------------------------------------
//Includes
//-----------------------------------------------------------------------------
#include"me8s003.h"//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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147653
  • led
    led
    +关注

    关注

    237

    文章

    22450

    浏览量

    645893
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4901

    浏览量

    209946
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112048
  • WS2812
    +关注

    关注

    0

    文章

    30

    浏览量

    5722
收藏 人收藏

    评论

    相关推荐

    WS2812实时时钟程序

    文件名大小更新时间WS2812实时时钟程序\APP\24Cxx\24cxx.c54102019-04-05WS2812实时时钟程序\APP\24Cxx
    发表于 07-13 07:33

    求一种使用SPI+DMA的方式进行WS2812的控制方案

    怎样使用SPI+DMA的方式进行WS2812的控制呢?如何实现SPI控制WS2812灯呢?
    发表于 12-21 06:37

    讲讲WS2812的数据协议

    可编程定电流控制部分,可以保证LED亮度一致。下面来讲讲WS2812的数据协议。WS2812采用的是一种叫做单线归零码的通讯方式。首先要注意的是,单线归零码通过识别电平转换来判别0和1信号,与一般的电平...
    发表于 01-11 07:25

    Arduino控制WS2812灯带的方法

    设计者:STCode(公众号同名)Arduino控制WS2812灯带(灯环)1) WS2812WS2812灯带WS2812灯环WS2812
    发表于 01-12 08:08

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

    1、利用硬件SPI控制WS2812智能集成LED光源 WS2812通过简单的外部接口、特有的级联方案便于利用MCU完成多个LED控制,极大简
    发表于 06-21 15:17

    如何进行WS2812的面板灯制作详细资料合集免费下载

    本文档的主要内容详细介绍的是如何进行WS2812的面板灯制作详细资料合集免费下载包括了:DMX512转WS2812 面板灯程序,STC8系列单片机技术参考手册,WS2812灯板照片,WS281
    发表于 05-29 17:36 158次下载
    如何进行<b class='flag-5'>WS2812</b>的面板灯制作详细资料合集免费下载

    dfrobot炫彩WS2812 RGB LED可剪裁白色灯带介绍

    WS2812 RGB裸板白灯条是由一系列的全彩LED组成。
    的头像 发表于 12-27 15:35 4066次阅读
    dfrobot炫彩<b class='flag-5'>WS2812</b> RGB <b class='flag-5'>LED</b>可剪裁白色灯带介绍

    STM32使用LL库PWM的DMA模式驱动ws2812

    驱动n个,当然n是有限制的。时序超级简单,也有一定难度。类似的帖子网上有很多,在此不再赘述。WS2812驱动方式大概有以下几种:1.使用GPIO模拟,中间加延时实现“0”、“1”的时序,延时需要...
    发表于 11-30 10:21 63次下载
    STM32使用LL库PWM的DMA模式驱动<b class='flag-5'>ws2812</b>

    超小60位WS2812灯环

    电子发烧友网站提供《超小60位WS2812灯环.zip》资料免费下载
    发表于 08-12 09:58 20次下载
    超小60位<b class='flag-5'>WS2812</b>灯环

    WS2812 LED灯条的DIY Arduino 1D乒乓球游戏

    电子发烧友网站提供《带WS2812 LED灯条的DIY Arduino 1D乒乓球游戏.zip》资料免费下载
    发表于 11-04 14:38 0次下载
    带<b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>灯条的DIY Arduino 1D乒乓球游戏

    WS2812 RGB LED开源分享

    电子发烧友网站提供《WS2812 RGB LED开源分享.zip》资料免费下载
    发表于 02-01 14:05 22次下载
    <b class='flag-5'>WS2812</b> RGB <b class='flag-5'>LED</b>开源分享

    最简WS2812类似RGB灯条驱动方法

    最简WS2812类似RGB灯条驱动方法
    的头像 发表于 06-19 17:51 2455次阅读
    最简<b class='flag-5'>WS2812</b>类似RGB灯条驱动方法

    WS2812 LED芯片的使用笔记

    最接接触了WS2812 LED,相信有不少人都用过。大家对这款彩色LED肯定是又爱又恨,爱的是它使用简单,采用单总线通信方式,节约IO口,而且可以多级串联。而普通的彩色LED不是共阴就
    的头像 发表于 10-01 09:58 1738次阅读
    <b class='flag-5'>WS2812</b> <b class='flag-5'>LED</b>芯片的使用笔记

    多个WS2812灯珠的点亮实验

    今天看到一位同学在群里面的留言,要我写一个长串WS2812点亮的程序
    的头像 发表于 10-24 14:51 871次阅读
    多个<b class='flag-5'>WS2812</b>灯珠的点亮实验

    迪文屏控制WS2812氛围灯

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——迪文屏控制WS2812氛围灯。工程师通过COF智能屏的OS核精准控制WS2812幻彩灯带每一颗灯珠颜色,实现炫酷的灯带颜色切换的动态效果。演示视频完整开发资料
    的头像 发表于 01-26 08:12 367次阅读
    迪文屏控制<b class='flag-5'>WS2812</b>氛围灯