• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-06
  • 语言: 其他
  • 标签: WS2812  stm32f103  RGB灯  

资源简介

该资源包含了连个文件,分别是.c和.h,可以实现stm32f103c8t6开发板控制24位WS2812 5050RGB灯圈,其中灯个数可随意修改,在拿到文件后不能很好控制RGB灯时,需自行拿逻辑分析仪测出1,0码所需的延时时间。

资源截图

代码片段和文件信息

#include “led.h“
#include “delay.h“//滴答时钟系统延时相关头文件,自行添加。因为下面函数中用到了Delay_us操作,不用系统滴答的话,可用自定义的延时函数HAL_Delay
  //不过延时数值要尽量大一些最好用逻辑分析仪测一下时长


/*
WS2812 5050RGBLED灯是一款可级联无限个的,内置处理芯片的,由10时序控制的,色彩控制及呈现良好的灯
其10码对时间的要求相对苛刻,在选型处理器时一定要注意,处理器的处理频率是否达到所需控制量级,像一
般的51单片机是不能很好的控制这款灯的,但一般M系列内核的处理器都可以,当然集成51内核的还有很多处理
速度相对高一点的芯片,本人没有做过相应测试,但看到10码所需的纳秒级别就知道处理器的处理速度不能太
小。
 */

void  led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PA0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ENABLE );
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB &GPIO_InitStructure);
WS2812 = 1;
}


 
#define numLEDs 24   //灯的个数
unsigned char buf_R[numLEDs] = {0};//颜色缓冲
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};
 
void RGB_Set_Up();  //送0码
void RGB_Set_Down(); //送1码
 
 
 
void HAL_Delay(unsigned int t)
{
while(t--);
}
 
//1码高电平850ns 低电平400ns 误差正负150ns
void RGB_Set_Up()
{
//这里要直接对寄存器进行操作,是因为WS2812 5050RGB灯对时间要求非常苛刻,对寄存器直接操作可以降低使用库函数处理时耗损时间的影响
GPIOB->BSRR = 0x01;
//经过逻辑分析仪调试的延时,这个很重要,不同的MPU其处理速度不同,需用逻辑分析仪获得这个延时时长是否达到要求,下同。
HAL_Delay(4);
GPIOB->BRR  = 0x01;
HAL_Delay(1);
__nop;
}
 
//1码高电平400ns 低电平850ns 误差正负150ns
void RGB_Set_Down()
{
GPIOB->BSRR = 0x01;
  //经过逻辑分析仪调试的延时
HAL_Delay(1);
GPIOB->BRR  = 0x01;
HAL_Delay(2);
}
 
//发送24位数据
void Send_2811_24bits(unsigned char G8unsigned char R8unsigned char B8)
{
  
  unsigned int n = 0;
  //发送G8位
for(n=0;n<8;n++)
{
G8<<=n;
if(G8&0x80 == 0x80)
{
RGB_Set_Up();
}
else  
{
  RGB_Set_Down();
}
}
//发送R8位
for(n=0;n<8;n++)
{
R8<<=n;
if(R8&0x80 == 0x80)
{
RGB_Set_Up();
}
else  
{
RGB_Set_Down();
}

}
//发送B8位
  for(n=0;n<8;n++)
{
B8<<=n;
if(B8&0x80 == 0x80)
{
RGB_Set_Up();
}
else  
{
  RGB_Set_Down();
}
}
}
//复位码
void RGB_Rst()
{
WS2812 = 0;
Delay_us(50);
}
//把24位数据GRB码转RGB
void Set_Colour(unsigned char runsigned char gunsigned char b)
{
  unsigned char i;
for(i=0;i   {
  buf_R[i] = r; //缓冲
  buf_G[i] = g;
  buf_B[i] = b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
//某一个点显示的颜色
void SetPointColour(unsigned int numunsigned char runsigned char gunsigned char b)
{
  unsigned char i;
for(i=0;i   {
buf_R[num] = r;//??
  buf_G[num] = g;
  buf_B[num] = b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
 
//颜色交换24位不拆分发
void SetPixelColor(unsigned char numunsigned long c)
{
  unsigned char i;
for(i=0;i   {
buf_R[num] = (unsigned char)(c>>16);
  buf_G[num] = (unsigned char)(c>>8);
  buf_B[num] = (unsigned char)(c);
}
for(i=0;i

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-01-09 11:28  WS2812_RGBLED\
     文件        6516  2019-01-09 12:03  WS2812_RGBLED\led.c
     文件        1226  2019-01-09 11:43  WS2812_RGBLED\led.h

评论

共有 条评论