當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > DMX512協(xié)議及對(duì)接口電路的分析
1、DMX512協(xié)議簡(jiǎn)介
DMX 是Digital MultipleX 的縮寫(xiě),意為多路數(shù)字傳輸(具有512條信息的數(shù)字多路復(fù)用”)。DMX512控制協(xié)議是美國(guó)舞臺(tái)燈光協(xié)會(huì)(usITT)于1990年發(fā)布的燈光控制器與燈具設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)墓I(yè)標(biāo)準(zhǔn),全稱是USITTDMX512(1990);
DMX512 在其物理層采用EIA-485差分信號(hào),結(jié)合可變尺寸,基于分組的通信協(xié)議。它是單向的。DMX512不包含自動(dòng)錯(cuò)誤檢查和糾正功能,因此不適用于危險(xiǎn)應(yīng)用,如煙火或舞臺(tái)裝置的移動(dòng)。電磁干擾,靜電放電,不正確的電纜端接,電纜過(guò)長(zhǎng)或電纜質(zhì)量都可能造成虛假觸發(fā),但是在連接控制器(如照明控制臺(tái))與調(diào)光器和特效設(shè)備等都有廣泛應(yīng)用。
2、DMX512協(xié)議分析
2.1、DMX512指令幀介紹:
每一個(gè)DMX 控制字節(jié)叫做一個(gè)指令幀,稱作一個(gè)控制通道,可以控制燈光設(shè)備的一個(gè)或幾個(gè)功能。一個(gè)DMX 指令幀由1個(gè)開(kāi)始位(S)、8個(gè)數(shù)據(jù)位(D0-D8)和2個(gè)結(jié)束位(E)共11位構(gòu)成,采用單向異步串行傳輸,如圖1所示。
圖1 DMX512 定時(shí)程序的幀結(jié)構(gòu)(上圖)和信息包結(jié)構(gòu)(下圖)
圖1 中虛線內(nèi)控制指令中的S 為開(kāi)始位,寬度為一個(gè)比特,是受控?zé)艟邷?zhǔn)備接收并解碼控制數(shù)據(jù)的開(kāi)始標(biāo)志;
E為結(jié)束位,寬度為兩個(gè)比特,表示一個(gè)指令幀的結(jié)束;
D0~ D7為8 位控制數(shù)據(jù),其電平組合從00000000一11111111 共有256個(gè)狀態(tài)(對(duì)應(yīng)十進(jìn)制數(shù)的0~255),控制燈光的亮度時(shí),可產(chǎn)生256個(gè)亮度等級(jí),0000~ (0)對(duì)應(yīng)燈光最暗,11111111(255)對(duì)應(yīng)燈光最亮。
DMX512指令的位寬(每比特寬度)是4 us,每一個(gè)指令幀11位,故指令幀寬度為44 us,傳輸速率為1/44us = 250 kbps。
2.2、DMX512信息包
一個(gè)完整的DMX512信息包(Packet)由一個(gè)MTBP位、一個(gè)Break 位、一個(gè)MAB位、一個(gè)SC 和512個(gè)數(shù)據(jù)幀構(gòu)成。
MTBP(Mark TimeBetween Packets)標(biāo)志著一個(gè)完整的信息包發(fā)送完畢,是下一個(gè)信息包即將開(kāi)始的“空閑位”,高電平有效。
Break為中斷位,對(duì)應(yīng)一個(gè)信息包結(jié)束后的程序復(fù)位階段,寬度不少于兩個(gè)幀(22 比特)。程序復(fù)位結(jié)束后應(yīng)發(fā)送控制數(shù)據(jù),
MAB位,由于每一個(gè)數(shù)據(jù)幀的第一位(即開(kāi)始位)為低電平,所以必須用一個(gè)高電平脈沖間隔前后兩個(gè)低電平脈沖,這個(gè)起間隔、分離作用的高電平脈沖即MAB(Mark After Break),此脈沖一到,意味著“新一輪”的控制又開(kāi)始了。
SC(Start Code)意為開(kāi)始代碼幀(圖1中的第0幀),和此后到來(lái)的數(shù)據(jù)幀一樣,也是由11 位構(gòu)成,除最后的兩個(gè)高電平的結(jié)束位之外,其他9位全部是低電平,通常將其叫做第0 幀或第0通道(Ch~nel No 0),可理解為一個(gè)不存在的通道(Non一~istent Channe1)。
表1 DMX512 信息包定時(shí)表
表1 是DMX512 信息包的定時(shí)表,表中NS意為自己設(shè)定,寬度沒(méi)有嚴(yán)格限制,由程序設(shè)計(jì)者自行決定,比如MTBP的寬度可以介于0~1秒之間,其他建議采用典型值。
調(diào)光控制臺(tái)每發(fā)送一個(gè)信息包,可以對(duì)全部512個(gè)受控通道形成一次全面的控制。發(fā)送一個(gè)信息包的時(shí)間大約是23 ms,每秒鐘將對(duì)所有512個(gè)受控通道完成44 次控制,即受控光路的刷新頻率44 Hz,如果實(shí)際受控通道少于512個(gè),那么刷新頻率將相應(yīng)提高。
3、DMX512接口電路
以下是使用RJ45連接器的接線及驅(qū)動(dòng)電路 :
(XLR-5和RJ45基本類似)
表2 DMX512 設(shè)備使用RJ45連接器的接線表
圖2 DMX512 設(shè)備接口驅(qū)動(dòng)電路
4、C51開(kāi)發(fā)的DMX512發(fā)送程序
[cpp] view plain copy
1. // 串口工作在方式3
2. void send_dmx (void)
3. {
4. unsigned int count;
5. EA = 0;
6. TXD = 1; //break
7. TXD = 0;
8. Delay88us();
9. TXD = 1;
10. Delay8us();
11. TB8 = 1; //MAB
12. SBUF = 0x00;
13. while (!TI);
14. TI = 0;
15. for (count=0 ; count
16. TB8 = 1;
17. SBUF = XBYTE[count];
18. while(!TI);
19. TI = 0;
20. }
21. TXD = 1;
22. EA = 1;
23. }
5、C51開(kāi)發(fā)的DMX512接收程序
[cpp] view plain copy
1. // 串口工作在方式3
2. void uart(void) interrupt 4
3. {
4. static bit flag = 0;
5. if(RI) {
6. if(RB8 == 0) {
7. if(SBUF == 0)
8. flag = 1; //set flag when meet a break
9. Recv.count = 0; //reset uart data counter
10. }
11. else if (flag == 1) {
12. if(Recv.count == 0) //byte after reset
13. if(SBUF != 0) //not a start code
14. flag = 0; //error, reset flag
15. if(Recv.count >= Recv.addr && Recv.count < Recv.addr + CTL_LEN) {
16. Recv.dat.Byte[Recv.count - Recv.addr] = SBUF;
17. }
18. If (Recv.count < 512) Recv.count++;
19. else flag = 0;
20. }
21. RI = 0;
22. }
23. }