成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個IO控制很多個LED,這個技能你Get到了嗎

系統
多位(幾個LED就是幾位)通過引腳級聯,接一個LED的DOUT引腳到另一個LED的DIN引腳,通過這種級聯的方式,只需要使用一個IO口(單片機引腳)就能控制盡可能多的LED。

[[377324]]

簡介

多位(幾個LED就是幾位)通過引腳級聯,接一個LED的DOUT引腳到另一個LED的DIN引腳,通過這種級聯的方式,只需要使用一個IO口(單片機引腳)就能控制盡可能多的LED。

每個LED都集成了一顆驅動芯片在里面,讓我們的LED變得智能和尋址,每一個內部都有恒流驅動,所以LED顏色非常一致,即使電壓有小幅抖動,電壓變化也是一樣的。

不需要外部電阻——限流電阻,使LED燈的布局設計變得簡單。

單線通信,能夠最大限度的減少單片機IO口的壓力,另外這款RGB燈使用了WS2812B驅動芯片,讓外圍電路只需要一顆電容就能夠滿足電路需求,從而最大可能的讓電路變得簡單優美。

特點

  1. 智能反接保護,電源反接不會損壞IC;
  2. IC控制電路與LED點光源公用一個電源;
  3. 控制電路與RGB芯片集成在一個5050封裝的元器件中,構成一個外控像素點;
  4. 內置信號整形電路,任何一個像素點收到信號后經過波形整形再輸出,保證線路波形畸變不會累加;
  5. 內置上電復位和掉電復位電路;
  6. 每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低于400Hz;
  7. 串行級聯接口,能通過一根信號線完成數據的接收與解碼;
  8. 任意兩點傳輸距離在不超過5米時,無需增加額外電路;
  9. 當刷新速率30幀/秒時,級聯數不小于1024點;
  10. 數據發送速度可達800Kbps;
  11. 光的顏色高度一致,性價比高。

注意: 800Kbps,相當于1.25us傳輸一比特數據。

引腳圖

引腳功能描述:

NO. Symbol 功能描述
1 VDD LED的供電電源,Vdd 范圍 +3.5~+5.3 V
2 DOUT 控制信號數據輸出引腳
3 VSS
4 DIN 控制信號數據輸入引腳

典型電路

串聯方法

原理圖

除了燈珠以外只需要額外增加一個0.1uF的電容即可。

硬件連接

STM32F103RET6核心板 WS2812B模塊
PA6 DIN
VCC +5V
GND GND

驅動原理

數據協議采用單線歸零碼的通訊方式,像素點在上電復位以后,DIN端接受從控制器傳輸過來的數據,首先送過來的24bit數據被第一個像素點提取后,送到像素點內部的數據鎖存器,剩余的數據經過內部整形處理電路整形放大后通過DOUT端口開始轉發輸出給下一個級聯的像素點,每經過一個像素點的傳輸,信號減少24bit。

像素點采用自動整形轉發技術,使得像素點的級聯個數不受信號傳送的限制,僅僅受限信號傳輸速度要求。

因為數據被內部鎖存,所以只要不改變顏色值(模塊持續供電),顏色是不會發生改變的,設置顏色的脈沖也不需要持續提供(單片機發生復位也無影響),只需要在修改顏色值的時候,發送一遍即可。

0和1的區分

Treset:復位時間

由上圖可知,我們要發送 '0' ,需要將GPIO引腳置高并持續0.4 us(400 ns),然后GPIO置低并持續0.85 us(850 ns),此過程即完成0 code的發送,具體代碼實現如下:

  1. void send_0(void) 
  2.     IN_H; 
  3.     Wait400ns; 
  4.     IN_L; 
  5.     Wait850ns; 

我們要發送 '1' ,需要將GPIO引腳置高并持續0.85 us(850 ns),然后GPIO置低并持續0.4 us(400 ns),此過程即完成1 code的發送,具體代碼實現如下:

  1. void send_1(void) 
  2.     IN_H; 
  3.     Wait850ns; 
  4.     IN_L; 
  5.     Wait400ns; 

所以本程序的難點即是求取400 ns 和 850 ns 相對精確的延時時間。

延時函數的實現

單片機里的延時函數一般通過執行一些無意義的循環進行延時,比如定義如下函數:

  1. void delay(unsigned char i) 
  2.     while(--i); 

我們這里需要的延時周期很小,才1.25us,因為函數的調用,需要入棧和出棧,所以如果使用上面的延時函數的方式的話,那么一進一出就接近幾百ns的時間就沒了,所以為了精確控制,我們這里延時函數的定義如下:

  1. #define    Wait10nop        {__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();} 
  2. #define    Wait250ns        {__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();} 
  3. #define    Wait400ns        {Wait250ns;Wait10nop;}    //388 
  4. #define    Wait850ns        {Wait250ns;Wait10nop;Wait10nop;Wait10nop;Wait10nop;__NOP();__NOP();__NOP();__NOP();__NOP();}    //860 

