
本帖最后由 zoomdy 于 2017-1-22 12:24 编辑 è¿è¡ææå¾ ![]() 运行效果图 é¢å æ¿æ¥çº¿ ![]() 面包板接线 æææ¸ å ![]() 材料清单 NUCLEO-F042K6一块,https://detail.tmall.com/item.htm?id=524897143044 WS2812灯环一个(24盏灯),https://detail.tmall.com/item.htm?id=525645384067 面包板一个,https://detail.tmall.com/item.htm?id=16513870165 我用上述链接购买的,供有需要的同学参考,我与卖家仅有买卖关系。 分享一下我采用的方案 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æ¶åº ![]() |
这也是引起我的好奇,实作将0x7C改成0xF8(0x7C<<1)结果就是不行,可能是STM SPI DMA的特性.
示波器波形如下:
黄色:SPI MOSI
蓝色(仅参考): SPI SCK
0x7C
0xF8
比如我的是stm32f401
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
spi频率配制成8分频
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
接下来该怎么计算呢?
我有个想法,结合一下磁力传感器做个指南针
哈哈,想法不错,不过不用电机的,移动像素位置就旋转了,实际效果就是在旋转的,静态图片看不出来
你是说PCB原理图吗?没有啊,不过很简单的,就是把多颗WS2812串联起来,参考WS2812数据手册就可以了。
好吧 谢谢了
http://git.oschina.net/zoomdy/BlueSoRing 已经上传到这里了。