搜索
bottom↓
回复: 52

介绍一款单总线智能RGB LED WS2812B

  [复制链接]

出0入0汤圆

发表于 2016-4-19 22:30:47 | 显示全部楼层 |阅读模式
很有意思的国产货,原本用于灯带、光彩工程用途;个人拿来做点小玩意还是不错的
5050封装,芯片与全彩LEG封装在一起,只用4个引脚,两电源脚 一个数据输入DIN 一个数据输出DO
每一只芯片为一个全彩“像素“,各个像素头尾相接,DIN端接受从控制器传输过来的数据,前24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit,一路传递下去

内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加
内置上电复位和掉电复位电路。每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示
串行级联接口,能通过一根信号线完成数据的接收与解码
任意两点传传输距离在不超过3米时无需增加任何电路。(实测10M Cat5e传输信号可正常工作)
datasheet:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-4-19 23:15:16 | 显示全部楼层
taobao有产品吗?

出0入0汤圆

发表于 2016-4-19 23:21:41 | 显示全部楼层
好像上次有一个说实现了流水灯却无法实现呼吸灯的帖子也提到了这个LED,淘宝价5毛左右,对于要在一个点实现多种色彩显示的应用也有很高的性价比……

出0入0汤圆

发表于 2016-4-20 00:58:26 | 显示全部楼层
我可以说以前有一段时间画这个的板子画到吐了吗?

这个玩意我也做过简单的demo驱动,用的MEGA8.

开发的时候必须要示波器,时序要求挺严格的.....

友提:正脉宽略微宽一些,有助于远距离的传输....

嵌入汇编吧,程序的调用周期需要考虑的.....

出0入0汤圆

发表于 2016-4-20 01:05:43 来自手机 | 显示全部楼层
就是从这个玩意开始,
我养成了开大buffer的习惯。
计算数据,关中断,发数据,开中断,处理其它事情。

这玩意发送数据的时候,必须关中断。

为了一个红外接收头的响应,
甚至不得不采用双核……

出0入0汤圆

发表于 2016-4-20 05:20:49 | 显示全部楼层
Q男 发表于 2016-4-20 01:05
就是从这个玩意开始,
我养成了开大buffer的习惯。
计算数据,关中断,发数据,开中断,处理其它事情。

灯条很长的时候,关中断会造成红外接收不行啊,用STM8S003做没弄好。期待你例程

出0入0汤圆

发表于 2016-4-20 07:54:18 来自手机 | 显示全部楼层
zeroXone 发表于 2016-4-20 01:22
用带DMA的UART或者SPI就行了,调节UART或SPI的分频做好好时序,没必要控制中断,STM32都带DMA,比较好控 ...

这个玩意的时序是靠占空比来决定发送的数据是1还是0,或者是复位通讯接口的。

所以DMA.SPI根本不行的

出0入0汤圆

发表于 2016-4-20 07:58:24 来自手机 | 显示全部楼层
zyw19987 发表于 2016-4-20 05:20
灯条很长的时候,关中断会造成红外接收不行啊,用STM8S003做没弄好。期待你例程  ...

双核,用两片003,一片负责专门发数据,另外一片负责接收红外。红外接收解码成功之后,用io口通知。

这样只是给人的感觉会慢一些,但是不会按键失灵的感觉

这个是我当时能够想到的最好方法了。

出0入0汤圆

发表于 2016-4-20 08:01:35 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 00:58
我可以说以前有一段时间画这个的板子画到吐了吗?

这个玩意我也做过简单的demo驱动,用的MEGA8.

两个m8? 果然双核

出0入0汤圆

发表于 2016-4-20 08:06:53 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 07:58
双核,用两片003,一片负责专门发数据,另外一片负责接收红外。红外接收解码成功之后,用io口通知。

这 ...

。。。spi不像串口有前导和结束位  是纯数据  只要你选择合适波特率就能发自己脉冲   极端情况我把波特率提高10倍行不行 然后发ff和00 相当高采样率  实际往往能设计成一个字节发多于一个脉冲

出0入0汤圆

发表于 2016-4-20 08:13:14 | 显示全部楼层
Q男 发表于 2016-4-20 07:58
双核,用两片003,一片负责专门发数据,另外一片负责接收红外。红外接收解码成功之后,用io口通知。

这 ...

SPI完全可以,因为不像串口有前导/停止位.可以用特殊的数据构造出来正确的时序.某些机器的串口也可以这么用.

出0入0汤圆