我們在main函數中使用如下方式測試這個延時函數:

  1. while(1) 
  2.     IN_H; 
  3.     //Wait250ns; 
  4.     Wait850ns; 
  5.     IN_L; 
  6.     //Wait250ns; 
  7.     Wait850ns; 

然后用示波器觀察與模塊DIN引腳相連的GPIO輸出的脈沖信號,查看其高電平是否與咱們預定義的一致,如果不一致,增加或減少空指令進行調整。

注意:一個 __NOP(); 空指令的耗時大約:1000/72 ≈ 14 ns 的時間,自己可以在上面定義的基礎上,根據需要隨意增加或者減少 __NOP(); 空指令的個數。

“注意空指令前面是兩個“_”。

經過示波器測量,不斷調整,上面定義的 Wait250ns 宏定義的耗時如下圖所示。

經過示波器測試,上面的 Wait400ns 耗時為 388 ns , Wait850ns 耗時為 860 ns,滿足上面"0"和"1"的時間區間范圍。

24 bit數據的組成

注意: 數據傳輸順序按GRB順序傳輸,并且高位在前。

  1. void ws2812_rgb(u8 ws_num,u8 ws_r,u8 ws_g,u8 ws_b)  
  2.     ws_data[(ws_num-1)*3]=ws_g; 
  3.     ws_data[(ws_num-1)*3+1]=ws_r; 
  4.     ws_data[(ws_num-1)*3+2]=ws_b; 

ws_data[] 數組用于記錄待傳輸的RGB數據,每一個燈珠的顏色占用三個字節,因為數據傳輸順序按GRB的順序傳輸,所以賦值的時候注意先后順序,上面函數是設置某一個燈珠的顏色值。

ws_data[] 數組中顏色值設置完畢之后,就要把這個數組的數據發送到模塊中,具體的實現函數如下:

  1. void ws2812_refresh(u8 ws_count) 
  2.     u8 ws_ri=0; 
  3.      
  4.     for(;ws_ri<ws_count*3;ws_ri++) 
  5.     { 
  6.         if((ws_data[ws_ri]&0x80)==0) send_0(); else send_1(); 
  7.         if((ws_data[ws_ri]&0x40)==0) send_0(); else send_1(); 
  8.         if((ws_data[ws_ri]&0x20)==0) send_0(); else send_1(); 
  9.         if((ws_data[ws_ri]&0x10)==0) send_0(); else send_1(); 
  10.         if((ws_data[ws_ri]&0x08)==0) send_0(); else send_1(); 
  11.         if((ws_data[ws_ri]&0x04)==0) send_0(); else send_1(); 
  12.         if((ws_data[ws_ri]&0x02)==0) send_0(); else send_1(); 
  13.         if((ws_data[ws_ri]&0x01)==0) send_0(); else send_1(); 
  14.     } 
  15.      
  16.     //延時一段時間 
  17.     ws2812_reset(); 

ws_data[] 數組中的每一個字節按位發送,因為高位在前,所以先發送每個字節的高位,獲取最高位的值的方法為:ws_data[ws_ri]&0x80 。

數據傳輸方法

N位的模塊,一次就要發送 N * 3 字節的數據。

注意: 上圖中D1的數據是通過單片機發送,D2,D3,D4通過像素內重塑放大傳輸。

main函數實現

main函數中,每隔1S,點亮一個LED,當8個LED都點亮一次之后,所有LED點亮一次,然后再開啟下一次循環。

