什么是WS2812B?

WS2812B是一款全彩LED控制IC,单总线控制,何为但总线我的理解就是数据线在一根线上传输的控制方式就是单总线。其实要把灯点亮仅有一根线是不行的,还需要电源线和地线给其供电。

WS2812B灯带是怎么连接的?

其实就是一颗灯珠串联另外一个灯珠,信号通过一根数据线相连起来控制等的亮灭就是在这根信号线上发送数据。

WS2812B灯带的数据是什么样的呢?


在说数据格式之前先来补充一下关于色彩的知识点,就是三原色,红绿蓝,也就是我们常说的RGB,R就是RED,G就是GREEN,B就是BLUE,一个彩色可以用这三用颜色的比例来混合出来。

为什么是红绿蓝?

为什么是红绿蓝
三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,到的刺激略大于辨别绿色的细胞,人的感觉是黄色;如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这三种光可以分别对三种锥形细胞产生刺激。

既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所说的“用三种原色的光以不同的比例加和到一起,形成各种颜色的光”显然就不大合适。使用三原色并不足以重现所有的色彩,准确地说法应该是“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”只有那些在三原色的色度所定义的颜色三角内的颜色,才可以利用三原色的光以非负量相加混合得到。
例如,红光与绿光按某种比例复合,对三种锥状细胞刺激后产生的色觉可与眼睛对单纯的黄光的色觉等效。但决不能认为红光与绿光按某种比例复合后生成黄光,或黄光是由红光和绿光复合而成的。
————————————————
版权声明:本文为CSDN博主「weixin_43169720」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43169720/article/details/102516397

24bit数据如何构造?

既然是24bit数据代表三种颜色,我们就要首先知道一个bit的意义是什么,我们传统意义上来说1个bit代表一个数据位,但是对于数据位bit的理解好像就是“1”或者“0”在数电里我们很容易把高低电平跟逻辑1和逻辑0对应起来,但是表示灯珠的逻辑电平不是简单的高低电平。在数值上0xFFFFFF就是24bit的1,0x000000就是24bit的0.这里有8个bit代表颜色G分量,G7G6G5G4G3G2G1G0,有8个bit代表R分量R7R6R5R4R3R2R1R0,有8个bit代表B分量B7B6B5B4B3B2B1B0,当不同分量组合时候就会有不同的数据产生,这个数据背后其实是逻辑电平,这里要说明的是彩灯的逻辑“1”并不是简简单单的高电平,彩灯的逻辑“0”也不是简简单单的低电平。

WS2812B的逻辑1和逻辑0


由上图可知“0”码和“1”码都是既有高电平又有低电平不过高电平和低电平的比例不同,这点很好理解,重点是分析一下它的特点,首先直观的特点就是编码“0”的电平高电平时间短一些低电平时间长一些,这也恰好符合我们的逻辑毕竟它还是低电平多一些的,编码“1”的电平高电平时间就长一些,而低电平就短一些。
但是不管是高电平还是低电平他们占用整个时间长度是一样的,这里还有一个很长的低电平这个代表复位信号。

WS2812B控制波形的精准描述如何?

这里这涉及到严格的数学描述了,长一点是多长?短一点是多短?这个肯定是有标准或者是约束的

理论上来说,高电平时长和低电平时长加起来应该是0.4us+0.85us或者0.85us+0.4us也就是说总共要占用1.25us的时间才可以编码出来一个“0”或者“1”出来。复位是要求50us以上,显然是要比编码的0或者1占用的时间要多的。
当然既然是电路的高低电平时长就会引入误差这个在误差允许的范围内我们可以接受,这个范围就是上下不超过150ns这里是ns比us还要小的时间,这个其实时间要求还是很严格的。

如何编程实现?

这里我选用我手上一个正点原子开发板,网上基于这种方式有很多驱动方案,有直接驱动也有PWM驱动也有SPI驱动,还有PWM+DMA驱动,还有用一些开源库进行驱动的,我感觉各种驱动方式各有优缺点,我先来尝试我认为最容易想到的方式(不一定是最好的或者最合适的)玩一下,后面会根据这些方式的特点进行一个总结,在相对应的需求下选用合适的方案是我们应该重点考虑的。

实现us级别延时

  1. 硬件延时NOP实现
  2. 滴答定时器中断实现
  3. 普通定时器实现
    先用nop实现个us延时我手上的板子是精英板主控芯片是STM32F103ZET6系统频率是72M,一个NOP的周期就是1/72M单位是s = 1/72=单位是us,换句话说也就是72个NOP浪费的时间是1us,0.4us就是0.4*72=28.8个NOP取整数29,0.2个NOP的误差,因为一个NOP是1/72 1000 个约等于是13.88个ns 所以0.2个NOP引起的误差在150ns以内可以接受。
    0.85
    72=61.2NOP同样取整数61个NOP,这样组合一下编码0的波形和编码1的波形就有了,实现一个 us函数 50us的低电平也可以产生复位信号,理论分析完毕上代码测试。

简单测试代码

void RGB_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA.8GPIO_ResetBits(GPIOB,GPIO_Pin_12);                        //PD.2 输出高}void Bit_0(void)
{GPIO_SetBits(GPIOB,GPIO_Pin_12);                        //PB12 输出高Delay_L();GPIO_ResetBits(GPIOB,GPIO_Pin_12);                            //PB12 输出高Delay_H();
}
void Bit_1(void)
{GPIO_ResetBits(GPIOB,GPIO_Pin_12);                          //PB12 输出高Delay_H();GPIO_SetBits(GPIOB,GPIO_Pin_12);                          //PB12 输出高Delay_L();
}void RGB_Set(void)
{for(uint8_t i = 0;i<8;i++){Bit_1();}for(uint8_t i = 0;i<8;i++){Bit_0();}for(uint8_t i = 0;i<8;i++){Bit_1();}
//  for(uint8_t i = 0;i<24;i++)
//  {//      delay_us(100);
//  }
}
void Delay_L(void)
{__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}void Delay_H(void)
{__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}

