紅外 IR 協議原理分析

2021-06-07 13:11:19 字數 3300 閱讀 9831

1、概述:

對多種紅外遙控器的訊號進行分析,其發出的紅外指令中,引導碼各不相同,而且後面的控制指令也有較大差別,甚至指令碼的位數也不相同,原因是這些紅外設計沒有遵守相同的紅外標準。但是其基本思想是相同的,即採用不同週期和不同占空比的脈衝分別表示邏輯0及1,只要根據期占空比及脈衝週期進行解析即可得到具體的按鍵碼值。

2、協議種類:

市面上基本上有如下幾大類協議:

nec with ****** repeat code 

nec with full repeat code 

tc9012 

松下7051碼

sony碼

rc5/rc6a

3、協議datasheet表(引用hisi整理的統計表)

nec with ****** repeat code 碼

nec with full repeat code 碼

tc9012和sony碼:

4、資料格式

基本上紅外都是以38khz作為載波頻率,即每一位時間為1.12ms或2.25ms

nec with ****** repeat code資料格式由start(引導碼)+資料碼+burst突發幀三部分組成

傳送單個幀格式:

傳送重複幀格式,收到第乙個完整幀資料後,接下來收到的資料幀由簡化的引導碼和burst訊號組成

其它的編碼本質上都差不多,例如松下7051編碼:

遙控器紅外發射訊號的編碼格式:引導碼+裝置碼+鍵碼+迴圈延時

引導碼 = 3640us (高電平)+ 1800us(低電平)

"高電平"為紅外線載波調製,"低電平"為無紅外線載波調製。 

裝置碼 = 32位: 

格式 = 碼0(s)8位 + 碼1(z)8位 + 碼2(y)8位 + 碼3(x)8位; 

鍵值碼 = 16位: 

格式 = 資料碼0(8位)+資料碼1(8位); 

邏輯'0':= 380us (高電平)+ 380us(低電平); 

邏輯'1'= 380us (高電平)+ 1350us(低電平); 

迴圈延時=50ms,其誤差≤5%;

表示先檢測到引導碼,然後進入開始統計裝置碼及鍵值碼共48位,最後按下不入進入repeat模式進行延時50ms。

5、基本程式設計方法

1、註冊isr中斷

request_irq(ir_irq_no, (irq_handler_t)ir_isr, irqf_disabled, null, hi_null);

2、處理ir_isr函式,根據暫存器ir_rcv狀態將獲得的鍵值(高低電平值)寫入佇列(data_l,data_h)

3、在定時器中處理佇列資料,如每隔10ms或者50ms時間檢測並將佇列值送入到ir decode器中

4、ir decode處理,本質就是比較高低電平持續時間確定出具體的鍵值

/* d1 暫存器中讀取的值,d2為協議定義的標準值,margin為誤差碼值 */

#define factor        15/100

static inline int pulse_eq_margin(unsigned int d1, unsigned int d2, unsigned int margin)

首先判定引導碼:

3640us (高電平)+ 1800us(低電平)引導碼

pulse_eq_margin(data_l,header_pulse,header_pulse*factor)

pulse_eq_margin(data_l,header_space,header_space*factor)

然後再根據其狀態進行取值

比如松下7051碼可定義如下狀態:

ir_state_inactive, // 空閒狀態

ir_state_header_space,

ir_state_bit_pulse,

ir_state_bit_space,

ir_state_frame_pulse,

ir_state_frame_space,

ir_state_repeat_pulse,

ir_state_repeat_space,

定義的重要資料結構如下:

unsigned int wanted_bits;        /* 需要等待接收的位數,比如7051就需要接收48位*/

unsigned int header_pulse;       /* unit:μs 3640*/

unsigned int header_space;       /* unit:μs 1800*/

unsigned int bit0_pulse;         /* unit:μs 380*/

unsigned int bit0_space;

/* unit:μs 380*/

unsigned int bit1_pulse;

/* unit:μs 380*/

unsigned int bit1_space;

/* unit:μs 1350*/

unsigned int frame_units;

/* unit:μs 380*/

unsigned int frame_end_space;    /* more than frame_end_space 50ms即 50000μs*/

unsigned int repeat_pulse;

/* no repeat 0 ex>nec:9000*/

unsigned int repeat_space;

/* no repeat 0 ex>nec:2250*/

然後就是求值:

if(pulse_eq_margin(data_time,bit1_space,frame_units>>1))

其中bits用於儲存鍵值,只有出現邏輯'1'時才須對其賦值,count用於計算位於state_bit_space累加值

其中會涉及到一些較細節的知識就不在此複述了,提供一種思路給大家,都有規律可偱。

紅外遙控系統之紅外通訊協議分析

紅外通訊過程主要由紅外發射和紅外置收兩個過程組成。首先將一幀資料 數碼訊號 送給紅外發射電路,經調製轉換成紅外光訊號在空中傳輸,然後紅外置收電路收到該紅外光信 號,經過該電路的 解調,將此紅外光訊號還原成可被微控制器處理的數碼訊號,由微控制器內部處理得到原來的資料。本協議制定的原則 1 採用自動重傳...

IR2104驅動原理

在做智慧型車的驅動電路時,最常用的一套方案就是使用ir2104配合nmos lr7843進行全橋控制。以前布驅動的時候為了保險2104的線都給了 50mil,這樣實在太佔位置了。但確定最小線寬必須弄明白ir2104這玩意到底為什麼可以驅動全橋?原理是什麼?要過多大電流?這是之前一直弄不明白的。終於,...

微控制器(九) IR紅外線通訊

有關紅外線,首先我們要知道它長什麼樣子 這是紅外線發光管,通電後會產生光波波長為940nm左右的紅外線。這是紅外線接收頭,裡面有高頻的濾波電路,能夠濾掉紅外線合成訊號的載波訊號 38khz 紅外遙控系統的結構大致如下 那麼紅外線發射為什麼需要載波呢?1.能更好減少周邊環境對紅外線的干擾。比如選擇38...