[DemoCode下载] WS2812如何控制?简单,直接NOP延时模拟时序

[复制链接]
 楼主| 捉虫天师 发表于 2024-9-6 22:18 | 显示全部楼层 |阅读模式
en-us--EC_M0A23_GPIO_ARGB_LED_Control_V1.00 (1).zip (5.25 MB, 下载次数: 1)
使用 GPIO 控制 ARGB LED,主要透过 NOP() 命令让高低电平往后延迟一段时间,程序中设定系统时钟 HIRC 为 48MHz,执行一个命令时间约 1 / 48MHz ( 20.83ns ),由执行命令时间即可得到需要执行几次 NOP() 命令。
  1. void ARGB_sendBIT0()
  2. {
  3.     Dout_Pin = 1;
  4.     __NOP();
  5.     __NOP();
  6.     __NOP();
  7.     __NOP();
  8.     __NOP();
  9.     __NOP();
  10.     __NOP();
  11.     __NOP();
  12.     __NOP();
  13.     __NOP();
  14.     __NOP();
  15.     Dout_Pin = 0;
  16.     __NOP();
  17.     __NOP();
  18.     __NOP();
  19.     __NOP();
  20.     __NOP();
  21.     __NOP();
  22.     __NOP();
  23.     __NOP();
  24.     __NOP();
  25.     __NOP();
  26.                 __NOP();
  27.     __NOP();
  28.     __NOP();
  29.     __NOP();
  30.     __NOP();
  31.     __NOP();
  32.     __NOP();
  33.     __NOP();
  34.     __NOP();
  35.     __NOP();
  36.                 __NOP();
  37.     __NOP();
  38.     __NOP();
  39.     __NOP();
  40.     __NOP();
  41.     __NOP();
  42.     __NOP();
  43.     __NOP();
  44.     __NOP();
  45. }

  46. /**
  47.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Send BIT1
  48.   * @param  None
  49.   * @retval None
  50.   */
  51. void ARGB_sendBIT1()
  52. {
  53.     Dout_Pin = 1;
  54.     __NOP();
  55.     __NOP();
  56.     __NOP();
  57.     __NOP();
  58.     __NOP();
  59.     __NOP();
  60.     __NOP();
  61.     __NOP();
  62.     __NOP();
  63.     __NOP();
  64.     __NOP();
  65.     __NOP();
  66.     __NOP();
  67.     __NOP();
  68.     __NOP();
  69.     __NOP();
  70.     __NOP();
  71.     __NOP();
  72.     __NOP();
  73.     __NOP();
  74.     __NOP();
  75.     __NOP();
  76.     __NOP();
  77.     __NOP();
  78.     __NOP();
  79.     __NOP();
  80.     __NOP();
  81.     __NOP();
  82.     __NOP();
  83.     Dout_Pin = 0;
  84.                 __NOP();
  85.     __NOP();
  86.     __NOP();
  87.     __NOP();
  88.     __NOP();
  89.     __NOP();
  90.     __NOP();
  91.     __NOP();
  92.     __NOP();
  93.     __NOP();
  94.     __NOP();
  95. }

  96. /**
  97.   * @brief  Send Trst
  98.   * @param  None
  99.   * @retval None
  100.   */
  101. void ARGB_sendReset()
  102. {
  103.     int i = 0;
  104.     Dout_Pin = 0;

  105.     for (i = 0; i < 3200; i++)
  106.     {
  107.         __NOP();
  108.     }
  109. }
应了那句话:天下武功,为快不破。
两只袜子 发表于 2024-9-7 15:40 | 显示全部楼层
所以要打闪电战吗
hilahope 发表于 2024-9-9 10:31 | 显示全部楼层

