wszjw2 发表于 2024-8-14 08:58:57

8G1K08 点亮ws2812为何会闪烁

ws2812时序要求
1码时间


0码时间




时序都已经达到要求,为何会发生闪烁现象228

DebugLab 发表于 2024-8-14 09:07:12

WS2812品牌批号不同时序差异很大,最准的方法是接1个灯发2个灯数据,测它的输出时序,因为它肯定不能自相矛盾,根据它输出的时序用示波器调

DebugLab 发表于 2024-8-14 09:08:05

建议换8H系列带DMA和SPI的型号,用硬件SPI驱动

wszjw2 发表于 2024-8-14 09:14:21

DebugLab 发表于 2024-8-14 09:08
建议换8H系列带DMA和SPI的型号,用硬件SPI驱动

我看了那个帖子了,目前能力有限,还不会dma和spi{:5_358:}
现在就想着先用io口直接驱动

wszjw2 发表于 2024-8-14 09:17:42

wnagming 发表于 2024-8-14 09:16
时序不对,我之前用10%和90%作为0和1,其实WS2812判断的是否超过50%,所以我将占空比尽可能远离50% ...

我调的时序贴了,可以帮忙看看吗?
淘宝店家给的规格书我看已经符合了,不知道哪里还有问题了

wszjw2 发表于 2024-8-14 09:23:22

wnagming 发表于 2024-8-14 09:18
我的意思是把0和1的占空比再往极限调整一下,不要看商家的时序,商家自己都不知道对不对 ...

好的我试试看

wszjw2 发表于 2024-8-14 09:42:27

wnagming 发表于 2024-8-14 09:20
现在你表格是0。4和0.8嘛,你调整为0.2和1.0试试,没有什么0.85和0.45

我靠真的有用!太感谢了!

cnos 发表于 2024-8-14 21:52:21

网上已经有帖子把2812的时序用通俗语言解释得较为清楚了,我也简单在他们的基础上进一步总结一下
要从芯片设计制造的角度去思考时序问题。比如为什么DS18B20和WS2812这种芯片的时序时间都有一个范围,其实是因为这些芯片内部用的是RC振荡器,所以不会太精准,因此要求外部时序无论在高温低温还是电压偏高偏低的情况下都落入一个特定的范围。

对于ws2812来说,只要来个高电平,那么就会观察这个高电平的持续时间,如果持续时间小于某个值,判为0,如果大于某个值,判为1.
如果信号变成了低电平,那么就等待下一个信号的到来,如果等了半天80us或者200uS,不同型号帧间隔不同,没有下一个信号,就判定为复位信号,本次传输结束。

因此只要控制高电平持续时间的长短,就是控制了发的到底是1还是0了。以下是我用的代码,自认为没有更简洁的办法了。

//STC8G1K08A 22.1184MHz
//STC8G1K08A 22.1184MHz

void nop(void)
{
}
void sendbyte(unsigned char byte)
{
      unsigned char i;
      i=8;
      EA=0;
                do
                {
                        ws2812pin=1;nop();
                        ws2812pin=byte&0x80;nop();
                        ws2812pin=0;nop();
                        byte=(byte<<1);               //左移位
                }while(--i);
      EA=1;
}
void SetLed(unsigned char R_,G_,B_)
{
      sendbyte(G_);
      sendbyte(R_);
      sendbyte(B_);
}

soma 发表于 2024-8-14 22:08:59

我的理解是只要在一个时间范围内发送高低电平,ws2812b就能识别不需要非常精准的时间。

wszjw2 发表于 2024-8-15 09:59:25

soma 发表于 2024-8-14 22:08
我的理解是只要在一个时间范围内发送高低电平,ws2812b就能识别不需要非常精准的时间。 ...

这个范围组合太多了{:4_167:}我试了IRC频率不同的情况输出相同时序,效果都会不一样,只能说io口直接驱动还是不够准确哈哈哈,后面再学spi驱动
页: [1] 2
查看完整版本: 8G1K08 点亮ws2812为何会闪烁