RM新时代网站-首页

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

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

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

紅外遙控自學(xué)習(xí)實(shí)現(xiàn)原理詳解

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:博客園 ? 作者:樹(shù)蔭下的陽(yáng)光 ? 2022-04-24 16:16 ? 次閱讀

1 序言

很早前就想實(shí)現(xiàn)這個(gè)紅外遙控自學(xué)習(xí)的這個(gè)實(shí)驗(yàn),用于來(lái)自己控制房子里如空調(diào)等紅外遙控設(shè)備的自動(dòng)化,NEC的標(biāo)準(zhǔn)到具體的產(chǎn)品上可能就被廠(chǎng)家定義為不一樣了,所以自學(xué)習(xí)就應(yīng)該是接收到什么就發(fā)送什么,不用管內(nèi)容是什么!

2 硬件實(shí)現(xiàn)原理

10a45842-c278-11ec-bce3-dac502259ad0.png

由上述原理圖可知,當(dāng)IE為高電平時(shí)發(fā)送紅外光,為低電平時(shí)不發(fā)送紅外光。

在NEC協(xié)議中,信息傳輸是基于38K載波,也就是說(shuō)紅外線(xiàn)是以載波的方式傳遞。

發(fā)送波形如下圖所示:

10b661cc-c278-11ec-bce3-dac502259ad0.png

NEC協(xié)議規(guī)定:

  • 發(fā)送協(xié)議數(shù)據(jù)“0” = 發(fā)送載波560us + 不發(fā)送載波560us

  • 發(fā)送協(xié)議數(shù)據(jù)“1” = 發(fā)送載波560us+ 不發(fā)送載波1680us

  • 發(fā)送引導(dǎo)碼 = 發(fā)送載波9000us + 不發(fā)送載波4500us

在紅外接收端,如果接收到紅外38K載波,則IR輸出為低電平,如果不是載波包括固定低電平和固定高電平則輸出高電平。在IR端接收的信號(hào)如下所示:

10cb1ee6-c278-11ec-bce3-dac502259ad0.png

10decbbc-c278-11ec-bce3-dac502259ad0.png

3 軟件實(shí)現(xiàn)自學(xué)習(xí)

設(shè)計(jì)原理:

10f3aa5a-c278-11ec-bce3-dac502259ad0.png

1、 根據(jù)接收波形記錄電平和電平持續(xù)時(shí)間,以便于發(fā)送。

2、電平記錄采用定時(shí)器捕獲功能,從下降沿接收引導(dǎo)信號(hào)開(kāi)始,每觸發(fā)一次改變觸發(fā)方式,從而使每個(gè)電平變化都能捕獲到。

源碼實(shí)現(xiàn)如下:

定時(shí)器捕獲初始化設(shè)置(CubeMax軟件自動(dòng)配置生成):

void MX_TIM4_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};

htim4.Instance = TIM4;htim4.Init.Prescaler = 71;htim4.Init.CounterMode = TIM_COUNTERMODE_UP;htim4.Init.Period = 10000;htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim4) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_Init(&htim4) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim4, &sConfigIC, TIM_CHANNEL_4) != HAL_OK){Error_Handler();}

}

定時(shí)器捕獲中斷回調(diào)處理:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)    {if(TIM4->CCER & (TIM_CCER_CC4P))   //下降沿觸發(fā)        {            TIM4->CCER &= ~(TIM_CCER_CC4P); //切換            gu8BitVal = 1;        }else                               //上升沿觸發(fā)        {            TIM4->CCER |= TIM_CCER_CC4P;    //切換            gu8BitVal = 0;        }



if(gsInfrared.State == NONE_STATE)        {            gsInfrared.State = RECV_STATE;        }else if(gsInfrared.State == RECV_STATE)        {            NowTimCnt = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);            gsInfrared.KeepTime[gsInfrared.SampleCount] = Round(NowTimCnt);            gsInfrared.BitValue[gsInfrared.SampleCount ++] = gu8BitVal;        }

        TIM4->CNT = 0;    }}

3、設(shè)置的定時(shí)器溢出時(shí)間為10ms,如果10毫秒內(nèi)不再接收電平變化則默認(rèn)接收結(jié)束,設(shè)置結(jié)束標(biāo)志。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim == &htim4)    {if(gsInfrared.State == RECV_STATE)        {            gsInfrared.State = END_STATE;        }    }}

