找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2017|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

WS2811應(yīng)用資料與單片機(jī)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1108761 發(fā)表于 2024-1-10 11:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、WS2811簡(jiǎn)介

輸出端口耐壓12V

芯片內(nèi)置穩(wěn)壓管,24V以下電源端只需串電阻IC到VDD腳,無(wú)需外加穩(wěn)壓管

灰度調(diào)節(jié)電路(256級(jí)灰度可調(diào))

內(nèi)置信號(hào)整形電路,任何一個(gè)IC收到信號(hào)后經(jīng)過(guò)波形整形后在輸出,保證線路波形畸變不會(huì)累加

內(nèi)置上電復(fù)位和掉電復(fù)位電路

PWM控制端能夠?qū)崿F(xiàn)256級(jí)調(diào)節(jié),掃描頻率不低于400HZ/S

串行接口級(jí)聯(lián),一根信號(hào)線DI完成數(shù)據(jù)的接收與解碼

任意兩點(diǎn)傳輸距離不超過(guò)2米無(wú)需增加任何電路

當(dāng)刷新速率30幀/秒時(shí),低速模式級(jí)聯(lián)數(shù)不小于512點(diǎn),高速模式下不小于1024點(diǎn)

數(shù)據(jù)發(fā)送速度可達(dá)與400Kbps與800Kbps兩種模式


二、通訊協(xié)議


數(shù)據(jù)協(xié)議采用單線歸零碼的通訊方式, 像素點(diǎn)在上電復(fù)位以后, DIN端接受從控制器傳輸過(guò)來(lái)的數(shù)據(jù), 首先送過(guò)來(lái)的24bit數(shù)據(jù)被第一個(gè)像素點(diǎn)提取后, 送到像素點(diǎn)內(nèi)部的數(shù)據(jù)鎖存器, 剩余的數(shù)據(jù)經(jīng)過(guò)內(nèi)部整形處理電路整形放大后通過(guò)DO端口開(kāi)始轉(zhuǎn)發(fā)輸出給下一個(gè)級(jí)聯(lián)的像素點(diǎn), 每經(jīng)過(guò)一個(gè)像素點(diǎn)的傳輸, 信號(hào)減少24bit。 像素點(diǎn)采用自動(dòng)整形轉(zhuǎn)發(fā)技術(shù), 使得該像素點(diǎn)的級(jí)聯(lián)個(gè)數(shù)不受信號(hào)傳送的限制, 僅僅受限信號(hào)傳輸速度要求。

WS2811 0碼、1碼、reset碼時(shí)序、串接方法
數(shù)據(jù)傳輸
需要精確延時(shí)的,使用示波器進(jìn)行查看




三、電路連接


四、開(kāi)源代碼

WS2811.h

  1. #ifndef __WS2811_H

  2. #define __WS2811_H

  3. #include <stm32f10x.h>

  4. //#define   Time_D    400          //宏定義

  5. #define nWs 50 // 定義串接級(jí)聯(lián)WS2811個(gè)數(shù)  50可修改

  6. //B-R-G  定義顏色24bits

  7. #define   White        0xFFFFFF  // 白色

  8. #define   Black        0x000000  // 黑色 (不亮)

  9. #define   Blue         0xFF0000  // 藍(lán)色

  10. #define   Red          0x00FF00  // 紅色

  11. #define   Green        0x0000FF  // 綠色

  12. #define   Gray         0x22ee22

  13. extern void WS_GPIO_Init(void);//WS2811端口初始化

  14. extern unsigned long WsDat_RUN[nWs];//流水燈顯存

  15. extern unsigned long WsDat[nWs];//流水燈顯存

  16. //extern void WS_Reset(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);    //復(fù)位

  17. //extern void WS_Set1(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long dat);

  18. //發(fā)送1個(gè)字節(jié)

  19. extern void WS_Set_Date(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned char len,unsigned long dat); //發(fā)送相同數(shù)據(jù)

  20. extern void WS_SetAll(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN); //發(fā)送所有字節(jié)

  21. //燈帶控制方案

  22. extern unsigned long ColorToColor(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color0, unsigned long color1,unsigned int speed) ;//顏色漸變   

  23. //初始化顯存數(shù)組

  24. extern void LED_Init(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color);          extern void RUN_LED(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color,unsigned int speed,unsigned char temp); //跑馬燈

  25. #endif
