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

QQ登錄

只需一步,快速開始

帖子
查看: 7473|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

基于STM32的DMX512通信控制RGB燈帶程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:326235 發(fā)表于 2021-1-18 17:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
30黑幣
程序是讓燈帶只亮紅色并呼吸效果,當(dāng)cnr增加到0x80時(shí),會(huì)出現(xiàn)全部燈熄滅的情況,測(cè)出來(lái)波形是32us長(zhǎng)低電平+12us高電平導(dǎo)致的初始化(個(gè)人猜測(cè)),如何避免該數(shù)據(jù)造成的初始化,希望有人解答一下

int main(void)
{
        u8 key;
        u8 i=0,t=0,u = 0;
        u8 cnr = 0x00;
        u8 cnb = 0x00;
        u8 cng = 0x00;
        u8 rs485buf[35];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);  
        uart_init(115200);      
        
        LED_Init();   
         LCD_Init();
        KEY_Init();
        RS485_Init(250000);
        Dat_Rst_Init();
         delay_ms(100);
        LED0 = 1;
        
        DatRst = 0;     
        delay_us(88);
        DatRst = 1;
        delay_us(8);
        DatRst = 0;
        delay_us(32);
        DatRst = 1;
        delay_us(8);
        for( i = 0; i < 30; i++ )
        {
                rs485buf[ i] = 0x00;
        }
        RS485_Send_Data(rs485buf,30);
        
        while(1)
        {
                DatRst = 0;
                delay_us(88);
                DatRst = 1;
                delay_us(8);
                DatRst = 0;
                delay_us(32);
                DatRst = 1;
                delay_us(8);
                for( i = 0; i < 30; i = i+3 )
                {
                        rs485buf[i ] = cnr;
                        rs485buf[i+1] = cnb;
                        rs485buf[i+2] = cng;
                }
                RS485_Send_Data(rs485buf,30);
                delay_ms(10);
                switch(u)
                {
                        case 0:
                                cnr = cnr + 0x01;
                        if(cnr == 0xFF)
                                {
                                        cnr = 0xFF;
                                        u = 1;
                                }
                                break;
                        case 1:
                                cnr = cnr - 0x01;
                        if(cnr == 0x00)
                        {
                                cnr = 0x00;
                                u = 0;
                        }
                        break;
                        default:
                                u = 0;
                        break;
                }
        }   
}

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

使用道具 舉報(bào)