main函數的具體實現如下所示:

  1. int main(void)   
  2. {  
  3.     int times = 0;  
  4.      
  5.     //初始化 
  6.     //延時函數初始化    
  7.     delay_init(); 
  8.      
  9.     uart_init(115200);    //串口1:Debug,初始化為115200  
  10.  
  11.     ws2812_init(); 
  12.      
  13.     printf("System Init OK ...\r\n"); 
  14.   
  15.     while(1)  
  16.     {   
  17.         times++;  
  18.  
  19.         if(times > 8) 
  20.             times = 0; 
  21.          
  22.         switch(times) 
  23.         { 
  24.             case 0: 
  25.                 ws2812_rgb(1, WS_RED); 
  26.                 ws2812_rgb(2, WS_GREEN); 
  27.                 ws2812_rgb(3, WS_BLUE); 
  28.                 ws2812_rgb(4, WS_WHITE); 
  29.                 ws2812_rgb(5, WS_PURPLE); 
  30.                 ws2812_rgb(6, WS_YELLOW); 
  31.                 ws2812_rgb(7, WS_BROWN); 
  32.                 ws2812_rgb(8, WS_BLUE); 
  33.                 ws2812_refresh(8); 
  34.                 break; 
  35.             case 1: 
  36.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  37.                 ws2812_rgb(1, WS_RED); 
  38.                 ws2812_refresh(8); 
  39.                 break; 
  40.             case 2: 
  41.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  42.                 ws2812_rgb(2, WS_GREEN); 
  43.                 ws2812_refresh(8); 
  44.                 break; 
  45.             case 3: 
  46.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  47.                 ws2812_rgb(3, WS_BLUE); 
  48.                 ws2812_refresh(8); 
  49.                 break; 
  50.             case 4: 
  51.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  52.                 ws2812_rgb(4, WS_WHITE); 
  53.                 ws2812_refresh(8); 
  54.                 break; 
  55.             case 5: 
  56.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  57.                 ws2812_rgb(5, WS_PURPLE); 
  58.                 ws2812_refresh(8); 
  59.                 break; 
  60.             case 6: 
  61.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  62.                 ws2812_rgb(6, WS_YELLOW); 
  63.                 ws2812_refresh(8); 
  64.                 break; 
  65.             case 7: 
  66.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  67.                 ws2812_rgb(7, WS_BROWN); 
  68.                 ws2812_refresh(8); 
  69.                 break; 
  70.             case 8: 
  71.                 memset(ws_data,0,WS_ARRAY_SIZE*sizeof(u8));  
  72.                 ws2812_rgb(8, WS_BLUE); 
  73.                 ws2812_refresh(8); 
  74.                 break; 
  75.         } 
  76.          
  77.         delay_ms(1000);         
  78.     }   

顏色RGB值查詢

顏色的RGB值和名稱可以參考下面鏈接:

https://code.ziqiangxuetang.com/try/color.py

程序中顏色預定義如下:

  1. #define WS_DARK  0,0,0 
  2. #define WS_WHITE  255,255,255 
  3. #define WS_RED   255,0,0 
  4. #define WS_GREEN  0,255,0 
  5. #define WS_BLUE  0,0,255 
  6. #define WS_YELLOW  255,255,0 
  7. #define WS_PURPLE   255,0,255 
  8. #define WS_CYAN  0,255,255 
  9. #define WS_BROWN    165,42,42 

大家可以根據自己的喜歡,隨意替換顏色。

本文轉載自微信公眾號「 嵌入式從0到1」,可以通過以下二維碼關注。轉載本文請聯系 嵌入式從0到1公眾號。

 

責任編輯:武曉燕 來源: 嵌入式從0到1
相關推薦

2022-09-27 08:28:54

云平臺云主機私有云

2021-05-12 13:38:47

云計算

2021-01-12 11:37:09

Python編程語言開發

2017-04-29 11:28:57

人工智能機器學習AI

2018-10-25 15:04:22

編程程序員陷阱

2023-10-28 09:41:12

Next.js函數配置選項

2016-11-09 15:46:43

數據中心大數據數據備份

2019-11-15 14:45:10

開發者技能工具

2019-04-25 13:10:04

Java 8Stream API編程語言

2021-10-04 09:29:41

對象池線程池

2021-05-19 14:22:46

代碼開發項目

2018-06-29 15:07:13

代碼工程師軟件開發

2015-05-26 09:35:29

運維運維危機云計算應用

2023-03-26 22:02:53

APMPR監控

2024-06-21 08:15:25

2024-06-19 09:47:21

2023-12-06 07:28:47

阻塞IO異步IO

2021-09-03 06:46:34

MyBatis緩存后端

2011-06-28 09:16:11

切克簽到

2022-07-11 08:48:52

業務轉型CIO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品成人在线观看 | 中文字幕 亚洲一区 | 欧美理论片在线 | 手机三级电影 | 韩国av一区二区 | 欧美日韩亚洲国产综合 | 一区二区在线不卡 | 四虎成人av| 欧美成人精品 | 亚洲成人免费在线观看 | 国产一区二区精品在线观看 | 国产成人精品免费 | 男人的天堂在线视频 | 99久久国产| 久久久国产一区二区三区 | 亚洲天堂精品久久 | 国产农村妇女精品一二区 | 天天爽一爽| 国产精品激情小视频 | 欧美精品一区二区三区视频 | 久久久久国产一区二区三区不卡 | 国产日韩欧美一区二区 | 亚洲一区中文字幕 | 超碰成人av| 中文字幕在线观看成人 | 亚洲精品一区二区 | 精品伦精品一区二区三区视频 | 欧美一级在线免费 | 久久精品视频网站 | 日本韩国欧美在线观看 | av激情在线 | 国产乱码精品1区2区3区 | 一级在线免费观看 | 亚洲免费视频在线观看 | 黄免费看 | 一级日批片 | 久久一二 | 亚洲毛片| 成人精品高清 | 久久一二区 | 欧美午夜精品久久久久久浪潮 |