粗略测试效果


这里仅仅是粗略测验证一下理论分析是否正常 经过测试灯可以点亮 ,但是这种方式显然不适合做项目,接下里考虑用SPI或者PWM方式实现。

初出茅庐的小李第84篇博客之驱动WS2812B灯带(一)相关推荐

  1. 初出茅庐的小李第3篇博客《5G物联网及NB-IoT技术详解》读书笔记1

    初出茅庐的小李第3篇博客 <5G物联网及NB-IoT技术详解>读书笔记1 在Mculover666那里白嫖了一本书,不要问我咋白嫖的,我也不知道- 为什么要写这样的笔记? 因为我白嫖的时候 ...

  2. 初出茅庐的小李第113篇博客项目笔记之机智云智能浇花器实战(2)-基础Demo实现

    初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现 接(1) 继电器实现 继电器原理图 继电器采用的是5V继电器,控制端是RELAY-1 继电器代码实现 #includ ...

  3. 初出茅庐的小李第39篇博客之转载一篇有关unistd.h的介绍文章

    转载一篇文章 mask一下好找 unistd.h在unix中类似于window中的windows.h! #ifdef WIN32 #include <windows.h> #else #i ...

  4. 初出茅庐的小李第19篇博客之广和通G510模块接入机智云平台

    2020年5月1日劳动节 为什么要说一下这个日期,因为我上一次玩(学)G510模组是去年2019年5月1日,由于种种原因吧,一直也没有机会再次操作,而且不幸的一件事情就是,我还把上次搞的代码搞丢了,也 ...

  5. 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用

    offsetof(type, member-designator) 这是一个宏定义包含在<stddef.h>里,它的作用是用来计算一个结构成员相对于结构开头的字节偏移量. 说到这里我先来补 ...

  6. 初出茅庐的小李第86篇博客之Modbus协议总结

    Modbus协议来源 Modbus协议的由来 Mod,取自英文单词" Modicon",Modicon 中文翻译为莫迪康,是美国一家自动化公司的名字,现在这家公司被法国的施耐德电气 ...

  7. 初出茅庐的小李第59篇博客之测试Modbus协议的继电器

    1, Modbus RTU指令详解 发送: FF 05 00 00 FF 00 99 E4 字段 含义 注释 FF 设备地址 范围1-255,默认255 05 功能码 写单个线圈 00 00 继电器地 ...

  8. 初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现

    机智云智能浇花器实战(3)-基础Demo实现 链接:机智云智能浇花器实战(2)-基础Demo实现 BH1750光照传感器原理图 BH1750传感器代码 #include "bh1750.h& ...

  9. 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

    旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...

  10. 初出茅庐的小李第115篇博客之智能浇花器实战分享(4)

    机智云智能浇花器实战分享(下) 机智云平台如何创建数据点: 机智云官方网站:机智云|物联网云平台,AIoT开发云平台,Aiot软件开发平台.AIoT开发云平台.工业物联网解决方案 (gizwits.c ...

最新文章

  1. 处理问题的方法--抽象和特例化
  2. pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法
  3. 跟我一起用node-express搭建一个小项目(node连接mongodb)[三]
  4. 数据库-null值和notnull操作
  5. 站长如何屏蔽流氓宽带商在你的页面里面强行插入的广告代码
  6. linux开机自启服务命令,linux开机自启服务命令
  7. DM8168 DMM(2)
  8. 架构设计工作笔记002---微服务架构理论-扩展立方体
  9. mooc上c语言怎么改作业,C语言的编写、运行和修复代码
  10. 打印一种拓扑排序(假定给的是有向无环图时)DFS+栈
  11. android自定义ViewPager之——处理与ScrollView的事件冲突
  12. Linux串口设置参数
  13. 猴子排序 php,睡眠排序、面条排序、猴子排序...........................
  14. 外贸七日通 第六日 合作篇 与货代打交道
  15. 震惊!!!年度双生武魂诞生现场----双统安装(centos与windows)
  16. 电脑出现Windows7/vista/server Windows7vista/server(noslic)等等怎么办?还有grub是​来自GNU项目的多操作系统启动程序​
  17. 硬件设计——关于电路设计的一些知识
  18. mysql查询出当前年份的12个月
  19. 部分mp4视频在ios手机端上无法播放问题
  20. Leetcode刷题笔记 714. 买卖股票的最佳时机含手续费

热门文章

  1. Android Studio User Manual
  2. nginx配置lua脚本
  3. 基于Android设备的 Kali Linux渗透测试教程(内部资料)
  4. python教程百度云盘-Python 模拟登陆百度云盘实战教程
  5. 小米手机adb命令解锁BL_小米10解锁BL刷机卸载自带APP等
  6. Jasper报表导出pdf中文不显示——Font simsun is not available to the JVM. See the Javadoc for more det,已解决
  7. 小区防盗系统 c语言,住宅小区防盗报警系统方案以及系统组成
  8. c# socket操作智嵌物联的网络继电器板
  9. 数学建模常用模型10 :数据包络(DEA)分析法(投入产出法)
  10. Recast源码解析(二):NavMesh导航网格生成原理(上)