0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32: NEC紅外線協(xié)議解碼(超低成本無線傳輸方案)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-03-14 09:48 ? 次閱讀

?

一、環(huán)境介紹

MCU: STM32F103ZET6

編程軟件環(huán)境: keil5

紅外線傳輸協(xié)議: NEC協(xié)議---38KHZ載波:。NEC協(xié)議是紅外遙控協(xié)議中常見的一種。

解碼思路: 外部中斷 + 定時(shí)器方式

代碼風(fēng)格: 模塊化編程,寄存器直接操作方式

二、NEC協(xié)議與解碼思路介紹

2.1 采用的相關(guān)硬件

圖1: 這是NEC協(xié)議的紅外線遙控器: 如果自己手機(jī)沒有紅外線遙控器的功能,可以淘寶上買一個(gè)小遙控器來學(xué)習(xí)測試,成本不高,這個(gè)遙控器也可以自己做,能解碼當(dāng)然也可以編碼發(fā)送,只需要一個(gè)紅外光發(fā)射管即可。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

圖2: 這是紅外線接收頭模塊。如果自己的開發(fā)板沒有自帶這個(gè)接收頭,那就單獨(dú)買一個(gè)接收頭模塊,使用杜邦線接到開發(fā)板的IO口上即可用來測試學(xué)習(xí),接線很方便。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

圖3: 這是紅外線發(fā)射管,如果自己想做遙控器的發(fā)射端,自己做遙控器,那么就可以直接購買這種模塊即可。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.2 紅外線協(xié)議介紹

在光譜中波長自760nm至400um的電磁波稱為紅外線,它是一種不可見光。紅外線通信的例子我們每個(gè)人應(yīng)該都很熟悉,目前常用的家電設(shè)備幾乎都可以通過紅外遙控的方式進(jìn)行遙控,比如電視機(jī)、空調(diào)、投影儀等,都可以見到紅外遙控的影子。這種技術(shù)應(yīng)用廣泛,相應(yīng)的應(yīng)用器件都十分廉價(jià),因此紅外遙控是我們?nèi)粘TO(shè)備控制的理想方式。

紅外線的通訊原理: 紅外光是以特定的頻率脈沖形式發(fā)射,接收端收到到信號后,按照約定的協(xié)議進(jìn)行解碼,完成數(shù)據(jù)傳輸,在消費(fèi)類電子產(chǎn)品里,脈沖頻率普遍采用 30KHz 到 60KHz 這個(gè)頻段,NEC協(xié)議的頻率就是38KHZ。 這個(gè)以特定的頻率發(fā)射其實(shí)就可以理解為點(diǎn)燈,不要被復(fù)雜的詞匯難住了,就是控制燈的閃爍頻率(亮滅),和剛學(xué)單片機(jī)完成閃光燈一樣的意思,只不過是燈換了一種類型,都是燈。 接收端的原理: 接收端的芯片對這個(gè)紅外光比較敏感,可以根據(jù)有沒有光輸出高低電平,如果發(fā)送端的閃爍頻率是有規(guī)律的,接收端收到后輸出的高電平和低電平也是有規(guī)律對應(yīng)的,這樣發(fā)送端和接收端只要約定好,那就可以做數(shù)據(jù)傳輸了。

紅外線傳輸協(xié)議可以說是所有無線傳輸協(xié)議里成本最低,最方便的傳輸協(xié)議了,但是也有缺點(diǎn),距離不夠長,速度不夠快;當(dāng)然,每個(gè)傳輸協(xié)議應(yīng)用的環(huán)境不一樣,定位不一樣,好壞沒法比較,具體要看自己的實(shí)際場景選擇合適的通信方式。

2.3 NEC協(xié)議介紹

NEC協(xié)議是眾多紅外線協(xié)議中的一種(這里說的協(xié)議就是他們數(shù)據(jù)幀格式定義不一樣,數(shù)據(jù)傳輸原理都是一樣的),我們購買的外能遙控器、淘寶買的mini遙控器、電視機(jī)、投影儀幾乎都是NEC協(xié)議。 像格力空調(diào)、美的空調(diào)這些設(shè)備使用的就是其他協(xié)議格式,不是NEC協(xié)議,但是只要學(xué)會一種協(xié)議解析方式,明白了紅外線傳輸原理,其他遙控器協(xié)議都可以解出來。

下圖是NEC協(xié)議傳輸一次數(shù)據(jù)的完整格式:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

NEC協(xié)議一次完整的傳輸包含: 引導(dǎo)碼、8位用戶碼、8位用戶反碼、8位數(shù)據(jù)碼、8位數(shù)據(jù)反碼。

