色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用PWM+DMA的方式驅(qū)動(dòng)WS2812B

冬至配餃子 ? 來源:兆易創(chuàng)新GD32 MCU ? 作者:豪哥 ? 2022-09-22 18:17 ? 次閱讀

1.實(shí)驗(yàn)簡述

使用 PWM+DMA 的方式驅(qū)動(dòng) WS2812B,并每隔 800ms 隨機(jī)顯示不同顏色。

2.實(shí)驗(yàn)硬件

兆易創(chuàng)新GD32F310 MCU開發(fā)板套件

16*16 WS2812B

3.開發(fā)環(huán)境

keil 5.24.1

4.WS2812B講解

WS2812B 是 WorldSemi 公司推出的外控集成 RGB LED 光源。

WS2812B 則是將控制 IC 和傳統(tǒng) RGB 結(jié)合到了一起,我們使用一條數(shù)據(jù)線即可驅(qū)動(dòng)所有 RGB,另外也使得顏色控制的精度更高,同時(shí)也支持 RGB 燈組的單個(gè) RGB 顏色控制,因此WS2812B 除了可以用于照明外,還能應(yīng)用到辦公樓外墻來作為屏幕進(jìn)行廣告宣傳,此時(shí)每個(gè)WS2812B 就對(duì)應(yīng)的是一個(gè)像素點(diǎn)。

WS2812B 數(shù)據(jù)協(xié)議采用單線歸零碼的通訊方式,像素點(diǎn)在上電復(fù)位以后,DIN 端接受從控制器傳輸過來的數(shù)據(jù),首先送過來的 24bit 數(shù)據(jù)(紅綠藍(lán)各 8 位)被第一個(gè)像素點(diǎn)提取后,送到像素點(diǎn)內(nèi)部的數(shù)據(jù)鎖存器,剩余的數(shù)據(jù)經(jīng)過內(nèi)部整形處理電路整形放大后通過 DO端口開始轉(zhuǎn)發(fā)輸出給下一個(gè)級(jí)聯(lián)的像素點(diǎn),每經(jīng)過一個(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)傳輸速度要求。WS2812B 傳輸協(xié)議時(shí)序圖如下:

poYBAGMsNVWAQH7zAADM5joxSaQ966.png

從時(shí)序圖可以看到,二進(jìn)制的 0 和 1 用周期相同的不同占空比的方波來表示(1 對(duì)應(yīng) 68%占空比,0 對(duì)應(yīng) 32%占空比),因此我們可以通過改變 PWM 的占空比來模擬出要傳輸?shù)臄?shù)據(jù)。因?yàn)閃S2812B 協(xié)議對(duì)傳輸速度要求非常高,所以使用了 DMA+PWM 這種方法,在比較事件發(fā)生時(shí),DMA 立即響應(yīng)并將對(duì)應(yīng)數(shù)據(jù)傳輸?shù)奖容^寄存器中。

WS2812 的傳輸過程如下圖:

pYYBAGMsNW-AVtv-AADBaJurDk0079.png

每經(jīng)過一個(gè) WS2812B,數(shù)據(jù)就被截走24bit。

WS2812B 的 24 位數(shù)據(jù)如下:

poYBAGMsNYGAP6aaAAAxzrIMkG8565.png

數(shù)據(jù)按照高位在前的順序分別輸出綠色,紅色和藍(lán)色控制數(shù)據(jù)。在這里我們順便說一下RGB 的取色原理。RGB 由三種基本色構(gòu)成,分別是紅,綠,藍(lán),也叫加法三原色,通過這三種顏色的不同比例可以組合出各種顏色,而不同比例可以通過 PWM 的占空比來實(shí)現(xiàn)。如果想要特定顏色,可以使用調(diào)色板取色,如下圖:

pYYBAGMsNZOAV_rJAADml-OVVdM997.png

5.實(shí)驗(yàn)步驟

1、獲取demo工程,任意選中一個(gè)工程用來修改實(shí)現(xiàn)PWM+DMA控制WS2812B 功能