发表于 2016-4-20 08:17:26 | 显示全部楼层
这个对时序要求高

出0入0汤圆

发表于 2016-4-20 08:28:13 来自手机 | 显示全部楼层
本帖最后由 Q男 于 2016-4-20 08:35 编辑

特殊处理过的DMA/SPI确实可以模拟一些时序,这个的负脉宽时间是0.4uS,正脉宽是0.85uS,反过来就是另外一个bit。

数据×10以后,RAM就有点悬了,正常512个灯需要1.5K的RAM,数据翻倍之后就需要15K,很多低端的MCU根本没那么多。

再说两片003要比一片stm32便宜。

出0入0汤圆

发表于 2016-4-20 08:33:33 | 显示全部楼层
分享下 http://www.amobbs.com/thread-5646991-1-1.html

出0入0汤圆

发表于 2016-4-20 08:43:52 | 显示全部楼层
这玩意采用单线归零编码的方式,我用stm32的PWM,DMA驱动成功,然后调试过程发现发送变换颜色时会有闪烁。最终找到问题是这个刷新频率不能低于400Khz。然后再开一个定时器2MS刷新一次。。就正常了

出0入4汤圆

发表于 2016-4-20 08:53:34 | 显示全部楼层
Q男 发表于 2016-4-20 07:54
这个玩意的时序是靠占空比来决定发送的数据是1还是0,或者是复位通讯接口的。

所以DMA.SPI根本不行的 ...

WS2811,WS2812这种芯片我都是用DMA+SPI驱动的,很爽,就是比较占RAM,用一个字节表示一位,所以一个全彩灯需要占24字节。

出0入0汤圆

发表于 2016-4-20 09:09:35 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 08:28
特殊处理过的DMA/SPI确实可以模拟一些时序,这个的负脉宽时间是0.4uS,正脉宽是0.85uS,反过来就是另外一个 ...

所以没有必要把整个FB都直接调制成数据。少一些,分次转换发送就可以

出0入0汤圆

发表于 2016-4-20 09:33:48 | 显示全部楼层
zqf441775525 发表于 2016-4-20 08:53
WS2811,WS2812这种芯片我都是用DMA+SPI驱动的,很爽,就是比较占RAM,用一个字节表示一位,所以一个全彩 ...

其实可以变通一下.每个周期1.25us,高0.4低0.85.使用3bit编码一个字节刚好卡在点上.就是转换麻烦点.

出0入0汤圆

发表于 2016-4-20 09:46:38 来自手机 | 显示全部楼层
xwkm 发表于 2016-4-20 09:09
所以没有必要把整个FB都直接调制成数据。少一些,分次转换发送就可以

不行的,不能够分次刷。

一次性必须刷完整个灯条,否则时序就会错乱。

这个就是依次移位的处理,错一个比特都不行。

出0入0汤圆

发表于 2016-4-20 09:47:01 | 显示全部楼层
顶 收藏了

出0入4汤圆

发表于 2016-4-20 09:59:43 | 显示全部楼层
xwkm 发表于 2016-4-20 09:33
其实可以变通一下.每个周期1.25us,高0.4低0.85.使用3bit编码一个字节刚好卡在点上.就是转换麻烦点. ...

嗯,有道理,但是这样做转换起来太麻烦了,但是在RAM紧张的情况下可以考虑这么用。

出0入0汤圆

发表于 2016-4-20 10:09:33 来自手机 | 显示全部楼层
这类芯片非常多了,这个芯片也是山寨的,比较早出的是天微

出0入0汤圆

发表于 2016-4-20 10:20:06 | 显示全部楼层
Q男 发表于 2016-4-20 07:58
双核,用两片003,一片负责专门发数据,另外一片负责接收红外。红外接收解码成功之后,用io口通知。

这 ...

我手上有别人的样板,就一个003感觉交互很好哦。
是不是我们有什么资源没有利用起来。

出0入0汤圆

发表于 2016-4-20 10:37:34 来自手机 | 显示全部楼层
zyw19987 发表于 2016-4-20 10:20
我手上有别人的样板,就一个003感觉交互很好哦。
是不是我们有什么资源没有利用起来。 ...

不知道,我当时的需求是只用mega8做一个发送的demo,用按键来改花样。

后期的其他事情没有跟进的,只是一个构想建议。

或许发送的过程中,有汇编来插入检测红外。

出0入0汤圆

