STM32F103ZE开发板WS2812B RGB灯带调试
生活随笔
收集整理的這篇文章主要介紹了
STM32F103ZE开发板WS2812B RGB灯带调试
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
調(diào)試時采用5顆燈珠的燈帶。
WS2812B每一顆燈都由24位控制,分為8位G,8為位R,8位B。從0到0xFF,數(shù)值越大那一種顏色越亮。發(fā)送的信號根據(jù)高低電平的時間分為1,0,和RES信號。103開發(fā)板控制IO口翻轉(zhuǎn)實現(xiàn)0、1信號要實現(xiàn)幾百ns的翻轉(zhuǎn),正點原子開發(fā)板提供的delay函數(shù)不能滿足。采用下面的翻轉(zhuǎn)方法:
采用NOP指令實現(xiàn)幾百ns的延時,我用的板子系統(tǒng)時鐘是72mhz,然后我用示波器看了一下,一個nop大概是14到15ns,差不多相當(dāng)于是1/72000000s的延時。
void send_0(void) {GPIOA->BSRR=GPIO_Pin_7;//LED1滅 // delay_ns(2);delay_250ns();GPIOA->BRR=GPIO_Pin_7;delay_250ns();delay_250ns();delay_250ns();delay_250ns();// delay_ns(7); } void send_1(void) {GPIOA->BSRR=GPIO_Pin_7;delay_250ns();delay_250ns();delay_250ns();delay_250ns();GPIOA->BRR=GPIO_Pin_7;delay_250ns();} void send_res(void) {GPIOA->BRR=GPIO_Pin_7;delay_us(300); }然后是發(fā)送1、2、res信號的程序。按燈的規(guī)格書,連著發(fā)信號每個燈都會自動向下一個燈轉(zhuǎn)發(fā),發(fā)送res信號(低電平超過300us)則一輪發(fā)送結(jié)束。也就是連著發(fā)5個24位信號再發(fā)res則控制五個燈。但是實際使用時res信號后再加ms級的延時會比較好。
```c static u8 g_2, r_2, b_2;void rgb1(u8 g, u8 r, u8 b)// 隨機燈色循環(huán)亮 {int x, y, i, j;g_2 = rand() % 0xff;//隨機燈色r_2 = rand() % 0xff;b_2 = rand() % 0xff;//if((g_2 < 10) || (r_2 < 10) || (b_2 < 10))//return;for(x = 4; x >= 0; x--)//燈個數(shù) x+1個燈{y = 4 - x; //燈個數(shù)for(i = x; i > 0; i--){for(j = 0; j < 8; j++){if(((g >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((r >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((b >> j) & 0x01) == 1)send_1();elsesend_0();}}for(y = y; y >= 0; y--){for(j = 0; j < 8; j++){if(((g_2 >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((r_2 >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((b_2 >> j) & 0x01) == 1)send_1();elsesend_0();}}send_res();delay_ms(100);} }void rgb2(u8 g, u8 r, u8 b) //所有燈同色閃{int i = 0;int j = 0;//while((g > 0) && (r > 0) && (b > 0)){for(i = 0; i < 5; i++) //燈個數(shù){for(j = 0; j < 8; j++){if(((g >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((r >> j) & 0x01) == 1)send_1();elsesend_0();}for(j = 0; j < 8; j++){if(((b >> j) & 0x01) == 1)send_1();elsesend_0();}}send_res();delay_ms(1000);} }int main(void){ // u8 g, r, b;delay_init(); //延時函數(shù)初始化 LED_Init(); //初始化與LED連接的硬件接口g_2 = 0;r_2 = 0x00;b_2 =0x10;while(1){// if((r < 0xff)||(b > 0)){rgb1(g_2, r_2, b_2);// r = r + 1;// b = b - 1;}//else// g = 0;// r = 0x00;// b = 0xff;}// while(1) // { // rgb2(0xff, 0x00, 0xff); // rgb2(0xff, 0xff, 0x00); // rgb2(0xff, 0xff, 0xff); // rgb2(0x00, 0xff, 0xff); // // } }// // for(i = 0; i<24; i++) // { // if((rgb & 0x1) == 1) // { // send_1(); // rgb = rgb >> 1; // } // else // { // send_0(); // rgb = rgb >> 1; // } // } // rgb = a - 100; // //send_res(); // delay_ms(10); // // } //} 主程序兩個函數(shù)對應(yīng)兩種等效,可以選擇一種使用。總結(jié)
以上是生活随笔為你收集整理的STM32F103ZE开发板WS2812B RGB灯带调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2008背景色配置
- 下一篇: 细粒度分析综述(Fine-grain i