标题: 懂WS2812时序的师傅们,请教个问题 [打印本页]

作者: hai2369513    时间: 2024-5-6 15:55
标题: 懂WS2812时序的师傅们,请教个问题
懂WS2812的师傅们,请教个问题如图,我示波器的图跟规格书的图,如何去看波形对不对?要看哪些参数?如何去看波形和规格书?请教各位师傅们了

ws2812.jpg (4.23 MB, 下载次数: 39)

ws2812

ws2812

51hei截图_20240506155123.png (83.32 KB, 下载次数: 52)

规格书1

规格书1

51hei截图_20240506155109.png (62.93 KB, 下载次数: 42)

规格书2

规格书2

作者: lkc8210    时间: 2024-5-6 17:11


作者: hai2369513    时间: 2024-5-6 18:09
lkc8210 发表于 2024-5-6 17:11

谢谢师傅!
作者: Y_G_G    时间: 2024-5-7 12:50
hai2369513 发表于 2024-5-6 18:09
谢谢师傅!

示波器有一个可以测量时间长度的功能,你测量一下就可以了
在这方面30块逻辑分析仪比示波器好用
这是一个已经验证的WS2812写入函数,你参考一下
/*—————————————————————————————————————————————————————————————————
*函数名                :write_ws2812
*函数功能        :写入数据
*输入                :rgb_data
*输出                :无
备注: 使用16MHZ的内部RC时钟,一个指令周期为: 250uS,不需要增加延时
—————————————————————————————————————————————————————————————————*/
void write_ws2812(u8 rgb_data)
{
  u8 i;
  for(i = 0; i < 8; i++)
  {
    if(rgb_data & 0x80)//写"1"
    {
      DO = HI;
          delay_750ns//这个是宏定义750nS延时,你要根据你用的单片机来自己写一个,51单片机可以用几个空指令来完成
      DO = LOW;
    }
    else //写"0"
    {
      DO = HI;//如果你用的单片机指令快于250nS,可以加一个或者几个空指令,来达到延时的目的
      DO = LOW;
    }
    rgb_data <<= 1;
  }
}


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

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

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

//STC8G1K08A 22.1184MHz
  1. //STC8G1K08A 22.1184MHz

  2. void nop(void)
  3. {
  4. }
  5. void sendbyte(unsigned char byte)
  6. {
  7.         unsigned char i;
  8.         i=8;
  9.         EA=0;
  10.                 do
  11.                 {
  12.                         ws2812pin=1;nop();
  13.                         ws2812pin=byte&0x80;nop();
  14.                         ws2812pin=0;nop();
  15.                         byte=(byte<<1);                 //左移位
  16.                 }while(--i);
  17.         EA=1;
  18. }
  19. void SetLed(unsigned char R_,G_,B_)
  20. {
  21.         sendbyte(G_);
  22.         sendbyte(R_);
  23.         sendbyte(B_);
  24. }
复制代码

作者: hai2369513    时间: 2024-5-8 09:25
cnos 发表于 2024-5-7 16:03
论坛里面已经有帖子把2812的时序用通俗语言解释得较为清楚了,我也简单在他们的基础上进一步总结一下
要从 ...

感谢师傅,学习了!
作者: hai2369513    时间: 2024-5-8 09:26
Y_G_G 发表于 2024-5-7 12:50
示波器有一个可以测量时间长度的功能,你测量一下就可以了
在这方面30块逻辑分析仪比示波器好用
这是一 ...

师傅,您说的那个测时间长度的功能叫什么?比如??
作者: Y_G_G    时间: 2024-5-8 17:40
hai2369513 发表于 2024-5-8 09:26
师傅,您说的那个测时间长度的功能叫什么?比如??

示波器如果是英文的,它会有一个cursor的按键,使用方法大多是一样的,或者是相似的
你先在一个测量波形的界面,按下停止按键,就像你现在上传的这个波形一个
然后按一下cursor按键,左右旋转一下旋钮,大概操作就是这样子的,一时半会儿说不明白,你可能百度一下
然后,你再去测量一下示波器上的的1KHZ时钟,用来验证一下
如果你的示波器没有这个cursor按键,那它可能是叫"光标"
作者: hai2369513    时间: 2024-5-8 20:24
Y_G_G 发表于 2024-5-8 17:40
示波器如果是英文的,它会有一个cursor的按键,使用方法大多是一样的,或者是相似的
你先在一个测量波形的 ...

万分感谢师傅百忙抽时间回复我,谢谢!剩下的交给徒弟我了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1