发表于 2016-4-20 12:22:53 | 显示全部楼层
这颗芯片原先做过,这个有量吗,这个芯片好处就是可以直接接24V电压,那个sdi->sdo,有内部整形,可以传很远。

出0入0汤圆

发表于 2016-4-20 12:41:06 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 08:28
特殊处理过的DMA/SPI确实可以模拟一些时序,这个的负脉宽时间是0.4uS,正脉宽是0.85uS,反过来就是另外一个 ...

将原始数据切割分块处理内存就少了   比如每10个原始数据转换一次码流  stm32可能确实贵了  如果再找找别的呢 比如新塘  gd. 或者什么的  2块钱一下的m0 肯定有

出0入0汤圆

发表于 2016-4-20 12:53:28 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 09:46
不行的,不能够分次刷。

一次性必须刷完整个灯条,否则时序就会错乱。

如果这样好像是不好处理  主频没高到切换一次dma设置的时间可以完全忽略

出0入0汤圆

发表于 2016-4-20 13:07:48 | 显示全部楼层
Q男 发表于 2016-4-20 09:46
不行的,不能够分次刷。

一次性必须刷完整个灯条,否则时序就会错乱。

reset信号是50us。DMA传输完成后,10us都足够转换了

出0入0汤圆

发表于 2016-5-21 17:15:30 | 显示全部楼层
zqf441775525 发表于 2016-4-20 08:53
WS2811,WS2812这种芯片我都是用DMA+SPI驱动的,很爽,就是比较占RAM,用一个字节表示一位,所以一个全彩 ...

SPI的时钟多少合适?
逻辑0和1的高低电平比例是1:2,而SPI一般是8位,那么转换成SPI的数据对应是什么样的?

出0入4汤圆

发表于 2016-5-21 20:03:32 | 显示全部楼层
aozima 发表于 2016-5-21 17:15
SPI的时钟多少合适?
逻辑0和1的高低电平比例是1:2,而SPI一般是8位,那么转换成SPI的数据对应是什么样的 ...

1:3也可以的,SPI的时钟要看是高速还是低速。我倒是没注意SPI怎么设置的,用示波器看下脉宽,就差不多了。

出0入8汤圆

发表于 2016-5-21 22:19:38 来自手机 | 显示全部楼层
哪有卖?

出0入8汤圆

发表于 2016-5-22 11:19:33 | 显示全部楼层
不错的,芯片,还不会用

出0入0汤圆

发表于 2016-11-1 18:52:46 | 显示全部楼层
收藏并学习,多谢分享!

出0入0汤圆

发表于 2016-11-1 19:52:55 | 显示全部楼层
真是个好东西,以前想做一个全彩的摇摇棒,板子都画不出来,,,,现在这个应该很轻松就搞定了,

出0入0汤圆

发表于 2016-11-2 16:29:42 | 显示全部楼层
标记一下, rgb 串行三色 LED.

出0入0汤圆

发表于 2016-11-2 16:42:14 | 显示全部楼层
东西不错,收藏备用

出0入0汤圆

发表于 2016-11-2 22:22:45 | 显示全部楼层
mark 用个LED显示多种信息也是不错的

出0入0汤圆

发表于 2016-11-3 09:05:49 | 显示全部楼层
流星灯 和 呼吸灯 啊,

出0入4汤圆

发表于 2017-10-18 12:45:13 | 显示全部楼层
zqf441775525 发表于 2016-4-20 08:53
WS2811,WS2812这种芯片我都是用DMA+SPI驱动的,很爽,就是比较占RAM,用一个字节表示一位,所以一个全彩 ...

有没有例程,有个需求是RGB点阵,上午还头疼怎么安装,用这种就很简单了,

出0入4汤圆

发表于 2017-10-18 14:10:20 | 显示全部楼层
clesun 发表于 2017-10-18 12:45
有没有例程,有个需求是RGB点阵,上午还头疼怎么安装,用这种就很简单了, ...

没找到怎么上传文件,就把代码复制过来吧

