本帖最后由 zoomdy 于 2017-1-22 12:24 编辑 è¿è¡ææå¾ 运行效果图3 ^7 X9 }7 w5 I) b é¢å æ¿æ¥çº¿ 面包板接线 æææ¸ å 材料清单 NUCLEO-F042K6一块,https://detail.tmall.com/item.htm?id=5248971430443 o) d1 _9 v# w) R; f7 U WS2812灯环一个(24盏灯),https://detail.tmall.com/item.htm?id=525645384067* V: K8 Q( U3 f h) l) U5 W4 e 面包板一个,https://detail.tmall.com/item.htm?id=16513870165 我用上述链接购买的,供有需要的同学参考,我与卖家仅有买卖关系。6 j( J$ t! |4 ] ^) a % T) ]/ K1 Z- t$ p. T 分享一下我采用的方案, V7 {2 a7 U9 N( z, t WS2812的时序非常特殊,见下图,没有办法使用标准的外设来驱动,得使用模拟实现。我采用的方案是SPI+DMA,用一个字节的SPI数据来表示WS2812的一位数据,SPI时钟频率调整到6.4M(800K * 8,WS2812的速率要求为800K,SPI每8个位长表示1位WS2812数据),SPI数据0x70(3个1,5个0,符合WS2812低电平的时序要求)表示WS2812的0,SPI数据0x7C(5个1,3个0,符合WS2812高电平的时序要求)表示WS2812的1。一个WS2812需要24位数据,首先将这24位RGB数据转换成24字节的SPI数据,然后使用DMA将24字节SPI数据发出去,这样就可以驱动WS2812了。我这个灯环有24盏LED,那么需要24*24=576字节的SPI缓存,用DMA可以一次性操作。这种方法比较耗内存,但是实现起来比较简单,输出时序一致性非常高。源代码已经上传至OSChina:http://git.oschina.net/zoomdy/BlueSoRing WS2812æ¶åº * R6 H8 F% Y, s7 G, v |
这也是引起我的好奇,实作将0x7C改成0xF8(0x7C<<1)结果就是不行,可能是STM SPI DMA的特性.
1 @: t3 I' B, U1 K( g9 S2 O
示波器波形如下: ?7 m' G& v, c! z& T g% O* r5 y
黄色:SPI MOSI) c* B( v5 L1 X; \; x) ^' _
蓝色(仅参考): SPI SCK
# v3 s( N3 n1 L# Z6 c& v- Y) d# h
0x7C/ m. r! _4 F0 E- E* |3 j$ l
2 D2 _$ U2 |8 _* B8 W9 g! k9 H
0xF8
. k& a4 d- ]& G' t
比如我的是stm32f401
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
spi频率配制成8分频9 y( {2 P1 Y8 w+ K! G" C
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
接下来该怎么计算呢?
我有个想法,结合一下磁力传感器做个指南针
哈哈,想法不错,不过不用电机的,移动像素位置就旋转了,实际效果就是在旋转的,静态图片看不出来
你是说PCB原理图吗?没有啊,不过很简单的,就是把多颗WS2812串联起来,参考WS2812数据手册就可以了。
好吧 谢谢了
http://git.oschina.net/zoomdy/BlueSoRing 已经上传到这里了。