pYYBAGMsNaSADPLCAABevuiTaP8394.png

2、添加需要的頭文件和宏定義

poYBAGMsNbuAHSAEAABkINLUKwI266.png

TIMER0_CH0CC為定時(shí)器1的CH0通道比較輸出的地址。

num為要控制ws2812B的數(shù)量,這里我們只控制1個(gè)。

3、定義需要的變量和聲明需要的初化函數(shù)

pYYBAGMsNcyAAkPdAABK6V0HIbk666.png

RGB_buffer數(shù)組用來存放占空比數(shù)值。

4、配置PWM輸出引腳

poYBAGMsNeCAPXqGAACDBOJvEKs372.png

5、配置定時(shí)器0通道0輸出PWM

`void timer_config(void)
{

timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;

rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
/* TIMER0 configuration */
timer_initpara.prescaler         = 0;
timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection  = TIMER_COUNTER_UP;
timer_initpara.period            = 89;
timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0, &timer_initpara);
/* CH0 configuration in PWM0 mode */
timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0,0);
timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_ENABLE);
/* TIMER0 primary output enable */
timer_primary_output_config(TIMER0, ENABLE);
/* TIMER0 CH0D DMA request enable */
timer_dma_enable(TIMER0, TIMER_DMA_CH0D);
/* auto-reload preload enable */
//timer_auto_reload_shadow_enable(TIMER0);
    timer_auto_reload_shadow_disable(TIMER0);
/* TIMER0 counter enable */
timer_enable(TIMER0);

}`

6、DMA配置

`void dma_config(void)
{

dma_parameter_struct dma_init_struct;

/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA);

/* initialize DMA channel1 */
dma_deinit(DMA_CH1);

/* DMA channel1 initialize */
dma_deinit(DMA_CH1);
dma_init_struct.direction    = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr  = (uint32_t)RGB_buffer;
dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_init_struct.number       =sizeof(RGB_buffer);
dma_init_struct.periph_addr  = (uint32_t)TIMER0_CH0CC;
dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_init_struct.priority     = DMA_PRIORITY_HIGH;
dma_init(DMA_CH1, &dma_init_struct);
/* configure DMA mode */
    dma_circulation_disable(DMA_CH1);
dma_memory_to_memory_disable(DMA_CH1);
/* enable DMA channel1 */
dma_channel_enable(DMA_CH1);

}`

7、通過PWM模擬WS2812B數(shù)據(jù)協(xié)議實(shí)現(xiàn)顏色設(shè)置

`void setRGB(uint8_t red,uint8_t green,uint8_t blue)
{
uint8_t i = 0,j =0;
uint32_t rgb_value = green<<16 | red<<8 | blue;

while(dma_flag_get(DMA_CH1, DMA_INTF_FTFIF)==RESET);
dma_flag_clear(DMA_CH1,DMA_INTC_FTFIFC);
dma_channel_disable(DMA_CH1);
dma_transfer_number_config(DMA_CH1,sizeof(RGB_buffer));
for(j=1;j<=num;++j)
{
for(i=0;i<24;++i)
{
  if((rgb_value<

}`

8、在主函數(shù)實(shí)現(xiàn)每隔 800ms 隨機(jī)顯示不同顏色功能。

`int main(void)
{

  systick_config();
gpio_config();
dma_config();
timer_config();
usart0_gpio_config();
usart0_config();
/* print out */
printf("Hello world!\n\r");
while(1)
 {
     setRGB(rand()%256,rand()%256,rand()%256);
     delay_1ms(800);
    };

}`




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    116

    文章

    5364

    瀏覽量

    217929
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    256

    瀏覽量

    11957
  • WS2812B
    +關(guān)注

    關(guān)注

    2

    文章

    39

    瀏覽量

    2517
收藏 2人收藏
  • 神s兽1

評(píng)論

相關(guān)推薦
熱點(diǎn)推薦

什么是WS2812BWS2812B燈帶是怎么連接的呢?

