精华内容
下载资源
问答
  • Ws2812b

    2020-12-26 18:29:29
    <p>The ws2812b pwm led config doesnt work, hyperion ng gives sometimes an error out. <h4>Steps to reproduce <p>Select ws2812x on the led hardware list, the leds will not shine. <h4>What is expected? ...
  • WS2812B Arduino lib 和 WS2812B RGB LED 示例
  • WS2812B

    2021-01-10 02:22:41
    s a stupid question, but I have several LED 2812B strings. One has 3 wires (grnd, 5V and green - data), one has 5 wires (black, green, red, blue, white -12V needed) and one has 4 wires (black, green, ...
  • STM32F030 DMX512 WS2812B 驱动 此代码基于馈送到 USART1 的 DMX512 数据包驱动八个并行的 WS2812B LED 串(连接到 GPIOA 引脚 0-7)。 WS2812B 库是一个位于的 Elia 代码的端口
  • Manik的STM32F4xx WS2812B库 描述 STM32F4xx-WS2812B-lib是一个非常易于使用的库,可使用STM32F4xx处理WS2812B可编程LED。 整个库旨在尽可能简单地使用。 它只需要一个命令即可进行初始化,并且只需要一个命令即可...
  • <div><p>WS2812B flicker, WS2812 not. <p>I am facing a big issue when switching from WS2812 to WS2812B ! <p>My configuration : • IOT application, 6000 loc, including FASTLED 3.1 and AsyncWEBServer • ...
  • LPC824_WS2812B 使用LPC82x MCU的SPI端口驱动WS2812B RGB LED模块的示例项目。 许多驱动WS2812B的代码示例都在紧密循环中利用“位撞击”,但是由于数据速率相对较高,这使得MCU难以执行任何其他任务。 该示例使用...
  • ws2812b.zip

    2021-02-26 17:08:41
    1.硬件:stm32f105,ws2812b串行灯 2.技术实现:DMA发送SPI数据,保证纳秒级别的信号稳定 3.标准库,系统频率72M,SPI分频32,故每个bit占用时间444纳秒。 所以3个bit对应ws2812b一个bit。故24位灯每个占用: 24*3/8...
  • WS2812_STM32 用于STM32F上具有SPI的WS2812b控制的库 基本要求:SPI速度约为4.5Mb / S。 以HAL风格编写。 使用来自以下位置的colorspa对话: :
  • ws2812b模块资料

    2018-12-22 12:16:27
    ws2812b模块资料
  • WS2812B.zip

    2021-04-21 15:49:25
    stm32f103控制wS2812b,SIP 方式实现矩阵彩灯。蓝牙模块与手机APP通信,控制
  • 我通过删除cRGB数据类型并为每个像素添加了直接RGB和HSV访问,简化了原始light_ws2812的使用。 还实现了全局亮度控制,类似于FastLED中使用的亮度控制。 添加了用于在Arduino IDE中突出显示语法的关键字。 将色相...
  • Music-Reactive-WS2812B-Arduino:LED灯带WS2812B对通过AUX 3.5毫米插Kong连接的音乐做出React,如在cine-light youtube上所见
  • 多达255个WS2812B RGB LED的测试系统。 它可以测试由WS2812B LED制成的环,面板和条带。
  • ws2812B模块资料

    2018-05-11 10:12:24
    ws2812B模块资料 RGB全彩多点位控制 LED显示屏控制原理
  • WS2812B灯珠驱动

    2019-11-29 22:25:15
    运行环境为STM32F103C8T6芯片+标准库+FreeRTOS驱动WS2812B灯珠。 使用定时器及DMA外设进行驱动,灯珠可实现呼吸灯效果及指定频率闪烁,代码标注详细。 代码内的闪烁频率符合YY0709医疗标准要求。
  • ws2812b单按键变色

    2019-03-27 23:56:11
    单按键控制ws2812b单色,变色,闪烁变色,rgb循环变色
  • stc8_ws2812b.zip

    2020-04-07 01:11:14
    这是51单片机驱动ws2812b,采用的单片机是stc8a8k32s4a12,采用内部时钟频率24MHZ,可以移植到其他单片机,只要频率相同,网上的用51单片机驱动ws2812的代码比较少,也大多有问题,我驱动的是64个ws2812b,用逻辑分析...
  • adalight_ws2812b-源码

    2021-03-25 19:04:43
    凌达WS2812B 这可用于PlatformIO,有关Arduino IDE版本,请参见 。 这是Adalight的一个分支,它使用FastLED库(v 3.1)与WS2811 / WS2812 LED一起工作。 可以在Github上找到FastLED库: : 预构建的二进制文件在...
  • WS2812B_RGBLEDTest.rar

    2019-12-19 15:48:55
    用STM32F030 驱动WS2812B LED测试 模拟警察亭闪烁灯效果。
  • Python TK框架下搭建的上位机界面,通过串口连接Arduino来控制ws2812b灯带!简单,方便,快捷!
  • RGB三色灯珠WS2812B/WS2815B

    千次阅读 多人点赞 2019-04-11 18:09:24
    WS2812B/WS2815B均为RGB三色灯珠,WS2815B是WS2812B的升级版,区别在于两点,首先是供电电压由5V变为了12V供电,有效的降低了整个像素点的工作电流,降低线路板压降,最大限度保证像素点在很远距离传输时达到良好的...

    原理分析

    WS2812B/WS2815B均为RGB三色灯珠,WS2815B是WS2812B的升级版,区别在于两点,首先是供电电压由5V变为了12V供电,有效的降低了整个像素点的工作电流,降低线路板压降,最大限度保证像素点在很远距离传输时达到良好的混光一致性。其次是额外增加了一路信号线,在单个像素点损坏的情况下,不影响整体显示效果。

    每个灯珠控制需要24位数据,8Bit绿色亮度+8Bit红色亮度+8Bit蓝色亮度,每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示。 典型电路我们由WS2812B说起,灯带上的灯珠供电并联,信号线“串联”。信号由DI进到灯珠,灯珠在“吃掉”(锁存)24Bit数据后,将剩余数据整形放大后通过DO端口输出给下一个级联的灯珠,每经过一个灯珠的传输,信号减少24bit。当灯珠接收到280μs以上的RESET数据,灯珠根据自己锁存的数据完成对RGB三色灯的控制。24位数据采用归零码编码,Bit数据为高时,发送1码,Bit数据为低时,发送0码。

    WS2815B多了一个BIN引脚,这个引脚接前一个灯珠的DI脚(灯带第一个灯珠接地)。BIN端接收到数据信号丢弃24bit数据后,再将DIN接收的数据信号与BIN断进行比较,若DIN端无信号,BIN端有接收到信号,切换到BIN端接收输入信号,这种措施可以确保在单个灯珠损坏时不至于影响到其余的灯珠,但是如果连续两个灯珠损坏,依然会导致后边的灯珠不受控制。
    两种灯珠需要不同的灯板(灯珠封装不同),但是两种灯珠需要的嵌入式软件是一样的(数据的定义以及归零码的码制可以是一样的)

    嵌入式代码

    在嵌入式传输代码的实现上。一般都存在两种方式,一种为IO口模拟,这种方式一般见以前玩51单片机的嵌入式工程师,诸如I2C,SPI等常见的通信协议总线都习惯用IO口去模拟时序。对于WS281XB的通信协议,没有像SPI这种硬件帮我们实现的通信接口,这么看来用IO口去模拟是一个摆在桌面的实现方式。但是IO口模拟存在一个致命弱点,那就中断会打断你的时序模拟。以10个灯珠的控制为例,当你的代码正在模拟时序发到控制第10个灯还没有发的时候,中断来了,这个时候IO口正好被模拟程序控制为低,然后芯片去执行相应的中断处理程序,执行了超过280μs(RESET),执行完再回来继续发送第十个灯珠的数据,这时你会发现,你发送控制的第10个灯珠的数据其实发送给了第一个灯珠,因为两个数据之间因为中断的原因夹杂了一个RESET码。
    我们采取的是SPI+DMA的方法来实现,使用芯片内部的SPI控制器去发送灯珠的控制数据,又因为我们采用的是DMA发送,能够保证中断来的时候芯片能依然准确的按照时序发送我们控制灯珠的数据。
    我的实现是在STM32F10x系列的MCU,时钟的情况如下:
    时钟
    我使用的是SPI3,初始化代码如下:

    void SPI3_Init(void)
    {
        GPIO_InitTypeDef  GPIO_InitStructure;
        SPI_InitTypeDef   SPI_InitStructure;
    	DMA_InitTypeDef DMA_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);;//初始化SPI发送IO口
    
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
        SPI_I2S_DeInit(SPI3);
        SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;//SPI单线发送
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//发送数据宽为8Bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//36/4=9M,则传输1Bit时间=111ns
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 10;
        SPI_Init(SPI3, &SPI_InitStructure);
    	SPI3->CR1 &= ((uint16_t)0xDFFF);//禁止CRC发送
    		
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
    	DMA_DeInit(DMA2_Channel2); 	
    	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR;  //外设地址
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //DMA传输方向
    	DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)PixelBuffer;
    	DMA_InitStructure.DMA_BufferSize = 0;  //需要发送的大小为0,初始不执行发送操作	
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //外设为发送数据8bit宽
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; //Ram存储数据8Bit宽
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High ; 
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  
    	DMA_Init(DMA2_Channel2, &DMA_InitStructure); 	
    	
    	SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE); //使能SPI使用DMA通道发送
    	SPI_Cmd(SPI3, ENABLE);//使能SPI控制器
    }
    

    当我们发送使用上述配置的SPI发送0xe0(11100000)时,SPI发送引脚高电平持续时间为111ns3=333ns,低电平时间持续的时间为111ns5=550,因为SPI为逐字节发送,用示波器量得SPI发送字节之间的间隙时间大约是100ns左右,则连续发送8字节数,则低电平持续的时间为550ns+100ns=650ns,正符合WS281xB对0码的要求。
    于是,我们用发送一字节数据0xe0来模拟发送一个0码。同理可得用0xFC发送1码。用连续310个0x00来模拟发送RESET码。代码如下:

    unsigned char PixelBuffer[PixelNumber*24+310] = {0};
    
    void DMA2_Star_SPI_TX()
    {
    		DMA2_Channel2->CNDTR=(PixelNumber*24+310); 
    		DMA2_Channel2->CMAR=(uint32_t)PixelBuffer;	
    	
    		DMA_Cmd(DMA2_Channel2,ENABLE); //使能SPI3的DMA发送	
    	    while(!DMA_GetFlagStatus(DMA2_FLAG_TC2)); //循环等待发送完成,此时如果被中断打断,并不影响发送
    		DMA_Cmd(DMA2_Channel2,DISABLE); 
    		DMA_ClearFlag(DMA2_FLAG_TC2); 	  
    		return;
    } 
    
    void Set_All_Pixel_Color(uint8_t r, uint8_t g, uint8_t b)
    {
    	int i=0;
    	for (i = 0; i < 64; i++)//灯带上有64个灯珠
        {
            Ws281x_Set_Pixel(Color_Show(r,g,b),i);
        }
    }
    
    void Ws281x_Set_Pixel(uint32_t color,uint32_t position)//
    {
    	unsigned int positionin=position*3;//一个灯珠3种颜色
    	uint8_t Red, Green, Blue; 
    	
    	Red   = color>>16;
    	Green = color>>8;
    	Blue  = color;
    	
    	Ws281x_Set_Bits(Green,positionin);
    	Ws281x_Set_Bits(Red,positionin+1);
        Ws281x_Set_Bits(Blue,positionin+2);
    }
    
    void Ws281x_Set_Bits(uint8_t bits,uint32_t position)
    {
    	unsigned int positionin=0;	
    	int zero = 0xe0; //11100000
    	int one = 0xfC;  //11111100
        int i = 0x00;
    	int j = 0x00;	
    	positionin=position*8;//一个灯珠上的一种颜色,需要8位数表示亮度
        for (i = 0x80; i >= 0x01; i >>= 1)
        {		
        	PixelBuffer[position+j]=((bits & i) ? one : zero);
    		j++;
        }
    }
    uint32_t Color_Show(uint8_t r, uint8_t g, uint8_t b)
    {
      return ((uint32_t)r << 16) | ((uint32_t)g <<  8) | b;
    }
    

    下面的代码片是我们测试灯带的主函数,主要实现的是三色循环点亮。

    int main(void)
    {
    	int i=0;
    	unsigned int PixColorDa=0;
    	uint8_t Red, Green, Blue;
    	
    	SPI3_Init();//初始化SPI3
    	while(1)
    	{
    		for(i=0;i<3;i++{
    			PixColorDa=(0xff<<(8*i));//逐次点亮红绿蓝
    			
    			Blue=(PixColorDa>>16)&0xff;
    			Green=(PixColorDa>>8)&0xff;
    			Red=(PixColorDa)&0xff;
    			Set_All_Pixel_Color(Red,Green,Blue);//设置灯带上所有灯的颜色为红色
    			DMA2_Star_SPI_TX();//发送数据
    			sleep(1);//睡眠1秒,自己实现此函数
    		}				
    	}
    }
    
    展开全文
  • 单片机控制ws2812b

    2021-04-22 14:10:05
    <p>ws2812b的led灯8x32怎么控制 只需要控制成红色或蓝色 用stm32f103VE控制</p>
  • WS2812B with CleanFlight

    2020-12-01 21:28:27
    I am using WS2812B which were purchased here: http://www.ebay.co.uk/itm/1m-WS2812B-RGB-LED-Pixel-Strip-60-Individually-Addressable-Pixels-60-m-/151478784787?</p> <p>I have made a test strip and ...
  • New WorldStar WS2812B strips

    2021-01-11 00:28:23
    <div><p>New WS2812B strips are dropping. Annoyingly they're still labeled as WS2812B but they don't light up with the current version of FastLED I'm using. There's a small visible ...
  • WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源,主要特点: ●控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 ●内置信号整形电路,任何一个像素点收到信号后经过波形整形...
  • 这是一个基于STC8的单片机与WS2812B的LED方案一起集成的灯带显示控制方案,STC8通过串口接口其他设备发送过来的显示指令,然后STC8通过单线HDQ通讯与WS2812B模块交互来进行灯带的显示控制。
  • WS2812B全彩LED驱动

    千次阅读 2020-10-09 16:48:21
    今天心血来潮花了点时间写了个WS2812B的驱动,把灯点亮了。 WS2812B是一款全彩LED控制IC,单总线控制,信号时序如下图,其它信息请看规格书,要注意高低电平的时间一定要控制在规格书的要求范围内。WS2812B可以级联...

    今天心血来潮花了点时间写了个WS2812B的驱动,把灯点亮了。

    WS2812B是一款全彩LED控制IC,单总线控制,信号时序如下图,其它信息请看规格书,要注意高低电平的时间一定要控制在规格书的要求范围内。WS2812B可以级联,每个灯接收的是24bit数据(GRB颜色值),D1灯在收到24bit数据后,会把数据保存,如果还收到数据,会通过DO脚传给D2
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    用STM32F0芯片,48M时钟,驱动代码如下:
    头文件:

    /************************************************************
    Copyright (C), 2013-2020, XINZHIYIKONG.Co.,Ltd.
    @FileName: WS2812B.h
    @Author  : 糊读虫 QQ:570525287
    @Version : 1.0
    @Date    : 2020-12-25
    @Description: WS2812B全彩LED灯驱动
    @Function List:
    @History    : 
    <author> <time> <version > <desc>
    
    ***********************************************************/
    
    #ifndef __WS2812B_H
    #define	__WS2812B_H
    
    #include "stm32f0xx.h"
    #include "sys.h"
    
    //WS2812B IO 定义  注意初始化APB时钟也要修改
    #define WS2812B_PORT		GPIOA
    #define WS2812B_PIN			GPIO_Pin_15
    #define WS2812B_RCC_AHB		RCC_AHBPeriph_GPIOA  //RCC时钟
    
    #define WS2812B_Hi()		WS2812B_PORT->BSRR=WS2812B_PIN	//GPIO_ResetBits(LED1_PORT, LED1_PIN)
    #define WS2812B_Low()		WS2812B_PORT->BRR=WS2812B_PIN	//GPIO_SetBits(LED1_PORT, LED1_PIN)
    
    //颜色
    typedef struct color{
    	u8 G;
    	u8 R;
    	u8 B;
    }Color_TypeDef;
    
    //------------------------
    #define PIXEL_NUM	59	//LED灯的个数
    
    void WS2812B_Init(void);
    void WS2812B_Reset(void);
    void WS2812B_WriteColor(Color_TypeDef *pColor);
    void WS2812B_RefreshPixel(void);
    
    void WS2812B_FillColor(u16 start,u16 end,Color_TypeDef *pColor);
    void WS2812B_MovePixel(u8 dir);
    
    void WS2812B_Test(void);
    #endif /* __WS2812B_H */
    
    
    

    源文件

    /************************************************************
    Copyright (C), 2013-2020, XINZHIYIKONG.Co.,Ltd.
    @FileName: WS2812B.c
    @Author  : 糊读虫 QQ:570525287
    @Version : 1.0
    @Date    : 2020-12-25
    @Description: WS2812B全彩LED灯驱动
    @Function List:
    @History    : 
    <author> <time> <version > <desc>
    
    ***********************************************************/
    
    #include "WS2812B.h"
    
    Color_TypeDef PixelBuf[PIXEL_NUM]; //像数数据
    uint8_t flag;
    
    //晶振48M,每个nop是20.83ns
    #define DELAY_20_8nS		__nop()		//1个nop是20.8ns
    #define DELAY_104nS			DELAY_20_8nS;DELAY_20_8nS;DELAY_20_8nS;DELAY_20_8nS;DELAY_20_8nS //5个nop是104ns
    #define Delay_320nS()		DELAY_104nS;DELAY_104nS;DELAY_104nS  //30个nop
     
    /*---------------------------------------------------------------------------
    @Function   :Delay_850nS
    @Description:检测开关初始化
    @Input      :无
    @Retrun     :无
    @Others     :T1H T0L 时间在  580ns~1.6us,取850ns   实测855us
    ----------------------------------------------------------------------------*/
    void Delay_850nS(void)
    {
    	//进入函数所用的时间约为310ns
    	DELAY_104nS;
    	DELAY_104nS;
    	Delay_320nS();
    	DELAY_20_8nS;
    }
    /*---------------------------------------------------------------------------
    @Function   :Delay_300uS
    @Description:
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void Delay_300uS(void)
    {
    	uint8_t i;
    	while(i--)
    	{
    		Delay_320nS();
    	}
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_Init
    @Description:初始化
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;
    	RCC_AHBPeriphClockCmd(WS2812B_RCC_AHB, ENABLE);
    	GPIO_InitStruct.GPIO_Pin = WS2812B_PIN ;
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;
    	GPIO_Init(WS2812B_PORT, &GPIO_InitStruct);
    
    	GPIO_SetBits(WS2812B_PORT, WS2812B_PIN);
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_Reset
    @Description:复位
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_Reset(void)          //复位函数
    {
    	WS2812B_Low();
    	Delay_300uS();
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_WriteByte
    @Description:写一个字节
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_WriteByte(uint8_t dat)
    {
    	u8 i;
    	for (i=0;i<8;i++)
    	{
    		//先发送高位
    		if (dat & 0x80) //1
    		{
    			WS2812B_Hi();
    			Delay_850nS(); //T1H
    			WS2812B_Low();	
    			Delay_320nS(); //T1L
    		}
    		else	//0
    		{
    			WS2812B_Hi();
    			Delay_320nS(); //T0H
    			WS2812B_Low();	
    			Delay_850nS(); //T0L
    		}
    		dat<<=1;
    	}
    }
    
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_WriteColor
    @Description:写入1个24bit颜色数据
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_WriteColor(Color_TypeDef *pColor)
    {
    	WS2812B_WriteByte(pColor->G);
    	WS2812B_WriteByte(pColor->R);
    	WS2812B_WriteByte(pColor->B);
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_RefreshPixel
    @Description:更新显示
    @Input      :无
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_RefreshPixel(void)
    {
    	u8 i;
    
    	for(i=0;i<PIXEL_NUM;i++)
    	{
    		WS2812B_WriteColor(&PixelBuf[i]);
    	}
    }
    
    //----------------------------------------
    void WS2812B_Test(void)
    {
    	u8 i;
    	Color_TypeDef temp;
    	temp.B = 0x50;
    	temp.R = 0x60;
    	temp.G = 0x70;
    
    	for(i=0;i<60;i++)
    	{
    		WS2812B_WriteColor(&temp);
    	}
    }
    
    //测试延时时间
    void WS2812B_Test2(void)
    {
    	WS2812B_Hi();
    	Delay_850nS();
    	WS2812B_Low();
    }
    
    //============================================================================
    void Copy_Color(Color_TypeDef *pDst,Color_TypeDef *pScr)
    {
    	pDst->R = pScr->R;
    	pDst->G = pScr->G;
    	pDst->B = pScr->B;
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_FillColor
    @Description:填充颜色
    @Input      :start:开始位置;end:结束信置;pColor:颜色值
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_FillColor(u16 start,u16 end,Color_TypeDef *pColor)
    {
    	if (start > end) //交换位置
    	{
    		u16 temp;
    		temp = start;
    		start = end;
    		end = temp;
    	}
    
    	if (start >= PIXEL_NUM)return; //超出范围
    	if (end >= PIXEL_NUM)end = PIXEL_NUM-1;
    
    	//填充颜色值
    	while(start <= end)
    	{
    		Copy_Color(&PixelBuf[start],pColor);
    		start++;
    	}
    }
    
    /*---------------------------------------------------------------------------
    @Function   :WS2812B_MovePixel
    @Description:循环移动像素颜色
    @Input      :dir:方向;
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    void WS2812B_MovePixel(u8 dir)
    {
    	Color_TypeDef temp;
    	u8 i;
    
    	if (dir) //向左移动
    	{
    		Copy_Color(&temp,&PixelBuf[PIXEL_NUM-1]);
    
    		i = PIXEL_NUM-1;
    		while(i)
    		{
    			 Copy_Color(&PixelBuf[i],&PixelBuf[i-1]);
    			 i--;
    		}
    		Copy_Color(&PixelBuf[0],&temp);
    	}
    	else  //向右移动
    	{
    		Copy_Color(&temp,&PixelBuf[0]);
    
    		i = 0;
    		while(i < (PIXEL_NUM-1))
    		{
    			Copy_Color(&PixelBuf[i],&PixelBuf[i+1]);
    			i++;
    		}
    		Copy_Color(&PixelBuf[PIXEL_NUM-1],&temp);
    	}
    }
    
    //----------------------------------END OF FILE------------------------------
    
    
    /*---------------------------------------------------------------------------
    @Function   :main
    @Description:主函数
    @Input      :
    @Retrun     :无
    @Others     :
    ----------------------------------------------------------------------------*/
    int main(void)
    {
    	Color_TypeDef temp;
    	HardWare_Init();
    	
    	WS2812B_Init();	
    	temp.R = 0x00;
    	temp.G = 0xff;
    	temp.B = 0x80;
    	WS2812B_FillColor(10,20,&temp);
    	while(1)
    	{
    		if (SysGetSignal_ms(20,0)) //20ms
    		{		
    			WS2812B_MovePixel(1);
    			WS2812B_RefreshPixel();
    		}
    	}	
    }	
    

    代码实现了循环移动的流水灯功能,点亮效果:
    在这里插入图片描述

    展开全文
  • WS2812b wrong sorted colors

    2020-11-27 16:29:34
    <div><p>WS2812b: strip.setPixelColorRGB(1,255,0,0) -> green strip.setPixelColorRGB(1,0,255,0) -> red strip.setPixelColorRGB(1,0,0,255) -> blue</p><p>该提问来源于开源项目:jgarff/rpi_ws...
  • WS2812B使用备忘

    千次阅读 2019-08-31 18:55:08
    在淘宝卖的ws2812b rgb灯虽然都是同一名称,但是各家的数据格式都有有微小的不同,参考各家数据手册会发现高低电平的时间有许多不同。 如在淘宝“南方光电”买的ws2812b数据手册如下: 再如“糊糊蝶照明”RGB灯条的...

    在淘宝卖的ws2812b rgb灯虽然都是同一名称,但是各家的数据格式都有有微小的不同,参考各家数据手册会发现高低电平的时间有许多不同。

    如在淘宝“南方光电”买的ws2812b数据手册如下:
    南方光电
    再如“糊糊蝶照明”RGB灯条的数据手册:
    糊糊蝶照明
    网上还有其他版本的数据手册,时间也不一样,有兴趣可以搜一搜。
    以上时间差距会让颜色不准,在使用的时候要注意。
    除了手册差异(数据差异)导致的问题,还有不同写法io反转速度差异引起的时间不准。
    如:
    1.用库函数

     GPIO_SetBits(GPIOB,GPIO_Pin_5);
     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    

    这样写的反转频率大约为2.7MHz,周期361ns

    2.用寄存器GPIOx_ODR

    GPIOB->ODR |= GPIO_Pin_5;
     GPIOB->ODR &=~ GPIO_Pin_5;
    

    这样写的反转频率小于18MHz,周期大于55.55ns

    3、用寄存器 GPIOB->BRR和GPIOB->BSRR

    GPIOB->BRR = GPIO_Pin_5;
    GPIOB->BSRR = GPIO_Pin_5;
    

    这样写的反转频率大约为18MHz,周期55.55ns

    由于我们需要0.3us的延时,所以直接排除库函数,而用寄存器BRR和BSRR应该是最好的选择。
    在stm32f103 72MHz主频下,一个__nop();为1/72M=13.9ns。

    所以,对于RGB灯条,
    T0H=T1L=55.5ns+1813.9ns;
    T0L=T1H=55.5ns+61
    13.9ns;

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 738
精华内容 295
关键字:

ws2812b