(注意:下面的解釋都是站在紅外線接收端的角度來進(jìn)行說明的,就是解碼端的角度)

引導(dǎo)碼: 由9ms的高電平+4.5ms的低電平組成。

4個(gè)字節(jié)的數(shù)據(jù): 用戶碼+用戶反碼+數(shù)據(jù)碼+數(shù)據(jù)反碼。 這里的反碼可以用來校驗(yàn)數(shù)據(jù)是否傳輸正確,有沒有丟包。

重點(diǎn): NEC協(xié)議傳輸數(shù)據(jù)位的時(shí)候,0和1的區(qū)分是依靠收到的高、低電平的持續(xù)時(shí)間來進(jìn)行區(qū)分的---這是解碼關(guān)鍵。

標(biāo)準(zhǔn)間隔時(shí)間:0.56ms

收到數(shù)據(jù)位0: 0.56ms

收到位1: 1.68ms

所以,收到一個(gè)數(shù)據(jù)位的完整時(shí)間表示方法是這樣的:

收到數(shù)據(jù)位0: 0.56m低電平+ 0.56ms的高電平

收到數(shù)據(jù)位1: 0.56ms低電平+1.68ms的高電平

紅外線接收頭模塊輸出電平的原理: 紅外線接收頭感應(yīng)到有紅外光就輸出低電平,沒有感應(yīng)到紅外光就輸出高電平。

這是使用邏輯分析采集紅外線接收頭輸出的信號:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

這是采集紅外線遙控器上的LED燈輸出電平時(shí)序圖,剛好和接收端相反:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

單片機(jī)編寫解碼程序的時(shí)候,常見的方式就是采用外部中斷+定時(shí)器的方式進(jìn)行解析,中斷可以設(shè)置為低電平觸發(fā),因?yàn)榻邮疹^沒有感應(yīng)到紅外光默認(rèn)是輸出高電平,如果收到NEC引導(dǎo)碼,就會輸出低電平,進(jìn)入到中斷服務(wù)函數(shù),完成解碼,解碼過程中開啟定時(shí)器記錄每一段的高電平、低電平的持續(xù)時(shí)間,按照NEC協(xié)議進(jìn)行判斷,完成最終解碼。

STM32可以使用輸入捕獲方式完成解碼,其實(shí)輸入捕獲就是外部中斷+定時(shí)器的組合,只不過是STM32內(nèi)部封裝了一層。

完整keil工程源碼下載(解壓即可編譯運(yùn)行測試):

https://download.csdn.net/download/xiaolong1126626497/19863275

外部中斷服務(wù)器里的解碼程序如下(這個(gè)在其他單片機(jī)上思路是一樣的):

/*
函數(shù)功能:  外部中斷線9_5服務(wù)函數(shù)
*/
void EXTI9_5_IRQHandler(void)
{
    u32 time;
    u8 i,j,data=0;
  
    //清除中斷線9上的中斷請求
		EXTI->PR|=1<<9;
  
    time=Infrared_GetTime_L();       //得到低電平時(shí)間
    if(time<7000||time>10000)return; //標(biāo)準(zhǔn)時(shí)間: 9000us
    time=Infrared_GetTime_H();       //得到高電平時(shí)間
    if(time<3000||time>5500)return;  //標(biāo)準(zhǔn)時(shí)間4500us
    
    //正式解碼NEC協(xié)議
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
             time=Infrared_GetTime_L();       //得到低電平時(shí)間
             if(time<400||time>700)return;    //標(biāo)準(zhǔn)時(shí)間: 560us
             
             time=Infrared_GetTime_H();       //得到高電平時(shí)間
             if(time>1400&&time<1800)         //數(shù)據(jù)1 1680us
             {
                data>>=1;
                data|=0x80;
             }
             else if(time>400&&time<700)   //數(shù)據(jù)0 560us
             {
                data>>=1;
             }
             else return;
        }
        InfraredRecvData[i]=data; //存放解碼成功的值
      }
    
      //解碼成功
      InfraredRecvState=1;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

三、核心完整代碼

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

本程序的解碼思路是: 將紅外線接收模塊的輸出腳接到STM32的PB9上,配置STM32的PB9為外部中斷模式,下降沿電平觸發(fā);如果收到紅外線信號就進(jìn)入到中斷服務(wù)函數(shù)里解碼,如果解碼過程中發(fā)現(xiàn)數(shù)據(jù)不符合要求就終止解碼,如果數(shù)據(jù)全部符合要求就按照協(xié)議接收,直到解碼完成,設(shè)置標(biāo)志位,在main函數(shù)里打印解碼得到的數(shù)據(jù)。