WS2812B是一款全彩LED控制IC,單總線控制,何為單總線我的理解就是數(shù)據(jù)線在一根線上傳輸?shù)目刂?b class='flag-5'>方式就是單總線。
的頭像 發(fā)表于 07-08 14:53 ?1.5w次閱讀
什么是<b class='flag-5'>WS2812B</b>?<b class='flag-5'>WS2812B</b>燈帶是怎么連接的呢?

STM32F030 MDA+PWM驅(qū)動(dòng)ws2812b,起始的50US的低電平是怎么產(chǎn)生?

STM32F030 MDA+PWM 驅(qū)動(dòng) ws2812b,起始的50US的低電平怎么產(chǎn)生? 現(xiàn)在dma+pwm,倒是可以產(chǎn)生一個(gè)800K hz的驅(qū)動(dòng)
發(fā)表于 04-12 07:23

WS2812B RGB全彩LED燈珠

WS2812B RGB全彩LED燈珠,只需通過一根信號(hào)線控制多個(gè)燈顯示,本教程使用X-CTR100控制器驅(qū)動(dòng)WS2812燈環(huán)。原理WS2812B是一個(gè)集控制電路與發(fā)光電路于一體的智能外
發(fā)表于 08-06 08:15

怎樣使用硬件定時(shí)器PWM+DMA方式實(shí)現(xiàn)WS2812驅(qū)動(dòng)

WS2812驅(qū)動(dòng)方式有哪幾種?怎樣使用硬件定時(shí)器PWM+DMA方式實(shí)現(xiàn)WS2812
發(fā)表于 01-25 06:56

怎樣給WS2812B發(fā)送數(shù)據(jù)呢

1. 對(duì)于寫驅(qū)動(dòng)來說WS2812B芯片手冊(cè)主要就是看通訊。簡單來說就是給WS2812B發(fā)送數(shù)據(jù),數(shù)據(jù)就是RGB對(duì)應(yīng)的值,先發(fā)高位,按照GRB的順序發(fā)送數(shù)據(jù)。通常我們用高電平表示數(shù)字信號(hào)“1”,低電平
發(fā)表于 02-22 06:51

怎樣使用PWM+DMA方式驅(qū)動(dòng)WS2812B

PWM+DMA 驅(qū)動(dòng) WS2812一、項(xiàng)目要求(主要目的)使用 PWM+DMA方式驅(qū)動(dòng)
發(fā)表于 02-22 06:42

可以用SPI DMA驅(qū)動(dòng)WS2812b嗎?

我打算用SPI DMA驅(qū)動(dòng)WS2812b,請(qǐng)問這是可行的嗎?還有如果我啟動(dòng)了SPI,可不可以只有MISO引腳有復(fù)用,其他引腳繼續(xù)用作GPIO。
發(fā)表于 08-18 07:42

CH563驅(qū)動(dòng)ws2812B使用SPI+DMA呢還是用PWM+DMA呢?

