stm8l單片機之汽車遙控解碼器

前兩天給大家展示了一個基於stm8l的遙控解碼器,有網友提出能不能講一講解碼原理,這裡就給分享一下具體解碼思路和最終的代碼,有條件的可以去實踐一下,相信會對大家的單片機編程能力有很大的提升。


首先,明確一下本次遙控解碼的協議是pt226x,固定碼,8位地址,4位數據

stm8l單片機之汽車遙控解碼器

圖1,pt226x數據幀

但是,地址和數據的有效值是由兩個脈衝組成,如下圖所示:

stm8l單片機之汽車遙控解碼器

圖2,有效數據位表示

大家由沒有發現,這裡有個很變態的地方,長脈衝和短脈衝的組合給浪費掉了!嗯,就是這麼變態。

但是,既然一個有效數據位有三種狀態,那麼顯然在單片機裡面,一個數據位只能表示0和1是不夠的,這樣還得擴展成2bit來表示三種狀態,短脈衝短對應數據位0,長脈衝為1。

那麼一個pt2262的有效位就是00b,11b,01b三種狀態,這樣對於單片機來說存儲這些數據就變成了16位地址和8位數據。

第二、開始解碼

stm8l單片機之汽車遙控解碼器

圖3,完整數據幀

一個完整的物理據幀由:16個地址脈衝+8位數據脈衝+1個結束位短高電平脈衝(4T)+1個低電平間隔(124T)

1.如何確定幀頭?

只有一個結束位和低電平間隔是和數據地址有區別的,嗯,就是它了,可以作為幀頭判斷。

2.有效數據接收

根據圖3,一個T表示一個時鐘週期,地址和數據位一個短電平是4T,一個長電平是12T。

為了單片機方便解碼,我們定義T=100us:

數據位0:一個短高電平(4T=400us)+一個長低電平(12T=120us)

數據位1:一個長高電平(12T=120us)+一個短低電平(4T=120us)

T

3.單片機編程實現

有了上面的分析,我們只需要實現脈衝寬度測量就可以了。

a.採用timer3作為脈衝測量定時器,計時單位是1us

stm8l單片機之汽車遙控解碼器

b.接收管腳配置位為數據中斷,在脈衝的上升沿和下降沿取定時器的計數值

stm8l單片機之汽車遙控解碼器

c.在中斷服務程序裡面獲取數據,這裡採用狀態機來解碼

c.1 查找幀頭短高電平, 從變為高電平時刻開始計時

stm8l單片機之汽車遙控解碼器

c.2 變為低電平時,判斷短高電平脈寬是否滿足要求,如果滿則要求則對低電平脈衝計時,

否則重置狀態機,重新開始。

stm8l單片機之汽車遙控解碼器

c.3變為高電平時,判斷低電平脈寬是否滿足要求,如果滿足要求則開始接收數據,否則重新開始


stm8l單片機之汽車遙控解碼器

d.開始數據接收解碼

d.1狀態機奇數獲取數據的高電平脈寬,每個數據幀由24個高電平脈寬

stm8l單片機之汽車遙控解碼器

d.2 狀態機偶數獲取數據的低電平脈寬,每個數據幀由24個低電平脈寬,同時判斷數據的有效性

如果第一幀數據接收完成,則啟動第二幀數據接收。

stm8l單片機之汽車遙控解碼器

d.3 只有連續兩幀數據接收完成,並且兩幀數據一樣才判斷為有效數據,進而進行數據處理

stm8l單片機之汽車遙控解碼器

4.總結

固定碼解碼其實並不複雜,並且方法也有很多種,上面給出的方法是最直觀的方法,可以一個數據位一個數據位去思考。但是關鍵是要把協議格式理解清楚,也就事半功倍了。其他就是對編程能力考驗,程序裡面沒有任何討巧的地方,都是最普通的代碼,希望對各位單片機愛好者有一定幫助。


分享到:


相關文章: