應該說現在每一塊開發板都帶有紅外模塊,并且大都配置了相應的程序。但其實自己動手寫解碼程序,更能鍛煉自己所學,且不談程序寫的如何,這個過程中肯定是受益良多的,F在我就把我花一下午寫出的解碼程序與大家分享,期待高手的光臨指正。
首先,必須要了解一些基本原理。其實按下遙控器的某一個鍵,遙控器會發出一連串經過調制后的信號,這個信號經過紅外一體化模塊接收后,輸出解調后的數字脈沖,每個按鍵對應不同的脈沖,故識別出不同的脈沖就能識別出不同的按鍵。

上圖就是很常見的車載MP3遙控器,比較小巧,很好用。下面是紅外發射和接受原理:

到此讀者可能會有疑惑,那么不同的調制解調方法那么出來的脈沖規則是不一樣的?是的,的確如此。
遙控發射器專用芯片很多,根據編碼格式可以分成兩大類,這里我們以運用比較廣泛,解碼比較容易的一類來加以說明,現以日本NEC的uPD6121G組成發射電路為例說明編碼原理(一般家庭用的DVD、VCD、音響都使用這種編碼方式)。當發射器按鍵按下后,即有遙控碼發出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖所示。

如圖可見,0與1前端的低電平持續都是0.56ms,那么就是后面的高電平持續時間不同,0為0.56ms,1為1.685ms,找到不同之處,編程時就有識別的依據了!
上述“0”和“1”組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率,達到降低電源功耗的目的。然后再通過紅外發射二極管產生紅外線向空間發射,如圖所示。

UPD6121G產生的遙控編碼是連續的32位二進制碼組,其中前16位為用戶識別碼,能區別不同的電器設備,防止不同機種遙控碼互相干擾。該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。
請看下圖,來自網絡:

當一個鍵按下超過36ms,振蕩器使芯片激活,將發射一組108ms的編碼脈沖,這108ms發射代碼由一個引導碼(9ms),一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數據碼(9ms~18ms)和這8位數據的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,接下來發射的代碼(連發碼)將僅由起始碼(9ms)和結束碼(2.25ms)組成。(實際上人手的動作是很慢的,即使你快速的按下按鍵,可能對于芯片來說還是超過108ms,所以如何處理連發碼是很關鍵的)
遙控器在按鍵按下后,周期性地發出同一種32位二進制碼,周期約為108ms。一組碼本身的持續時間隨它包含的二進制“0”和“1”的個數不同而不同,大約在45~63ms之間,圖為發射波形圖。


下面是我寫的代碼,按鍵編碼通過串口發送到電腦端:
由于時間關系,代碼注釋不多。
其中START_Judge()函數是判斷9ms低電平,既是判斷有無遙控信號。
BOOT_REPEATING_CODE_Judge()是判斷是引導碼還是連發碼,引導碼則進入接受數據環節,連發碼表明數據已經接受結束。
H_L_LEVEL_Judge()是接受數據時判斷高低電平。
如果亂碼,請參考:
注明:以下代碼為純軟件方式,沒有用到中斷,定時器方式,純CPU查詢,但測試結果倒也可以,至少比較穩定,得到的碼值不管對不對,都是那個值。

編輯如下:
01 FE 8B 74 --- 01 FE 8D 72 --- 01 FE 8F 70
01 FE 89 76 --- 01 FE 81 7E --- 01 FE 87 78
01 FE 0F F0 --- 01 FE 2B D4 --- 01 FE 13 EC
01 FE 2D D2 --- 01 FE 33 CC --- 01 FE 1B E4
01 FE 19 E6 --- 01 FE 31 CE --- 01 FE BD 42
01 FE 11 EE --- 01 FE 39 C6 --- 01 FE B5 4A
以上為對應按鍵的編碼。
過程中存在問題:
一是如何有效的識別引導碼和連發碼,因為這個能直接影響到長時間按鍵,單片機的響應與否。這個問題,貌似我以解決,就是長時間按鍵后,單片機識別一次按鍵后,如果還是同一按鍵,就不與理睬。
還有一個問題就是,如果連續按下兩次按鍵,該程序能夠識別出,但是如果間隔很短,第二下按鍵的編碼容易出錯,容易變成這樣:
03 FE 8B 74.。。。就是第一個字節出現誤差,這個問題現在還未來得及解決。
還有就是本程序對于延時函數的精度要求很高,因為本身處理的脈沖就是MS級別的。所以需要嚴格的測試延時函數的實際延時時間:

以上的代碼,可以看出許多問題,軟件延時不準確,大量的“while( IR_Out == 0 ) ;”代碼,抗干擾能力弱,容易進入死循環。
下面介紹的這種解碼方法,利用外部中斷觸發程序,定時器定時(但沒有設置定時中斷程序,即判斷TF的值確定定時結束),在代碼過程中,開頭的一個7.93ms延時,足以濾掉不合法的紅外信號。應該說效率質量更高的。
代碼注釋很詳細,在此不在細述:

這個那么多,要慢慢看了ghuk 發表于 2019-9-18 16:16
可以改為空調遙控器嗎?
| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |