0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动WS2812B灯条时显示其他颜色咋办?

冬至子 来源:小陈学不停 作者:小陈学不停 2023-07-21 15:38 次阅读

一 背景

前段时间发现在驱动WS2812B灯条的时候会有突然显示其他颜色的情况,后来排查发现是时序被其他任务打断了,在控制时序的时候需要做原子性访问来保证时序的正确性。

二 WS2812B数据手册

2.1 逻辑0和逻辑1

图片

2.2 发送时序

图片

绿色数据先发,高位在前

图片

三 写数据

3.1 精准ns和us级别延时的实现

一个__NOP()的时间是一个时钟周期,如果主频设置的是64MHz,那么一个时钟周期就是1/64000000 = 15.625ns,这里只需要实现一个330ns延时,2个330ns就是660ns了。

void delay_330ns(void)
{
    volatile uint8_t cnt = 21;
    while(cnt--)
    {
        __NOP();
    }
}
void delay_660ns(void)
{
    volatile uint8_t cnt = 21*2;
    while(cnt--)
    {
        __NOP();
    }
}
void ws2812b_write_data(uint8_t data){
  for(uint8_t i=0;i< 8;i++)
  {
    if(data & 0x80)//高位先发
    {
      GPIOA- >BSRR = GPIO_PIN_8;
      delay_660ns();
      GPIOA- >BRR = GPIO_PIN_8;
      delay_660ns();
    }
    else
    {
      GPIOA- >BSRR = GPIO_PIN_8;
      delay_330ns();
      GPIOA- >BRR = GPIO_PIN_8;
      delay_660ns();
    }
    data< <=1;
  }
}


#define CONFIG_LED_COUNT 12


void updata_light(uint8_t green,uint8_t red,uint8_t blue)
{  
  rt_base_t level = rt_hw_interrupt_disable();//关闭中断

  for(int i=0;i< CONFIG_LED_COUNT;i++)
  {  
      WS2812_Send(green);      //发送当前需要亮的灯的颜色
      WS2812_Send(red);
      WS2812_Send(blue);
  }
  rt_hw_interrupt_enable(level);//开启中断

  rt_hw_us_delay(300);//复位显示
}

四 总结

当灯的数量比较多的时候,就不能用这种延时方式了,长时间的关闭中断可能会引起一些中断无法及时响应造成数据丢失,在发现问题的时候或者调试新算法的时候,需要基于数据来分析问题,有了数据自然就会有答案了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7319

    浏览量

    142998
  • led灯
    +关注

    关注

    22

    文章

    1554

    浏览量

    107036
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50596
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13615
  • WS2812B
    +关注

    关注

    1

    文章

    38

    浏览量

    1923
收藏 人收藏

    评论

    相关推荐

    哪位大神有完整的STM32F205驱动WS2812B带的程序

    哪位大神有完整的STM32F205驱动WS2812B带的程序
    发表于 09-03 18:08

    使用ESP8266驱动WS2812B型RGB LED智能制作分享

    这个智能方案很不错,只用了一个无线WIFI esp8266芯片,驱动ws2812b型RGB LED,效果很赞,在群里看到的,特分享下,若是侵犯了版权,联系我删除就行了
    发表于 07-16 04:35

    怎么使用Arduino控制采用WS2812B可独立寻址的LED

    如何使用Arduino控制采用WS2812B可独立寻址的LED
    发表于 06-19 11:22

    WS2812B RGB全彩LED

    WS2812B RGB全彩LED珠,只需通过一根信号线控制多个显示,本教程使用X-CTR100控制器驱动
    发表于 08-06 08:15

    怎样给WS2812B发送数据呢

    1. 对于写驱动来说WS2812B芯片手册主要就是看通讯。简单来说就是给WS2812B发送数据,数据就是RGB对应的值,先发高位,按照GRB的顺序发送数据。通常我们用高电平表示数字信号“1”,低电平
    发表于 02-22 06:51

    怎样使用PWM+DMA的方式去驱动WS2812B

    PWM+DMA 驱动 WS2812一、项目要求(主要目的)使用 PWM+DMA 的方式驱动 WS2812B, 并每隔 800ms 随机显示
    发表于 02-22 06:42

    【DFRobot Beetle ESP32-C3开发板试用体验】Arduino编程控制WS2812B炫彩LED

    我最近分享的一篇文章中 Debian-StarFive下的SPI驱动WS2812B炫彩灯珠 中,在Linux下,通过SPI来驱动WS2812B炫彩LED
    发表于 06-20 00:20

    【晶心科技ADP-Corvette-T1开发板试用体验】使用Arduino的SPI库,直接驱动WS2812B炫彩点阵板

    ,确定使用SPI库2). 定义珠、引脚信息3). 定义要发送的数据信息;关于其具体的定义,可以查看 Debian-StarFive下的SPI驱动WS2812B炫彩灯珠4). 定义当前要点亮的
    发表于 06-20 12:45

    ws2812b led做远程区域面板控制器的教程

    描述WS2812B 远程区域面板控制器我用ws2812b led做了一个面板,你可以把覆盆子前面的动画放到面板上使用此板,您可以控制面板并将其放置在任何有 wifi 的地方PCB代
    发表于 07-29 07:16

    使用WS2812b Led的diy光剑光剑控制器

    描述使用 WS2812b Led 的 diy 光剑光剑控制器,包括用于声音的微型 SD 插槽、用于运动跟踪的 6 轴传感器和用于光剑声音的扬声器。通过板载 USB 端口和 Arduino IDE 进行编程。
    发表于 08-25 07:40

    使用WS2812B实现一个带有麦克风的RGB LED控制电路

    描述RGB LED游戏在这个项目中,我们将使用可编程LEDWS2812B Yeladuino nano实现一个带有麦克风的RGB LED
    发表于 08-29 06:45

    WS2812B多了怎么保证时序的正确?

    WS2812B多了,怎么保证时序的正确。
    发表于 09-20 08:14

    WS2812B最后一个颜色总是不对,是什么原因造成的?

    WS2812B最后一个颜色总是不对
    发表于 09-20 07:24

    【LuckFox Pico Plus开发板免费试用】05_使用SPI驱动WS2812B

    使用SPI驱动WS2812B 前面把开发环境全部搭好,工具也都准备好了,这次就来做点小demo,正好手上有一个WS2812B的小,上面有
    发表于 10-29 19:15

    Arduino WS2812B LED灯带设计方案

    Arduino WS2812B LED灯带可单独控制每个LED的亮度和颜色,提供了一种简单而酷炫的LED效果体验。
    发表于 04-24 08:36 1.1w次阅读
    Arduino <b class='flag-5'>WS2812B</b> LED灯带设计方案