何乃味
(柳州職業技術學院 廣西 柳州 545006)
用BA5104芯片構成的紅外遙控發射器電路具有外接元件少、成本低廉、器件本身功耗低、電源電壓適應范圍寬、工作穩定可靠等特點,因此廣泛應用于遙控風扇、燈器、電熱水器等各類家用電器中。BA5104芯片解碼常用BA5204、BA820X系列、SM5032C等芯片進行硬件解碼,這種解碼方法缺乏靈活性。目前許多電子產品和電氣設備以單片機作為核心控制器且逐漸采用紅外遙控器進行操作,采用軟件解碼代替硬件解碼,對于設備的升級和改造提供極大的靈活性,降低開發成本。
由紅外遙控芯片BA5104構成的紅外遙控發射器電路[1]如圖1所示。K1~K8為遙控器的輸入按鍵,由于BA5104的按鍵輸入端內接有上拉電阻,無鍵按下時,電路沒有電流流通,無編碼信號輸出。當電路中有任一鍵按下時,振蕩電路起振,產生455 kHz的振蕩信號,經BA5104內部電路進行12分頻,得到38 kHz的載波信號。按鍵的編碼信息和C1、C2的狀態信息經內部電路進行編碼調制,由15腳串行輸出,經三極管Q1,Q2構成的達靈頓電路放大,驅動經外發射管發射38 kHz的已調制紅外載波信號。14腳輸出高電平,點亮發射狀態指示燈LED1。

圖1 BA5104構成的紅外遙控發射器電路Fig.1 The infrared remote control transmitter circuit composition of BA5104
BA5104的編碼格式[2]為:每一幀遙控碼的長度為12位,包括3位起始碼位、2位用戶碼位、7位指令碼位。每一幀遙控碼的時間間隔為4T,其中T=1.687 9 ms為每一位遙控碼的周期。一幀遙控碼如圖2所示。遙控碼“0”用1/4T的高電平、3/4T的低電平表示,遙控碼“1”用3/4T的高電平、1/4T的低電平表示,一位遙控碼的波形如圖3所示。

圖2 1幀遙控碼Fig.2 A frame of remote control code

圖3 1位遙控碼Fig.3 A bit remote control code
解碼的關鍵是要測出接收脈沖下降沿到上升沿的時間間隔,行之有效的方法有兩種:外部中斷法[3]和輸入捕獲功能法,下面分別進行介紹。
3.1.1 外部中斷法
用AVR單片機ATmega16的外部中斷INT0接收解碼BA5104芯片的電路如圖4所示。PC838為一體化紅外接收頭,YM12864為中文液晶顯示器,用于顯示下降沿中斷至上升沿中斷之間的時間間隔及解碼成功后的遙控碼。

圖4 INT0接收解碼電路Fig.4 INT0 receiver decoder circuit

圖5 INT0發生中斷的過程Fig.5 INT0 interrupts process
外部中斷法的解碼思路:PCF838的輸出端未接收到紅外遙控信號時保持高電平,接收到紅外遙控信號時,輸出端從高電平變成低電平,形成下降沿,低電平持續一段時間后,紅外遙控信號消失,輸出端又從低電平變成高電平,形成上升沿。單片機ATmega16的外部中斷可以由編程者自由設置為上升沿中斷或下降沿中斷,初始化時先將ATmega16的外部中斷INT0設置為下降沿中斷,當INT0發生下降沿中斷時用定時器/計數器T/C1記錄發生的時間并保存在t1中,然后設置外部中斷INT0為上升沿中斷,當外部中斷INT0又一次觸發中斷時將發生的時間保存在t2中,再次將外部中斷INT0為下降沿中斷。最后計算從下降沿中斷至上升沿中斷之間的時間間隔并保存在事先開辟的數據存儲區中,直到接收完一幀遙控碼[4],外部中斷INT0發生的過程如圖5所示。外部中斷INT0的中斷服務子程序如下:

3.1.2 輸入捕獲功能法
用AVR單片機ATmega16的輸入捕獲功能ICP1接收解碼BA5104芯片的電路如圖6所示。

圖6 ICP1接收解碼電路Fig.6 ICP1 receiver decoder circuit

