电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
WS2812b驱动原理
分 享
扫描二维码分享
WS2812b驱动原理
ws2812b
arduino
入门电子设计
关注
发布时间: 2020-04-28
丨
阅读: 3900
我最近在网上看到了一个用LED来模仿辉光管效果做的一个的时钟,显示效果还不错 ![](https://cf05.ickimg.com/bbsimages/202004/12975ea7ad9a812919dd649011c4e341.jpg) ![](https://cf05.ickimg.com/bbsimages/202004/dd3bfd30f30b1d854c0396b8ea3d19fe.jpg) 上面的两张图就是这款时钟的外观了。 我了解了一下这个项目使用的是WS2812b这一款灯珠 ![](https://cf05.ickimg.com/bbsimages/202004/b09f03ad160874e58efa38241a44b539.jpg) ![](https://cf05.ickimg.com/bbsimages/202004/9d7622cbea638b9efe239108ee36d249.jpg) 这一款灯珠内置了控制电路,我们可以很方便的对灯珠进行控制,本篇文章我就来介绍一下WS2812b的用法。 我们首先来看一下这款灯珠的特点: IC控制电路与LED点光源公用一个电源。 控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。 内置上电复位和掉电复位电路。 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。 串行级联接口,能通过一根信号线完成数据的接收与解码。 任意两点传传输距离在不超过3米时无需增加任何电路。 当刷新速率30帧/秒时,级联数不小于1024点。数据发送速度可达800Kbps。 光的颜色高度一致,性价比高。 上面就是这款灯珠的一些特点了。现在我们来看一下这个灯珠的电路连接图 ![](https://cf05.ickimg.com/bbsimages/202004/ac303ac76e61bd4b6f22c3787f1405d2.jpg) 我们可以看到灯珠的四个引脚分别是VDD、DIN、DOUT和VSS,VDD和VSS是电源,我们来看一下DIN和DOUT这两个脚的作用,在前面我们介绍WS2812b的特点的时候有一条是说WS2812b有串行级联接口,我们可以使用一根线来连接很多的灯珠,在这里DIN就是信号输入脚,DOUT就是信号输出脚,我们可以把DIN连接我们的单片机,然后将DOUT连接到下一个灯珠的DIN脚,这样我们就可以将灯珠进行级联了。 然后我们来看一下WS2812b的数据格式。 我们要使用单片机控制一个WS2812b灯珠要给它发送24bit的数据,这24bit的数据就是灯珠的RGB值,不过发送的时候要按照GRB的顺序来发送。 24bit数据格式: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 数据传输时间(TH+TL=1.25μs±600ns) T0H 0码高电平时间 0.35μs ± 150ns T0L 0码低电平时间 0.8μs ± 150ns T1H 1码高电平时间 0.7μs ± 150ns T1L 1码低电平时间 0.6μs ± 150ns RES帧单位 低电平时间 50μs以上 我们在发送多组24bit的数据时,先发送的24bit数据会被第一个灯珠送入内部数据锁存器,剩余数据被内部电路整形转发,这样数据每经过一个灯珠,数据就减少24bit,这样我们就可以级联多个灯珠了。 发送WS2812b数据对于时间的要求还是比较严格的,在这里我使用arduino的fastled库来实现对灯珠的控制。 Fastled是一款简单易用的控制WS2812b等LED的arduino第三方库。安装好以后我们可以使用arduino来控制一条LED灯带。 ```cpp #include <FastLED.h> // How many leds in your strip? #define NUM_LEDS 1 // For led chips like WS2812, which have a data line, ground, and power, you just // need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock, // ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN // Clock pin only needed for SPI based chipsets when not using hardware SPI #define DATA_PIN 3 #define CLOCK_PIN 13 // Define the array of leds CRGB leds[NUM_LEDS]; void setup() { // Uncomment/edit one of the following lines for your leds arrangement. // ## Clockless types ## FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // GRB ordering is assumed // FastLED.addLeds<SM16703, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1829, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1812, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1904, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS2903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2852, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<GS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA106, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<PL9823, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2813, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GE8822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886_8BIT, DATA_PIN, RGB>(leds, NUM_LEDS); // ## Clocked (SPI) types ## // FastLED.addLeds<LPD6803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical } void loop() { // Turn the LED on, then pause leds[0] = CRGB::Red; FastLED.show(); delay(500); // Now turn the LED off, then pause leds[0] = CRGB::Black; FastLED.show(); delay(500); } ``` 上面是一个控制led闪烁的例程,在程序开始,我们使用NUM_LED来定义灯珠的数量,然后定义输出引脚,在下面的一大堆注释的语句中我们选则灯珠的型号,然后我们就可以通过leds[0] = CRGB::Red;来让第一个灯珠显示红色了。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
入门电子设计
关注
评论
(1)
登录后可评论,请
登录
或
注册
HIT_Td
353
天前...
请问用STM32HAL库模拟WS2812B的时序楼主做过吗?
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交