WS2812是一种智能控制LED灯源,它可以通过单根信号线控制多个灯点,实现全真色彩显示。
mnynt121 发表于 2024-9-9 11:09 | 显示全部楼层
NOP指令的执行时间取决于单片机的时钟频率。例如,如果单片机的主频是72MHz,那么一个NOP指令的执行时间大约是1/72us。
yorkbarney 发表于 2024-9-9 12:15 | 显示全部楼层
使用NOP(No Operation)指令进行延时是控制WS2812信号时序的一种方法。这要求精确计算NOP指令执行的时间及所需数量,以确保符合WS2812的时序要求。例如,如果系统时钟为48MHz,则每个NOP的时间为1/48MHz,即大约20.83纳秒。因此,发送一个比特的数据可能需要执行数十个NOP指令来满足时间上的高电平和低电平持续时间的需求。
modesty3jonah 发表于 2024-9-9 14:42 | 显示全部楼层
采取必要的抗干扰措施,确保系统的稳定性和可靠性。
wilhelmina2 发表于 2024-9-9 16:09 | 显示全部楼层
WS2812的数据帧由高低电平的持续时间决定,通常高电平(T1H或T0H)和低电平(T1L或T0L)的持续时间需要非常精确。例如,数据帧为1时,高电平持续T1H,低电平持续T1L;数据帧为0时,高电平持续T0H,低电平持续T0L。
benjaminka 发表于 2024-9-9 19:24 | 显示全部楼层
WS2812是一种集成了控制电路和RGB芯片的智能控制LED灯源,它的控制主要是通过模拟其特定的时序来实现的。在使用GPIO(通用输入输出)模拟时序驱动WS2812时,通常会采用__NOP()(无操作指令)延时的方法来精确控制高低电平的时间长度,从而生成符合WS2812要求的0码和1码。
51xlf 发表于 2024-9-9 22:25 | 显示全部楼层
当控制多个WS2812灯珠时,需要连续发送每个灯珠的24位数据。
eefas 发表于 2024-9-10 01:27 | 显示全部楼层
控制WS2812时,需要考虑MCU的系统时钟频率。不同的MCU时钟频率会影响__NOP()延时的精确度。例如,STM32F4系列的系统时钟频率为84MHz,每个__NOP()大约占用11.9ns。因此,需要根据具体的系统时钟频率来计算所需的__NOP()数量。
mollylawrence 发表于 2024-9-10 04:27 | 显示全部楼层
软件实现上,可以使用内联函数来减少函数调用的开销,提高时序控制的精度。
我喜欢打游戏 发表于 2024-9-10 16:08 | 显示全部楼层
这个实现确实简单,但是这种方式不太推介
1988020566 发表于 2024-9-10 16:20 | 显示全部楼层
WS2812是一种集成了控制电路和RGB芯片的智能控制LED灯源,它的控制主要是通过模拟其特定的时序来实现的。在使用GPIO(通用输入输出)模拟时序驱动WS2812时,通常会采用__NOP()(无操作指令)延时的方法来精确控制高低电平的时间长度,从而生成符合WS2812要求的0码和1码。
mnynt121 发表于 2024-9-10 18:31 | 显示全部楼层
控制WS2812时,需要考虑MCU的系统时钟频率。不同的MCU时钟频率会影响__NOP()延时的精确度。例如,STM32F4系列的系统时钟频率为84MHz,每个__NOP()大约占用11.9ns。因此,需要根据具体的系统时钟频率来计算所需的__NOP()数量。
olivem55arlowe 发表于 2024-9-10 20:18 | 显示全部楼层
为了提高代码的执行效率,可以尽量减少循环和函数调用,直接使用宏定义或内联函数来执行NOP延时。
zerorobert 发表于 2024-9-10 22:07 | 显示全部楼层
WS2812 在数据传输之前需要一个复位信号,复位信号的持续时间也需要满足一定的要求,通常是一个较长的低电平脉冲。在模拟时序时,要确保复位信号的正确性,以便 WS2812 能够正确接收后续的数据
jimmhu 发表于 2024-9-11 10:38 | 显示全部楼层
如果在程序中使用了中断,要确保中断不会影响到 NOP 延时的准确性。在控制 WS2812 时,最好关闭不必要的中断,或者在中断服务程序中尽量减少执行时间,以免干扰到 WS2812 的信号传输
pentruman 发表于 2024-9-11 12:23 | 显示全部楼层
NOP指令产生的延时取决于单片机的时钟频率。确保你知道你的单片机运行在什么频率下,并据此计算所需的NOP次数。
zerorobert 发表于 2024-9-11 14:02 | 显示全部楼层
NOP延时容易受到外界干扰              
earlmax 发表于 2024-9-11 16:02 | 显示全部楼层
硬件的时钟源稳定,避免因时钟频率波动导致 NOP 延时不准确,从而影响 WS2812 的控制时序。如果时钟频率不稳定,可能会导致 WS2812 无法正确识别信号,出现显示异常等问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

3272

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

212

主题

3272

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部