寫在最前面:
DMX512(digital multiplex)
其實就是主機向從機整包單向廣播發送的協議(protocol),從機自取所需。
一、鏈接拓撲(network topology)
根據后面的協議可以知道,其實就是將所有的slave掛到線上去。(線最長可以多長?)

二、協議(protocol)的時序如下圖
1) 先說明地址,包的格式是固定的,第一個數據幀就是地址1(說是0也可以),接下來的數據幀,地址逐漸+1。
2) 1 slot 或者叫 1 data frame(數據幀)=1 start bit(低電平) + 8 data bits + 2 stop bits(高電平) = 11bits, 1bit=4us,1slot=44us。(下圖右下角的藍色字體部分)
3) 1 packet (數據包)= 1 break + 1 MAB(mark after break) + 1 SC(start code) + 512 slots + 1 MTBP(mark time between packets) (下圖紅色字體部分)
- 1 break 典型值88us
- MAB 典型值 8us
- SC就是一幀 44us,第0幀
- MTBP,高電平有效,0-1s之間
time = 88us+8us+44us+512*44us+0=22668us=22.668ms 發包頻率44.11Hz,也就是控制頻率了,如果地址用不完,把slot減少,時間也可以節省,然后頻率可以更高了。

放大右下角的每幀時序

三、硬件實現方式

四、電路:

五、軟件實現
下面的兩個圖,第一個是DMX512的時序,第二個是UART的時序,可以看出,可以利用UART進行模仿。
1、數據格式,大家都是1個bit的低電平作為開始,八個數據位,兩個停止位,大家都是11位
2、一個bit的時間,標准的DMX512是4us,那么對應波特率就是1s/(4us)=250000bit/s
然后問題來了,那個大break怎么檢測呢?
把通訊格式換成1個開始bit+9個數據bit+1個停止bit,也是11個bit,
1、正常的slot,第9個數據bit對應了停止位,所以是1,
2、break的時間間隔足夠長,第9個數據bit對應的還是0,差別出來了,就靠這個第9數據bit來區別。


STM32F103 code:
/************************************************** 函數說明:初始化DMX512的USART4,用USART來模仿DMX512,設定接收中斷 **************************************************/ void DMX512_UART4_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 250000; //跟DMX512的速度匹配上,一個bit用4us //模仿slot: //UART :1低電平啟動位+9個數據位+1個高電平停止位 //DMX512:1低電平開始位+8個數據位+2個高電平停止位 //為什么要設置UART的第9個數據位,而不是8個數據位+2個停止位, //主要是用來判斷break的 //UART協議中,有一個固定的低電平啟動位 USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(UART4, &USART_InitStructure); USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//使能接收中斷 USART_Cmd(UART4, ENABLE); // 中斷組0 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 中斷來源 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; // 搶占式優先級 0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 響應優先級 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
六、多地址數據獲取
在實際應用中,一個slot的信息量太小了,一個slave設備可能用到多個slot,比如8個,那么所有設備都要約定好,slave1從使用slot0-7的數據,那么為了避免重疊,slave可以使用slot8-15的數據。
參考資料
what is DMX512
https://en.wikipedia.org/wiki/DMX512
https://www.learnstagelighting.com/what-is-dmx-512/
https://wenku.baidu.com/view/d8945f9b80eb6294dd886ccb.html (這份解釋不錯。)
作者:StarsOcean
鏈接:https://www.jianshu.com/p/5c1083283507
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。