代碼都是模塊化編程,閱讀起來也很方便。

3.1 紅外線解碼.c

#include "nec_Infrared.h"
u8 InfraredRecvData[4]; //存放紅外線解碼接收的數(shù)據(jù)
u8 InfraredRecvState=0; //0表示未接收到數(shù)據(jù),1表示接收到數(shù)據(jù) 
/*
函數(shù)功能: 紅外線解碼初始化(接收)
*/
void Infrared_RecvInit(void)
{
    Infrared_Time6_Init(); //定時(shí)器初始化
    
    /*1. 配置GPIO口*/
    RCC->APB2ENR|=1<<3; //PB
    GPIOB->CRH&=0xFFFFFF0F;
    GPIOB->CRH|=0x00000080;
    GPIOB->ODR|=1<<9;
  
    /*2. 配置外部中斷*/
    EXTI->IMR|=1<<9; //外部中斷線9,開放中斷線的中斷請求功能
    EXTI->FTSR|=1<<9; //中斷線9_下降沿
  
    RCC->APB2ENR|=1<<0; //開啟AFIO時(shí)鐘
    AFIO->EXTICR[2]&=~(0xF<<1*4);
    AFIO->EXTICR[2]|=0x1<<1*4;
    STM32_NVIC_SetPriority(EXTI9_5_IRQn,1,1);
}

/*
函數(shù)功能: 初始化定時(shí)器,用于紅外線解碼
*/
void Infrared_Time6_Init(void)
{
    RCC->APB1ENR|=1<<4;
		RCC->APB1RSTR|=1<<4;
		RCC->APB1RSTR&=~(1<<4);
    TIM6->PSC=72-1; //預(yù)分頻器
    TIM6->ARR=65535;   //重裝載寄存器
    TIM6->CR1|=1<<7; //開啟緩存功能
	  //TIMx->CR1|=1<<0; //開啟定時(shí)器
}

/*
函數(shù)功能: 測量高電平持續(xù)的時(shí)間
*/
u32 Infrared_GetTime_H(void)
{
    TIM6->CNT=0;
    TIM6->CR1|=1<<0;    //開啟定時(shí)器
    while(NEC_IR){}     //等待高電平結(jié)束
    TIM6->CR1&=~(1<<0); //關(guān)閉定時(shí)器
    return TIM6->CNT;
}

/*
函數(shù)功能: 測量低電平持續(xù)的時(shí)間
*/
u32 Infrared_GetTime_L(void)
{
    TIM6->CNT=0;
    TIM6->CR1|=1<<0;    //開啟定時(shí)器
    while(!NEC_IR){}     //等待低電平結(jié)束
    TIM6->CR1&=~(1<<0); //關(guān)閉定時(shí)器
    return TIM6->CNT;
}


/*
函數(shù)功能:  外部中斷線9_5服務(wù)函數(shù)
*/
void EXTI9_5_IRQHandler(void)
{
    u32 time;
    u8 i,j,data=0;
  
    //清除中斷線9上的中斷請求
		EXTI->PR|=1<<9;
  
    time=Infrared_GetTime_L();       //得到低電平時(shí)間
    if(time<7000||time>10000)return; //標(biāo)準(zhǔn)時(shí)間: 9000us
    time=Infrared_GetTime_H();       //得到高電平時(shí)間
    if(time<3000||time>5500)return;  //標(biāo)準(zhǔn)時(shí)間4500us
    
    //正式解碼NEC協(xié)議
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {
             time=Infrared_GetTime_L();       //得到低電平時(shí)間
             if(time<400||time>700)return;    //標(biāo)準(zhǔn)時(shí)間: 560us
             
             time=Infrared_GetTime_H();       //得到高電平時(shí)間
             if(time>1400&&time<1800)         //數(shù)據(jù)1 1680us
             {
                data>>=1;
                data|=0x80;
             }
             else if(time>400&&time<700)   //數(shù)據(jù)0 560us
             {
                data>>=1;
             }
             else return;
        }
        InfraredRecvData[i]=data; //存放解碼成功的值
      }
    
      //解碼成功
      InfraredRecvState=1;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 主函數(shù).c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "W25Q64.h"
#include "spi.h"
#include "nec_Infrared.h"