至此,實(shí)現(xiàn)了紅外遙控的學(xué)習(xí)功能,獲得的記錄數(shù)據(jù)為記錄長(zhǎng)度和電平信號(hào)數(shù)組與電平信號(hào)維持的時(shí)間數(shù)組。

11059166-c278-11ec-bce3-dac502259ad0.png

4、發(fā)送實(shí)現(xiàn)

設(shè)置定時(shí)器輸出38KPWM信號(hào),在記錄電平為0是輸出記錄時(shí)間的38K載波信號(hào),如果為1則不輸出載波,實(shí)現(xiàn)如下:

PWM生成設(shè)置(CubeMax自動(dòng)配置生成):

void MX_TIM5_Init(void){  TIM_MasterConfigTypeDef sMasterConfig = {0};  TIM_OC_InitTypeDef sConfigOC = {0};

  htim5.Instance = TIM5;  htim5.Init.Prescaler = 0;  htim5.Init.CounterMode = TIM_COUNTERMODE_UP;  htim5.Init.Period = 1896;  htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim5) != HAL_OK)  {    Error_Handler();  }  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)  {    Error_Handler();  }  sConfigOC.OCMode = TIM_OCMODE_PWM1;  sConfigOC.Pulse = 0;  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)  {    Error_Handler();  }  HAL_TIM_MspPostInit(&htim5);

}

發(fā)送實(shí)現(xiàn),注意點(diǎn)就是記錄為0時(shí)發(fā)載波,記錄為1時(shí)不發(fā)載波:

void InfraredSend(void){uint16_t Count = 0;
while(Count < gsInfrared.SampleCount &&  gsInfrared.State == END_STATE)    {if(gsInfrared.BitValue[Count] == 0)        {            TIM5->CCR2 = 948;            delay_us(gsInfrared.KeepTime[Count]);            TIM5->CCR2 = 0;        }else        {            TIM5->CCR2 = 0;            delay_us(gsInfrared.KeepTime[Count]);            TIM5->CCR2 = 0;        }

        Count ++;    }

    delay_us(20000);}

往PWM比較寄存器設(shè)置948即為設(shè)置38KPWM波,也可在初始化時(shí)固定948,在此函數(shù)內(nèi)啟停定時(shí)器即可;

至此,自學(xué)習(xí)功能的全部思路已實(shí)現(xiàn),通過(guò)對(duì)各個(gè)不同類(lèi)型的紅外遙控進(jìn)行功能測(cè)試,均成功。

PS:查看很多資料發(fā)現(xiàn)很多紅外解碼未判斷低電平時(shí)間,個(gè)人感覺(jué)不是很好,應(yīng)該是不僅高電平時(shí)間得符合,低電平時(shí)間也應(yīng)該符合。

自己寫(xiě)了一個(gè)小函數(shù)驗(yàn)證了一下,這個(gè)函數(shù)只是驗(yàn)證,未經(jīng)仔細(xì)推敲,還可優(yōu)化,僅供參考這一思想。

誤差設(shè)計(jì):±200us(拍腦袋值)

