摘 要: 介紹了紅外遙控發射和接收的原理,提出了一種用PLD(可編程邏輯器件)進行解碼的方案,并分別用EPROM和GAL實現。該方案思路新穎、原理簡單、工作可靠,可用于各種以鍵盤掃描為輸入方式的智能儀器系統中。
關鍵詞: 紅外遙控? 可編程邏輯器件? 遙控解碼? 鍵盤掃描
紅外遙控技術已經在日常家用電器中得到了廣泛應用,其使用方便、功耗低、抗干擾能力強的優點也越來越在智能儀器系統中受到重視。市場上的各種家電紅外遙控系統技術成熟、成本低廉,但都是針對各自的遙控對象(彩電、冰箱、空調等),不能直接用于智能儀器。本文探討了如何借鑒家電紅外遙控系統的原理,自行設計解碼電路,使智能儀器具有遙控功能。
1 紅外遙控原理
一般的紅外遙控系統是由紅外遙控信號發射器、紅外遙控信號接收器和微控制器及其外圍電路等三部分構成的,如圖1所示。
遙控信號發射器用來產生遙控編碼脈沖,驅動紅外發射管輸出紅外遙控信號,遙控接收頭完成對遙控信號的放大、檢波、整形、解調出遙控編碼脈沖。遙控編碼脈沖是一組組串行二進制碼,對于一般的紅外遙控系統,此串行碼輸入到微控制器,由其內部CPU完成對遙控指令解碼,并執行相應的遙控功能。
在紅外遙控系統中,解碼的核心是CPU。它接收解調出的串行二進制碼,在內部根據本系統的遙控信號編碼格式將串行碼對應成遙控器上的按鍵。顯然,這種在CPU內部解碼出的遙控指令是不便我們利用的,而且我們也不需要獲取它。我們只需利用一般紅外遙控系統中的遙控發射器、遙控接收頭,自行設計解碼電路直接對遙控接收頭解調出的遙控編碼脈沖進行解碼,就可以得到原始的按鍵信息。
2 紅外遙控編碼
目前應用中的各種紅外遙控系統的原理都大同小異,區別只是在于各系統的信號編碼格式不同。下面我們就以本文采用的紅外遙控系統為例說明它的編碼體制。
紅外遙控發射器以TC9012為核心組成了鍵掃描、編碼、發射電路。當按下遙控器上任一按鍵時,TC9012即產生一串脈沖編碼如圖2所示。
TC9012形成的遙控編碼脈沖對40kHz載波進行脈沖幅度調制(PAM)后便形成遙控信號,經驅動電路由紅外發射管發射出去。紅外遙控接收頭接收到調制后的遙控信號,經前置放大、限幅放大、帶通濾波、峰值檢波和波形整形,從而解調出與輸入遙控信號反相的遙控脈沖。
在圖2中,一次按鍵動作的遙控編碼信息為32位串行二進制碼。對于二進制信號“0”,一個脈沖占1.2ms;對于二進制信號“1”,一個脈沖占2.4ms,而每一脈沖內低電平均為0.6ms。從起始標志到32位編碼脈沖發完大約需80ms,此后遙控信號維持高電平。若按鍵未釋放,則從起始標志起每隔108ms發出3個脈沖的重復標志。
在32位的編碼脈沖中,前16位碼不隨按鍵的不同而變化,我們稱之為用戶碼。它是為了表示特定用戶而設置的一個辨識標志,以區別不同機種和不同用戶發射的遙控信號,防止誤操作。后16位碼隨著按鍵的不同而改變,我們就是要讀取這16位按鍵編碼,經解碼得到按鍵鍵號,轉而執行相應控制動作。
那么,不同的按鍵編碼脈沖是怎樣和遙控器上不同的按鍵一一對應的呢?我們借助于邏輯分析儀記錄下來遙控器上每一個按鍵的編碼脈沖序列,破譯出了各按鍵的編碼。表1是解碼后得到的紅外遙控器上各鍵的編碼(前16位用戶碼均為0000001011111101,表1只列出后16位鍵碼)。
由表1按鍵編碼可看出,后16位鍵碼的前8位與后8位互為補碼,這樣加大編碼的冗余度是為了增強遙控系統的抗干擾能力。實際上,我們只須截取16位鍵碼的8位(比如后8位)就可達到識別按鍵的目的。當然,要加強遙控系統的抗干擾能力,還需接收全16位鍵碼甚至16位用戶碼加以識別。
3 紅外遙控解碼
紅外遙控接收頭解調出的編碼是串行二進制碼,包含著遙控器按鍵信息。但它還不便于CPU讀取識別,因此需要先對這些串行二進制碼進行解碼。本文的紅外遙控信號解碼電路如圖3所示,它主要包括遙控編碼脈沖串并轉換電路與PLD解碼電路。
3.1 遙控編碼脈沖的串并轉換
紅外遙控接收頭解調出的遙控編碼脈沖經一非門反相后引入計數器4020的復位端(RST),4020的腳10(CP)端引入1MHz計數脈沖。遙控信號(已反相)中每一正脈沖到來時其高電平對4020復位,經過0.6ms遙控信號變為低電平,4020復位結束,開始以1MHz的頻率計數,直到下一個正脈沖到來時為止。二進制碼“0”每一脈沖周期低電平時間為0.6ms,二進制碼“1”每一脈沖周期低電平時間為1.8ms,4020的Q11端即可以區分二進制碼“0”或“1”。每一遙控編碼正脈沖上升沿到來時,若Q11端為“1”,說明前一位遙控碼為“1”;若Q11端為“0”,說明前一位遙控碼為“0”。
將4020的Q11端作為74HC595的串行移位輸入端(SER),便可在每一個遙控編碼脈沖上升沿到來時并在4020復位之前,將74HC595中的數據沿Q0到Q7方向依次移一位,且4020的Q11端數據移入74HC595的Q0端。對于一組遙控編碼脈沖,共有33次上升沿(包括起標志),而74HC595僅為8位移位寄存器,所以移位的最終結果,只有遙控編碼脈沖的最后8位保留在74HC595中。
當一組遙控編碼脈沖(反相后)來到時,其起始標志的上跳沿觸發了雙單穩74HC123的1B,在1Q上產生了一個寬度為120ms的正脈沖。1Q同時又觸發了74HC123的2B,在2Q產生一個寬度為80ms的負脈沖,1Q和2Q相與后作為鎖存信號送至74HC595的RCLK端,即一組遙控編碼脈沖到來80ms后,產生一個鎖存信號。此時74HC595已經移過了一組遙控碼,芯片中保留的是最后8位遙控碼,鎖存信號將這最后8位遙控碼鎖存。
3.2 基于EPROM的遙控解碼原理
經過串并轉換,我們得到了8位并行遙控碼。為了讓CPU讀取這個并行遙控碼,通常的方法是在轉換完成后產生一個中斷,通知CPU來讀取遙控信息。但這樣做要占用CPU一個外部中斷資源并需編寫額外的中斷服務程序,顯得比較煩瑣。尤其是當儀器系統的軟件不是由自己開發而又要加裝遙控時更是無能為力。因此,我們想尋求一種不占用儀器CPU的軟、硬件資源而實現遙控的方法,使鍵盤輸入和遙控輸入統一起來,占用同一個端口、同一個中斷、同一個中斷服務程序。簡言之,要做到對CPU是透明的,似乎只有一個鍵盤輸入單元在工作,只須訪問它來進行鍵盤掃描、鍵碼讀出操作。但實際上卻有遙控器與鍵盤兩套鍵輸入硬件在同時而獨立地工作。
考察一下智能儀器的鍵盤掃描輸入原理。在這種方式下,CPU通過輸出指令使鍵盤矩陣的行掃描線依次為“0”(低電平),同時監測鍵盤矩陣的列掃描線。若無鍵按下,則列掃描線輸出全“1”(高電平);若有鍵按下,則此鍵所在列線輸出為“0”,再結合行掃描線此時的狀態,就可具體定位按鍵。
我們設想,可否將遙控接收頭輸出的含有按鍵信息的8位遙控碼通過某種轉換,并入鍵盤矩陣電路,當遙控器有鍵按下時,就會在機上鍵盤對應鍵處產生一個“模擬”按鍵動作,產生一個鍵碼可供CPU讀取。所謂“模擬”是指并沒有機械按鍵動作,但對于鍵盤矩陣電路而言卻產生一個低電平,效果和機械按鍵動作完全一樣。這樣就將遙控鍵盤和本機鍵盤統一起來,二者的鍵數和鍵功能定義都一樣,一個相同的鍵在遙控器上按下和在本機鍵盤上按下對CPU而言沒有任何區別,只不過對鍵盤矩陣來說前者是軟接觸,后者是硬接觸。
根據遙控器上按鍵與本機鍵盤按鍵的一一對應方案,我們可以導出實現“模擬”按鍵的邏輯真值表(其中C0~C4為列掃描線),見表2。
這是一個12變量輸入5變量輸出的組合邏輯函數,最小項總數為16×20=320個。若用普通邏輯門電路來實現這樣的功能將是十分麻煩的,用PLD(可編程邏輯器件)來做就要簡單得多。EPROM就是一種與陣列固定、或陣列可編程的邏輯器件。如果把EPROM的輸入地址A0,A1,……AN視為輸入邏輯變量,同時把輸出數據D0,D1,……DM視為一組多輸出邏輯變量,那么輸出與輸入之間也就是一組多輸出的組合邏輯函數。而且,EPROM地址譯碼器的輸出包含了全部輸入變量的最小項,每一位數據輸出又都是這些最小項之和,因而任何形式的組合邏輯函數均能通過向EPROM中寫入相應的數據來實現。不難推想,具有N位輸入地址和M位數據輸出的EPROM可以獲得一組(最多為M個)任何形式的N變量組合邏輯函數。
根據這個原理,選用4K×8 EPROM 2732,可以實現任意12變量輸入、8變量輸出的組合邏輯函數。在本機遙控系統中,利用了EPROM的D0~D4五根數據線和全部12根地址線,通過向2732中固化上表所示的邏輯真值表,從而實現了關鍵的遙控解碼,使遙控器上按鍵與本機鍵盤按鍵一一對應起來。需要指出的是,EPROM的地址譯碼是全譯碼,而在本方案中占據地址線A0~A7的8位遙控碼只有20種有效碼值(20個鍵),即一頁(256字節)中只有20個有效數據,則應將剩余空間填入0FFH。
由解碼電路圖3可見,EPROM 2732的地址線A0~A7接至8位輸出鎖存移位寄存器74HC595的輸出(即8位遙控碼),A8~A11接至鍵盤矩陣的行掃描線R0~R3;2732的8根數據線使用了其中的5根D0~D4,接至鍵盤矩陣的列掃描線C0~C4,2732的CS(片選端)接地,OE(讀信號)接至施密特與非門4093的3腳輸出,此輸出為雙單穩74HC123的1Q、2Q與非的結果。
當遙控器上沒有按鍵按下時,EPROM 2732的OE端為“1”,使得2732的數據線D0~D4為高阻態與鍵盤矩陣線脫離,而本機鍵盤的掃描與讀出照常進行不受影響,若遙控器上有鍵按下時,經紅外發射、接收對應的8位遙控碼出現在74HC595的輸出端,并作為EPROM 2732的A0~A7輸入,此時的行掃描碼(CPU發出)作為A8~A11輸入,2732的OE端為低電平,讀出A0~A11指定單元的數據,將其中D0~D4放在鍵盤矩陣列線上。D0~D4中只有一位為“0”,指示著哪一列有鍵按下,這樣就由遙控接收、解碼電路模擬了一次“按鍵”動作。接下來CPU對這個“按鍵”動作的響應、處理就和本機鍵盤完全一樣了。
2.3 基于GAL的遙控解碼原理
我們還可以考慮用GAL器件來實現解碼功能。GAL(通用陣列邏輯)也是一種PLD器件,它的與陣列可編程而或陣列固定。根據遙控解碼的真值表,我們要實現一個12變量輸入、5變量輸出的組合邏輯函數,其全部最小項有16×20=320個。而GAL20V8的輸出最多可有8個,每個輸出由8個乘積項相或而得,總共可包含8×8=64個乘積項,似乎不夠用于實現解碼邏輯。但是注意到320個最小項并不是互不相關的,通過化簡可將它們化成5個最簡與或式,分別對應著5個輸出變量,每個輸出變量由4個乘積項相或而得,這樣就可以用GAL20V8來實現解碼邏輯了。據此可設計出GAL邏輯方程如下:
/** Inputs **/
Pin[1..8]=[A7..A0]? ;定義并行遙控碼的輸入引腳
Pin[9..11,14]=[R0..R3];定義鍵盤行掃描線的輸入引腳
Pin[13]=[out_enable]? ;定義輸出使能引腳
/** Outputs **/
Pin[15..19]=[C0..C4];定義鍵盤列線的輸出引腳
/** Declarations and Intermidiate Variables **/
Field remote=[A7..A0];
$define m0'b'11000111;將20個鍵的鍵值用
$define ml'b'00010111 ;″m0″、″m1″…″m19″來表示
……
$define m19'b'00011111
/** Logic Equations **/
!C0=!R0&remote:m0? ;第0條列線的輸出方程
#!R1&remote:m5
#!R2&remote:m10
#!R3&remote:m15;
!C1=!R0&remote:m1? ;第1條列線的輸出方程
#!R1&remote:m6
#!R2&remote:m11
#!R3&remote:m16;
!C2=!R0&remote:m2? ;第2條列線的輸出方程
#!R1&remote:m7
#!R2&remote:m12
#!R3&remote:m17;
!C3=!R0&remote:m3;第3條列線的輸出方程
#!R1&remote:m8
#!R2&remote:m13
#!R3&remote:m18;
!C4=!R0&remote:m4;第4條列線的輸出方程
#!R1&remote:m9
#!R2&remote:m14
#!R3&remote:m19;
[C0..C4].oe=!out_enable;所有列線輸出均帶使能
采用EPROM和GAL器件進行紅外遙控解碼的方案都已在實際電路中得到驗證,工作穩定可靠。而GAL較之EPROM更具有體積小、功耗低、可加密等優點。本文提出的解碼方案基于純硬件原理,不占用CPU軟、硬件資源,直接并在鍵盤掃描矩陣上,對CPU是透明的。本方案適用于鍵盤掃描輸入的智能儀器系統的紅外遙控,對其它紅外遙控系統的設計應用亦具有借鑒意義。
參考文獻
1 閻 石.數字電子技術基礎.北京:高等教育出版社,1989
2 蔡 軼.通用搖控解碼電路.電子技術,1995(1)