typedef struct
{
    u8 red;
    u8 green;
    u8 blue;
}_Pixel;


  1. /****************************************************************
  2. WS2811驱动函数
  3. 使用资源:SPI1,DMA1_Channel3,一定数量的RAM
  4. 使用方法:
  5. 主函数中先调用LED_SPI_LowLevel_Init()对SPI、DMA和GPIO进行初始化
  6. 先宏定义LED灯的总个数LED_ALL_Num,再给每个灯的 red,green,blue 三个变量赋值,然后LED_SPI_Update(),即可。
  7. *****************************************************************/
  8. #include "includes.h"
  9. #include "WS2811.h"
  10. #include "stm32f10x_spi.h"
  11. #include "stm32f10x_dma.h"

  12. _Pixel Pixel[LED_ALL_Num];

  13. #define Buffer_ALL_Num (LED_ALL_Num * 24 + 21)

  14. u8 PixelBuffer[Buffer_ALL_Num] = {0};
  15. u16 PixelPointer = 0;

  16. static void SPI_DMA_Init(void)
  17. {
  18.     DMA_InitTypeDef   DMA_InitStructure;
  19.    
  20.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  21.     DMA_DeInit(DMA1_Channel3);
  22.     DMA_InitStructure.DMA_BufferSize = Buffer_ALL_Num;
  23.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (SPI1->DR);
  24.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)PixelBuffer;
  25.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  26.     DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
  27.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  28.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  29.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  30.     DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
  31.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  32.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  33.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  34.     DMA_Init(DMA1_Channel3, &DMA_InitStructure); /* DMA1 CH3 = MEM -> DR */
  35.     DMA_Cmd(DMA1_Channel3, ENABLE);
  36. }

  37. void LED_SPI_LowLevel_Init(void)
  38. {
  39.     GPIO_InitTypeDef  GPIO_InitStructure;
  40.     SPI_InitTypeDef   SPI_InitStructure;

  41.     SPI_DMA_Init();
  42.    
  43.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA, ENABLE);

  44.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  45.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  46.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  48.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  49.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  50.     SPI_I2S_DeInit(SPI1);

  51.     SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  52.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  53.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  54.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  55.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  56.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  57.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  58.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  59.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  60.     SPI_Init(SPI1, &SPI_InitStructure);

  61.     SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);

  62.     SPI_Cmd(SPI1, ENABLE);
  63. }



  64. static void WS2811_SPI_WriteByte(u16 Data)
  65. {
  66.     PixelBuffer[PixelPointer] = Data;
  67.     PixelPointer ++;
  68. }
  69. static void WS2811_SPI_SendBits(u8 Bits)
  70. {
  71.     u8 Zero = 0xc0;  //11000000
  72.     u8 One = 0xfc;   //11111100
  73.     u16 i = 0;
  74.     for(i = 0x80;i >= 0x01;i >>= 1)
  75.     {
  76.         WS2811_SPI_WriteByte((Bits & i)?One:Zero);
  77.     }
  78. }
  79. static void WS2811_SPI_SendPixel(u16 Sensor_Num)
  80. {
  81.     WS2811_SPI_SendBits(Pixel[Sensor_Num].red);
  82.     WS2811_SPI_SendBits(Pixel[Sensor_Num].green);
  83.     WS2811_SPI_SendBits(Pixel[Sensor_Num].blue);
  84. }
  85. void LED_SPI_Update(void)
  86. {
  87.     u16 i;
  88.     if(DMA_GetCurrDataCounter(DMA1_Channel3) == 0)
  89.     {
  90.         for(i=0;i<LED_ALL_Num;i++)
  91.         {
  92.             WS2811_SPI_SendPixel(i);
  93.         }
  94.         for (i = 0; i < 20; i++)
  95.         { /* (20+1) * 2.5 = 51.5 ~ 52.5us */
  96.             WS2811_SPI_WriteByte(0x00);
  97.         }
  98.         PixelPointer = 0;

  99.         DMA_Cmd(DMA1_Channel3, DISABLE);
  100.         DMA_ClearFlag(DMA1_FLAG_TC3);
  101.         SPI_DMA_Init();
  102.         DMA_Cmd(DMA1_Channel3, ENABLE);

  103.     }
  104. }


  105. //以下为用户程序
  106. void Pixel_Color_Init(void)
  107. {
  108.     u8 i;
  109.     for(i=0;i<LED_ALL_Num;i++)
  110.     {
  111.         Pixel[i].red = 0x00;
  112.         Pixel[i].blue = 0x00;
  113.         Pixel[i].green = 0x00;
  114.     }
  115. }


  116. void WS2811_Pixel_Light(u16 num,u8 Color)
  117. {
  118.     u8 i;
  119.     switch(Color)
  120.     {
  121.         case WS2811_Color_Red:
  122.             for(i=0;i<num;i++)
  123.             {
  124.                 Pixel[i].red = 0xff;
  125.                 Pixel[i].blue = 0x00;
  126.                 Pixel[i].green = 0x00;
  127.             }
  128.             for(i=num;i<LED_ALL_Num;i++)
  129.             {
  130.                 Pixel[i].red = 0x00;
  131.                 Pixel[i].blue = 0x00;
  132.                 Pixel[i].green = 0x00;
  133.             }
  134.         break;
  135.         case WS2811_Color_Orange:
  136.             for(i=0;i<num;i++)
  137.             {
  138.                 Pixel[i].red = 0xff;
  139.                 Pixel[i].green = 0x7f;
  140.                 Pixel[i].blue = 0x00;
  141.             }
  142.             for(i=num;i<LED_ALL_Num;i++)
  143.             {
  144.                 Pixel[i].red = 0x00;
  145.                 Pixel[i].blue = 0x00;
  146.                 Pixel[i].green = 0x00;
  147.             }
  148.         break;
  149.         case WS2811_Color_Yellow:
  150.             for(i=0;i<num;i++)
  151.             {
  152.                 Pixel[i].red = 0xff;
  153.                 Pixel[i].green = 0xff;
  154.                 Pixel[i].blue = 0x00;
  155.             }
  156.             for(i=num;i<LED_ALL_Num;i++)
  157.             {
  158.                 Pixel[i].red = 0x00;
  159.                 Pixel[i].blue = 0x00;
  160.                 Pixel[i].green = 0x00;
  161.             }
  162.         break;
  163.         case WS2811_Color_Green:
  164.             for(i=0;i<num;i++)
  165.             {
  166.                 Pixel[i].red = 0x00;
  167.                 Pixel[i].green = 0xff;
  168.                 Pixel[i].blue = 0x00;
  169.             }
  170.             for(i=num;i<LED_ALL_Num;i++)
  171.             {
  172.                 Pixel[i].red = 0x00;
  173.                 Pixel[i].blue = 0x00;
  174.                 Pixel[i].green = 0x00;
  175.             }
  176.         break;
  177.         case WS2811_Color_Qing:
  178.             for(i=0;i<num;i++)
  179.             {
  180.                 Pixel[i].red = 0x00;
  181.                 Pixel[i].green = 0xff;
  182.                 Pixel[i].blue = 0xff;
  183.             }
  184.             for(i=num;i<LED_ALL_Num;i++)
  185.             {
  186.                 Pixel[i].red = 0x00;
  187.                 Pixel[i].blue = 0x00;
  188.                 Pixel[i].green = 0x00;
  189.             }
  190.         break;
  191.         case WS2811_Color_Blue:
  192.             for(i=0;i<num;i++)
  193.             {
  194.                 Pixel[i].red = 0x00;
  195.                 Pixel[i].green = 0x00;
  196.                 Pixel[i].blue = 0xff;
  197.             }
  198.             for(i=num;i<LED_ALL_Num;i++)
  199.             {
  200.                 Pixel[i].red = 0x00;
  201.                 Pixel[i].blue = 0x00;
  202.                 Pixel[i].green = 0x00;
  203.             }
  204.         break;
  205.         case WS2811_Color_Zi:
  206.             for(i=0;i<num;i++)
  207.             {
  208.                 Pixel[i].red = 0x87;
  209.                 Pixel[i].green = 0x7f;
  210.                 Pixel[i].blue = 0x78;
  211.             }
  212.             for(i=num;i<LED_ALL_Num;i++)
  213.             {
  214.                 Pixel[i].red = 0x00;
  215.                 Pixel[i].blue = 0x00;
  216.                 Pixel[i].green = 0x00;
  217.             }
  218.         break;
  219.         case WS2811_Color_White:
  220.             for(i=0;i<num;i++)
  221.             {
  222.                 Pixel[i].red = 0xff;
  223.                 Pixel[i].green = 0xff;
  224.                 Pixel[i].blue = 0xff;
  225.             }
  226.             for(i=num;i<LED_ALL_Num;i++)
  227.             {
  228.                 Pixel[i].red = 0x00;
  229.                 Pixel[i].blue = 0x00;
  230.                 Pixel[i].green = 0x00;
  231.             }
  232.         break;
  233.         default:
  234.             
  235.         break;
  236.     }
  237.     LED_SPI_Update();
  238. }

  239. void WS2811_Pixel_Flash(void)
  240. {
  241.     u8 i;
  242.     Pixel_Color_Init();
  243.     LED_SPI_Update();
  244.     OS_Delay(1000);
  245.     //for(j=0;j<WeightSensor_Num;j++)
  246.     {
  247.         for(i=0;i<LED_ALL_Num;i++)
  248.         {
  249.             Pixel[i].red = 0xff;
  250.             Pixel[i].blue = 0x00;
  251.             Pixel[i].green = 0x00;
  252.         }
  253.     }
  254.     LED_SPI_Update();
  255.     OS_Delay(1000);
  256.     //for(j=0;j<WeightSensor_Num;j++)
  257.     {
  258.         for(i=0;i<LED_ALL_Num;i++)
  259.         {
  260.             Pixel[i].red = 0xff;
  261.             Pixel[i].green = 0x7f;
  262.             Pixel[i].blue = 0x00;
  263.         }
  264.     }
  265.     LED_SPI_Update();
  266.     OS_Delay(1000);
  267.     //for(j=0;j<WeightSensor_Num;j++)
  268.     {
  269.         for(i=0;i<LED_ALL_Num;i++)
  270.         {
  271.             Pixel[i].red = 0xff;
  272.             Pixel[i].green = 0xff;
  273.             Pixel[i].blue = 0x00;
  274.         }
  275.     }
  276.     LED_SPI_Update();
  277.     OS_Delay(1000);
  278.     //for(j=0;j<WeightSensor_Num;j++)
  279.     {
  280.         for(i=0;i<LED_ALL_Num;i++)
  281.         {
  282.             Pixel[i].red = 0x00;
  283.             Pixel[i].green = 0xff;
  284.             Pixel[i].blue = 0x00;
  285.         }
  286.     }
  287.     LED_SPI_Update();
  288.     OS_Delay(1000);
  289.     //for(j=0;j<WeightSensor_Num;j++)
  290.     {
  291.         for(i=0;i<LED_ALL_Num;i++)
  292.         {
  293.             Pixel[i].red = 0x00;
  294.             Pixel[i].green = 0xff;
  295.             Pixel[i].blue = 0xff;
  296.         }
  297.     }
  298.     LED_SPI_Update();
  299.     OS_Delay(1000);
  300.     //for(j=0;j<WeightSensor_Num;j++)
  301.     {
  302.         for(i=0;i<LED_ALL_Num;i++)
  303.         {
  304.             Pixel[i].red = 0x00;
  305.             Pixel[i].green = 0x00;
  306.             Pixel[i].blue = 0xff;
  307.         }
  308.     }
  309.     LED_SPI_Update();
  310.     OS_Delay(1000);
  311.     //for(j=0;j<WeightSensor_Num;j++)
  312.     {
  313.         for(i=0;i<LED_ALL_Num;i++)
  314.         {
  315.             Pixel[i].red = 0x87;
  316.             Pixel[i].green = 0x7f;
  317.             Pixel[i].blue = 0x78;
  318.         }
  319.     }
  320.     LED_SPI_Update();
  321.     OS_Delay(1000);
  322.     //for(j=0;j<WeightSensor_Num;j++)
  323.     {
  324.         for(i=0;i<LED_ALL_Num;i++)
  325.         {
  326.             Pixel[i].red = 0xff;
  327.             Pixel[i].green = 0xff;
  328.             Pixel[i].blue = 0xff;
  329.         }
  330.     }

  331. }


  332. void WS2811_Pixel_Slow_Light(u8 Color_Flag)
  333. {
  334.     u16 i,j;
  335.    
  336.     switch(Color_Flag)
  337.     {
  338.         case 0:
  339.             for(i=0;i<LED_ALL_Light;i++)
  340.             {
  341.                 for(j=0;j<LED_ALL_Num;j++)
  342.                 {
  343.                     Pixel[j].red = i;
  344.                     Pixel[j].blue = 0x00;
  345.                     Pixel[j].green = 0x00;
  346.                 }
  347.                 LED_SPI_Update();
  348.                 OS_Delay(15);
  349.             }
  350.         break;
  351.         case 1:
  352.             for(i=0;i<LED_ALL_Light;i++)
  353.             {
  354.                 for(j=0;j<LED_ALL_Num;j++)
  355.                 {
  356.                     Pixel[j].red = 0x00;
  357.                     Pixel[j].blue = i;
  358.                     Pixel[j].green = 0x00;
  359.                 }
  360.                 LED_SPI_Update();
  361.                 OS_Delay(15);
  362.             }
  363.         break;
  364.         case 2:
  365.             for(i=0;i<LED_ALL_Light;i++)
  366.             {
  367.                 for(j=0;j<LED_ALL_Num;j++)
  368.                 {
  369.                     Pixel[j].red = 0;
  370.                     Pixel[j].blue = 0x00;
  371.                     Pixel[j].green = i;
  372.                 }
  373.                 LED_SPI_Update();
  374.                 OS_Delay(15);
  375.             }
  376.         break;
  377.         case 3:
  378.             for(i=0;i<LED_ALL_Light;i++)
  379.             {
  380.                 for(j=0;j<LED_ALL_Num;j++)
  381.                 {
  382.                     Pixel[j].red = i;
  383.                     Pixel[j].blue = i;
  384.                     Pixel[j].green = 0x00;
  385.                 }
  386.                 LED_SPI_Update();
  387.                 OS_Delay(15);
  388.             }
  389.         break;
  390.         case 4:
  391.             for(i=0;i<LED_ALL_Light;i++)
  392.             {
  393.                 for(j=0;j<LED_ALL_Num;j++)
  394.                 {
  395.                     Pixel[j].red = i;
  396.                     Pixel[j].blue = 0x00;
  397.                     Pixel[j].green = i;
  398.                 }
  399.                 LED_SPI_Update();
  400.                 OS_Delay(15);
  401.             }
  402.         break;
  403.         case 5:
  404.             for(i=0;i<LED_ALL_Light;i++)
  405.             {
  406.                 for(j=0;j<LED_ALL_Num;j++)
  407.                 {
  408.                     Pixel[j].red = 0;
  409.                     Pixel[j].blue = i;
  410.                     Pixel[j].green = i;
  411.                 }
  412.                 LED_SPI_Update();
  413.                 OS_Delay(15);
  414.             }
  415.         break;
  416.         case 6:
  417.             for(i=0;i<LED_ALL_Light;i++)
  418.             {
  419.                 for(j=0;j<LED_ALL_Num;j++)
  420.                 {
  421.                     Pixel[j].red = i;
  422.                     Pixel[j].blue = i;
  423.                     Pixel[j].green = i;
  424.                 }
  425.                 LED_SPI_Update();
  426.                 OS_Delay(15);
  427.             }
  428.         break;
  429.         case 7:
  430.             for(i=0;i<LED_ALL_Light;i++)
  431.             {
  432.                 for(j=0;j<LED_ALL_Num;j++)
  433.                 {
  434.                     Pixel[j].red = i;
  435.                     Pixel[j].blue = i;
  436.                     Pixel[j].green = i;
  437.                 }
  438.                 LED_SPI_Update();
  439.                 OS_Delay(15);
  440.             }
  441.         break;
  442.             default:break;
  443.     }
  444. }

  445. //点亮一卷灯带的50个灯珠
  446. //输入:        Flag,决定颜色
  447. //              Light,决定亮度
  448. void WS2811_Pixel_Color_Light(u8 Color_Flag,u8 Light)
  449. {
  450.     u16 i,j;
  451.    
  452.     switch(Color_Flag)
  453.     {
  454.         case 0:
  455.             for(j=0;j<LED_ALL_Num;j++)
  456.             {
  457.                 Pixel[j].red = Light;
  458.                 Pixel[j].blue = 0x00;
  459.                 Pixel[j].green = 0x00;
  460.             }
  461.             LED_SPI_Update();
  462.         break;
  463.         case 1:
  464.             for(j=0;j<LED_ALL_Num;j++)
  465.             {
  466.                 Pixel[j].red = 0x00;
  467.                 Pixel[j].blue = Light;
  468.                 Pixel[j].green = 0x00;
  469.             }
  470.             LED_SPI_Update();
  471.         break;
  472.         case 2:
  473.             for(j=0;j<LED_ALL_Num;j++)
  474.             {
  475.                 Pixel[j].red = 0;
  476.                 Pixel[j].blue = 0x00;
  477.                 Pixel[j].green = Light;
  478.             }
  479.             LED_SPI_Update();
  480.         break;
  481.         case 3:
  482.             for(j=0;j<LED_ALL_Num;j++)
  483.             {
  484.                 Pixel[j].red = Light;
  485.                 Pixel[j].blue = Light;
  486.                 Pixel[j].green = 0x00;
  487.             }
  488.             LED_SPI_Update();
  489.         break;
  490.         case 4:
  491.             for(j=0;j<LED_ALL_Num;j++)
  492.             {
  493.                 Pixel[j].red = Light;
  494.                 Pixel[j].blue = 0x00;
  495.                 Pixel[j].green = Light;
  496.             }
  497.             LED_SPI_Update();
  498.         break;
  499.         case 5:
  500.             for(j=0;j<LED_ALL_Num;j++)
  501.             {
  502.                 Pixel[j].red = 0;
  503.                 Pixel[j].blue = Light;
  504.                 Pixel[j].green = Light;
  505.             }
  506.             LED_SPI_Update();
  507.         break;
  508.         case 6:
  509.             for(j=0;j<LED_ALL_Num;j++)
  510.             {
  511.                 Pixel[j].red = Light;
  512.                 Pixel[j].blue = Light;
  513.                 Pixel[j].green = Light;
  514.             }
  515.             LED_SPI_Update();
  516.         break;
  517.         case 7:
  518.             for(j=0;j<LED_ALL_Num;j++)
  519.             {
  520.                 Pixel[j].red = Light;
  521.                 Pixel[j].blue = Light;
  522.                 Pixel[j].green = Light;
  523.             }
  524.             LED_SPI_Update();
  525.         break;
  526.             default:break;
  527.     }
  528. }