圖7 ICP1發生捕獲的過程Fig.7 ICP1 occurrence of capture process
輸入捕獲功能[5]法的思路:初始化時先將ATmega16的T/C1設置為輸入捕獲模式,下降沿捕獲中斷。當ICP1引腳檢測到下降沿時產生捕獲中斷,將計數寄存器TCNT1中的計數值自動寫入捕捉寄存器ICR1,在捕獲中斷程序中將ICR1的值保存到變量t1中,之后將T/C1設置為上升沿捕獲中斷;當ICP1引腳檢測到上升沿時再一次產生捕獲中斷,此時將ICR1的值保存在變量t2中,然后將TCNT1的計數值清0,并將T/C1設置為上升沿捕獲。最后進行計算便可得到下降沿捕獲中斷至上升沿捕獲中斷之間的時間間隔并保存在數據緩沖區中,直到接收完12位遙控碼。輸入捕獲中斷發生的過程如圖7所示。ICP1捕獲中斷服務子程序如下:

根據BA5104芯片的編碼格式,當保存在數據緩沖區中的數值為 1/4T=1/4×1.687 9 ms≈422 μs時,判定為接收到遙控碼 “0”; 當數據緩沖區中的數值為3/4T=3/4×1.687 9 ms≈126 6 μs時,判定為接收到遙控碼“1”。在實際應用中,由于單片機和紅外遙控發射器所使用的晶振頻率與標稱值有一定的偏差[5],所以在編寫程序時要留有一定的容限誤差。提取12位遙控碼的子程序如下:

測試條件:AVR單片機ATmega16外接晶振為8 MHz,系統內部進行8分頻。經過實驗,用外部中斷法和輸入捕獲功能法均能測出接收脈沖下降沿到上升沿的時間間隔。表1為測試所得的結果。在實驗中發現,用外部中斷法測得的第一幀遙控碼的第1位(即S2)比較容易受到外界的干擾,造成解碼偶爾會出現錯誤。而用輸入捕獲功能法進行解碼極少出現錯誤,主要是因為ATmega16工作在輸入捕獲模式并打開噪音消除功能時,單片機以時鐘頻率連續4次采樣ICP1引腳,當4次采樣數據相同時,才認為輸入捕獲信號有效,具有較強的抗干擾能力[6]。外部中斷法要占用單片機的一個外部中斷源和內部的一個定時器,而輸入捕獲功能法僅占用單片機內部的一個定時器。由此可見輸入捕獲功能解碼法明顯優于外部中斷解碼法。

表1 按鍵K1~K8每一位遙控碼脈沖下降沿至上升沿的時間間隔(單位:μs)Tab.1 Keys K1~K8 every remote code pulse falling edge to rising edge of the time interval (units:μs)
用AVR單片機進行軟件解碼紅外遙控芯片BA5104的2種方法均已在實際電路中得到驗證。經過分析和比較,得出輸入捕獲功能解碼法優于外部中斷解碼法的結論。文中介紹的2種解碼方法只是針對以BA5104芯片組成的遙控器,對于其它不同編碼格式的遙控器,解碼的思路是相同的,只須根據實際遙控器的編碼格式將程序中的一些參數修改即可,不用更換接收電路,非常方便。
[1]包書祥.8通道紅外遙控集成電路BA5104/SM5032C[J].電子制作,2005(7):43-44.
BAO Shu-xiang.Eight channel infrared remote control IC BA5104/SM5032C[J].Practical Electronics,2005(7):43-44.
[2]曾智剛,賈東耀,汪仁惶.1種紅外遙控信號的發送與接收[J].國外電子元器件,2003(2):17-19.
ZENG Zhi-gang,JIA Dong-yao,WANG Ren-huang.An infrared transmitting for infrared remote-control signal and its infrared receive[J].International Electronic Elements,2003(2):17-19.
[3]崔如春,譚海燕.紅外遙控信號的編碼方法與單片機譯碼程序的設計[J].計算機與現代化,2000(6):108-111.
CUI Ru-chun,TAN Hai-yan.Encoding methodsand microprocessor decoding programming for remote control signal[J].Computer and Modernization,2000(6):108-111.
[4]張毅.紅外遙控編碼的軟件識別接收法[J].重慶郵電學院學報:自然科學版,2001(6):84-86.
ZHANG Yi.The recognized way of infrared remote control coding by software[J].Journal of Chong Qing University of Posts and Telecommunications:Natural Sciences Edition,2001(6):84-86.
[5]肖圣兵,仲興榮,徐清源,等.一種紅外遙控信號的解碼方法[J].蘇州大學學報:自然科學,2002,18(2):101-106.
XIAO Sheng-bing,ZHONG Xing-rong,XU Qing-yuan,et al.A decoding method for infrared remote-control signal[J].Journal of Su Zhou University:Natural Sciences Edition,2002,18(2):101-106.
[6]張軍.AVR單片機應用系統開發典型實例[M].北京:中國電力出版社,2007.