沙發(fā)
ID:390416 發(fā)表于 2021-1-19 01:04 | 只看該作者
以下代碼是DMX512發(fā)送代碼,使用STC8F單片機(jī)。出自《人人學(xué)會(huì)單片機(jī)》
  1. bit DMX512_RB8_ok=0;                                             //保存串口的第八位數(shù)據(jù)
  2. bit Uart2_Flag=1;                                                        //發(fā)送控制標(biāo)志位

  3. u8 xdata DMX512_Write_Buffer[Pixel_Num];
  4. #define BREAK 8                                                                //這個(gè)是控制BREAK的低電平復(fù)位時(shí)間的
  5. #define MAB BREAK+2                                                        //這個(gè)是控制復(fù)位后MAB時(shí)間的
  6. #define MAREK BREAK+4                                                //這個(gè)是控制復(fù)位后MAB時(shí)間的
  7. #define DMX512_OUT P11
  8. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  9. // 定時(shí)器4、定時(shí)器2、串口2初始化配置 波特率250000bps可變,9位數(shù)據(jù),下載主頻設(shè)置為24MHz
  10. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  11. void DMX512_Init()
  12. {
  13.         T4T3M |= 0x20;                                                        //定時(shí)器T4工作在1T模式
  14.         T4L = 0xF0;                                                                //初值,定時(shí)22us
  15.         T4H = 0xFD;                                                                //初值,定時(shí)22us
  16.         T4T3M |= 0x80;                                                        //定時(shí)器開始計(jì)時(shí)
  17.         IE2|=0X40;                                                                //定時(shí)器4中斷允許
  18.         
  19.         S2CON = 0x88;                                                        //9位數(shù)據(jù),可變波特率
  20.         AUXR |= 0x04;                                                        //定時(shí)器2時(shí)鐘為晶振時(shí)鐘
  21.         T2L = 0xE8;                                                                //定時(shí)器初值,定時(shí)時(shí)間*4=波特率
  22.         T2H = 0xFF;                                                                //定時(shí)器初值,定時(shí)時(shí)間*4=波特率
  23.         AUXR |= 0x10;                                                        //啟動(dòng)定時(shí)2
  24.         IE2|=0X01;                                                                //定時(shí)器2中斷允許
  25.         //IP2H|=0X01;                                                        //串口中斷改成最高優(yōu)先級(jí)
  26.         //IP2|=0X01;                                                        //串口中斷改成最高優(yōu)先級(jí)
  27.         EA=1;                                                                        //總中斷打開
  28.         DMX512_Write_Buffer[0]=0;                                //DMX512規(guī)范,第0字節(jié)發(fā)送的是0;
  29. }
  30. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  31. // DMX512發(fā)送函數(shù)
  32. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  33. void DMX512_TX_timer0() interrupt 20
  34. {
  35.         static u16 i;
  36.         static u16 count=0;
  37.         if(count<BREAK)                                                        //BREAK 復(fù)位拉低(根據(jù)項(xiàng)目調(diào)整參數(shù))
  38.         {
  39.                 count++;
  40.                 DMX512_OUT=0;
  41.         }
  42.         else if(count<MAB)                                                //復(fù)位后拉高最少12us(根據(jù)項(xiàng)目調(diào)整參數(shù))
  43.         {
  44.                 DMX512_OUT=1;
  45.                 count++;
  46.         }
  47.         if(count==MAB)                                                        //開始傳輸數(shù)據(jù)
  48.         {
  49.                 if(Uart2_Flag)                                                //上一個(gè)字節(jié)發(fā)送完成,中斷置1后。
  50.                 {        
  51.                         S2CON|=0x08;                                        //DMX512的字節(jié)是9位數(shù)據(jù),有兩個(gè)停止位,第8bit是TB8中。
  52.                         S2BUF=DMX512_Write_Buffer[i];        //發(fā)送字節(jié)
  53.                         Uart2_Flag=0;                                        //未發(fā)送完,不允許再進(jìn)來(lái)                                
  54.                         i++;                                                        //下一個(gè)字節(jié)
  55.                         if(i>=Pixel_Num)                                //大于總字節(jié)數(shù)量
  56.                         {
  57.                                 i=0;
  58.                                 count++;
  59.                         }
  60.                                                                                         //延時(shí),使兩位停止位+空閑總共達(dá)到12us
  61.                 }
  62.         }
  63.         if(count>MAB)                                                        //字節(jié)發(fā)送完之后,其余時(shí)間空閑,本程序是0~24字節(jié),后面空閑
  64.         {
  65.                 DMX512_OUT=1;
  66.                 count++;
  67.                 if(count>100)                                                //100  用于控制幀率,DMX512標(biāo)準(zhǔn)是 最多44幀數(shù)據(jù)包
  68.                 {
  69.                         count=0;
  70.                 }
  71.         }
  72. }

  73. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  74. // 串口中斷
  75. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁緒電子---2020年5月 *************
  76. void Uart2_Routine (void) interrupt 8
  77. {        
  78.         S2CON&=0xed;                                                        //清除發(fā)送中斷標(biāo)志
  79.         Uart2_Flag=1;                                                        //標(biāo)志位允許下一個(gè)字節(jié)發(fā)送
  80. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:752974 發(fā)表于 2021-1-19 10:12 | 只看該作者
這個(gè)協(xié)議沒用過,不懂,只能幫你頂一下。
回復(fù)

使用道具 舉報(bào)

地板
ID:373388 發(fā)表于 2021-1-19 10:19 | 只看該作者
你描述的不是很清楚,你這個(gè)應(yīng)該是主控端指令系統(tǒng),終端控制執(zhí)行部分,硬件是什么樣子的,根據(jù)你的指令協(xié)議怎么工作的,都沒有講,怎么幫你分析啊

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:326235 發(fā)表于 2021-1-25 14:43 | 只看該作者
xhaity 發(fā)表于 2021-1-19 10:19
你描述的不是很清楚,你這個(gè)應(yīng)該是主控端指令系統(tǒng),終端控制執(zhí)行部分,硬件是什么樣子的,根據(jù)你的指令協(xié)議 ...

用STM32開發(fā)板的485接口發(fā)送DMX512通用協(xié)議寫呼吸燈效果,解碼芯片為TM512AC,我測(cè)試了波形之后,發(fā)現(xiàn)從0x00到0x7F的亮度變化和0x80到0xFF的亮度變化一樣,測(cè)試得出解碼輸出的PWM波低電平占空比到0x7F就滿了,然后從0x80PWM波低電平占空比又從0開始到0xFF滿,說明這個(gè)解碼芯片輸出PWM波最大值是127,而不是正常的255,因?yàn)檎5腄MX512通信協(xié)議是到255才是最亮的,所以問一下你們有沒有碰到這種情況,對(duì)這個(gè)TM512AC了解嗎。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:326235 發(fā)表于 2021-1-25 14:52 | 只看該作者
我解釋一下硬件和后續(xù),硬件采用的是TM512AC解碼芯片的燈帶,自帶解碼和輸出PWM功能,但是DMX512通用協(xié)議對(duì)于燈光的控制一般是從0到255燈光從最暗到最亮,所以我寫的時(shí)候cnr就是一直+1,當(dāng)加到0x80的時(shí)候,燈就滅掉了,然后又慢慢亮,效果就是呼吸亮兩次,呼吸滅兩次。
后續(xù)我測(cè)試之后,發(fā)現(xiàn)這個(gè)解碼芯片的PWM輸出低電平占空比(就是燈亮的電平占空比)從0x00的0%到0x7F的100%,然后到0x80又變成了0%,到0xFF的100%,那么說明它的控制輸出,從0到127就可以了,但是我是第一次用這個(gè)協(xié)議做,對(duì)于這款解碼芯片也不是很了解,就是問一下這樣合理嗎,你們有沒有碰到這種情況。
結(jié)論就是我帖子里的猜想是錯(cuò)誤的,DMX512通信里的數(shù)據(jù)幀并不會(huì)觸發(fā)初始化,但是上述的情況大家是否碰到過可以探究探究。也是給以后可能用到的人一個(gè)提醒吧。

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:373388 發(fā)表于 2021-2-7 10:16 | 只看該作者
具體的你看看數(shù)據(jù)手冊(cè)吧 說明TM512AC這個(gè)芯片就是7bit pwm占空比, 最高位有可能其他含義;說明128當(dāng)作 0處理了,正好符合 測(cè)試現(xiàn)象;  你就把數(shù)據(jù)范圍控制在0-127,如果能滿足你的控制要求就行了,要不滿足控制要求,就選擇其他芯片了
回復(fù)

使用道具 舉報(bào)

8#
ID:326235 發(fā)表于 2021-2-27 17:11 | 只看該作者
xhaity 發(fā)表于 2021-2-7 10:16
具體的你看看數(shù)據(jù)手冊(cè)吧 說明TM512AC這個(gè)芯片就是7bit pwm占空比, 最高位有可能其他含義;說明128當(dāng)作 0處 ...

好的,謝謝
回復(fù)

使用道具 舉報(bào)

9#
ID:634016 發(fā)表于 2022-1-11 16:14 | 只看該作者
這頭像也太萌了吧
回復(fù)

使用道具 舉報(bào)

10#
ID:77589 發(fā)表于 2023-8-2 17:43 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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