ATtiny85 上的内部时钟对于单线计时是否足够准确?
根据https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide单线计时似乎需要 0.05us 范围内的精度,因此 8MHZ 的 AVR 上 10% 的时钟误差会导致 0.0125us 大小时间差异(假设 10% 的误差数字是准确的,并且它是 10% 的频率误差,而不是每个脉冲的 +/- 10% 方差)。
不是很多利润 - 但它足够好吗?
ATtiny85 上的内部时钟对于单线计时是否足够准确?
根据https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide单线计时似乎需要 0.05us 范围内的精度,因此 8MHZ 的 AVR 上 10% 的时钟误差会导致 0.0125us 大小时间差异(假设 10% 的误差数字是准确的,并且它是 10% 的频率误差,而不是每个脉冲的 +/- 10% 方差)。
不是很多利润 - 但它足够好吗?
首先,WS2812 LED不是1 -wire。WS2812的控制协议在datasheet中有描述
简短的回答是肯定的,ATTiny85,整个 AVR 系列也有足够的时钟精度来控制 WS2812 链。但是程序应该在汇编程序中编写,并且不允许中断,以保证匹配时序请求。如果编程做得好,内部振荡器的 8MHz 速度可能足以同时将不同的数据输出到两个 WS2812 链。
因此,当运行 8MHz ±10% 时,一个时钟周期将为 112...138 ns。
数据表要求(具有 150ns 容差):
因此,如您所见,考虑到时钟源的 ±10% 容差,您可以找到保证与所需间隔匹配的整数周期数。
从经验来看,如果跟随脉冲的低电平将延长数百纳秒,它仍然有效。
使用带有 UART 的内部振荡器存在已知问题 - 应将时间精确到 2%,而内部振荡器在出厂设置下最多可降低 10%。虽然它可以校准(AVR 有用于此目的的寄存器 OSCCAL),但它的频率受温度影响。
值得一试,但在温度变化或工作电压波动时可能不可靠。
NeoPixels (WS2812B) 的时序要求足够宽,唯一真正关键的部分是 1 位的最小宽度。16Mhz 的 ATtiny85 非常快,可以从 GPIO 引脚驱动一串它们。在 8Mhz 时,它可能不起作用(我还没有尝试过)。我刚刚发布了一个小的 Arduino 草图,它允许您在 ATtiny85 上控制任意长度的 NeoPixel 字符串,而无需使用任何 RAM。
https://github.com/bitbank2/NeoPixel
对于具有硬件 SPI 的设备(例如 ATMega328p),最好使用 SPI 移出位(也包含在我的代码中)。