复制代码

出0入4汤圆

发表于 2017-10-20 11:25:21 | 显示全部楼层
zqf441775525 发表于 2017-10-18 14:10
没找到怎么上传文件,就把代码复制过来吧

typedef struct


多谢。问一下,这种灯容易坏吗。这两天搞PTL,得考虑灯坏了替换的问题,

出0入4汤圆

发表于 2017-10-20 13:12:27 | 显示全部楼层
clesun 发表于 2017-10-20 11:25
多谢。问一下,这种灯容易坏吗。这两天搞PTL,得考虑灯坏了替换的问题, ...

我用的量不多,不好发表意见

出0入4汤圆

发表于 2017-10-20 13:43:54 | 显示全部楼层
zqf441775525 发表于 2017-10-20 13:12
我用的量不多,不好发表意见


我看你的代码里用到SPI的sck和MOSI两个管脚,这样和普通IO比效果会更好?

出0入0汤圆

发表于 2017-10-20 13:49:57 | 显示全部楼层
灯上pwm调光频率太低了才~415HZ  WS2801调光频率高一点 ~2150HZ ,本人十分讨厌PWM直接调光

出0入4汤圆

发表于 2017-10-20 20:09:03 | 显示全部楼层
clesun 发表于 2017-10-20 13:43
我看你的代码里用到SPI的sck和MOSI两个管脚,这样和普通IO比效果会更好?

