久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32驅動WS2812呼吸燈、頻譜,變色變速旋轉源程序
[打印本頁]
作者:
feeling1791
時間:
2022-9-5 16:43
標題:
STM32驅動WS2812呼吸燈、頻譜,變色變速旋轉源程序
網上看到些WS281例程,終究看不下去,動手寫了個來玩,希望能吊打全網你能隨便百度到的相關例程,源碼工程奉上:
特點:
1,硬件:STM32C8T6小板,WS2812 16leds燈環,資源易得;
2,軟件:PWM+DMA+TIME3處理脈沖數據(比SPI選擇的端口多,隨便修改很多口可用)
TIME4處理顯示花式,不使用delay,不影響主循環其余進程
呼吸(算法有趣)
頻譜(加上音樂AD到的 幅度數據即可動態跟隨)
變色變速旋轉(給你一個定時器基準節拍,可以無限擴展各種時間,各種變量的控制,靈活使用timer)
代碼簡潔易懂(對齊和括號強迫癥)
*如果喜歡,請回帖 ,開玩笑啦 :)
單片機源程序如下:
#include "ws281x.h"
#include "delay.h"
#include "timer.h"
u16 pixelBuffer[PIXEL_NUM + RESET_NUM][24] = {0};
void ws281x_show(void)
{
DMA_SetCurrDataCounter(DMA1_Channel5,(PIXEL_NUM + RESET_NUM)* 24 );
DMA_Cmd(DMA1_Channel5, ENABLE);
TIM_Cmd(TIM4, ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC5) !=SET);
DMA_Cmd(DMA1_Channel5, DISABLE );
DMA_ClearFlag(DMA1_FLAG_TC5);
TIM_Cmd(TIM4, DISABLE);
}
void ws281x_closeAll(void)
{
uint16_t i;
uint8_t j;
for(i = 0; i < PIXEL_NUM; i++)
{
for(j = 0; j < 24; j++)
{
pixelBuffer[i][j] = WS_LOW;
}
}
ws281x_show();
}
uint32_t ws281x_color(uint8_t red, uint8_t green, uint8_t blue)
{
return ((green << 16) | (red << 8) | blue);
}
void ws281x_setPixelColor(uint16_t n ,uint32_t GRBcolor)
{
uint8_t i;
if(n < PIXEL_NUM)
{
for(i = 0; i < 24; i++)
{
pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
}
}
}
/**********************************************************************************************************/
// level
// 8 08 09
// 7 07 10
// 6 06 11
// 5 05 12
// 4 04 13
// 3 03 14
// 2 02 15
// 1 01 16
// 0 off
void ws281x_setPixelColor_ringleds(uint16_t n ,uint32_t GRBcolor) //PIXEL_NUM:12/16/2*n Ring leds
{
uint8_t i,k,p;
for(i = 0; i < 24; i++)
{
for(k = 0;(k < n) && (n <= (PIXEL_NUM / 2));k++)
{
pixelBuffer[k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
pixelBuffer[(PIXEL_NUM - 1) - k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
}
for(p = n;(p < ( PIXEL_NUM - n)) && (n <= (PIXEL_NUM / 2)) ;p++)
{
pixelBuffer[p][i] = WS_LOW;
}
}
}
// fill the dots one by one with a color on left and right sides at the same time
void ws281x_colorWipe_lr( uint32_t c, uint8_t num)
{
uint16_t i;
if(num > PIXEL_NUM / 2)
{
num = PIXEL_NUM / 2;
}
for(i = 0; i < (num + 1); i++) //
{
ws281x_setPixelColor_ringleds(i ,c);
ws281x_show();
//delay_ms(wait); //> 0.05ms will should be using timer
}
}
//Freq rising or falling lights
void ws281x_colorWipe_freq(uint8_t type)
{
switch(type)
{
case 1:
ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
break;
case 2:
ws281x_colorWipe_lr(ws281x_color(0, 50, 0), ws281x_freq_num); // green
break;
case 3:
ws281x_colorWipe_lr(ws281x_color(0, 0, 50), ws281x_freq_num); // Blue
break;
case 4:
ws281x_colorWipe_lr(ws281x_color(50, 50, 50), ws281x_freq_num); // white
break;
default:
ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
break;
}
}
/***************************************************************************************************/
uint32_t ws281x_colorTran(uint8_t tran,uint8_t color_mode) //The colour is a transition r/g/b back to r/g/b(color_mode:Red1,Green2,Blue3). space 3
{
tran = 255 - tran;
if(tran < 85)
{
switch(color_mode)
{
case 1:
return ws281x_color(tran * 3, 0, 0);
case 2:
return ws281x_color(0, tran * 3, 0);
case 3:
return ws281x_color(0, 0, tran * 3);
default:
return ws281x_color(tran * 3, 0, 0);
}
}
if(tran < 170)
{
tran -= 85;
switch(color_mode)
{
case 1:
return ws281x_color(255, 0, 0);
case 2:
return ws281x_color(0,255, 0);
case 3:
return ws281x_color(0, 0, 255);
default:
return ws281x_color(255, 0, 0);
}
}
tran -= 170;
switch(color_mode)
{
case 1:
return ws281x_color(255 - tran * 3, 0, 0);
case 2:
return ws281x_color(0, 255 - tran * 3, 0);
case 3:
return ws281x_color(0, 0, 255 - tran * 3);
default:
return ws281x_color(255 - tran * 3, 0, 0);
}
}
void ws281x_colorblnCtrl(uint8_t color_mode) // ws281x_bln_num use timer,mode:red1/green2/blue3
{
uint16_t i;
if( !(ws281x_bln_num == ws281x_bln_oldnum))
{
for(i = 0; i < PIXEL_NUM; i++)
{
ws281x_setPixelColor(i ,ws281x_colorTran(ws281x_bln_num,color_mode));
}
ws281x_show();
ws281x_bln_oldnum = ws281x_bln_num;
}
}
/***************************************************************************************************/
void ws281x_setPixelColor_wheel_leds(uint16_t n ,uint32_t GRBcolor) //n:0~15 whirling leds
{
uint8_t i,k;
for(i = 0; i < 24; i++)
{
for(k = 0;k < PIXEL_NUM;k++)
{
pixelBuffer[k][i] = WS_LOW;
}
pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
if( n < PIXEL_NUM/2)
{
pixelBuffer[n + (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
}
else
{
pixelBuffer[n - (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
}
}
ws281x_show();
}
void ws281x_display(void)
{
if(ws281x_led_display_mode == 1)
{
ws281x_colorblnCtrl(ws281x_bln_mode);
}
if(ws281x_led_display_mode == 2)
{
ws281x_colorWipe_freq(ws281x_freq_color_type);
}
if(ws281x_led_display_mode == 3)
{
ws281x_setPixelColor_wheel_leds(ws281x_whirl_index,
ws281x_color(color_R[ws281x_whirl_colortran_index],
color_G[ws281x_whirl_colortran_index],
color_B[ws281x_whirl_colortran_index])) ;
}
}
/*
void ws281x_setPixelColor_11x44leds(uint16_t n ,uint32_t GRBcolor) //PIXEL_NUM:11x44 leds n:0~10
{
uint8_t i,k,p,q;
for(i = 0; i < 24; i++)
{
for(k = 0;k < 44;k++)
{
for(q = 0 ;q < (n +1);q++)
{
pixelBuffer[q + k*11][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
}
for(p = 1;p < (10-n);p++)
{
pixelBuffer[(n + p) + k*11][i] = WS_LOW;
}
}
}
}
*/
復制代碼
效果視頻
https://v.qq.com/x/page/u3354xdptxh.html
原理圖: 無
仿真: 無
Keil代碼下載:
程序.7z
(180.19 KB, 下載次數: 376)
2022-9-7 02:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
dragon20100708
時間:
2022-9-6 09:29
看一看,研究下。
作者:
053053
時間:
2022-9-7 11:25
不寫注釋,真是一個不好的習慣
作者:
heicad
時間:
2022-9-7 23:39
好資料,51黑有你更精彩!!!
作者:
bigbigcong
時間:
2022-11-8 14:22
很牛的WS281驅動例程
作者:
461447043
時間:
2023-2-23 20:38
原理圖能繼續分享一下嗎?
作者:
hei51com
時間:
2023-2-24 09:33
效果很贊,感謝分享,收藏備用
作者:
Jshenliu
時間:
2023-3-27 14:19
沙發,收藏備用
作者:
wuhaijie
時間:
2023-9-13 06:06
下載來看看,確實很牛···還帶變速的,謝謝樓主分享,學習學習
作者:
IdeaMing
時間:
2023-11-10 09:45
幅度的動態跟隨,請大佬詳解
作者:
maijinzhi
時間:
2023-11-22 09:28
不寫注釋,真是一個不好的習慣
作者:
山海靚仔
時間:
2023-12-19 17:54
就沖你這句吊打一切,無論能不能點亮,都要給你點贊
作者:
啦啦啦ajih
時間:
2023-12-25 11:20
博主,求求了,原理圖可以分享一下嗎
作者:
feeling1791
時間:
2023-12-26 15:43
啦啦啦ajih 發表于 2023-12-25 11:20
博主,求求了,原理圖可以分享一下嗎
某一個寶買塊16 RGB的燈環,然后買塊最小系統STM32F103C8T6板,再買個ST LINK下載小板,總共應該50元左右吧,把燈環輸入接電源+5V,GND,燈環數據輸入焊點DATA接最小系統板的PB8腳,然后編譯程序下載到單片機,再上電就可以看效果了,電路圖,你買這些小板老板都會給你圖紙的
作者:
點不亮燈大師
時間:
2024-2-29 11:47
怎么玩啊,兄弟盟
作者:
wifingtta
時間:
2024-3-1 14:21
感謝樓主!用C8T6測試過,程序完全可用,有三種模式,2812接PB8口,定時器自動切換模式,燈的數量不限,直接改參數即可。只是注釋確實太少,勉強看懂一點,再看看。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美区在线
|
男女国产网站
|
日韩中文字幕免费在线
|
日韩欧美一区二区三区免费观看
|
caoporn国产精品免费公开
|
91精品久久久久
|
日韩中文字幕在线观看
|
国产一级成人
|
亚洲一区
|
亚洲第一成年免费网站
|
www视频在线观看
|
久久香蕉网
|
av一二三区
|
成人三级影院
|
成人三区
|
久久国产激情视频
|
日韩在线一区二区三区
|
亚洲福利
|
国产精品178页
|
国产福利在线免费观看
|
99久久婷婷国产综合精品
|
一区二区三区免费在线观看
|
性生活毛片
|
亚洲一区免费在线
|
久综合
|
成人精品系列
|
www.国产精
|
国产一区欧美
|
国产午夜精品一区二区三区四区
|
国产精品视频播放
|
亚洲日产精品
|
自拍亚洲
|
美日韩中文字幕
|
亚洲精品欧美
|
午夜视频在线视频
|
久久网国产
|
亚洲高清视频一区
|
岛国一区
|
黄色a三级
|
亚洲欧美综合精品久久成人
|
亚洲成人一二三
|