void InFraredDataDeal(void){uint32_t DataBuff = 0;uint16_t Count = 0;

if(gsInfrared.State == END_STATE)    {        gsInfraredData.State = 0;

do        {switch(gsInfraredData.State)            {case 0:   //引導(dǎo)碼識(shí)別            {

if(gsInfrared.KeepTime[0] >= 8800 && gsInfrared.KeepTime[0] <= 9200 && gsInfrared.BitValue[0] == 0)                {if(gsInfrared.KeepTime[1] >= 4300 && gsInfrared.KeepTime[1] <= 4700 && gsInfrared.BitValue[1] == 1)                    {if(gsInfrared.KeepTime[2] >= 360 && gsInfrared.KeepTime[2] <= 760 && gsInfrared.BitValue[2] == 0)                        {                            Count = 3;                            gsInfraredData.State = 1;                        }                    }else if(gsInfrared.KeepTime[1] >= 2300 && gsInfrared.KeepTime[1] <= 2700 && gsInfrared.BitValue[1] == 1)                    {if(gsInfrared.KeepTime[2] >= 360 && gsInfrared.KeepTime[2] <= 760 && gsInfrared.BitValue[2] == 0)                        {                            gsInfraredData.ReDataCount ++;                            gsInfraredData.State = 3;                        }                    }else                    {                        gsInfraredData.State = 3;                    }

                }else                {                    gsInfraredData.State = 3;                }



            }break;



case 1:   //數(shù)據(jù)解析            {

if(gsInfrared.KeepTime[Count + 1] >= 360 && gsInfrared.KeepTime[Count + 1] <= 760 && gsInfrared.BitValue[Count + 1] == 0)                {

if(gsInfrared.BitValue[Count] == 1)                    {if(gsInfrared.KeepTime[Count] >= 1480 && gsInfrared.KeepTime[Count] <= 1880)                        {                            DataBuff <<= 1;                            DataBuff |= 1;                        }else if(gsInfrared.KeepTime[Count] >= 360 && gsInfrared.KeepTime[Count] <= 760 && gsInfrared.BitValue[Count] == 1)                        {                            DataBuff <<= 1;                            DataBuff |= 0;                        }else                        {                            gsInfraredData.State = 3;                        }                    }                }

if(Count < gsInfrared.SampleCount)                {                    Count += 2;                }else                {                    gsInfraredData.State = 2;                }

            }break;

case 2:   //成功解析            {                gsInfraredData.Data = DataBuff;                gsInfraredData.State = 3;

            }break;

default:            {                gsInfraredData.State = 3;   //解析結(jié)束

            }break;            }

        }while(gsInfraredData.State != 3);

        gsInfrared.State = NONE_STATE;        gsInfrared.SampleCount = 0;    }

}

解析的話(huà)一般高位在前,所以左移,經(jīng)測(cè)試幀格式為:引導(dǎo)碼+用戶(hù)碼+用戶(hù)碼反碼+命令碼+命令碼反碼,能成功解析數(shù)據(jù)!解析的話(huà)根據(jù)具體協(xié)議,具體分析。

原文標(biāo)題:STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)

文章出處:【微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    23

    文章

    3246

    瀏覽量

    114715
  • 紅外遙控
    +關(guān)注

    關(guān)注

    22

    文章

    347

    瀏覽量

    45588
  • 原理
    +關(guān)注

    關(guān)注

    4

    文章

    550

    瀏覽量

    44891