復(fù)制代碼


WS2811.C





  1. #include "WS2811.h"



  2. unsigned long WsDat[nWs];   //顯存

  3. unsigned long WsDat_RUN[nWs];   //流水燈顯存





  4. /**************************************************

  5. * IO初始化(移植時(shí)請(qǐng)修改)

  6. ***************************************************/

  7. void WS_GPIO_Init()

  8. {

  9. GPIO_InitTypeDef  GPIO_InitStructure;



  10. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );   //端口時(shí)鐘,使能

  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; // PIN

  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出

  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz

  14. GPIO_Init(GPIOC, &GPIO_InitStructure); // 端口配置,根據(jù)設(shè)定參數(shù)初始化





  15. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );   //端口時(shí)鐘

  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12; // PIN

  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出

  18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz

  19. GPIO_Init(GPIOB, &GPIO_InitStructure); // 端口配置,根據(jù)設(shè)定參數(shù)初始化



  20. }



  21. /**************************

  22. * 內(nèi)部延時(shí)

  23. ***************************/



  24. void WS_delay_us(__IO u32 nCount) //簡(jiǎn)單的延時(shí)函數(shù)

  25. {

  26. for(; nCount != 0; nCount--);

  27. }



  28. void WS_delay2us()

  29. {

  30. unsigned char i;

  31. for(i=0; i<11; i++);

  32. }



  33. void WS_delay05us()

  34. {

  35. // unsigned char i;

  36. // for(i=0; i<1; i++);

  37. }



  38. void WS_delay_ms(uint32_t nms)

  39. {

  40. while(nms--)

  41. {

  42.   WS_delay_us(1670); //普通方式延時(shí)

  43. }

  44. }





  45. /***************************

  46. * 發(fā)送一比特

  47. ****************************/

  48. void TX0(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)    // 發(fā)送0

  49. {

  50. GPIO_SetBits(GPIOx, GPIO_Pin);

  51.     WS_delay05us();

  52. GPIO_ResetBits(GPIOx, GPIO_Pin);

  53. WS_delay2us();

  54. }

  55. void TX1(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   // 發(fā)送1

  56. {

  57. GPIO_SetBits(GPIOx, GPIO_Pin);

  58. WS_delay2us();

  59. GPIO_ResetBits(GPIOx, GPIO_Pin);

  60. WS_delay05us();

  61. }

  62. void WS_Reset(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   //復(fù)位

  63. {

  64. GPIO_ResetBits(GPIOx, GPIO_Pin);

  65. WS_delay_us(50);

  66. GPIO_SetBits(GPIOx, GPIO_Pin);

  67. GPIO_ResetBits(GPIOx, GPIO_Pin);

  68. }



  69. /************************************************

  70. * 發(fā)送數(shù)據(jù)

  71. *************************************************/

  72. void WS_Set1(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long dat)

  73. {

  74. unsigned char i;

  75. for(i=0; i<24; i++)

  76. {

  77. if(0x800000 == (dat & 0x800000) )

  78. TX1(GPIOx,GPIO_Pin);

  79. else

  80. TX0(GPIOx,GPIO_Pin);

  81. dat<<=1;        //左移一位

  82. }

  83. }





  84. void WS_Set_Date(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned char len,unsigned long dat) // 全部發(fā)送同樣的數(shù)據(jù)

  85. {

  86.    unsigned char i;

  87.    for(i = 0; i <len; i++)

  88.    {

  89. WS_Set1(GPIOx,GPIO_Pin,dat);

  90.    }

  91. WS_Reset(GPIOx,GPIO_Pin);

  92. }





  93. void WS_SetAll(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   //發(fā)送所有字節(jié)

  94. {

  95. unsigned char i;



  96. for(i=0;i<nWs;i++)

  97. {

  98. WS_Set1(GPIOx,GPIO_Pin,WsDat_RUN[i]);  

  99. }

  100. WS_Reset(GPIOx,GPIO_Pin);

  101. WS_delay_ms(500);

  102. }







  103. /**************************顏色漸變函數(shù)***************************/

  104. /*

  105. 從起始顏色---最終顏色

  106. */

  107. unsigned char abs0(int num)//求絕對(duì)值

  108. {

  109. if(num>0) return num;



  110. num = -num;

  111. return (unsigned char) num;

  112. }



  113. unsigned long ColorToColor(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color0, unsigned long color1,unsigned int speed)  

  114. {

  115. unsigned char Red0, Green0, Blue0;  // 起始三原色

  116. unsigned char Red1, Green1, Blue1;  // 結(jié)果三原色

  117. int   RedMinus, GreenMinus, BlueMinus; // 顏色差(color1 - color0)

  118. unsigned char NStep; // 需要幾步

  119. float   RedStep, GreenStep, BlueStep; // 各色步進(jìn)值

  120. unsigned long color; // 結(jié)果色

  121. unsigned char i;



  122. // 綠 紅 藍(lán) 三原色分解

  123. Red0   = color0>>8;

  124. Green0 = color0>>16;

  125. Blue0  = color0;



  126. Red1   = color1>>8;

  127. Green1 = color1>>16;

  128. Blue1  = color1;



  129. // 綠 紅 藍(lán) 三原色分解  若輸入的顏色非上述三種

  130. Red0   =( color0&0x00FF00)>>8;

  131. Green0 = (color0&0xFF0000)>>16;

  132. Blue0  = color0;



  133. Red1   = (color1&0x00FF00)>>8;

  134. Green1 = (color1&0xFF0000)>>16;

  135. Blue1  = color1;



  136. // 計(jì)算需要多少步(取差值的最大值)

  137. RedMinus   = Red1 - Red0;

  138. GreenMinus = Green1 - Green0;

  139. BlueMinus  = Blue1 - Blue0;



  140. //判斷兩個(gè)絕對(duì)值大小。。a>b為真,則=a;否則=b

  141. NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);

  142. NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);



  143. // 計(jì)算出各色步進(jìn)值

  144. RedStep   = (float)RedMinus   / NStep;

  145. GreenStep = (float)GreenMinus / NStep;

  146. BlueStep  = (float)BlueMinus  / NStep;



  147. // 漸變開(kāi)始

  148. for(i=0; i<NStep; i++)

  149. {

  150. Red1   = Red0   + (int)(RedStep   * i);

  151. Green1 = Green0 + (int)(GreenStep * i);

  152. Blue1  = Blue0  + (int)(BlueStep  * i);



  153. color  = Green1<<16 | Red1<<8 | Blue1; // 合成  綠紅藍(lán)



  154. WS_Set_Date(GPIOx,GPIO_Pin,nWs,color); //發(fā)送顏色,所有燈帶同色

  155. WS_delay_ms(speed);

  156. }

  157. return color;

  158. }



  159. /*************跑馬燈****************

  160. 000000000000000000000000

  161. 111100000000000000000000

  162. 000011110000000000000000

  163. 000000001111000000000000

  164. 111100000000111100000000

  165. 000011110000000011110000

  166. ***********************************/

  167. void LED_Init(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color) //初始化顯存數(shù)組

  168. {

  169. unsigned char i;

  170. for(i=0;i<50;i++)

  171. WsDat_RUN[i]=color;

  172. WS_SetAll(GPIOx,GPIO_Pin);

  173. }



  174. //入口參數(shù)     color----speed----temp

  175. //            顯示顏色--流水速度--間隔距離

  176. void RUN_LED(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color,unsigned int speed,unsigned char temp)//跑馬燈

  177. {

  178. unsigned char i,j;

  179. for(j=0;j<(nWs-1);j++)

  180. {

  181. for(i=nWs;i>0;i--)

  182. WsDat_RUN[i] = WsDat_RUN[i-1];



  183. if(j%temp == 0)

  184. WsDat_RUN[0] = color;

  185. else

  186. WsDat_RUN[0] = Black;



  187. //WS_Set_Date(GPIO_PIN,nWs,WsDat_RUN[i]);

  188. WS_SetAll(GPIOx,GPIO_Pin);

  189. WS_delay_ms(speed);

  190. }

  191. }

  192. main.c

  193. #include "stm32f10x.h"

  194. #include "WS2811.h"

  195. int main()

  196. {

  197. WS_GPIO_Init();//GPIOC和GPIOB初始化

  198. ColorToColor(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12,Red,Green,10);//顏色漸變端口GPIOB12\13\14\15輸出

  199. //如果需要其他端口輸出先去WS2811.c修改GPIO口初始化函數(shù)

  200. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301191 發(fā)表于 2024-1-13 01:55 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表