隨著無線通信芯片技術的發展,越來越多的便攜式或電池供電的無線傳輸設備進入人們日常生活中。例如,遙控車門開關(RKE)系統、汽車輪胎壓力監視系統(TPMS)、無線內窺鏡系統、藍牙技術等。利用單片機和無線數傳模塊來完成無線數據通信在石油、電力、水文、冶金等行業的無線控制、數據采集、報警諸多領域中有著廣泛的應用前景。通常采用的辦法是用單片機的串行I/ O 口來完成數據通信,但是該方法有許多不足之處:第一、在利用單片機的串口進行發送和接收數據時,對傳輸的數據只能進行奇偶校驗,然而在無線通信場合,被傳輸的數據極易受到電磁、靜電等的干擾,奇偶校驗一般不能檢測出這類干擾所引起的突發性錯誤,所以該方法無法滿足差錯檢測要求較高的場合;第二、由于單片機一般采用異步通信方式,接受器通常不能很快的接收到有效數據,因而該方法也不能滿足要求多路進行快速切換的場合;第三、單片機的串口通信在傳輸速率和每幀的有效數據位數等方面都受到了嚴格的限制,缺乏靈活性。本文針對低速無線通信的場合,提出了一種通過單片機用軟件實現編解碼的方案,該方案可以有效克服上述單片機串口通信的不足之處, 在無線通信中得到了令人滿意的效果。
1 編碼原理及程序流程
1.1 編碼原理
假設傳輸的數據精度為12位,以A8BH為例,其幀格式如圖1 所示,高位在先,低位在后。
數據的編碼采用了曼徹斯特編碼格式,每幀數據由同步頭、有效數據位和校驗位三部分組成。其中數據位“1”由高到低的跳變表示,數據位“0”由低到高的跳變表示,而且數據位“1”和“0”高低電平周期各為0.5 T(設T為一個數據位寬度)。根據曼徹斯特碼的特點,每個數據位都由高低電平組成,因而在連續傳輸的有效數據位中不會存在超過一個數據位寬度的高電平或低電平,因此在每個數據的前面設一個同步頭,高低電平各為1.5 T 。這樣在進行接收數據時,只要采樣得到的電平滿足1.5T ,則認為該電平是同步頭,開始接收數據。因為尋找同步頭的時間最長不會超過一個數據的長度,所以此編碼方式非常適合于要求多路進行快速切換的場合。為了簡化電路和節省功耗,本文采用了單極性曼徹斯特碼。
實現曼徹斯特軟件編碼比較簡單,根據曼碼和二進制數據的對應關系,一位二進制數據在編碼后將占據兩位空間。例如1在編碼后變為1、0;0在編碼后變為0、1。其中,曼碼數據低位在前,高位在后;被編碼的數據字節的高4位編碼后存放在一個字節中,低4位編碼后存放在相鄰的下一個字節中。
本文采用了循環冗余校驗,即后四位為循環冗余校驗碼。循環冗余校驗碼簡稱為CRC( CyclicRedundancy Code) 。循環冗余校驗的指導思想是發送端將被傳輸的數據流多項式除以生成多項式得到冗余位,接收端將被傳輸的數據(包括冗余位) 除以事先確定的生成多項式,如果余數為零,則認為沒有錯誤發生,不為零則表示有錯。由于使用這種方法獲得冗余位具有很強的信息覆蓋能力,它善于發現各種類型的錯誤,特別是一些突發性錯誤,所以它是一種效率極高的差錯校驗法 。
根據CRC 碼的編碼思想,對(16,12)碼,由x16 + 1確定生成多項式為G(x) = x4 + 1 ,該多項式也可表示成(10001) 。對被傳輸的12位數據和生成多項式采用模2 運算便可以得到每個數據的四位循環冗余位。
1.2 編碼子程序流程圖及說明
曼徹斯特編碼子程序包括計算冗余位和曼徹斯特編碼發送兩部分,首先調用CRC 求余子程序(流程圖略) ,將得到的冗余校驗位作為待發送16 位數據的低四位,然后對該16 位,并通過無線數傳模塊調制成模擬信號發射出去(單片機的TXD 端與無線數傳模塊發的DATA IN 端相連) 。同步頭及數據位發送是通過對單片機的TXD 端( P3. 1) 置“1”和清“0”并進行軟件延時來實現。TIME1 和TIME2 為軟件延時,以滿足同步頭高低電平寬度的要求。值得注意的是,在編寫編碼子程序時,應確保P3. 1 置“1”和清“0”時間間隔滿足數據位或同步頭寬度的要求。
2 解碼原理及程序流程
2.1 解碼原理
曼徹斯特解碼是編碼的逆過程,也就是從曼碼數據中提取時鐘,并利用這個時鐘還原二進制數據的過程。根據曼徹斯特解碼過程中完成任務的不同,可以把曼徹斯特解碼過程分為起始符識別及獲取同步時鐘、識別同步頭、提取數據信息3個階段。
(1) 同步頭的判定
本系統通過信號高低電平所占的位寬來判斷數據。當電平持續時間小于3/4的同步時鐘周期時,電平時間為半個位寬,反之電平時間為1個位寬。因為在起始符識別時只用了2個字節0xFF中的一個,所以在開始識別同步頭時識別出的第1個數據位肯定是‘1’,由此決定了在碼元識別時必須遵循以下2點。
首先對單片機的RXD 端( P3. 0) 進行連續采樣,從P3. 0 引腳變低時開始計時,若低電平的時間達到1. 3 T ,則認為該電平為同步頭。因為用無線數傳模塊得到的信號波形一般為梯形,所以接收到的實際高低電平寬度可能變小,因此若接收到低電平寬度達到1. 3 T ,則可近似認為該電平為某數據的同步頭。
(2) 數據位的判定
對每個數據位的判定采用“測三取二”的方法,既將每個數據位的前半部分成16 個狀態,在第7 、8 、9 狀態檢測P3. 0 引腳上的電平,取其大于等于2的相同值作為測得值,如表1 所示(表中“ x ”表示“0”或“1”) 。此檢測方法是在高電平或低電平的中間位置進行采樣,既提高了采樣準確度又有一定的濾波功能。
(3) 循環冗余校驗
對解碼得到的16 位數據進行循環冗余校驗,若余數為零,則認為傳輸正確,否則進行出錯處理。
2.2 解碼子程序流程圖及說明
解碼子程序包括曼徹斯特解碼和差錯校驗兩部分,其流程圖如圖3 所示。首先進行同步頭的判定,從RXD 端( P3. 0) 為低電平時開始計時(單片機的RXD 端與無線數傳模塊收的DATA OU T 端相連) ,并對P3. 0 引腳進行連續采樣,采樣時間間隔可自行設定,若P3. 0 引腳的低電平時間達到1. 3 T ,則認為該低電平為某數據的同步頭,然后對同步頭后面的數據位的前半位采用“測三取二”的方法進行數據位的判定,最后對采樣得到的16 位數據進行循環冗余校驗,若余數為0 ,則置錯誤標志,若不為0 ,則去掉冗余位, 得到12 位有效數據。TIME1~TIME3 是湊采樣的時間間隔。
3 結論
本文以一個實際工程的一部分為例,闡述了用AVR單片機軟件編程實現曼徹斯特編解碼方法。經過了實際驗證,數據傳輸可靠性很高,系統運行穩定,樣機已經成型,即將投入生產。與其它的數據傳輸方法和曼徹斯特編解碼方式相比,本方法十分靈活方便,它可以白適應射頻發射機電池電壓變化引起的數據傳輸波特率的變化。可處理的碼速率也很高,極限碼速率與所采用的單片機的速度和振蕩器的頻率以及采用的編程語言都有關系。本設計中采用C編程,振蕩器頻率為16MHz,數據傳輸率可達10kbps,用匯編語言編程數據傳輸率會更高。