原文標(biāo)題:STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)

    很早前就想實(shí)現(xiàn)這個(gè)紅外遙控自學(xué)習(xí)的這個(gè)實(shí)驗(yàn),用于來(lái)自己控制房子里如空調(diào)等紅外遙控設(shè)備的自動(dòng)化,N
    的頭像 發(fā)表于 12-29 09:49 ?2418次閱讀
    STM32之<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>信號(hào)<b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>實(shí)現(xiàn)</b>

    STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)

    STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)
    的頭像 發(fā)表于 09-18 15:52 ?3247次閱讀
    STM32之<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>信號(hào)<b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>實(shí)現(xiàn)</b>

    單片機(jī)紅外解碼的問(wèn)題

    本人在校學(xué)生,最近在想做基于51單片機(jī)的空調(diào)遙控器,空調(diào)型號(hào)(aux),但是不知道它的紅外協(xié)議是什么。在做了nec協(xié)議的解碼程序后,發(fā)現(xiàn)沒(méi)法識(shí)別。{:11:}求問(wèn):1.不知道空調(diào)的紅外協(xié)議能做出
    發(fā)表于 09-17 14:58

    自學(xué)習(xí)空調(diào)控制器

    最近的項(xiàng)目是做一個(gè)485控制的具有自學(xué)習(xí)功能的空調(diào)控制器,本來(lái)以為是個(gè)挺簡(jiǎn)單的紅外收發(fā),然后發(fā)現(xiàn)紅外編碼真的是個(gè)很復(fù)雜的事情,有沒(méi)有相關(guān)項(xiàng)目經(jīng)驗(yàn)的提供點(diǎn)思路和經(jīng)驗(yàn),謝謝大神
    發(fā)表于 08-31 12:55

    哪位有基于M3的紅外自學(xué)習(xí)模塊的程序嗎 求打賞

    我現(xiàn)在有一個(gè)紅外自學(xué)習(xí)的程序但是功能貌似沒(méi)有實(shí)現(xiàn)so哪位大神打賞一個(gè)參考參考
    發(fā)表于 12-12 21:53

    紅外遙控器怎么相互兼容?

    自學(xué)習(xí)紅外遙控器的設(shè)計(jì)與實(shí)現(xiàn)
    發(fā)表于 11-08 09:00

    紅外自學(xué)習(xí)芯片和紅外編解碼芯片之間的區(qū)別?

    紅外自學(xué)習(xí)芯片和紅外編解碼芯片之間的區(qū)別在哪里?
    發(fā)表于 04-07 11:37

    如何讓電機(jī)自學(xué)習(xí)

    變頻器換應(yīng)用場(chǎng)合,恢復(fù)出廠(chǎng)設(shè)置了,如何讓電機(jī)自學(xué)習(xí)? 經(jīng)常有人電話(huà)給我們,變頻器更換了應(yīng)用場(chǎng)合(為了省錢(qián)把變頻器最大化利用,你懂得)。比之前要求的環(huán)境呢精度要高,有沒(méi)有什么辦法。我們建議他讓電機(jī)
    發(fā)表于 12-24 16:04

    自學(xué)習(xí)紅外遙控器的設(shè)計(jì)與實(shí)現(xiàn)

    自學(xué)習(xí)紅外遙控器的設(shè)計(jì)與實(shí)現(xiàn) 給出了自學(xué)習(xí)紅外遙控
    發(fā)表于 05-04 21:43 ?7598次閱讀
    <b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>器的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    自學(xué)習(xí)紅外遙控器的設(shè)計(jì)與實(shí)現(xiàn)

     給出了自學(xué)習(xí)紅外遙控器的一種設(shè)計(jì),采用測(cè)量脈沖寬度的原理,適用于大多數(shù)電子產(chǎn)品的遙控器。介紹了轉(zhuǎn)發(fā)紅外信號(hào)的方法。 &nb
    發(fā)表于 05-09 12:08 ?2383次閱讀
    <b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>器的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    基于交流異步電機(jī)驅(qū)動(dòng)磨床進(jìn)給位移的自學(xué)習(xí)控制

    基于交流異步電機(jī)驅(qū)動(dòng)磨床進(jìn)給位移的自學(xué)習(xí)控制
    發(fā)表于 04-25 10:00 ?8次下載

    自學(xué)習(xí)差異進(jìn)化算法

    為解決動(dòng)態(tài)環(huán)境下的多中心優(yōu)化問(wèn)題,提出自學(xué)習(xí)差異進(jìn)化算法。通過(guò)評(píng)估特定個(gè)體檢測(cè)到環(huán)境變化,自學(xué)習(xí)算子將群體引至新的環(huán)境,并保持群體的拓?fù)浣Y(jié)構(gòu)不變,以繼續(xù)當(dāng)前的進(jìn)化趨勢(shì)。采用鄰域搜索機(jī)制加快算法的收斂
    發(fā)表于 03-13 16:46 ?0次下載

    利用單片機(jī)和軟件載波方式實(shí)現(xiàn)通用型紅外遙控的設(shè)計(jì)

    一種利用單片機(jī)設(shè)計(jì)通用自學(xué)習(xí)紅外遙控的方法,可以實(shí)現(xiàn)對(duì)多種產(chǎn)品紅外線(xiàn)遙控。本裝置采用了最小化模
    發(fā)表于 04-19 09:36 ?1399次閱讀
    利用單片機(jī)和軟件載波方式<b class='flag-5'>實(shí)現(xiàn)</b>通用型<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>的設(shè)計(jì)

    基于ESP8266智能家居自學(xué)習(xí)紅外遙控設(shè)計(jì) 單片機(jī)源代碼+PCB電路圖

    基于ESP8266智能家居自學(xué)習(xí)紅外遙控設(shè)計(jì) 單片機(jī)源代碼+PCB電路圖(51單片機(jī))-基于ESP8266智能家居自學(xué)習(xí)紅外
    發(fā)表于 07-22 15:11 ?88次下載
    基于ESP8266智能家居<b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>設(shè)計(jì) 單片機(jī)源代碼+PCB電路圖

    STM32之紅外遙控信號(hào)自學(xué)習(xí)實(shí)現(xiàn)

    紅外接收端,如果接收到紅外38K載波,則IR輸出為低電平,如果不是載波包括固定低電平和固定高電平則輸出高電平。
    發(fā)表于 02-08 15:08 ?6次下載
    STM32之<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>信號(hào)<b class='flag-5'>自學(xué)習(xí)</b><b class='flag-5'>實(shí)現(xiàn)</b>
    RM新时代网站-首页