int main()
{
	LED_Init();
	BEEP_Init();
	KeyInit();
  USARTx_Init(USART1,72,115200);
  IIC_Init();
  
  W25Q64_Init();
  
  printf("芯片ID號:0x%X\n",W25Q64_ReadID());
  
  Infrared_RecvInit();
  
	while(1)
	{
		if(InfraredRecvState)
    {
        InfraredRecvState=0;
        printf("用戶碼:%d,按鍵碼:%d\n",InfraredRecvData[0],InfraredRecvData[2]);
        printf("user反碼:%d,key反碼:%d\n",(~InfraredRecvData[1])&0xFF,(~InfraredRecvData[3])&0xFF);
        BEEP=!BEEP;
        LED0=!LED0;
    }
	}
}

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、擴(kuò)展提高

如果上面的NEC的解碼思路已經(jīng)看到,程序已經(jīng)可以自己編寫,就可以試著使用STM32的輸入捕獲+定時(shí)器方式寫一版解碼代碼,既能更加熟悉NEC協(xié)議、也可以學(xué)習(xí)STM32定時(shí)器捕獲捕獲的用法;也可以做一些小東西來鍛煉,比如:紅外線遙控小車、音樂播放器支持紅外線遙控器切歌,電機(jī)的開關(guān)、燈的開關(guān)等等。

搞定協(xié)議解碼之后,我們下一步就是完成自定義的NEC協(xié)議紅外線制作,采用STM32模擬一個(gè)萬能紅外線遙控器。

審核編輯:湯梓紅


在光譜中波長自760nm至400um的電磁波稱為紅外線,它是一種不可見光。目前幾乎所有的視頻音頻設(shè)備都可以通過紅外遙控的方式進(jìn)行遙控,比如電視機(jī)、空調(diào)、影碟機(jī)等,都可以見到紅外遙控的影子。這種技術(shù)應(yīng)用廣泛,相應(yīng)的應(yīng)用器件都十分廉價(jià),因此紅外遙控是我們?nèi)粘TO(shè)備控制的理想方式。


?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16804

    瀏覽量

    349393
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353807
  • 無線傳輸
    +關(guān)注

    關(guān)注

    3

    文章

    560

    瀏覽量

    40957
