用STM32的UART實現DMX512


寫在最前面:

DMX512(digital multiplex)

其實就是主機向從機整包單向廣播發送的協議(protocol),從機自取所需。


一、鏈接拓撲(network topology)

根據后面的協議可以知道,其實就是將所有的slave掛到線上去。(線最長可以多長?)

 
image.png

二、協議(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減少,時間也可以節省,然后頻率可以更高了。

 
image.png

放大右下角的每幀時序

 
image.png

三、硬件實現方式

 
image.png

四、電路:

 
image.png

五、軟件實現

下面的兩個圖,第一個是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來區別。

 
image.png
 
image.png

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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM