久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于STM32的DMX512通信控制RGB燈帶程序問題 [打印本頁]

作者: jhonyzhang    時間: 2021-1-18 17:01
標題: 基于STM32的DMX512通信控制RGB燈帶程序問題
程序是讓燈帶只亮紅色并呼吸效果,當cnr增加到0x80時,會出現全部燈熄滅的情況,測出來波形是32us長低電平+12us高電平導致的初始化(個人猜測),如何避免該數據造成的初始化,希望有人解答一下

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;
                }
        }   
}


作者: 人人學會單片機    時間: 2021-1-19 01:04
以下代碼是DMX512發送代碼,使用STC8F單片機。出自《人人學會單片機》
  1. bit DMX512_RB8_ok=0;                                             //保存串口的第八位數據
  2. bit Uart2_Flag=1;                                                        //發送控制標志位

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

作者: munuc_w    時間: 2021-1-19 10:12
這個協議沒用過,不懂,只能幫你頂一下。
作者: xhaity    時間: 2021-1-19 10:19
你描述的不是很清楚,你這個應該是主控端指令系統,終端控制執行部分,硬件是什么樣子的,根據你的指令協議怎么工作的,都沒有講,怎么幫你分析啊
作者: jhonyzhang    時間: 2021-1-25 14:43
xhaity 發表于 2021-1-19 10:19
你描述的不是很清楚,你這個應該是主控端指令系統,終端控制執行部分,硬件是什么樣子的,根據你的指令協議 ...

用STM32開發板的485接口發送DMX512通用協議寫呼吸燈效果,解碼芯片為TM512AC,我測試了波形之后,發現從0x00到0x7F的亮度變化和0x80到0xFF的亮度變化一樣,測試得出解碼輸出的PWM波低電平占空比到0x7F就滿了,然后從0x80PWM波低電平占空比又從0開始到0xFF滿,說明這個解碼芯片輸出PWM波最大值是127,而不是正常的255,因為正常的DMX512通信協議是到255才是最亮的,所以問一下你們有沒有碰到這種情況,對這個TM512AC了解嗎。
作者: jhonyzhang    時間: 2021-1-25 14:52
我解釋一下硬件和后續,硬件采用的是TM512AC解碼芯片的燈帶,自帶解碼和輸出PWM功能,但是DMX512通用協議對于燈光的控制一般是從0到255燈光從最暗到最亮,所以我寫的時候cnr就是一直+1,當加到0x80的時候,燈就滅掉了,然后又慢慢亮,效果就是呼吸亮兩次,呼吸滅兩次。
后續我測試之后,發現這個解碼芯片的PWM輸出低電平占空比(就是燈亮的電平占空比)從0x00的0%到0x7F的100%,然后到0x80又變成了0%,到0xFF的100%,那么說明它的控制輸出,從0到127就可以了,但是我是第一次用這個協議做,對于這款解碼芯片也不是很了解,就是問一下這樣合理嗎,你們有沒有碰到這種情況。
結論就是我帖子里的猜想是錯誤的,DMX512通信里的數據幀并不會觸發初始化,但是上述的情況大家是否碰到過可以探究探究。也是給以后可能用到的人一個提醒吧。
作者: xhaity    時間: 2021-2-7 10:16
具體的你看看數據手冊吧 說明TM512AC這個芯片就是7bit pwm占空比, 最高位有可能其他含義;說明128當作 0處理了,正好符合 測試現象;  你就把數據范圍控制在0-127,如果能滿足你的控制要求就行了,要不滿足控制要求,就選擇其他芯片了
作者: jhonyzhang    時間: 2021-2-27 17:11
xhaity 發表于 2021-2-7 10:16
具體的你看看數據手冊吧 說明TM512AC這個芯片就是7bit pwm占空比, 最高位有可能其他含義;說明128當作 0處 ...

好的,謝謝
作者: 18879099548    時間: 2022-1-11 16:14
這頭像也太萌了吧

作者: Longan.Wang    時間: 2023-8-2 17:43
頂一下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品99久久| 久久国产一区 | 午夜在线免费观看 | 亚洲精品观看 | 福利电影在线 | 在线欧美一区 | 亚洲国产成人在线视频 | 亚洲天堂免费在线 | 亚洲黄色av| a在线视频观看 | 狠狠色综合网站久久久久久久 | 一级黄色毛片免费 | 日本久久久久久 | 亚洲成人在线免费 | 91精品国产91久久久久游泳池 | 成人国产午夜在线观看 | 日本精品久久 | 国产精品一区在线观看 | 7777奇米影视 | 午夜国产精品视频 | 亚洲第一区久久 | 日韩不卡三区 | h视频在线免费观看 | av黄色国产 | 人人干人人舔 | 日本免费一区二区三区 | 福利视频网站 | 91在线观看网址 | 精品成人av | 在线成人免费观看 | 久久爱综合 | a级大片 | 一级二级三级在线观看 | 91精品国产综合久久小仙女图片 | 国产色婷婷精品综合在线手机播放 | 精品久久久久久久久久久院品网 | 欧美伊人 | 精品久久久久久久久久 | 国产一区二区电影网 | 精品一区二区三区四区外站 | 91在线观看免费 |