程小輝,康燕萍
(桂林理工大學(xué) 信息科學(xué)與工程學(xué)院,廣西 桂林 541004)
紅外遙控器是人們?nèi)粘I钪谐R姷囊环N遙控設(shè)備,可以用來(lái)遙控電視機(jī)、DVD、空調(diào)、風(fēng)扇等生活電器。但是紅外遙控的傳輸協(xié)議沒有統(tǒng)一的標(biāo)準(zhǔn),不同的生產(chǎn)廠家設(shè)計(jì)的遙控也各有異同,主要表現(xiàn)在載波頻率的不同和紅外信號(hào)傳輸協(xié)議的不同,常用的紅外遙控器中載波頻率主要有38 kHz和40 kHz。常用的紅外遙控信號(hào)傳輸協(xié)議有 NEC協(xié)議、Philips協(xié)議、ITT協(xié)議、Nokia NRC協(xié)議等。
目前的自學(xué)習(xí)紅外遙控器,只能針對(duì)單一的載波頻率進(jìn)行學(xué)習(xí),而不能識(shí)別不同的載波頻率的遙控信號(hào)。這樣的自學(xué)習(xí)遙控器存在一定的局限性,學(xué)習(xí)遙控的數(shù)量也相對(duì)較少。
本模塊硬件結(jié)構(gòu)設(shè)計(jì)基于STC單片機(jī),芯片型號(hào)為STC12C5410AD。硬件結(jié)構(gòu)框圖如圖1所示。
選擇單片機(jī)型號(hào)為STC12C5410AD。32腳LQFP封裝,CPU 最大頻率 35 MHz,10 KB Flash,512 B RAM,共 6個(gè)16位普通定時(shí)器,具有UART和SPI接口。該芯片是本模塊的核心部件,主要作用是計(jì)算紅外載波頻率和信號(hào)波形測(cè)量分析。
E2PROM存儲(chǔ)芯片選擇24C16,具有16 KB存儲(chǔ)空間,使用I2C總線通信。芯片的主要作用是存儲(chǔ)復(fù)制后的紅外二進(jìn)制編碼波形。
STC12C5410AD支持的最大外部時(shí)鐘頻率為35 MHz,具有單時(shí)鐘機(jī)器周期,運(yùn)行速度是普通51單片機(jī)速度的12倍。最小系統(tǒng)原理圖如圖2所示。
紅外接收電路使用傳統(tǒng)的紅外接收管,接收信號(hào)經(jīng)三極管偏置電路放大。紅外發(fā)射電路波形信號(hào)從CLK引腳輸入,CS為門控端,信號(hào)經(jīng)三極管放大后驅(qū)動(dòng)紅外發(fā)射管,如圖3所示。
外部存儲(chǔ)器使用24C16芯片,通信接口使用模擬I2C總線,24C16的SDA引腳和SCL引腳分別與單片機(jī)的P3.7和P1.0相連,并用10 kΩ電阻上拉。
本紅外自學(xué)習(xí)模塊主要工作模式分為:自學(xué)習(xí)模式和紅外遙控模式。自學(xué)習(xí)模式是學(xué)習(xí)紅外遙控的載波頻率和波形復(fù)制。工作步驟分為:載波頻率檢測(cè)、紅外波形檢測(cè)、檢測(cè)數(shù)據(jù)分析和數(shù)據(jù)儲(chǔ)存。軟件總體設(shè)計(jì)流程如圖4所示。
因?yàn)椴煌募t外遙控使用的載波頻率有所不同,所以載波頻率的檢測(cè)是模塊主要功能之一。利用外部觸發(fā)中斷和定時(shí)器聯(lián)合使用來(lái)實(shí)現(xiàn)檢測(cè)載波頻率。
理論計(jì)算:假如紅外信號(hào)的載波頻率為40 kHz。則周期T=25μs。單片機(jī)時(shí)鐘頻率為 24 MHz,定時(shí)器計(jì)數(shù)周期為1/24 MHz=0.041 7μs。假如在載波的一個(gè)下降沿啟動(dòng)定時(shí)器計(jì)數(shù),到下一個(gè)下降沿停止計(jì)時(shí),并讀取定時(shí)器的計(jì)數(shù)值,這個(gè)定時(shí)器的理論計(jì)數(shù)值為 25μs/0.041 7μs=600。
為了減小定時(shí)器計(jì)數(shù)值轉(zhuǎn)換成時(shí)間或頻率的計(jì)算誤差,本設(shè)計(jì)方案中存儲(chǔ)的頻率是定時(shí)器的計(jì)數(shù)值而并非實(shí)際的載波頻率。載波頻率檢測(cè)方法如下:
(1)將單片機(jī)的定時(shí)器0配置為16位計(jì)數(shù)器,計(jì)數(shù)時(shí)鐘不進(jìn)行12分頻;外部中斷1配置為下降沿觸發(fā)。
(2)當(dāng)接收到紅外波形時(shí),下降沿觸發(fā)外部中斷1,在中斷函數(shù)中啟動(dòng)定時(shí)器0開始計(jì)數(shù)。下一個(gè)下降沿時(shí)停止計(jì)數(shù),并讀出計(jì)數(shù)值存入緩沖區(qū)。
(3)連續(xù)測(cè)量14個(gè)數(shù)據(jù),將14個(gè)數(shù)據(jù)進(jìn)行冒泡法排列,分別去掉2個(gè)最大值和2個(gè)最小值,對(duì)剩下的數(shù)據(jù)求平均值。
(4)計(jì)算出來(lái)的平均值加上一個(gè)誤差補(bǔ)償值則為載波在一個(gè)周期內(nèi)定時(shí)器0的計(jì)數(shù)值。直接將計(jì)數(shù)值進(jìn)行存儲(chǔ)。
圖4 軟件總體設(shè)計(jì)流程圖
波形測(cè)量是指對(duì)紅外信號(hào)的編碼波形進(jìn)行測(cè)量。實(shí)際測(cè)量調(diào)制信號(hào)高低電平的時(shí)間。以紅外NEC[1]協(xié)議為例,紅外NEC協(xié)議編碼波形如圖5所示。
圖5所示的黑色部分是載波,空白部分是低電平。波形測(cè)量的方法:采用外部中斷觸發(fā)的方式分別記錄不同黑塊中載波脈沖的個(gè)數(shù)和不同低電平的時(shí)間。具體測(cè)量步驟如下:
(1)配置單片機(jī)的定時(shí)器0和外部中斷1,與測(cè)量載波頻率時(shí)的配置相同。
(2)當(dāng)接收到紅外波形時(shí)下降沿觸發(fā)外部中斷1,在中斷函數(shù)中啟動(dòng)定時(shí)器0開始計(jì)數(shù),中斷計(jì)數(shù)器值自增1。
(3)下一個(gè)下降沿時(shí)定時(shí)器0停止計(jì)數(shù),中斷計(jì)數(shù)器值自增1,并讀出定時(shí)器計(jì)數(shù)值。將計(jì)數(shù)值與載波頻率中測(cè)量值比較,若前者數(shù)值大于后者兩倍,則表明測(cè)量的是低電平,執(zhí)行步驟(4);否則,重置定時(shí)器0初值,并返回執(zhí)行步驟(3)。
(4)存儲(chǔ)外部中斷1和定時(shí)器0的計(jì)數(shù)值,并判斷數(shù)據(jù)緩存是否存滿,若存滿則執(zhí)行步驟(5);否則重置定時(shí)器0初值并返回步驟(3)。
(5)分析測(cè)出的數(shù)據(jù),并提取一段完整的波形存入E2PROM中,執(zhí)行步驟(6)。若不能分析出一段完整波形,則執(zhí)行步驟(7)。
(6)通過(guò)串口反饋學(xué)習(xí)成功,并傳回按鍵編號(hào)。
(7)通過(guò)串口反饋學(xué)習(xí)失敗。
波形測(cè)量后得到兩組數(shù)據(jù),分別是調(diào)制段的載波脈沖個(gè)數(shù)和低電平的時(shí)間計(jì)數(shù)值。所測(cè)波形數(shù)據(jù)中包含一段完整的波形數(shù)據(jù),之后會(huì)出現(xiàn)一個(gè)較長(zhǎng)時(shí)間的低電平,這個(gè)低電平的時(shí)間一般都會(huì)大于10 ms。通過(guò)判別低電平時(shí)間,就可以提取出一段完整的波形數(shù)據(jù)。
存儲(chǔ)波形數(shù)據(jù)時(shí),先定義一個(gè)結(jié)構(gòu)體,其成員有:載波頻率、按鍵編號(hào)、波形存儲(chǔ)首地址和存儲(chǔ)數(shù)據(jù)長(zhǎng)度。其中按鍵編號(hào)和存儲(chǔ)數(shù)據(jù)長(zhǎng)度采用無(wú)符號(hào)字符型,其余兩個(gè)采用無(wú)符號(hào)整型,因此一個(gè)結(jié)構(gòu)體變量的字節(jié)長(zhǎng)度是6 B。24C16的存儲(chǔ)容量是16 KB,將存儲(chǔ)空間分成兩個(gè)區(qū)域,前2 KB來(lái)存儲(chǔ)波形的結(jié)構(gòu)體變量數(shù)據(jù),后14 KB來(lái)存儲(chǔ)波形數(shù)據(jù)。理論上計(jì)算存儲(chǔ)器至少能存儲(chǔ)55個(gè)波形。
發(fā)射紅外信號(hào)時(shí),先根據(jù)按鍵編號(hào)從24C16中讀取相應(yīng)按鍵的載波頻率、按鍵編號(hào)、波形數(shù)據(jù)存儲(chǔ)首地址和存儲(chǔ)數(shù)據(jù)長(zhǎng)度。然后對(duì)按鍵編號(hào)進(jìn)行比較,確認(rèn)無(wú)誤后根據(jù)波形數(shù)據(jù)存儲(chǔ)首地址將波形數(shù)據(jù)讀取出來(lái)。再根據(jù)波形數(shù)據(jù)給定時(shí)器0賦不同的初值,在定時(shí)器0的定時(shí)中斷函數(shù)里對(duì)P3.5進(jìn)行電平翻轉(zhuǎn),從而輸出編碼波形。波形信號(hào)經(jīng)過(guò)三極管功率放大驅(qū)動(dòng)紅外發(fā)光二極管發(fā)射波形。
2.5.1 串口參數(shù)設(shè)置
串口參數(shù)設(shè)置為:波特率1 200 b/s、數(shù)據(jù)位 8 bit、停止位1 bit、無(wú)校驗(yàn)位、無(wú)流控制。
2.5.2 通信協(xié)議設(shè)置
(1)模塊接收數(shù)據(jù)格式
起始位 (0xfe)+命令位+數(shù)據(jù)長(zhǎng)度+數(shù)據(jù)域+數(shù)據(jù)校驗(yàn)。
命令位詳解:①0x00:模塊進(jìn)入學(xué)習(xí)模式;②0x01:模塊按照接收到的按鍵編碼發(fā)送紅外信號(hào);③0x02:獲取指定按鍵編號(hào)的波形數(shù)據(jù)。
數(shù)據(jù)長(zhǎng)度:通信協(xié)議中數(shù)據(jù)域的數(shù)據(jù)字節(jié)總數(shù)。
數(shù)據(jù)域:要發(fā)送的數(shù)據(jù)。當(dāng)命令位為0x00,數(shù)據(jù)域中數(shù)據(jù)無(wú)效,可為一個(gè)字節(jié)的任意數(shù)據(jù)。
數(shù)據(jù)校驗(yàn):數(shù)據(jù)域中所有數(shù)據(jù)的校驗(yàn)和。
例如,模塊進(jìn)入學(xué)習(xí)模式接收到的數(shù)據(jù)應(yīng)該是0xfe 0x00 0x01 0x00 0x00;控制模塊發(fā)送編碼為2的按鍵信號(hào)數(shù)據(jù)應(yīng)該是0xfe 0x01 0x01 0x02 0x02。
(2)模塊發(fā)送數(shù)據(jù)格式
起始位(0xfe)+狀態(tài)位+數(shù)據(jù)長(zhǎng)度+數(shù)據(jù)域+數(shù)據(jù)校驗(yàn)。
狀態(tài)位詳解:①0x00:紅外信號(hào)學(xué)習(xí)成功;②0x01:紅外信號(hào)學(xué)習(xí)失敗;③0x02:數(shù)據(jù)域中發(fā)送指定按鍵的編碼波形數(shù)據(jù)。
測(cè)試方法:用一個(gè)模塊編寫程序發(fā)出固定頻率的信號(hào),該信號(hào)需要經(jīng)過(guò)示波器測(cè)量確認(rèn),并讓另一模塊接收,測(cè)量該頻率相應(yīng)的定時(shí)器計(jì)數(shù)值,通過(guò)串口發(fā)送到PC機(jī)的串口調(diào)試助手顯示。再計(jì)算出該頻率相應(yīng)的定時(shí)器理論計(jì)數(shù)值,將兩個(gè)數(shù)值進(jìn)行比較。測(cè)試結(jié)果如表1所示。
表1 載波頻率測(cè)試結(jié)果
理論值的計(jì)算方法:載波頻率為F,一個(gè)周期的時(shí)間T=1/F;單片機(jī)的時(shí)鐘頻率 f=24 MHz,定時(shí)器 0不采用12分頻方式,定時(shí)器計(jì)一個(gè)數(shù)的時(shí)間t=1/f。因此在一個(gè)T時(shí)間內(nèi)定時(shí)器0的計(jì)數(shù)值為C=T/t。
通過(guò)實(shí)驗(yàn)數(shù)據(jù)可得出,測(cè)量值與理論值存在偏差,但是這個(gè)偏差值接近一個(gè)固定值34,通過(guò)軟件對(duì)測(cè)量數(shù)據(jù)加34來(lái)達(dá)到理論計(jì)算值。經(jīng)過(guò)補(bǔ)償后,將測(cè)量的頻率數(shù)據(jù)轉(zhuǎn)換成信號(hào)發(fā)出,用示波器測(cè)量發(fā)出的頻率與接收到的頻率一致。通過(guò)實(shí)驗(yàn)測(cè)得模塊學(xué)習(xí)載波的范圍是30 kHz~65 kHz。
載波頻率的數(shù)據(jù)測(cè)量可通過(guò)補(bǔ)償來(lái)達(dá)到理論要求。下面對(duì)實(shí)際的紅外遙控進(jìn)行載波頻率識(shí)別測(cè)試,使用示波器捕捉載波波形進(jìn)行比較。載波識(shí)別是本模塊的一大亮點(diǎn),參考文獻(xiàn)[1-7]中的紅外學(xué)習(xí)模塊都使用紅外一體化接收頭進(jìn)行數(shù)據(jù)采集,它們的共同點(diǎn)是載波頻率固定,不能學(xué)習(xí)多種載波的遙控信號(hào)。而載波學(xué)習(xí)的一個(gè)重要指標(biāo)是經(jīng)過(guò)學(xué)習(xí)后的載波頻率必須與原載波一致。
圖6所示為學(xué)習(xí)模塊識(shí)別載波頻率后發(fā)送的載波波形,頻率為38.46 kHz,占空比為1/2。用示波器測(cè)量紅外遙控發(fā)射的載波頻率為38.64 kHz,占空比為1/3。由圖6可見,該學(xué)習(xí)模塊能夠識(shí)別載波頻率。占空比的差異只與遙控器的功耗有關(guān),但不影響遙控功能。
圖6 學(xué)習(xí)模塊學(xué)習(xí)后發(fā)送的載波
紅外遙控自學(xué)習(xí)模塊另一重要功能是將學(xué)習(xí)到的紅外波形完整地發(fā)送出去,并且與原來(lái)的波形一致。通過(guò)示波器實(shí)驗(yàn)可以比對(duì)學(xué)習(xí)轉(zhuǎn)發(fā)的波形與原有波形。圖7所示為按下遙控器1號(hào)鍵時(shí),通過(guò)紅外接收管接收到的部分波形。圖8所示為模塊學(xué)習(xí)復(fù)制信號(hào)后發(fā)送的部分波形。經(jīng)過(guò)比較,兩種波形基本一致。
圖7 紅外遙控按鍵1發(fā)送的部分波形
圖8 模塊學(xué)習(xí)后發(fā)送的部分波形
實(shí)際功能測(cè)試:紅外遙控自學(xué)習(xí)模塊的主要功能是學(xué)習(xí)紅外遙控器的相關(guān)按鍵,并且能控制相關(guān)的紅外遙控設(shè)備。使用該模塊學(xué)習(xí)彩色電視機(jī)的遙控,能夠成功控制電視機(jī)頻道選擇;學(xué)習(xí)空調(diào)遙控,能成功控制空調(diào)的開關(guān)和調(diào)溫等操作。
本文介紹的紅外遙控自學(xué)習(xí)模塊具有自動(dòng)識(shí)別載波頻率和波形學(xué)習(xí)的功能。實(shí)驗(yàn)證明,紅外自學(xué)習(xí)模塊具有良好的通用性和寬載波學(xué)習(xí)范圍,解決了目前遙控器只識(shí)別單一載波的問題。通過(guò)實(shí)際功能測(cè)試,驗(yàn)證了該模塊設(shè)計(jì)方案的可行性。
[1]鄭偉,謝利理,張震.一種具有自學(xué)習(xí)功能的智能紅外遙控器設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2007,15(12):1758-1759.
[2]吳彪,朱立新,趙佳.基于 CPLD的紅外遙控發(fā)射接收設(shè)計(jì)與仿真[J].計(jì)算機(jī)仿真,2006,23(8):269-272.
[3]朱光忠,呂梅蕾,楊子鳴.基于單片機(jī)的紅外遙控開關(guān)控制器[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(11):2097-2099.
[4]吳愛萍,朱曉春.基于AT89S51的多功能紅外遙控器設(shè)計(jì)[J].儀表技術(shù)與傳感器,2008(8):78-80.
[5]高建榮.基于單片機(jī)控制紅外線遙控的編碼實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2004,25(11):2105-2107.
[6]李從宏.基于功能碼的紅外遙控軟件解碼技術(shù)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010(9):72-73.
[7]聶詩(shī)良,李磊民.紅外遙控信號(hào)的一種編碼解碼方法[J].儀表技術(shù)與傳感器,2004(8):28-29,32.