紅外遙控簡介
紅外遙控是一種無線、非接觸控制技術(shù),具有抗干擾能力強(qiáng),信息傳輸可靠,功耗低,成本低,易實(shí)現(xiàn)等顯著優(yōu)點(diǎn),被諸多電子設(shè)備特別是家用電器廣泛采用,并越來越多的應(yīng)用到計(jì)算機(jī)系統(tǒng)中。
由于紅外線遙控不具有像無線電遙控那樣穿過障礙物去控制被控對(duì)象的能力,所以,在設(shè)計(jì)紅外線遙控器時(shí),不必要像無線電遙控器那樣,每套(發(fā)射器和接收器)要有不同的遙控頻率或編碼(否則,就會(huì)隔墻控制或干擾鄰居的家用電器),所以同類產(chǎn)品的紅外線遙控器,可以有相同的遙控頻率或編碼,而不會(huì)出現(xiàn)遙控信號(hào)“串門”的情況。這對(duì)于大批量生產(chǎn)以及在家用電器上普及紅外線遙控提供了極大的方面。由于紅外線為不可見光,因此對(duì)環(huán)境影響很小,再由紅外光波動(dòng)波長遠(yuǎn)小于無線電波的波長,所以紅外線遙控不會(huì)影響其他家用電器,也不會(huì)影響臨近的無線電設(shè)備。
紅外遙控的編碼目前廣泛使用的是:NEC Protocol 的 PWM(脈沖寬度調(diào)制)和 Philips RC-5 Protocol的 PPM(脈沖位置調(diào)制)。我使用的的遙控器使用的是NEC 協(xié)議,其特征如下:
8位地址和8位指令長度;
地址和命令2次傳輸(確??煽啃裕?
PWM脈沖位置調(diào)制,以發(fā)射紅外載波的占空比代表“ 0”和“ 1”;
載波頻率為38Khz;
位時(shí)間為1.125ms或2.25ms;
NEC 碼的位定義:一個(gè)脈沖對(duì)應(yīng)560us的連續(xù)載波,一個(gè)邏輯 1 傳輸需要2.25ms(560us 脈沖+1680us 低電平),一個(gè)邏輯0的傳輸需要 1.125ms(560us 脈沖+560us 低電平)。而遙控接收頭在收到脈沖的時(shí)候?yàn)榈碗娖?,在沒有脈沖的時(shí)候?yàn)楦唠娖?,這樣,我們?cè)诮邮疹^端收到的信號(hào)為:邏輯1應(yīng)該是560us低+1680us高,邏輯0應(yīng)該是560us低+560us高。
NEC 遙控指令的數(shù)據(jù)格式為:同步碼頭、地址碼、地址反碼、控制碼、控制反碼。同步碼由一個(gè)9ms的低電平和一個(gè)4.5ms的高電平組成,地址碼、地址反碼、控制碼、控制反碼均是8位數(shù)據(jù)格式。按照低位在前,高位在后的順序發(fā)送。采用反碼是為了增加傳輸?shù)目煽啃裕捎糜谛r?yàn))。
1. ENC 協(xié)議的時(shí)序圖
ENC特點(diǎn)如下:
1),協(xié)議規(guī)定低位首先發(fā)送。一串信息首先發(fā)送9ms的AGC(自動(dòng)增益控制)的高脈沖,接著發(fā)送4.5ms的起始低電平,接下來是發(fā)送四個(gè)字節(jié)的地址碼和命令碼,這四個(gè)字節(jié)分別為:地址碼;地址碼反碼;命令碼;命令碼反碼。
2),如果你一直按那個(gè)按鍵,一串信息也只能發(fā)送一次,一直按著,發(fā)送的則是以110ms為周期的重復(fù)碼。
3),接收到的信號(hào)是跟發(fā)送信號(hào)正好反向的。
2.重復(fù)碼的格式
重復(fù)碼的格式是由9ms的AGC高電平和4.5ms的低電平及一個(gè)560us的高電平組成。
3.邏輯“1”的表示
邏輯1的是由560us的高電平和1.69ms的低電平組成的脈沖表示。
4.邏輯“0”的表示
邏輯0的是有560us的高電平和565us的低電平組成的脈沖表示。
5.ENC的解碼過程
一般ENC的解碼過程為:
1),產(chǎn)生下降沿,進(jìn)入外部中斷15的中斷函數(shù),延時(shí)一下之后檢測(cè)IO口是否還是低電平,是就等待9ms的低電平過去。
2),等待完9ms低電平過去,再去等待4.5ms的高電平過去。
3),接著開始接收傳送的4組數(shù)據(jù)
①先等待560us的低電平過去
②檢測(cè)高電平的持續(xù)時(shí)間,如果超過1.12ms那么是高電平(高電平的的持續(xù)時(shí)間為1.69ms,低電平的持續(xù)時(shí)間為565us。
4),檢測(cè)接收到的數(shù)據(jù)和數(shù)據(jù)的反碼進(jìn)行比較,是否等到的數(shù)據(jù)是一樣的。
6,下面直接寫驅(qū)動(dòng)程序
#include#include #include #include #include #include #defineIRDA_GPIOEXYNOS4_GPX3(2) intflag=0;//表示數(shù)據(jù)幀的開始 intnum=0;//表示數(shù)據(jù)幀里的第幾位數(shù)據(jù) staticlonglongprev=0;//64bit,記錄上次的時(shí)間 unsignedinttimes[40];//記錄每位數(shù)據(jù)的時(shí)間 irqreturn_t infrared_irq_handler(intirqno,void*dev_id) { longlongnow=ktime_to_us(ktime_get()); unsignedintoffset; inti,j,tmp; if(!flag){//數(shù)據(jù)開始 flag=1; prev=now; returnIRQ_HANDLED; } offset=now-prev; prev=now; if((offset>13000)&&(offset14000)){???//?判斷是否收到引導(dǎo)碼 ????????num?=?0; ? ????????return?IRQ_HANDLED; ????} ? ????if(num?32) ????????times[num++]?=?offset; ? ????if(num?>=32){ for(i=0;i4;?i++){?//?一共4個(gè)字節(jié) ????????????tmp?=?0; ? ????????????for(j?=?0;?j?8;?j++){ ????????????????if(times[i?*?8?+?j]?>2000)//如果數(shù)據(jù)位的信號(hào)周期大于20ms,則是二進(jìn)制數(shù)據(jù)1 tmp|=1<
還有對(duì)應(yīng)的Makefile:
#指定內(nèi)核源碼路徑 KERNEL_DIR=/home/george/1702/exynos/linux-3.5 #指定當(dāng)前路徑 CUR_DIR=$(shellpwd) #MYAPP=dht11_app MODULE=IRDA_for_irq all: make-C$(KERNEL_DIR)M=$(CUR_DIR)modules #arm-none-linux-gnueabi-gcc-o$(MYAPP)$(MYAPP).c clean: make-C$(KERNEL_DIR)M=$(CUR_DIR)clean $(RM)$(MYAPP) install: cp-raf*.ko$(MYAPP)/home/george/1702/exynos/filesystem/1702 #指定編譯當(dāng)前目錄下那個(gè)源文件 obj-m=$(MODULE).o
編譯生成.ko文件之后,裝載,然后進(jìn)行實(shí)物測(cè)試,驗(yàn)證效果圖如下:
審核編輯:湯梓紅。
-
單片機(jī)
+關(guān)注
關(guān)注
6032文章
44514瀏覽量
632981 -
遙控器
+關(guān)注
關(guān)注
18文章
829瀏覽量
65972 -
紅外遙控
+關(guān)注
關(guān)注
22文章
347瀏覽量
45543 -
ENC
+關(guān)注
關(guān)注
0文章
6瀏覽量
1370
原文標(biāo)題:單片機(jī)中紅外遙控的基本原理
文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論