WS2812 RGB灯

news/2024/11/17 9:21:35/

文章目录

  • 一、简介
  • 二、原理
  • 三、硬件介绍
  • 四、通信协议
  • 五、程序

一、简介

WS2812只需要一根信号线就能控制灯的多种颜色的变化,多个灯可以级联,在30hz的刷新频率下一个信号线能够控制至多500个LED。在这里插入图片描述

二、原理

WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。

三、硬件介绍

1.内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
2.内置上电复位和掉电复位电路
3.每个像素点的三基色颜色可实现256级亮度显示,完成16777216中颜色的全真彩显示,扫描频率不低于400hz/s
4.串行级联接口,能通过一根信号线完成数据的接收和接码。
5.数据发送速度可达800kbps(相当于1.25us传输一比特数据)

四、通信协议

数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。

数据码的逻辑实现:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
文档部分参考这位作者:
https://blog.csdn.net/tangxing1212/article/details/42964417

五、程序

调试延迟的时候可以用小马哥视频的方法
这里给出链接。
https://www.bilibili.com/video/BV1Qs41137dk/?spm_id_from=333.788.videocard.0

Ws2812.h#ifndef WS2812
#define WS2812#define RGB_Port_RCC RCC_APB2Periph_GPIOB //RGB时钟
#define RGB_PIN GPIO_Pin_9 //RGB引脚
#define RGB_PORT GPIOB //RGB端口#define RGBLED PBout(9)  //RGB灯// 发送0x000000是关闭灯void RGB_Init(void); // RGB初始化IO管脚
void RGB_ColorSet(uchar red,uchar green,uchar blue); // 设置一个灯的颜色
void RGB_RandomColor(void); // 产生随机数颜色
void RGB_RandomColor4(void); // 4个灯产生随机的颜色
#endifWs2812.c#include "All.h"// RGBLED 管脚初始化
void RGB_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RGB_Port_RCC,ENABLE);//系统时钟使能GPIO_InitStructure.GPIO_Pin = RGB_PIN; //定义管脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//管脚输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚的速度GPIO_Init(RGB_PORT,&GPIO_InitStructure); //初始化端口}// 信号0 300ns高电平  900ns低电平
void RGB_Write0(void)
{uchar cnt1=1,cnt2 = 5;RGBLED = 1;   // 高电平while(cnt1--)  // 300ns__nop();RGBLED = 0;while(cnt2--)  // 900ns__nop();
}// 信号1  600ns高电平  600ns低电平
void RGB_Write1(void)
{uchar cnt1=3,cnt2 = 3;RGBLED = 1;   // 高电平while(cnt1--)  // 600ns__nop();RGBLED = 0;while(cnt2--)  // 600ns__nop();	
}
// 复位   80us低电平
void RGB_LEDReset()
{RGBLED = 0;delay_us(80);
}// RGB写一个字节
void RGB_WriteByte(uchar dat)
{uchar i;for(i= 0;i<8;i++){dat <<= i;if(dat & 0x80) // 判断最高位{RGB_Write1(); // 写1}else{RGB_Write0(); // 写0}}
}// 设置一个灯的颜色
void RGB_ColorSet(uchar red,uchar green,uchar blue)
{// 灯的实际写入颜色是GRBRGB_WriteByte(green);  // 写入绿色RGB_WriteByte(red); // 写入红色RGB_WriteByte(blue); // 写入蓝色
}// 产生一个随机的颜色
void RGB_RandomColor(void)
{uchar red,green,blue; // srand((int)time(0)); // 设置随机种子red = rand() % 255; //产生随机数在一个字节的范围内green = rand() % 255;blue = rand() % 255;RGB_ColorSet(red,green,blue); // 合成颜色
}/* 4个灯各自产生随机的颜色*/
void RGB_RandomColor4(void)
{RGB_RandomColor();   // 产生随机颜色RGB_RandomColor(); RGB_RandomColor(); RGB_RandomColor(); 
}

http://www.ppmy.cn/news/182246.html

相关文章

Spring Data JPA想要学得好,缓存机制掌握好

文章目录 Spring Data JPA想要学得好&#xff0c;缓存机制掌握好Hibernate、JPA与Spring Data JPA之间的关系JPA的EntityManager接口与Hibernate的Session接口Hibernate的缓存Hibernate的一级缓存&#xff08;Session的缓存&#xff09;浅读缓存源码解密缓存过程Hibernate的一级…

python中random函数的使用方法 详解

# random各种使用方法 import random# 随机生成[0.1)的浮点数 print("random():", random.random())# 随机生成1000-9999之间的整数 print("randint(1000, 9999):", random.randint(1000, 9999))# 随机生成0-20之间的偶数 print("randrange(0, 21, 2)…

树莓派实现简单网站服务器

树莓派实现服务器&#xff08;外网访问&#xff09; 获取域名&#xff08;内网穿透&#xff09;好文请先阅读获取域名运行代理的客户端程序本地搭建一个网页树莓派实现代理服务器&#xff08;V*N&#xff09;配置为启动脚本 获取域名&#xff08;内网穿透&#xff09; 好文请…

linux下查询当前所有连接的ip

Linux 系统有很多用于快速处理数据的工具如 grep , awk , cut , sort , uniq , sort 可以帮助我们分析网络情况 , 他们非常非常地好用 , 如果你熟练掌握他们的使用技巧 , 他们则可以帮你快速定位问题 ; 接下来一步步来查看访问系统的 IP 情况 通过 netstat -ntu , 找出通过 tc…

解决openstack “failed to connect to server (code: 1006)”故障一例

openstack版本环境&#xff1a;ocata 安装完成ocata版本后&#xff0c;新建主机实例后&#xff0c;通过管理端进入主机实例的控制台时&#xff0c;报错&#xff1a;“failed to connect to server (code: 1006)” 解决思路&#xff1a; 1、检查日志文件&#xff0c;通过日志寻…

CVE-2016-2183

CVE-2016-2183-SSL/TLS协议信息泄露漏洞 漏洞描述 TLS, SSH, IPSec 协商及其他产品中使用的DES及Triple DES密码存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet32攻击&#xff0c;获取纯文本数据。 该漏洞又称为 SWEET32&#xff0c;是对较旧的分组密码算法…

Packet Tracer - 交换机端口安全故障排除

Packet Tracer - 交换机端口安全故障排除 场景 通常使用 PC1 的员工将家里的笔记本电脑带来&#xff0c;然后断开 PC1 的连接并将笔记本电脑连接到电信插座。 在提醒此安全策略不支持在网络上使用个人设备后&#xff0c;您必须重新连接 PC1 并重新启用端口。 拓扑图 要求 …

Linux 查看访问 IP

Linux 系统有很多用于快速处理数据的工具如 grep , awk , cut , sort , uniq , sort 可以帮助我们分析网络情况 , 他们非常非常地好用 , 如果你熟练掌握他们的使用技巧 , 他们则可以帮你快速定位问题 ; 接下来一步步来查看访问系统的 IP 情况 通过 netstat -ntu , 找出通过 tc…