目前,人們的物質文化生活水平日益提高,各種各樣的家用電器走進了千家萬戶,其中,大多數的家用電器都有各自不同的遙控器,人們常常為了控制某臺電器而到處尋找其對應的遙控器,這樣,就給人們的生活帶來了很多不便。為了解決這個問題,本文提出一個多功能遙控器的設計方案:該遙控器可以通過自學習而擁有對多臺電器的遙控功能,即省時、又省力,從而使人們免除同時面對功能眾多遙控器的煩惱。
遙控器由紅外接收及發射電路、信號調理電路、中央控制器8031.程序及數據存儲器、鍵盤及狀態指示電路組成。
遙控器有兩種狀態:學習狀態和控制狀態。當遙控器處於學習狀態時,使用者每按一個控制鍵,紅外線接收電路就開始接收外來紅外信號,同時將其轉換成電信號,然後經過檢波、整形、放大,再由CPU定時對其採樣,將每個採樣點的二進位數據以8位為一個單位,分別存放到指定的存儲單元中去,供以後對該設備控制使用。
當遙控器處於控制狀態時,使用者每按下一個控制鍵,CPU從指定的存儲單元中讀取一系列的二進位數據,串行輸出(位和位之間的時間間隔等於採樣時的時間間隔)給信號保持電路,同時由調製電路進行信號調製,將調製信號經放大後,由紅外線發射二極體進行發射,從而實現對該鍵對應設備功能的控制。
1. 原理
紅外遙控器是利用一個紅外發光二極體,以紅外光為載體來將按鍵信息傳遞給接收端的設備。紅外光對於人眼是不可見的,因此使用紅外遙控器不會影響人的視覺(可以打開手機攝像頭,遙控器對著攝像頭按,可以看到遙控器發出的紅外光)。
2. 調製
日常生活環境中有很多紅外光源,太陽、蠟燭火光、白熾燈、甚至是我們的身體。這些紅外光源都可能會對我們的接收設備產生幹擾,為了屏蔽幹擾,只接收有效信息,我們就需要用到調製。調製是我們使需要的信號區別於噪音方法。通過調製我們可以使紅外光以特定的頻率閃爍。紅外接收器會適配這個頻率,其它的噪音信號都將被忽略。你可以認為這種閃爍是引起接收器「注意」的方法,正如我們人類特別容易被黃色的燈光引起注意一樣,甚至在白天。
上圖左邊,調製信號通過驅動放大由紅外 LED 發射;上圖右邊,信號通過接收器檢測輸出。
在串行通訊裡,我們經常談及『 mark』和『 space』標記。『 space』是個默認信號,是指發射管關閉狀態,在『 space』期間,紅外光不被發射。反之在『 mark』狀態期間,紅外光以特定的頻率脈衝形式發射。在消費類電子產品裡,脈衝頻率普遍採用 30KHz 到 60KHz 這個頻段,紅外遙控器一般使用的是38KHz。
在接收端,一個『 space』信號以高電平方式重現輸出。反之一個『 mark』信號便是以低電平方式重現。請注意,這裡的『 mark』和『 space』不是我們需要發送的狀態 1 和 0。『 mark』和『 space』以及 1和 0 之間的真正關係取決於被應用的協議。
3. 協議
NEC協議
8 位地址碼, 8 位命令碼
完整發射兩次地址碼和命令碼,以提高可靠性
脈衝時間長短調製方式
38KHz 載波頻率
位時間 1.12ms 或 2.25ms
引導嗎:
下圖為一個引導碼的調製波形:
引導碼 由「9ms mark + 4.5ms space」構成,表示一組 鍵碼 的開始。
邏輯0和1:
下圖為邏輯0和邏輯1的調製波形:
邏輯「1」由「560us mark + 1690 space」組成,symbol period 為2.25ms;邏輯「0」由「560us mark + 560us space」組成,symbol period 為 1.12ms。
完整的一組鍵碼:
下圖位NEC 協議的典型脈衝鏈:
協議規定低位首先發送,如上圖所示的情況,發送的地 址碼為「59」,命令碼為「16」,總的碼值為 0x59A616E9。
重複碼:
下圖為重複碼的調製波形:
重複碼由 「9ms mark + 2.25ms space」組成,symbol period 為 11.25ms,重複碼表示一個重複按鍵,當按鍵按著不松時,會先發一個完整的鍵碼,接著每 110ms 發送一個重複碼,直到鬆開按鍵,如下面的波形圖所示:
接收端輸出:
在接收端,一個 mark 對應一個低電平輸出,一個 space 對應一個高電平輸出,因此起始碼、邏輯0 1、重複碼等在接收端的輸出波形如下圖所示:
[cpp] view plain copytypedef struct ir_symbol_s
{
unsigned short mark_period;
unsigned short symbol_period;
} ir_symbol_t;
typedef struct ir_key_s
{
unsigned int value;
int state;
}ir_key_t;
int NEC_Decode(ir_symbol_t symbol_buf[], int symbol_num, ir_key_t *ir_key)
{
unsigned int key_value;
if(symbol_num == 33) //解析鍵值,設定300us的容錯範圍
{
key_value = 0;
//引導碼判斷
if ( (symbol_buf[0].symbol_period 》 (13500 - 300)) && (symbol_buf[0].symbol_period 《 (13500 + 300))
&& (symbol_buf[0].mark_period 》 (9000 - 300)) && (symbol_buf[0].mark_period 《 (9000 + 300)) )
{
for(i = 0; i 《 (symbol_num-1); i ++)
{
//無效的符號位
if( (symbol_buf[i].symbol_period 《 (1120-300)) || (symbol_buf[i].symbol_period 》 (2250+300)) )
{
printf(「symbol %d, is invalid\n」, i);
return -1;
}
else
{
key_value 《《= 1;
//邏輯1判斷
if( (symbol_buf[i].symbol_period 》 (2250-300)) && (symbol_buf[i].symbol_period 《= (2250+300)) )
{
key_value |= 1;
}
}
}
ir_key-》value = key_value;
ir_key-》state = KEY_STATE_PRESS;
}
}
else if(symbol_num == 2) //NEC協議的重複鍵
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_REPEAT;
}
else
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_NONE;
}
return 0;
}
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