紅外軟體解碼文件
1 、引言
低速的紅外無線傳輸是一種廉價的無線通訊/控制方案,在家電領域已經廣泛使用。在嵌入式領域,只要工作環境比較優良,資料量小,傳輸距離較近(5公尺以內),同樣可以採用紅外無線傳輸。本站的atmega16學習板上設計了紅外發射管與接收管,配合站長家中閒置的「hitachi vm101」型電視遙控器,詳細分析一下此遙控器的紅外編譯碼原理與微控制器解碼方法。
2 、紅外遙控訊號**的格式
乙個完整的紅外遙控訊號**一般由引導碼、系統碼、系統碼的反碼、資料碼、資料碼的反碼等幾個部分組成。引導碼是乙個**的起始部分,由時間相對較長的一段傳送時間與一段停發時間構成,即時間較長的乙個高電平和乙個低電平組成;系統碼是通過遙控器的遙控編碼晶元的引腳不同接法設定的,用以區分不同型號的遙控系統;資料碼則是遙控器功能按鍵的編碼,不同的功能按鍵其**不相同;系統碼的反碼和資料碼的反碼是用來糾錯的。遙控訊號**總的長度因採用的編碼晶元不同而有所不同,功能**與功能**之間的最短時間間隔一般為80ms~120ms。如圖一所示是採用脈衝寬度編碼調製方式的代表某一功能的乙個完整的遙控**。
圖一 脈衝寬度編碼調製方法的乙個完整的遙控**例項
資料碼根據實際所需要表達的不同含義的數量,可以有不同的資料位數。如圖三的示例為8位資料,則該遙控器最多可以有256個功能鍵。
引導碼,系統碼00001010,系統碼反碼11110101,資料碼10110000,資料碼反碼01001111
3、資料格式
資料格式包括了引導碼、使用者碼、資料碼和資料碼反碼,編碼總佔32位。資料反碼是資料碼反相後的編碼,編碼時可用於對資料的糾錯。注意:第二段的使用者碼也可以在遙控應用電路中被設定成第一段使用者碼的反碼。
位定義:使用者碼或資料碼中的每乙個位可以是「1」,也可以是「0」。區分「0」和「1」是利用脈衝的時間間隔來區分,這種編碼方式稱為脈衝位置調製方式,英文簡稱ppm。
實際上我們觀察到的紅外置收頭的輸出和上面的波形剛好反相,在空閒狀態下,紅外置收頭輸出為高電平,如下圖:
因此對於我們實際的接收頭來說,收到的資料格式應該是:引導碼(9ms的低電平+4.5ms的高電平)+使用者碼(8位)+使用者反碼(8位)+資料碼(8位)+資料反碼(8位)+(停止位)。
其中位0是由0.56ms的低電平+0.565ms的高電平(總共1.125ms)組成。
位1是由0.56ms的低電平+1.69ms的高電平(總共2.25ms)組成。
而停止位則由0.56ms的低電平表示。(實測時有誤差)
上圖為位0和位1的脈衝時間長度,實際上在測試的時候發現,位0和位1的脈衝時間長度是存在誤差,最大誤差可達0.15ms~0.18ms左右(不同遙控器的誤差不同),因此在軟體解碼的時候一定要有個範圍,我們在軟體中設定是這樣子的:
else if(time>(1*ms) && time<(1.3*ms)) // 捕獲到的是0
else if(time>(2.1*ms) && time<(2.4*ms)) // 捕獲到的是1
4、軟體解碼
我們採用arm7來進行軟體解碼,使用的晶元是lpc2134/2136。硬體上我們是將紅外置收頭的輸出引腳連線到lpc2134/2136上的p0.17引腳,p0.17和cap1.2(定時器1的捕獲通道2)復用,我們選擇cap1.2功能,然後利用定時器1的捕獲功能,設定在下降沿時捕獲並允許中斷。我們的解碼思路如下:
(1)、初始化:
首先將p0.17選擇為cap1.2功能,
pinsel1 = 1 << 2; // p0.17連線捕獲1.2,其餘連線gpio
然後我們的定時器1設定如下:
t1pr = 00; // 分頻係數,不分頻
t1tc = 0; // 定時器清零
t1ccr = (1 << 7)| // 設定cap1.2下降沿捕獲
(1 << 8); // 允許產生中斷
接著我們開放定時器中斷:
irqenable(); // 使能irq中斷
/* 設定timer1中斷 */
vicintselect = 0x00000000; // 設定所有的通道為irq中斷
vicvectcntl0 = 0x20 | 5; // timer1分配到irq slot0,即最高優先順序
vicvectaddr0 = (uint32)timer1_capint; // 設定timer1向量位址
vicintenable = 1 << 5; // 使能timer1中斷
while(1); // 在此處迴圈等待
(2)、中斷服務子程式:
初始化工作做好之後,把硬體電路搭好,就可以測試啦,我們先定義了中斷服務子程式,然後程式體為空,如下:
void __irq timer1_capint (void)
vicvectaddr = 0x00; // 向量中斷處理結束
好了,現在可以做斷點除錯了,在語句vicvectaddr = 0x00;前加斷點,然後執行,我們用遙控器按下乙個鍵,可以看到程式跑到中斷服務子程式中了,說明我們的捕獲功能已經成功。接下來就是如何解碼的工作了。
(3)、解碼思路:
我們先看看我們的實際捕獲到的波形:
我們可以看到,如果我們可以得到相鄰兩個下降沿之間的時間間隔,那麼我們就可以解碼了,我們設相鄰兩個下降沿之間的時間間隔為interval,則
若13.2ms < interval < 13.8ms,則兩個下降沿之間為引導碼
若 1.0ms < interval < 1.3ms,則兩個下降沿之間為位「0」
若 2.1ms < interval < 2.1ms,則兩個下降沿之間為位「1」
我們的程式一直等待,直到有鍵按下(捕獲到引導碼),我們接收到引導碼之後就將變數code(用來存放32位編碼)和bitcount(用來計算當前接收到的位數)清零,然後乙個乙個的捕獲傳送的32位編碼。
我們每次在cpa1.2下降沿的時候捕獲產生中斷時,定時器1將計數值裝入t1cr2,我們讀取該值,然後復位和重啟定時器,然後根據我們讀到的t1cr2的值就可以知道兩個下降沿之間的時間間隔,根據這個間隔來判斷是引導碼還是位「0」和位「1」,32位編碼接收完畢後,復位並停止定時器,然後根據code值判斷是哪個鍵按下。
對應的程式如下:
t1ir = 1 << 6; // 清除cap1.2中斷標誌
interval=t1cr2; // 讀取捕獲到的t1tc值
// t1tcr = 0x03; // 復位並啟動定時器,但不能這樣做,否則程式跑不通。
t1tcr = 0x02;
t1tcr = 0x01;
// 復位定時器和啟動定時器兩條語句一定要分開,如果兩條語句合成語句:t1tcr = 0x03;
// 程式就跑不通,而且每次定時器捕獲值都是0,原因可能是復位和啟動不能同時進行吧。
if(interval>(13.2*ms) && interval<(13.8*ms)) // 捕獲到的是引導碼
code=0;
bitcount=0;
else if(interval>(1*ms) && interval<(1.3*ms)) // 捕獲到的是0
bitcount++;
else if(interval>(2.1*ms) && interval<(2.4*ms)) // 捕獲到的是1
code |=(1<<(31-bitcount));
bitcount++;
if(bitcount==32)
t1tcr = 0x02; //復位定時器
t1tcr = 0x00; //停止定時器
check_key(code);
bitcount=0;
code=0;
下面給出solam索浪sl-208型遙控器的code值。
void check_key(uint32 key_code)
//solam索浪sl-208型遙控器:
if(key_code==0x00fd00ff) // 電源 鍵
else if(key_code==0x00fdb04f) // 上一曲 鍵
else if(key_code==0x00fd708f) // 下一曲 鍵
else if(key_code==0x00fd609f) // ch+ 鍵
else if(key_code==0x00fda05f) // ch- 鍵
else if(key_code==0x00fd906f) // vol- 鍵
else if(key_code==0x00fd50af) // vol+ 鍵
else if(key_code==0x00fd10ef) // eq 鍵
else if(key_code==0x00fd7887) // s/f 鍵
else if(key_code==0x00fdb847) // 靜音 鍵
else if(key_code==0x00fd40bf) // 暫停 鍵
紅外遙控器解碼原理
紅外遙控器解碼原理 august 7th,2015 1 紅外遙控系統 通用紅外遙控系統由發射和接收兩大部分組成,應用編 解碼專用積體電路晶元來進行控制操作,如圖1所示。發射部分包括鍵盤矩陣 編碼調製 led紅外傳送器 接收部分包括光 電轉換放大器 解調 解碼電路。2 遙控發射器及其編碼 遙控發射器專...
51微控制器 紅外解碼
nec協議的資料格式包括 引導碼 使用者碼 使用者碼 使用者反碼 按鍵碼 按鍵碼 按鍵反碼 最後乙個停止位。停止位只要起隔離作用,一般不進行判斷,程式中可以不予理會。資料編碼共4個位元組32位,分別為 使用者碼 使用者碼 使用者反碼 按鍵碼 按鍵碼 按鍵反碼 具體是原始碼還是反碼由生產商決定,反碼可...
51微控制器 紅外遙控解碼
ir infrared radiation 通用紅外遙控系統由發射和接受兩大部分組成,應用編 解碼專用積體電路晶元來進行控制操作。發射部分包括鍵盤矩陣,編碼調製,led紅外線發射。接受部分包括光,電轉化放大器,解調,解碼電路。接收電路可以使用一種集紅外線接受和放大於一體的一體化紅外置收器,不需要任何...