查看: 9981  |  回复: 9
RGB全彩WS2812单线驱动8位MCU实现

主题

回复
发表于2022-01-25 14:32:56 | 显示全部楼层
1# 电梯直达


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

     下面先看一个规格书:

      

      

       

     

     从上面规格书可以看出,要想驱动WS2812这颗芯片,对于8位机来说就必须得采用汇编代码来实现,8位单片机通常最高晶振就是16M,如果按1T来算,一个NOP指令就占用了1/16微秒,WS2812的电平驱动时间是0.3与0.9微秒,也就是0.3就是4.8/14.4个NOP时间,如果按2T来算,一个NOP指令就占用了1/8微秒,WS2812的电平驱动时间是0.3与0.9微秒,也就是0.3就是2.4/7.2个NOP时间,在这期间内还得完成数据的传送,还有传送数据个数的比较,且现在用汇编代码的人并不多了,所以今天我已经把WS2812驱动已经做成了一个子函数了,只需要用C语言编程中直接调用就可以了。

     一、1T 51内核16M晶振的8位MCU实现(锦锐CA51F251)

     1、变量定义:

     u08 grb[18]; //6个RGB灯,6*3=18,内存空间够的话,可以定义更多个灯。

     2、子程序文件名:WS2812.A51。

     3、函数声明:void ws2812(u08 *p,u08 n); //指针*p指向要传送的数据组,本文指grb[18],n代表要传送数据的个数,本文18个。

     4、函数调用:

     Disable interrupt;

     ws2812(&grb[0],18);

     Enable interrupt;

      5、ROM空间:46个字节。

      6、代码运行时间:190微秒。

     二、2T 51内核16M晶振的8位MCU实现(现代MC96F6432)

     1、变量定义:

     u08 grb[18]; //6个RGB灯,6*3=18,内存空间够的话,可以定义更多个灯。

     2、子程序文件名:WS2812.A51。

     3、函数声明:void ws2812(u08 *p,u08 n); //指针*p指向要传送的数据组,本文指grb[18],n代表要传送数据的个数,本文18个。

     4、函数调用:

     Disable all interrupt;

     ws2812(&grb[0],18);

     Enable all interrupt;

      5、ROM空间:140个字节。

      6、代码运行时间:190微秒。

      三、2T RISC内核16M晶振的8位MCU实现(盤芯M8P626)

     1、变量定义:

     u08 grb[18]; //6个RGB灯,6*3=18,内存空间够的话,可以定义更多个灯。

     u08 grb_a;

     u08 grb_cnt;

     2、子程序文件名:ws2812(void)

     3、函数调用:

     for (I = 0;I < 18;i++) grb[i] = 0x80;

     grb_cnt = 18;

     ws2812();

      4、ROM空间:60个字节。

      5、代码运行时间:190微秒。

     四、2T RISC内核16M晶振的8位MCU实现(辉芒微FT-61F021B)

     1、变量定义:

     u08 grb[18]; //6个RGB灯,6*3=18,内存空间够的话,可以定义更多个灯。

     u08 grb_a;

     u08 grb_cnt;

     2、子程序文件名:ws2812(void)

     3、函数调用:

     for (I = 0;I < 18;i++) grb[i] = 0x80;

     grb_cnt = 18;

     ws2812();

      4、ROM空间:60个字节。

      5、代码运行时间:190微秒。

     五、2T RISC内核16M晶振的8位MCU实现(应广PMS150C)

     1、变量定义:

     u08 grb[18]; //6个RGB灯,6*3=18,内存空间够的话,可以定义更多个灯。

     u16 point;

     u08 grb_cnt;

     2、子程序文件名:ws2812(void)

     3、函数调用:

     grb[0] = 0x80; grb[1] = 0x80;  ……  grb[16] = 0x80; grb[17] = 0x80;

     grb_cnt = 18;

     ws2812();

      4、ROM空间:60个字节。

      5、代码运行时间:190微秒。

     

     以上是我花了较长时候实现了的代码,用0.1元的应广PMS150C就可以实现低成本驱动,并制作出了DEMO板。

      2-9-0-0-5-6-1-7-3      A-B-1-4-2-8-5-7-B-A

     

   


主题

回复
发表于2022-01-25 15:04:09   |  显示全部楼层
2#
8位单片机,只要满足晶振16M 2T以上的都以实现,目前已经实现的8位机有应广的PMS150C、辉芒微、盤芯的M8P626、锦锐CA51F251、现代MC96F6432A这几家的,像其它家8051内核的松瀚、中颖、中微、芯唐、芯圣、比亚迪、博巨兴、恩狄、合泰、宏晶、昴宝、赛元、笙泉、芯联发、中基国威等都是可以实现的。

主题

回复
发表于2022-01-25 19:19:58   |  显示全部楼层
3#
  

主题

回复
发表于2022-07-11 11:07:44   |  显示全部楼层
5#
发表于2022-05-10 17:58:58  4# 可以求源码吗?
AB142857WYB

主题

回复
发表于2022-11-21 16:10:05   |  显示全部楼层
8#
发表于2022-11-14 09:06:02  7# 不会汇编的我自学汇编也搞出来了
高手

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部