你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

再发STM32驱动WS2811灯带  

[复制链接]
anny 发布时间:2017-6-14 09:02
本帖最后由 anny 于 2017-6-14 13:07 编辑 ( D( b' K* a5 `% H, S3 }
5 y1 u+ [( g5 B: e% i; `$ C
其实社区有朋友发帖子用STM32驱动WS2811灯带了,他们用的是硬件SPI,其实也可以用PWM。
& h! \) r" f; E. {0 [/ q6 Q今天我的驱动方式不是用单片机外设来驱动,而是用最古老的延时方式,这种方式不适合地方你们自己想了,优点是灵活,想在哪个IO口驱动随便换。* Q( A( H6 P( q
还有,我这个驱动方式可以兼容UCS1903、SM16703等等这些灯带。
) M# p6 G. b5 Y* x5 b/ E驱动芯片:STM32F103RBT6 频率:72M
5 `0 l8 K* t( G" P说明:为了保护单片机我用了块74HC245来隔离,也算是做了电压转换,从3.3V变成了5V
& L- {( S4 w* a8 s/ m好吧,上程序:
/ V% A9 p$ }1 F. lvoid WS2811_SendByte(u8 dat)//发送1BIT的数据
* [7 q- Q% Q& O+ E' w) \! _{
- d1 Z; c4 s' N0 T& w6 t        u8 i;
; M- k$ I0 f9 ?, o) d" O        for(i=0;i<8;i++)
/ J" F  \" f. C        {
! M# X! q1 i5 M7 K: C% ^. H. `                if(dat & 0x80) //发送数据1, q9 H7 j. V1 {8 \5 W
                {8 c, ^9 C4 E( O( q- |9 G( y. l
             Light_SDA=1;
4 {6 e. ~' z- g7 D6 [4 T6 f             delay_us(1);
* a( _2 A& O5 P1 d5 |$ A            Light_SDA=0;
6 E& V' T1 d! A            __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
$ \# S" V6 G; Q' f; a1 Z8 }  J" l                }
+ e/ C& w/ j) X6 H9 k                else                        //发送数据0
; J+ l" U$ E- M                {+ S" \& P7 [8 J( k- C! N- w9 n
            Light_SDA=1;//0
8 Q0 p3 S1 L* z  m4 d            __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();$ R% ~2 l5 A. a
             Light_SDA=0;
5 y6 V. Z3 \5 v6 y! {) M: N            delay_us(1);
, ~4 D- Q, B; _1 S                }
2 Q: A7 h) u6 s7 ^                dat <<= 1;6 K- n/ @( A$ E+ _+ I- {8 g
        }( f2 i( I6 O4 J0 `* P4 q1 O* Z
}  y  W$ _* O7 f7 f

6 F+ G: l6 K7 W- Z) S! }0 D9 a- Q) V4 s" [, d) Z1 F( I# t" J
void Reset(void)                 * L' Z' R) c- K+ t$ |( v* h9 n
{        
; C9 P" y# x" p" a% t    Light_SDA=0;9 Q5 e: H$ _6 Z$ [
    delay_ms(30);; M+ D( z# }6 s  L$ W3 ]( j
}
! l3 ?2 W0 k0 g3 o
% u4 @) B, D1 ?# F* W/ ^基本的发数据程序就这样了
: v7 q% A+ d( ]9 c8 P- [void send_data(u8 R,u8 G,u8 B)& Y" `7 x8 ^) ^1 Z# _
{% W/ f8 ]1 n) e  f' j8 W
                u8 i;
' W5 t. C. J6 n7 P# E                for(i=0;i<led_size;i++)5 q2 f3 a# H" ]. e3 f3 B
                {' ~% C  W! [# d! w( F
                        WS2811_SendByte(G);: v# u$ M- Q2 e  M0 a# C
                        WS2811_SendByte(R);
. R( Z* {- g, g( w! A                        WS2811_SendByte(B);; [% h+ x. K- [7 @. `4 ^! }5 A
                }
5 G2 N, ?  T4 I: }- m5 F                   Reset();
- }( I& ]7 N$ P, l4 }+ w$ y2 r}* y" J0 k: b  w1 v' g
/ w. S8 Q: b% J3 d0 L# U
void ls_mode(void)' d" h$ X+ Q  o
{6 r6 {) V# ]. W5 N6 F4 _4 K' _/ ]
        u8 i=0,ys=0,yz=0;
0 U6 N- S$ o; ?& V$ [        for(i=led_size;i>0;i--), f0 s4 i5 P% I. w2 [0 u! o5 c
        {. L) P& p: o# k. p/ r) e. v1 ^
                if(i<=ls_t)" p- J) p  `0 [; Y7 O
                {
+ B4 j9 C# b9 U" C4 b                        if(ys<ls_t)( {# |, d& p2 @8 t
                        {
* {. ^" K* K  Q/ G! F7 ~! a                          ys++;
$ y+ ?# S5 B5 q* ~                        }
0 a) D) r, j$ A2 b4 z7 H- [+ A                        else
8 R0 f# a4 r' N9 U8 f% W                                ys=0;
- {1 z) F8 F- t* _                        WS2811_SendByte(LED_data[45-(ys%45)][1]);8 T* A6 D* ~) ^5 O: _
                        WS2811_SendByte(LED_data[45-(ys%45)][0]);3 V6 [# i0 w( W0 ?. e. y
                        WS2811_SendByte(LED_data[45-(ys%45)][2]);$ j, }  F  v. P1 a' H( P) E
                }
9 p7 C) V& l+ c& _" ?                else  |9 ~: H9 [, ^5 Q3 `" e
                {
" p  ~! F$ V  ]7 W4 Y# B# r                        if(yz>0)
' `  n& b6 ]* H/ ]. ]                        {
: E- |" ~& J( @; s" R( N                          yz--;
# |% R' i! u) C1 G  R                        }
1 `" L4 l8 J' x, V2 f$ f! A( p7 |                        else
) C0 ~3 k9 G' [! z                                yz=led_size-ls_t;, a5 e+ W5 I- y$ s% P2 y
                        WS2811_SendByte(LED_data[yz%45][1]);! C% J5 B( i6 D; d- J
                        WS2811_SendByte(LED_data[yz%45][0]);8 I. P2 f) ^- @# j1 X* \
                        WS2811_SendByte(LED_data[yz%45][2]);2 W; R  S7 P0 u
                }
% u  g( ~; e( ]        }+ ~+ M: ?3 G! k; r" U6 }
          Reset();; k+ Z0 H- _( |6 _0 Q7 E
}+ e* ]- h' \5 S" d( S7 C
0 z9 o4 [' k6 m7 S7 V6 E. ^

" a! U8 x7 }" R( D* t2 @这是应用程序,其实就是PLAY一个数组,我刚刚开始的方法是完全用FOR来实现,发现哪样做每种流水方式都要重新写,太痛苦了。PLAY数组里面的内容相对会方便很多,当然也可以在函数名上加指针用来实现PLAY哪个数组,这个就自行改善吧!' F& X) B/ t7 J  y7 n1 m: f* p7 _! e
const u8 LED_data[45][3]={5 L' |4 y) \3 y: T
        {55,0,255},//G,R,B
* B! q9 K9 |+ U$ n# `1 U        {100,0,200},' G4 Z" W) F3 C3 s+ c6 f
        {155,0,155},. T; G* s( x: s4 \  Z& g5 e# f- C
        {200,0,100},
5 n3 g( R- i( S# ^2 c6 Q& o        {255,0,55},//5) c6 _% X  E. W% v9 E7 ~, a% C
        {255,0,0},: E7 ^; {  g2 ~: Y! K
        {255,0,0},: Q8 L1 y$ D6 f
        {255,0,0},
0 M! b- E/ @+ ^  F        {255,0,0},
0 q( q$ C( ~" ?% F        {255,0,0},
/ y2 [4 @- N4 v* c3 A        {255,0,0},4 q7 D" a, ?  b! u& r
        {255,0,0},
! z* K9 i# v5 I3 Y5 f        {255,0,0}," Y! Z, ?* @. C- Q2 ^& _  Y! G
        {255,0,0},
6 C7 A5 H* N& ~        {255,0,0},//15
" C, a4 ]: {1 z( q$ k$ w, ~* x: r        {255,55,0},
" f( u* d9 [' ~0 p        {200,100,0},9 s0 J/ b# h/ c. P+ I- J1 ~
        {155,155,0},
: H% s6 t# K/ R# |. a- P: a% f        {100,200,0},+ T% a" d$ B4 K% ]$ l" e
        {55,255,0},//20
3 y) ]( G5 S. ?9 h        {0,255,0},//G,R,B
; l8 f/ Q0 S3 e  \0 n        {0,255,0},* w5 m5 v7 O9 ?% z- o
        {0,255,0},3 e1 O( q4 T4 K2 N: ]& ?
        {0,255,0},* o- R: S% s# u# X8 i
        {0,255,0},
& Q/ k& R  J1 q  z/ a# H8 M7 v        {0,255,0},
/ f+ K( ~! n1 F# s1 l! m        {0,255,0},
6 I: r9 P( x$ m: N! p0 n8 m0 ]        {0,255,0},
4 W# q3 O! o# w; @3 j        {0,255,0},
6 T6 t4 Z% d5 U" Z; f; Z% L        {0,255,0},//30+ R; B6 a- W( e% x
        {0,255,55},//G,R,B
' F% R* ~1 q* u        {0,200,100},
7 n) h; J* y3 _        {0,155,155},
2 n: b& i% R! p1 Q& y7 e. O( \        {0,100,200},
9 ~% I* `9 b/ [' o( b/ T# c        {0,55,255},1 |9 \$ g1 |2 b! q" m7 U9 v% B
        {0,0,255},//35% t9 s4 R+ c, x! G9 _7 R
        {0,0,255},0 a( K+ E: Z0 W; `  e4 x2 Z) k) w
        {0,0,255},
; D  E8 Y$ a3 M7 ^* e: k- R        {0,0,255},4 W- ^$ @: f; v, }) u! z
        {0,0,255},- i( c" N: i+ W4 C! Y0 n7 a" s
        {0,0,255},; n, J8 d3 t9 |* h" X; c
        {0,0,255},: @! N1 j3 R- A
        {0,0,255},
  \; q* Z8 N: c        {0,0,255},& k7 z% T0 T( E& a5 u" J% z9 v- a) H9 d
        {0,0,255}//45
3 u" O! J- t) O; y! J                           };, L* f+ w+ ^2 h$ {! l' I" x$ [1 c
! s0 r) `' }" M0 R8 V

$ Q2 H0 S; ]9 C- k这是要PLAY的数组,这次实现的是流水灯,在颜色链接的地方加上了渐变,这样更好看。当然也可以换上其它的方式
, ?5 i% M5 h# J! z# g9 ^6 a单单上面的程序流水灯是流不起来的,在定时中断用变量++来驱动:
$ @: x2 b  S/ P9 ?( j1 o. y* rvoid TIM2_IRQHandler(void)  // 1s enter( p! |  E* N1 h% Y/ d, A
{
5 N* I! {. f2 L3 b# {1 x0 ?% @     if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)4 I$ N% o/ i, w2 x+ a$ _
     {1 t* t! T# a" S! E" [
//                        ls_mode12();
) ^8 V) L$ N' Y$ s; ]                if(++t2>=ls_speed)
' k- [; i3 a, R- x                {9 ]3 W; L, r# E7 D
                        t2=0;
2 S2 n" G. U) o4 y3 \                        if(++ls_t>=led_size) //注意!!
9 O: U+ |9 n* U4 `                                {
1 E( @( Y# r6 }/ G, j! |8 Q8 U% @                                        ls_t=0;; d( b8 c+ j' F1 R1 f
                                }" R0 q/ t! p- T/ b% D3 V8 e6 C/ \
                        }% n' ]' J3 i3 t/ L. m
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );        3 y4 F7 o: o3 I' H9 w# C% H
     }  
+ Q/ n' g. N2 B' Q}3 J" p  ^1 D- }1 M
+ N% h; a; H% |6 Q) J. w( j" Y
  [" O1 B& g2 A' m0 P
这样在main函数调用ls_mode()灯就流起来了!!
! b, |: T+ U8 a; Z, F漂亮的东西怎么没有视频:* P) Y# h: a( n1 |& e: o
- ^; H1 c" o1 p' J$ n3 C0 \# z
P70614-085819.gif $ u! S" t% o! ^& j& v. r

评分

参与人数 4 ST金币 +11 收起 理由
勿忘初心ºº¹ + 1 赞一个!
pythonworld + 2 很给力!
shaoziyang + 5 很给力!
MrJiu + 3 赞一个!

查看全部评分

赞 1 收藏 7 评论33 发布时间:2017-6-14 09:02

举报

33个回答
dream2010 回答时间:2017-11-3 23:09:05
我也做了一批这个控制器,插TF卡,将要显示的数据保存成文件放在卡里,STM32读取,DMA传送到 SPI口,256级灰度可调,能控制1000个以上的芯片,这种芯片对时间要求比较严,一屏数据要按时序一次发完,否则可能显示就有问题,一直想换成PWM,但是不知道怎么去实现不停控制精准的时间,用示波器调感觉太麻烦了
myccl 回答时间:2018-5-6 20:28:02
anny 发表于 2018-5-3 08:17
5 {* R- P- T4 X8 k- b7 o兄弟,分享一下SPI是怎么驱动的?
+ C/ R1 J( b" j# Y
思路就是用MOSI脚驱动,然后直接发送数据,用逻辑分析仪看高低电平的时间,然后做调整,比如发SPI发送0xE0,其实就是发送了3个1,5个0,这样低电平的时间就肯定长,然后自己看着来调整就行了。
翔2018 回答时间:2021-5-20 14:03:56
dream2010 发表于 2017-11-3 23:095 e6 w# ]3 V+ x3 y  n- C8 `2 s
我也做了一批这个控制器,插TF卡,将要显示的数据保存成文件放在卡里,STM32读取,DMA传送到 S ...
( q- R8 D8 P6 G4 n4 u
请问您这边有思路吗,我也是想只使用定时器的PWM实现,补寄有的单片机没有DMA控制器4 \6 k, I4 P  \
MrJiu 回答时间:2017-6-14 09:11:49
看起来不错的样子!!!!!!!!!!
anobodykey 回答时间:2017-6-14 09:13:36
很炫酷那
shaoziyang 回答时间:2017-6-14 09:17:00
挺不错的
Stm32McuLover 回答时间:2017-6-14 09:24:50
帮顶。。。。
左岸右岸 回答时间:2017-6-14 09:42:22
赞
waiman 回答时间:2017-6-14 10:06:50
MCU是跑72Mhz 吗?
jackten 回答时间:2017-6-14 10:37:56
厉害厉害               
lisingch 回答时间:2017-6-14 10:53:15
漂亮,赞!
黑皮男 回答时间:2017-6-14 12:41:24
挺炫的
zero99 回答时间:2017-6-14 12:57:21
酷炫
anny 回答时间:2017-6-14 13:06:49
waiman-156411 发表于 2017-6-14 10:064 p) B; ^$ _9 R8 t/ o# a
MCU是跑72Mhz 吗?
( j3 V0 S6 X0 o  P' W" Q
是72M的
时光虫子 回答时间:2017-6-14 16:19:52
做的不错,看上去很炫啊
epochal 回答时间:2017-6-14 20:03:00
不错。赞一个!
pythonworld 回答时间:2017-6-14 21:00:09
功耗如何,费电吗?
123下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版