CH563驅(qū)動(dòng)ws2812B使用SPI+DMA呢還是用PWM+DMA呢?有沒有大佬有例程的?評(píng)估版文件里面的程序(PWM
發(fā)表于 10-17 08:02

STM32使用LL庫PWMDMA模式驅(qū)動(dòng)ws2812

STM32使用LL庫PWMDMA模式驅(qū)動(dòng)ws2812一、WS2812簡介二、CUBEMX初始化代碼配置一、
發(fā)表于 11-30 10:21 ?67次下載
STM32使用LL庫<b class='flag-5'>PWM</b>的<b class='flag-5'>DMA</b>模式<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>ws2812</b>

STM32F1 DMA+PWM 控制WS2812B LED燈

1. 對(duì)于寫驅(qū)動(dòng)來說WS2812B芯片手冊(cè)主要就是看通訊。簡單來說就是給WS2812B發(fā)送數(shù)據(jù),數(shù)據(jù)就是RGB對(duì)應(yīng)的值,先發(fā)高位,按照GRB的順序發(fā)送數(shù)據(jù)。通常我們用高電平表示數(shù)字信號(hào)“1”,低電平
發(fā)表于 12-28 19:11 ?78次下載
STM32F1 <b class='flag-5'>DMA+PWM</b> 控制<b class='flag-5'>WS2812B</b> LED燈

PWM+DMA 驅(qū)動(dòng) WS2812

PWM+DMA 驅(qū)動(dòng) WS2812一、項(xiàng)目要求(主要目的)使用 PWM+DMA方式驅(qū)動(dòng)
發(fā)表于 12-28 19:14 ?116次下載
<b class='flag-5'>PWM+DMA</b> <b class='flag-5'>驅(qū)動(dòng)</b> <b class='flag-5'>WS2812</b>

WS2812B遠(yuǎn)程區(qū)域面板控制器

電子發(fā)燒友網(wǎng)站提供《WS2812B遠(yuǎn)程區(qū)域面板控制器.zip》資料免費(fèi)下載
發(fā)表于 07-18 09:07 ?3次下載
<b class='flag-5'>WS2812B</b>遠(yuǎn)程區(qū)域面板控制器

ESP32 WS2812b分線板開源分享

電子發(fā)燒友網(wǎng)站提供《ESP32 WS2812b分線板開源分享.zip》資料免費(fèi)下載
發(fā)表于 07-29 10:04 ?3次下載
ESP32 <b class='flag-5'>WS2812b</b>分線板開源分享

WS2812B遙控?zé)艨刂破?/a>

電子發(fā)燒友網(wǎng)站提供《WS2812B遙控?zé)艨刂破?zip》資料免費(fèi)下載
發(fā)表于 11-25 09:16 ?8次下載
<b class='flag-5'>WS2812B</b>遙控?zé)艨刂破? />    </a>
</div>                              <div   id=

適用于Azure Sphere的WS2812B LED燈帶驅(qū)動(dòng)

電子發(fā)燒友網(wǎng)站提供《適用于Azure Sphere的WS2812B LED燈帶驅(qū)動(dòng)器.zip》資料免費(fèi)下載
發(fā)表于 12-06 14:42 ?0次下載
適用于Azure Sphere的<b class='flag-5'>WS2812B</b> LED燈帶<b class='flag-5'>驅(qū)動(dòng)</b>器
主站蜘蛛池模板: 国产色婷亚洲99精品AV在线 | 不良网站进入窗口软件下载免费 | 婷婷亚洲AV色香蕉蜜桃 | 美女岔开腿露出粉嫩花苞 | 成人国产精品免费网站 | 国产在线播放KKK | 亚州性夜夜射在线观看 | 色欲人妻无码AV精品一区二区 | 午夜伦yy44880影院 | 最新无码国产在线视频2020 | 日韩吃奶摸下AA片免费观看 | 嫩草视频在线观看免费 | 青春草国产成人精品久久 | 国产精品A8198V久久A片 | 久9青青cao精品视频在线 | 柠檬福利精品视频导航 | 青青视频 在线 在线播放 | 日韩精品一区二区三区色欲AV | 亚洲乱码国产一区三区 | 国产免费福利在线视频 | 牛和人交videos欧美 | 青青草原在线新免费 | 天天影视色欲 影视 | 一二三四在线视频社区8 | 伊人久久大香线蕉综合影 | 国产午夜精品美女免费大片 | 国产深夜福利视频在线 | 一二三四中文字幕在线看 | 我的好妈妈8高清在线观看WWW | 天天射天天爱天天干 | 小妇人电影免费完整观看2021 | 99精品国产免费久久久久久下载 | 伊人久久青青草 | 亚洲午夜AV久久久精品影院色戒 | 色小姐.com | 精品国产在线观看福利 | 日日夜夜国产 | 欧美eee114| 2021久久99国产熟女人妻 | 婷婷亚洲AV色香蕉蜜桃 | 国产九九九九九九九A片 |

電子發(fā)燒友

中國電子工程師最喜歡的網(wǎng)站

  • 2931785位工程師會(huì)員交流學(xué)習(xí)
  • 獲取您個(gè)性化的科技前沿技術(shù)信息
  • 參加活動(dòng)獲取豐厚的禮品