对,用SPI+DMA,可以很方便的获得WS2811的控制波形
也可以用TIM+DMA+GPIO做。

出0入0汤圆

发表于 2017-10-21 09:09:20 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 07:58
双核,用两片003,一片负责专门发数据,另外一片负责接收红外。红外接收解码成功之后,用io口通知。

这 ...

很多单片机就已经集成双核了,没必要用两个单片机。

出100入101汤圆

发表于 2017-10-21 13:29:08 | 显示全部楼层
单线通信,用过

出10入18汤圆

发表于 2017-10-21 13:55:25 | 显示全部楼层
哈哈 ,规格书把贴片厂工人下班要干的工作都规定了
拿着个做个10x10的小型的LED桌面小屏幕,会不会很好玩儿。

出0入0汤圆

发表于 2017-10-21 20:14:31 | 显示全部楼层
这种是不是叫菊花链?

出0入8汤圆

发表于 2017-11-14 22:38:37 | 显示全部楼层
1024X768的像素需要39万成本价

出0入8汤圆

发表于 2018-4-18 22:26:24 来自手机 | 显示全部楼层
YS126 发表于 2017-10-21 09:09
很多单片机就已经集成双核了,没必要用两个单片机。


推荐几个双核单片机呗

出0入0汤圆

发表于 2018-4-18 23:44:33 | 显示全部楼层
Q男 发表于 2016-4-20 07:54
这个玩意的时序是靠占空比来决定发送的数据是1还是0,或者是复位通讯接口的。

所以DMA.SPI根本不行的 ...

FPGA 可以用软核,自己写个外设,干这个事情

出0入0汤圆

发表于 2018-10-25 13:11:21 来自手机 | 显示全部楼层
Q男 发表于 2016-4-20 01:05
就是从这个玩意开始,
我养成了开大buffer的习惯。
计算数据,关中断,发数据,开中断,处理其它事情。

如果是串口就没这么多毛病了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 09:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表