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