1

ATtiny85 上的内部时钟对于单线计时是否足够准确?

根据https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide单线计时似乎需要 0.05us 范围内的精度,因此 8MHZ 的 AVR 上 10% 的时钟误差会导致 0.0125us 大小时间差异(假设 10% 的误差数字是准确的,并且它是 10% 的频率误差,而不是每个脉冲的 +/- 10% 方差)。

不是很多利润 - 但它足够好吗?

4

3 回答 3

1

首先,WS2812 LED不是1 -wire。WS2812的控制协议在datasheet中有描述

简短的回答是肯定的,ATTiny85,整个 AVR 系列也有足够的时钟精度来控制 WS2812 链。但是程序应该在汇编程序中编写,并且不允许中断,以保证匹配时序请求。如果编程做得好,内部振荡器的 8MHz 速度可能足以同时将不同的数据输出到两个 WS2812 链。

因此,当运行 8MHz ±10% 时,一个时钟周期将为 112...138 ns。

数据表要​​求(具有 150ns 容差):

  • 发送“一”时:高电平为550...850ns;- 6 个时钟周期 (672...828) 匹配此范围(还有 5 个时钟周期 (560...690ns) 匹配)
  • 跟随低电平 - 450...750ns;- 5 个周期 (560...690ns)
  • 发射“零”时:高电平200...500ns;- 3 个周期 (336...414ns)
  • 跟随低电平 650...950ns;- 6 个循环 (672...828)。

因此,如您所见,考虑到时钟源的 ±10% 容差,您可以找到保证与所需间隔匹配的整数周期数。

从经验来看,如果跟随脉冲的低电平将延长数百纳秒,它仍然有效。

于 2018-02-19T12:44:45.430 回答
0

使用带有 UART 的内部振荡器存在已知问题 - 应将时间精确到 2%,而内部振荡器在出厂设置下最多可降低 10%。虽然它可以校准(AVR 有用于此目的的寄存器 OSCCAL),但它的频率受温度影响。

值得一试,但在温度变化或工作电压波动时可能不可靠。

参考:ATmega 的内部振荡器 - 它有多糟糕tiny2313 上的定时精度调整内部振荡器

于 2018-01-28T09:57:37.663 回答
0

NeoPixels (WS2812B) 的时序要求足够宽,唯一真正关键的部分是 1 位的最小宽度。16Mhz 的 ATtiny85 非常快,可以从 GPIO 引脚驱动一串它们。在 8Mhz 时,它可能不起作用(我还没有尝试过)。我刚刚发布了一个小的 Arduino 草图,它允许您在 ATtiny85 上控制任意长度的 NeoPixel 字符串,而无需使用任何 RAM。

https://github.com/bitbank2/NeoPixel

对于具有硬件 SPI 的设备(例如 ATMega328p),最好使用 SPI 移出位(也包含在我的代码中)。

于 2018-03-08T21:51:16.783 回答