基於STM32的紅外遙控重點解析

2021-07-13 02:41:54 字數 2726 閱讀 6172

本文有兩個內容:一、紅外遙控協議的的講解;

二、解碼程式解析(參考正點原子的**)

紅外的介紹、優點、缺點就不給大家說了,進入正題

一、紅外遙控協議的的講解

紅外遙控的編碼目前廣泛使用的是:nec protocol的pwm(脈衝寬度調製)和philips rc-5 protocol的ppm(脈衝位置調製)

本文將以nec協議實現紅外遙控。

nec協議的特徵:

1、8位位址和8位指令長度;

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

3、pwm脈衝寬度調製,以發射紅外載波的占空比代表「0」和「1」;

4、載波頻率為38khz

5、位時間為1.125ms和2.25ms

nec碼位的定義:乙個脈衝對應560us的連續載波,乙個邏輯1傳輸需要2.25ms(560us脈衝+1680us低電平),乙個邏輯0的傳輸需要1.125ms(560us脈衝+560us低電平)。而遙控接收頭在收到脈衝時為低電平,在沒有收到脈衝時為高電平,因此,我們在接收頭端收到的訊號為:邏輯1應該是560us低+1680us高,邏輯0應該是560us低+560us高。如下圖:

nec遙控指令的資料格式為:同步碼頭(引導碼)+位址碼+位址反碼+控制碼+控制反碼。同步碼是由乙個9ms的低電平和乙個4.5ms的高電平組成,位址碼、位址反碼、控制碼、控制反碼均為8位資料格式。按照高位在前低位在後的順序傳送。採用反碼是為了增加傳輸的可靠性(可用於校驗)。下圖是我們按下按鍵2時,從紅外置收頭端測到的波形:

在圖中可以看到,在100ms之後,我們還收到了幾個脈衝,這是nec碼規定的連發碼(由9ms低電平+2.5ms高電平+0.56ms低電平和97.94ms高電平組成),如果在一幀資料傳送完後,按鍵仍沒有鬆開,則傳送重複碼(連發碼),可以通過統計連發碼的次數來標記按鍵按下的長短/次數。

二、解碼程式解析(參考正點原子的**)

在正點原子的**中是利用定時器的輸入捕獲功能來實現遙控解碼的,下面解析一下關鍵**:

在該實驗remote.h檔案中,定義了3個函式:remote_init();、tim4_irqhandler();、remote_scan();。

這裡要注意中斷優先順序,定時器4的兩個中斷,溢位(更新)中斷,捕獲事件中斷的優先順序是一樣的。意思就是,他兩誰也不能打斷誰,例如a在執行時,b就不會產生中斷。這裡很重要,很重要,很重要!

注意上圖中畫紅框的狀態標識,下面解析一下此中斷服務函式(該終端服務函式中有兩個中斷,溢位中斷和捕獲中斷):

1、先看捕獲中斷,rmtsta剛開始時為0,當發生一次上公升沿捕獲時(rdata對應的引腳得到乙個高電平),先把捕獲事件配置為下降沿捕獲,然後rmtsta=0x10,標記了上公升沿已經**獲;

2、當有下降沿到來時,將ccr1暫存器的值賦給dval變數,並再將捕獲事件配置為上公升沿捕獲;補充:像這樣上公升沿捕獲和下降沿捕獲交替使用,是為了捕獲到高電平持續時間。

3、注意:只有當接收頭收到了引導碼後,才進行解碼。故先判斷dval的值是不是在4200us~4700us之間,如果在,就將rmtsta|=1<<7,將rmtsta的最高位置1,標記成功接收到了引導碼;

4、當rmtsta的最高位被置為1後,即滿足了if(rmtsta&0x80),就可以判斷dval的值在下面3鐘範圍內了:300~800(560us)、1400~1800(1680us)、2200~2600(2500us)。從而得到0或者1或者rmtcnt++。實現瞭解碼。

4、以上3條,其中的高電平持續時間都在10ms之內,意思就是還沒到10ms就產生了捕獲中斷(上公升沿和下降沿),因為優先順序相同的原因,這時是無法產生溢位中斷的。只有當你到10ms了,還沒有產生上公升沿捕獲或下降沿捕獲,就會產生溢位中斷;

5、那什麼情況下10ms都沒有產生捕獲呢,那就是上文中的連發碼,那個97.94ms的高電平,遠大於了10ms,故會產生溢位中斷。在溢位中斷裡會標記已經完成一次完整的鍵值資訊採集(rmtsta|=1<<6),正點原子在溢位中斷中給設的連發碼時間為130ms,超過130ms視為是鬆開按鍵了(因為鬆開按鍵就不會有脈衝,也就是高電平,看上文)。

此外,處理紅外鍵盤的程式就很簡單了,先判斷是不是得到所有乙個鍵的所有資訊了(根據上一條,判斷if(rmtsta&(1<<6))是否成立),然後通過移位讀取之前在捕獲中斷中存進去的資料,再進行原碼和反碼的對比。這裡不多說了。。

注意:遙控器發過來的碼都是編好的,比如想破解遙控器編碼,可以拿示波器去測接收端的碼。(這個我沒試過~~)

整個程式思路不難,就是對遙控器發過來的碼進行解碼,這裡主要是兩個中斷的理解。

STM32 紅外遙控器

紅外 原理 遙控器作為發射器,發射38khz的載波,接收器在接收到載波時為低電平 按照nec protocol的pwm,該協議的特點 1 8位位址和8位指令長度 2 位址和命令分兩次傳送,並有傳送位址和命令反碼,便於校驗,確保傳輸的準確 3 pwm脈衝位置調製,以發射紅外載波的占空比來表示 0 和 ...

STM32紅外遙控NEC協議

正點原子紅外遙控實驗 nec協議發出的一幀資料報括 同步 引導 碼,位址碼,位址反碼,控制碼,控制反碼,連發 重複 碼 其中位址碼,位址反碼,控制碼,控制反碼的邏輯 1 和邏輯 0 表示如下 邏輯 1 2.25ms 560us脈衝 1680us低電平 邏輯 0 1.125ms 560us脈衝 560...

stm32紅外遙控的外部中斷實現

花了整整兩天時間終於算是基本把紅外解碼搞明白了,其實並不是很難,用了兩天時間,說來慚愧啊,原因就是細節上的問題,不過最終總算找出問題來了。使用外部中斷來解碼,就先對外部中斷進行配置吧 void exti init rcc apb2enr 1 0 使用外部中斷要開afio復用時鐘,因為要用到用到它的暫...