
本帖最后由 anny 于 2017-6-14 13:07 编辑 , i7 |" Z6 L2 {/ k 0 Q/ k6 r$ r# v3 i! ?2 ]; W5 b 其实社区有朋友发帖子用STM32驱动WS2811灯带了,他们用的是硬件SPI,其实也可以用PWM。 今天我的驱动方式不是用单片机外设来驱动,而是用最古老的延时方式,这种方式不适合地方你们自己想了 ![]() 还有,我这个驱动方式可以兼容UCS1903、SM16703等等这些灯带。" W( q& ?8 }8 B/ y" ~ 驱动芯片:STM32F103RBT6 频率:72M 说明:为了保护单片机我用了块74HC245来隔离,也算是做了电压转换,从3.3V变成了5V) v, C$ P u, H7 q 好吧,上程序: void WS2811_SendByte(u8 dat)//发送1BIT的数据' |6 C$ v T$ j5 C { u8 i;! S) V3 n7 q$ h) H4 T/ L8 w for(i=0;i<8;i++) {3 M( `1 Y- }/ l7 o2 y if(dat & 0x80) //发送数据1; r5 t! u& H; u- ]. \0 S {, U1 @' r5 S' h( m/ p Light_SDA=1;' v% b3 O! r% [& V! n/ ~; x delay_us(1);8 F p6 y3 K1 K Light_SDA=0; __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); } else //发送数据0; v8 k+ h6 [" r( F2 _! Z: ~* G { Light_SDA=1;//0 __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); Light_SDA=0;9 y3 _' P) x# f) X+ z delay_us(1);0 p: y6 C6 j# g! K2 ?, J }+ b& `4 m, ]. m9 ^; s l! A& } dat <<= 1; } } void Reset(void) & V: X. n' L3 F6 Q) Q& V { Light_SDA=0;6 O4 Q5 v) V- K4 f1 N delay_ms(30);. L9 O/ `& x, z; g% u0 Q6 w } 基本的发数据程序就这样了 void send_data(u8 R,u8 G,u8 B): N' s2 _& h' s% d4 ? {7 D# k! O0 k q2 x E4 | u8 i;( @% \4 [4 Y, i d {: o2 ~ for(i=0;i<led_size;i++) {* f- v+ h5 d% Q$ U/ N WS2811_SendByte(G); WS2811_SendByte(R); WS2811_SendByte(B); } Reset(); }& O9 C1 g2 ]; L: W v void ls_mode(void)( h, d6 B& Q9 r { u8 i=0,ys=0,yz=0; for(i=led_size;i>0;i--) { if(i<=ls_t)( |7 F! r) d x5 ^& Z {7 r: s1 w% ]2 f. I" ^4 Z M5 t4 u if(ys<ls_t) { ys++; }) m. F' O5 F$ M else ys=0; WS2811_SendByte(LED_data[45-(ys%45)][1]);2 C- S; ?) p7 ?. \. \7 K) M WS2811_SendByte(LED_data[45-(ys%45)][0]); WS2811_SendByte(LED_data[45-(ys%45)][2]); }0 t' W0 c0 G% I else Y2 ~0 I5 G3 W7 a { if(yz>0) { yz--; T- b) u# G/ w. K- I } else yz=led_size-ls_t;7 ~4 I: _. w" I7 F& }) h5 K7 b% L WS2811_SendByte(LED_data[yz%45][1]); WS2811_SendByte(LED_data[yz%45][0]); WS2811_SendByte(LED_data[yz%45][2]);5 M1 _. o' W# g& @ } } Reset(); }, [2 N9 b+ F1 L2 D6 F6 _2 H % E% C. }6 k. S) W8 C) F" _6 s 这是应用程序,其实就是PLAY一个数组,我刚刚开始的方法是完全用FOR来实现,发现哪样做每种流水方式都要重新写,太痛苦了。PLAY数组里面的内容相对会方便很多,当然也可以在函数名上加指针用来实现PLAY哪个数组,这个就自行改善吧! const u8 LED_data[45][3]={ e- y$ h$ \* }8 D# [( F0 C+ a {55,0,255},//G,R,B% b, p4 `& s1 ?" E: g G {100,0,200}, {155,0,155},; p# S5 R% n3 B# K5 f {200,0,100}, {255,0,55},//5 {255,0,0}," E# Z' q2 t% Z f; P/ F {255,0,0},6 H. [$ y0 k) m: b" x {255,0,0},& j( ?* g7 x- k% m8 Y, ? {255,0,0}, {255,0,0},7 B6 ]% O% h" A! z; Z, P0 N$ A9 l {255,0,0},- Z5 J" r# ^/ ~6 i {255,0,0}, {255,0,0}, {255,0,0},0 H5 `) z S5 n: `2 }- k {255,0,0},//15- D! B" u! z7 _9 M$ ^% ~ {255,55,0}, {200,100,0},; y, |& M5 t9 Y& z! q: A {155,155,0},( y2 P& a5 m9 z3 a. u$ g2 O {100,200,0},3 Z8 Q% P% ^2 ~7 v4 G7 a {55,255,0},//20 T& A( @+ x/ p, I {0,255,0},//G,R,B {0,255,0},6 Z5 b0 R. J$ |/ E: p0 A {0,255,0}, {0,255,0}, {0,255,0}, {0,255,0}," a+ {+ s: I1 X% h4 ?2 ~, f {0,255,0}, {0,255,0}, {0,255,0},4 N2 a3 N2 a& r( C) @1 b {0,255,0},//30$ ~% \4 T( B5 P5 f( S- s {0,255,55},//G,R,B {0,200,100},1 B8 ~6 h8 v* V- l @$ V {0,155,155},, w8 M9 D/ g% x- m1 W t( z! K {0,100,200},5 h6 `/ _! ^, r1 d" w {0,55,255},$ M6 G) a3 V: y, t {0,0,255},//35( l$ [9 l. e! D# q5 _2 T, E {0,0,255}, {0,0,255}, {0,0,255},. W, U/ m5 j( O {0,0,255},2 P) K5 E2 l) ~. | {0,0,255},3 \ I+ A/ w8 ~ ? {0,0,255}, {0,0,255}, {0,0,255},+ H1 Z; w$ G! ` I {0,0,255}//45 }; 9 m. F; \( p2 V- i, L: l 这是要PLAY的数组,这次实现的是流水灯,在颜色链接的地方加上了渐变,这样更好看。当然也可以换上其它的方式 单单上面的程序流水灯是流不起来的,在定时中断用变量++来驱动: void TIM2_IRQHandler(void) // 1s enter { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { // ls_mode12(); if(++t2>=ls_speed) { t2=0;2 i3 h" o% B" p# P6 |4 I u if(++ls_t>=led_size) //注意!! {6 g5 \- C0 e3 E8 d. X% n& X: H ls_t=0; } } TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 ); / G# Q! N) K2 H5 V3 q! ] } } 这样在main函数调用ls_mode()灯就流起来了!!' n% l F _6 J$ R+ u 漂亮的东西怎么没有视频: / M" @" \4 b9 w9 Q F ![]() |
参与人数 4 | ST金币 +11 | 收起 理由 |
---|---|---|
|
+ 1 | 赞一个! |
|
+ 2 | 很给力! |
|
+ 5 | 很给力! |
|
+ 3 | 赞一个! |
思路就是用MOSI脚驱动,然后直接发送数据,用逻辑分析仪看高低电平的时间,然后做调整,比如发SPI发送0xE0,其实就是发送了3个1,5个0,这样低电平的时间就肯定长,然后自己看着来调整就行了。
请问您这边有思路吗,我也是想只使用定时器的PWM实现,补寄有的单片机没有DMA控制器
是72M的