找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1557|回复: 8
打印 上一主题 下一主题
收起左侧

懂WS2812时序的师傅们,请教个问题

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 3 次
跳转到指定楼层
楼主
懂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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2024-5-6 17:11 | 只看该作者

评分

参与人数 1黑币 +5 收起 理由
hai2369513 + 5 很给力!

查看全部评分

回复

使用道具 举报

板凳
ID:977079 发表于 2024-5-6 18:09 | 只看该作者
回复

使用道具 举报

地板
ID:401564 发表于 2024-5-7 12:50 | 只看该作者

示波器有一个可以测量时间长度的功能,你测量一下就可以了
在这方面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;
  }
}

评分

参与人数 1黑币 +90 收起 理由
admin + 90 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:688692 发表于 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. }
复制代码

评分

参与人数 2黑币 +105 收起 理由
lkc8210 + 15 共享资料的黑币奖励!
admin + 90 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

感谢师傅,学习了!
回复

使用道具 举报

7#
ID:977079 发表于 2024-5-8 09:26 | 只看该作者
Y_G_G 发表于 2024-5-7 12:50
示波器有一个可以测量时间长度的功能,你测量一下就可以了
在这方面30块逻辑分析仪比示波器好用
这是一 ...

师傅,您说的那个测时间长度的功能叫什么?比如??
回复

使用道具 举报

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

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

使用道具 举报

9#
ID:977079 发表于 2024-5-8 20:24 | 只看该作者
Y_G_G 发表于 2024-5-8 17:40
示波器如果是英文的,它会有一个cursor的按键,使用方法大多是一样的,或者是相似的
你先在一个测量波形的 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表