收藏 人收藏

    評論

    相關(guān)推薦

    溫度越高輻射的紅外線越怎么樣

    引言 紅外線是一種電磁波,波長介于可見光和微波之間,具有熱效應(yīng)。紅外線輻射是物體因溫度而產(chǎn)生的電磁波輻射,其輻射強(qiáng)度和波長與物體的溫度密切相關(guān)。 紅外線的基本概念和特性 2.1 紅外線
    的頭像 發(fā)表于 08-20 09:47 ?659次閱讀

    紅外線的溫度高還是紫外線的溫度高

    引言 紅外線和紫外線是電磁波譜中的兩種重要類型,它們在自然界和人類社會中都有著廣泛的應(yīng)用。 紅外線與紫外線的基本概念 2.1 紅外線
    的頭像 發(fā)表于 08-20 09:46 ?928次閱讀

    紅外線與紫外線有什么區(qū)別與功能

    引言 紅外線和紫外線都是電磁波的一種,它們在自然界中廣泛存在,對人類的生活和科學(xué)研究都有著重要的影響。然而,由于它們的特性和應(yīng)用領(lǐng)域不同,人們對它們的了解程度也不盡相同。 紅外線與紫外線
    的頭像 發(fā)表于 08-20 09:44 ?1000次閱讀

    紅外線外線的特點(diǎn)及應(yīng)用有哪些

    紅外線的特點(diǎn): a. 波長范圍:紅外線的波長范圍在0.75微米至1000微米之間。 b. 熱效應(yīng):紅外線具有較強(qiáng)的熱效應(yīng),能夠使物體加熱。 c. 穿透能力:紅外線的穿透能力較弱,容易被
    的頭像 發(fā)表于 08-20 09:42 ?507次閱讀

    紅外線和紫外線哪個(gè)熱效應(yīng)更顯著

    一、引言 紅外線和紫外線是電磁波譜中的兩個(gè)重要波段,它們在自然界和人類社會中都有著廣泛的應(yīng)用。紅外線和紫外線的熱效應(yīng)是人們關(guān)注的焦點(diǎn)之一,因?yàn)樗鼈儗θ梭w的健康和生活都有著直接或間接的影
    的頭像 發(fā)表于 08-20 09:41 ?581次閱讀

    紅外線最顯著的特點(diǎn)是它的什么效應(yīng)

    紅外線最顯著的特點(diǎn)是它的 熱效應(yīng) 。這種效應(yīng)體現(xiàn)在紅外線能夠輻射熱量,使物體發(fā)熱。具體來說,紅外線的熱效應(yīng)包括以下幾個(gè)方面: 輻射熱量 :紅外線是光譜中光熱效應(yīng)最大的區(qū)域,任何高于絕對
    的頭像 發(fā)表于 08-20 09:39 ?618次閱讀

    紅外線有哪些特點(diǎn)和作用

    引言 紅外線是一種電磁波,波長介于可見光和微波之間。它在自然界和人類社會中有著廣泛的應(yīng)用,如熱成像、遙感、醫(yī)療、工業(yè)、軍事和通信等領(lǐng)域。本文將介紹紅外線的特點(diǎn)和作用。 紅外線的定義和分類 紅外
    的頭像 發(fā)表于 08-20 09:33 ?764次閱讀

    紅外線耳機(jī)和調(diào)頻耳機(jī)的區(qū)別

    在當(dāng)今無線通信技術(shù)日新月異的時(shí)代,各種無線耳機(jī)層出不窮,為我們提供了多樣化的選擇。在這些無線耳機(jī)中,紅外線耳機(jī)和調(diào)頻(FM)耳機(jī)因其獨(dú)特的傳輸
    的頭像 發(fā)表于 04-03 17:12 ?3000次閱讀

    紅外線傳感器工作原理與特點(diǎn)

    紅外線傳感器是一種非接觸式的光電傳感器,用于檢測物體是否存在或者物體特征的變化。它廣泛應(yīng)用于許多領(lǐng)域,例如家電、工業(yè)控制、機(jī)器人學(xué)和汽車安全等。 1)紅外線傳感器的工作原理 基于物體對紅外線的反射
    的頭像 發(fā)表于 03-27 18:25 ?2855次閱讀

    如何區(qū)分紅外線發(fā)射管與紅外線接收管

    如何區(qū)分紅外線發(fā)射管與紅外線接收管 紅外線技術(shù)在我們的日常生活中扮演著重要角色,它被廣泛應(yīng)用于安全監(jiān)控、遙控器、自動化控制等領(lǐng)域。紅外線發(fā)射管和紅外
    的頭像 發(fā)表于 01-31 15:04 ?2448次閱讀

    如何區(qū)分紅外線接收頭的故障部位?

    如何區(qū)分紅外線接收頭的故障部位? 紅外線接收頭是一種常見的電子元件,用于接收紅外線信號。它在家電、無線通信等領(lǐng)域被廣泛應(yīng)用,但由于長期使用或其他原因,
    的頭像 發(fā)表于 01-31 15:04 ?1957次閱讀

    紅外線接收頭在無線路由器上的應(yīng)用

    紅外線接收頭在無線路由器上的應(yīng)用 無線路由器是目前家庭和辦公網(wǎng)絡(luò)中不可或缺的設(shè)備之一。它允許多臺設(shè)備同時(shí)連接到互聯(lián)網(wǎng),并為用戶提供快速和穩(wěn)定的網(wǎng)絡(luò)連接。在無線路由器的設(shè)計(jì)和制造過程中,
    的頭像 發(fā)表于 01-31 15:04 ?800次閱讀

    紅外線感應(yīng)開關(guān)原理 紅外線感應(yīng)開關(guān)怎么接線

    紅外線感應(yīng)開關(guān)是一種利用紅外線傳感技術(shù)實(shí)現(xiàn)自動開關(guān)控制的設(shè)備。它廣泛應(yīng)用于電梯、自動門、安防系統(tǒng)、照明等各種場合,具有非接觸式、高精度、高可靠性等特點(diǎn)。 紅外線感應(yīng)開關(guān)的工作原理主要包括紅外線
    的頭像 發(fā)表于 01-23 17:15 ?3319次閱讀

    紅外線遙控器使用方法

    紅外線遙控器是一種常見的電子設(shè)備,廣泛應(yīng)用于家庭、商業(yè)和工業(yè)領(lǐng)域。它可以通過紅外線信號與相應(yīng)的設(shè)備進(jìn)行通信,實(shí)現(xiàn)控制和操作。本文將詳細(xì)介紹紅外線遙控器的基本原理、操作步驟和常見問題解決辦法,以幫助
    的頭像 發(fā)表于 12-20 11:31 ?4462次閱讀

    紅外線發(fā)射管簡介及參數(shù) 紅外線發(fā)射管和接收管的工作原理

    今天洲光源小編來給大家介紹下紅外線發(fā)射管,對于紅外線發(fā)射管大家應(yīng)該有些疑惑 下面逐步介紹它的一些相關(guān)問題。包括:紅外線發(fā)射管簡介及參數(shù)、紅外對管識別及
    的頭像 發(fā)表于 11-18 17:33 ?1.1w次閱讀
    <b class='flag-5'>紅外線</b>發(fā)射管簡介及參數(shù) <b class='flag-5'>紅外線</b>發(fā)射管和接收管的工作原理