<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32的紅外遙控和解碼遙控程序解析

          基于STM32的紅外遙控和解碼遙控程序解析

          作者: 時(shí)間:2016-09-06 來源:網(wǎng)絡(luò) 收藏

            文本主要包含兩個(gè)內(nèi)容:一、協(xié)議的的講解;二、解碼程序解析(參考正點(diǎn)原子的代碼)

          本文引用地址:http://www.ex-cimer.com/article/201609/296598.htm

            紅外的介紹、優(yōu)點(diǎn)、缺點(diǎn)就不給大家說了,網(wǎng)上書上都有,下面進(jìn)入正題

            一、協(xié)議的的講解

            的編碼目前廣泛使用的是:NEC Protocol的PWM(脈沖寬度調(diào)制)和Philips RC-5 Protocol的PPM(脈沖位置調(diào)制)

            本文將以NEC協(xié)議實(shí)現(xiàn)紅外遙控。

            NEC協(xié)議的特征:

            1、8位地址和8位指令長(zhǎng)度;

            2、地址和命令兩次傳輸(確保可靠性);

            3、PWM脈沖寬度調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;

            4、載波頻率為38KHz;

            5、位時(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í)為低電平,在沒有收到脈沖時(shí)為高電平,因此,我們?cè)诮邮疹^端收到的信號(hào) 為:邏輯1應(yīng)該是560us低+1680us高,邏輯0應(yīng)該是560us低+560us高。如下圖:

            

           

            NEC 遙控指令的數(shù)據(jù)格式為:同步碼頭(引導(dǎo)碼)+地址碼+地址反碼+控制碼+控制反碼。同步碼是由一個(gè)9ms的低電平和一個(gè)4.5ms的高電平組成,地址碼、 地址反碼、控制碼、控制反碼均為8位數(shù)據(jù)格式。按照高位在前低位在后的順序發(fā)送。采用反碼是為了增加傳輸?shù)目煽啃?可用于校驗(yàn))。下圖是我們按下按鍵2 時(shí),從紅外接收頭端測(cè)到的波形:

            

           

            在 圖中可以看到,在100ms之后,我們還收到了幾個(gè)脈沖,這是NEC碼規(guī)定的連發(fā)碼(由9ms低電平+2.5ms高電平+0.56ms低電平和 97.94ms高電平組成),如果在一幀數(shù)據(jù)發(fā)送完后,按鍵仍沒有松開,則發(fā)送重復(fù)碼(連發(fā)碼),可以通過統(tǒng)計(jì)連發(fā)碼的次數(shù)來標(biāo)記按鍵按下的長(zhǎng)短/次數(shù)。

            二、解碼程序解析(參考正點(diǎn)原子的代碼)

            在正點(diǎn)原子的代碼中是利用定時(shí)器的輸入捕獲功能來實(shí)現(xiàn)遙控解碼的,下面解析一下關(guān)鍵代碼:

            在該實(shí)驗(yàn)remote.h文件中,定義了3個(gè)函數(shù):Remote_Init();、TIM4_IRQHandler();、Remote_Scan();。

            1、Remote_Init();

            

           

            這里要注意中斷優(yōu)先級(jí),定時(shí)器4的兩個(gè)中斷,溢出(更新)中斷,捕獲事件中斷的優(yōu)先級(jí)是一樣的。意思就是,他兩誰也不能打斷誰,例如A在執(zhí)行時(shí),B就不會(huì)產(chǎn)生中斷。這里很重要,很重要,很重要!

            2、TIM4_IRQHandler();

            

           

            

           

            

           

            注意上圖中畫紅框的狀態(tài)標(biāo)識(shí),下面解析一下此中斷服務(wù)函數(shù)(該終端服務(wù)函數(shù)中有兩個(gè)中斷,溢出中斷和捕獲中斷):

            1、先看捕獲中斷,Rmtsta剛開始時(shí)為0,當(dāng)發(fā)生一次上升沿捕獲時(shí)(RDATA對(duì)應(yīng)的引腳得到一個(gè)高電平),先把捕獲事件配置為下降沿捕獲,然后Rmtsta=0x10,標(biāo)記了上升沿已經(jīng)被捕獲;

            2、當(dāng)有下降沿到來時(shí),將CCR1寄存器的值賦給Dval變量,并再將捕獲事件配置為上升沿捕獲;補(bǔ)充:像這樣上升沿捕獲和下降沿捕獲交替使用,是為了捕獲到高電平持續(xù)時(shí)間。

            3、注意:只有當(dāng)接收頭收到了引導(dǎo)碼后,才進(jìn)行解碼。故先判斷Dval的值是不是在4200us~4700us之間,如果在,就將Rmtsta|=1<<7,將Rmtsta的最高位置1,標(biāo)記成功接收到了引導(dǎo)碼。

            4、 當(dāng)Rmtsta的最高位被置為1后,即滿足了if(Rmtsta&0x80),就可以判斷Dval的值在下面3鐘范圍內(nèi) 了:300~800(560us)、1400~1800(1680us)、2200~2600(2500us)。從而得到0或者1或者RmtCnt++。 實(shí)現(xiàn)了解碼。

            4、以上3條,其中的高電平持續(xù)時(shí)間都在10ms之內(nèi),意思就是還沒到10ms就產(chǎn)生了捕獲中斷(上升沿和下降沿),因?yàn)閮?yōu)先級(jí)相同的原因,這時(shí)是無法產(chǎn)生溢出中斷的。只有當(dāng)你到10ms了,還沒有產(chǎn)生上升沿捕獲或下降沿捕獲,就會(huì)產(chǎn)生溢出中斷。

            5、 那什么情況下10ms都沒有產(chǎn)生捕獲呢,那就是上文中的連發(fā)碼,那個(gè)97.94ms的高電平,遠(yuǎn)大于了10ms,故會(huì)產(chǎn)生溢出中斷。在溢出中斷里會(huì)標(biāo)記已 經(jīng)完成一次完整的鍵值信息采集(RmtSta|=1<<6),正點(diǎn)原子在溢出中斷中給設(shè)的連發(fā)碼時(shí)間為130ms,超過130ms視為是松開 按鍵了(因?yàn)樗砷_按鍵就不會(huì)有脈沖,也就是高電平,看上文)。

            此外,處理紅外鍵盤的程序就很簡(jiǎn)單了,先判斷是不是得到所有一個(gè)鍵的所有信息了(根據(jù)上一條,判斷if(RmtSta&(1<<6))是否成立),然后通過移位讀取之前在捕獲中斷中存進(jìn)去的數(shù)據(jù),再進(jìn)行原碼和反碼的對(duì)比。這里不多說了。。

            

           

            注意:遙控器發(fā)過來的碼都是編好的,比如想破解遙控器編碼,可以拿示波器去測(cè)接收端的碼。

            整個(gè)程序思路不難,就是對(duì)遙控器發(fā)過來的碼進(jìn)行解碼,這里主要是兩個(gè)中斷的理解。



          關(guān)鍵詞: STM32 紅外遙控

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();