本帖最后由 zoomdy 于 2017-1-22 12:24 编辑 8 T- W/ T2 b9 Z# M2 R5 Z9 E è¿è¡ææå¾ 运行效果图 é¢å æ¿æ¥çº¿ 面包板接线; s# }) U8 k' h, U æææ¸ å 材料清单 NUCLEO-F042K6一块,https://detail.tmall.com/item.htm?id=524897143044 WS2812灯环一个(24盏灯),https://detail.tmall.com/item.htm?id=525645384067 v. j; x$ v8 [ 面包板一个,https://detail.tmall.com/item.htm?id=16513870165( e' F2 S" f+ K/ Y2 [ 我用上述链接购买的,供有需要的同学参考,我与卖家仅有买卖关系。# \* m2 \9 e* u- u, o) | 分享一下我采用的方案 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 + e# d' m! \; O- m7 Q3 P WS2812æ¶åº * M8 ?0 ]; K/ a |
这也是引起我的好奇,实作将0x7C改成0xF8(0x7C<<1)结果就是不行,可能是STM SPI DMA的特性.
" m8 n- Y9 R2 v ?4 g+ Q
示波器波形如下:' f" |' H8 W7 D& T# b
黄色:SPI MOSI
蓝色(仅参考): SPI SCK% v; }" {! {- M
0x7C
0xF8
* w( j. L4 B' n# P
比如我的是stm32f401 8 j: B8 x! H( ?1 z/ o+ v `
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
spi频率配制成8分频0 {/ T% L n: C3 Z1 E- m6 Z( z
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
' V6 B2 b0 A- Y6 K4 O6 l K9 |& c
接下来该怎么计算呢?
我有个想法,结合一下磁力传感器做个指南针
哈哈,想法不错,不过不用电机的,移动像素位置就旋转了,实际效果就是在旋转的,静态图片看不出来
你是说PCB原理图吗?没有啊,不过很简单的,就是把多颗WS2812串联起来,参考WS2812数据手册就可以了。
好吧 谢谢了
http://git.oschina.net/zoomdy/BlueSoRing 已经上传到这里了。