国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

這篇具有很好參考價(jià)值的文章主要介紹了STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.NEC協(xié)議

?????????紅外遙控是一種比較常用的通訊方式,目前紅外遙控的編碼方式中,應(yīng)用比較廣泛的是NEC協(xié)議。NEC協(xié)議的特點(diǎn)如下:

  1. 載波頻率為 38KHz
  2. 8位地址和 8位指令長度
  3. 地址和命令2次傳輸(確??煽啃裕?/span>
  4. PWM 脈沖位置調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”

????????其邏輯1與邏輯0的表示如圖所示

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

????????可以看到,邏輯1的位時(shí)間為2.25ms,脈沖時(shí)間560us;邏輯0的位時(shí)間為1.12ms,脈沖時(shí)間560us。

????????一個(gè)完整的NEC數(shù)據(jù)包如下:

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

????????首次發(fā)送的是9ms高電平+4.5ms低電平,為引導(dǎo)碼。

????????接下來是8bit的地址碼+8bit地址碼的反碼+8bit命令碼+8bit命令碼的反碼。

????????以上是一個(gè)正常的數(shù)據(jù)包,但可能存在一種情況:當(dāng)長按某個(gè)鍵時(shí),發(fā)送的是以110ms為周期的重復(fù)碼,如下圖:

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

????????重復(fù)碼由9ms高電平和2.25ms的低電平以及560us的高電平組成。

2.解碼程序

????????在上面的圖中可以看到,邏輯1和邏輯0的位時(shí)間是不同的,占空比也不同。所以我們可以根據(jù)位時(shí)間的長短來解碼,也可以根據(jù)占空比的不同(1/2或1/4)來解碼,或者二者同時(shí)作為解碼條件。這里我們介紹根據(jù)位時(shí)間來解碼。

????????需要注意的是,很多紅外一體接收頭為了提高接受靈敏度。輸入高電平,其輸出的是相反的低電平。下圖為示波器實(shí)際捕獲的一組數(shù)據(jù):

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

?

????????可以看到,空閑時(shí)為高電平,引導(dǎo)碼為9ms低電平+4.5ms高電平。根據(jù)位時(shí)間解碼的話,我們就不必關(guān)系高低電平各自的時(shí)間,只需關(guān)系總時(shí)間就行,即:引導(dǎo)碼-13.5ms,邏輯1-2.25ms,邏輯0-1.12ms。

????????首先用STM32CubeMx配置定時(shí)器。系統(tǒng)時(shí)鐘等的配置這里不在贅述,參考其它教程。

????????這里使用TIM3的Channel1作為捕獲通道配置如下:

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

  1. 定時(shí)器時(shí)鐘為內(nèi)部時(shí)鐘
  2. Channel1配置為輸入捕獲模式
  3. 分頻系數(shù)為63,因?yàn)橄到y(tǒng)時(shí)鐘為64M,這樣定時(shí)器實(shí)際時(shí)鐘為64/(63+1)=1M,主要是為了程序中方便計(jì)算。
  4. 捕獲方式為下降沿捕獲
  5. 最后別忘了打開定時(shí)器的中斷

STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼

????????最后生成代碼。在生成的TIM3中斷函數(shù)中,屏蔽生成的中斷處理還是,添加自己的解碼程序如下:

uint32_t TIM3_Over_Cnt = 0;//tim3溢出次數(shù)
uint32_t TIM3_Sum_Cnt = 0;//兩次下降沿之間的時(shí)間間隔
uint32_t cnt0 = 0;
uint8_t IR_Data[60];

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
//  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */
    if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE))      //定時(shí)器溢出中斷
    {
        __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);    //清除中斷標(biāo)記
        TIM3_Over_Cnt++;
    }
    cnt0 = __HAL_TIM_GET_COUNTER(&htim3);
    TIM3_Sum_Cnt = (TIM3_Over_Cnt << 16) + cnt0;//獲取計(jì)數(shù)器的值
    __HAL_TIM_SetCounter(&htim3,0);//清零重新計(jì)數(shù)
    TIM3_Over_Cnt = 0;//清零重新計(jì)數(shù)

    if (__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_CC1) != RESET)//TIM3CH1捕獲中斷
    {
       if(StartRevFlag == 1)//接收到引導(dǎo)碼,開始解碼
       {
         if(TIM3_Sum_Cnt > 36000)//大于36ms認(rèn)為是結(jié)束
         {
           RevComplete = 1;//解碼完成
           IR_Tick = 0;
         }
         else if(RevComplete == 0)
         {
           if(TIM3_Sum_Cnt > 1000 && TIM3_Sum_Cnt < 1300)//1ms~1.3ms認(rèn)為是低電平
            IR_Data[IR_Idx] = 0;
           else  if(TIM3_Sum_Cnt > 2100 && TIM3_Sum_Cnt < 2400)//2.1ms~2.4ms認(rèn)為是高電平
            IR_Data[IR_Idx] = 1;
           else //接收錯(cuò)誤,重新開始
             StartRevFlag = 0;
           IR_Idx++;
           if(IR_Idx > 59)
             IR_Idx = 59;
        }

       }
       else
       {
         if(TIM3_Sum_Cnt > 13000 && TIM3_Sum_Cnt < 14000)//13~14ms引導(dǎo)碼
         {
           StartRevFlag = 1;
         }
         IR_Tick = 0;
         RevComplete = 0;//解碼完成標(biāo)志置零
         IR_Idx = 0;//有效解碼位
         TIM3_Over_Cnt = 0;
         TIM3_Sum_Cnt = 0;//定時(shí)器計(jì)數(shù)清零
       }
        __HAL_TIM_CLEAR_IT(&htim3, TIM_IT_CC1);
    }

  /* USER CODE END TIM3_IRQn 1 */
}

????????解碼程序根據(jù)每次捕獲下降沿之間的間隔判斷是引導(dǎo)碼還是邏輯1或邏輯0。接收到引導(dǎo)碼之后,再開始將解碼的數(shù)據(jù)保存下來。最后通過也是時(shí)長來判斷解碼結(jié)束。這里沒有判斷重復(fù)碼,有興趣的小伙伴可以自己加上。

?????????中斷函數(shù)中,只是將每一位解碼并保存,最后還需要在主程序中組合成字節(jié)并判斷處理。

void IR_Rev()
{
  uint8_t num = IR_Idx / 8;
  uint8_t IRValue[8];

  if(RevComplete == 1 && StartRevFlag == 1 && IR_Tick > 20)
  {
    if(num > 7)
      num = 7;

    for(uint8_t j=0;j<num;j++)//將每一位解碼數(shù)據(jù)組合成字節(jié)數(shù)據(jù)
    {
      for(uint8_t i = 0;i< 8;i++)
      {
        IRValue[j] = IRValue[j]>>1;
        if(IR_Data[j*8+i])
          IRValue[j] |= 0x80;
      }
    }
    if(IRValue[0] == 0x00 && IRValue[1] == 0xFF)//地址碼正確
    {
      switch(IRValue[2])//判斷數(shù)據(jù)碼
      {
        case 0x46:
          KeyValue = S_key_Menu;
          break;
        case 0x43:
          KeyValue = S_key_Set;
          break;
        case 0x40:
          KeyValue = S_key_Rst;
          break;
        case 0x15:
          KeyValue = S_key_Down;
          break;
        case 0x09:
          KeyValue = S_key_Up;
          break;
      }
    }
    StartRevFlag = 0;
    RevComplete = 0;
    IR_Tick = 0;
  }
}

???????文章來源地址http://www.zghlxwxcb.cn/news/detail-436833.html

到了這里,關(guān)于STM32定時(shí)器實(shí)現(xiàn)紅外接收與解碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)

    STM32使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)

    目前開發(fā)STM32普遍使用HAL庫,但 HAL 庫封裝的延時(shí)函數(shù)目前僅支持 ms 級(jí)別的延時(shí),日常很多情況下會(huì)用到 us 延時(shí),特別是一些傳感器的數(shù)據(jù)讀取過程,對(duì)時(shí)序要求比較嚴(yán)格,us 延時(shí)必不可少,因此我們今天來介紹STM32如何使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)。 Keil 5 STM32CubeMX STM

    2024年02月12日
    瀏覽(18)
  • STM32不使用中斷實(shí)現(xiàn)定時(shí)器微秒級(jí)精確延時(shí)

    STM32不使用中斷實(shí)現(xiàn)定時(shí)器微秒級(jí)精確延時(shí)

    我們?cè)趯懘a的時(shí)候避免不了要使用延時(shí)函數(shù),很多延時(shí)函數(shù)都是使用中斷或者tick來實(shí)現(xiàn)的,tick的方式最大到毫秒ms級(jí)別,通過中斷方式的通用定時(shí)器來實(shí)現(xiàn),如果實(shí)現(xiàn)1us的延時(shí)那么每1us就來一次中斷,很影響cpu的效率。 本文提供一種 不使用中斷 ,并且很簡單的方式實(shí)現(xiàn)的

    2024年04月11日
    瀏覽(21)
  • STM32+摁鍵與定時(shí)器實(shí)現(xiàn)Led燈控制(中斷)

    STM32+摁鍵與定時(shí)器實(shí)現(xiàn)Led燈控制(中斷)

    中斷作為單片機(jī)開發(fā)必須掌握的內(nèi)容,它能夠在不搭載操作系統(tǒng)的情況下讓我們體驗(yàn)多任務(wù)處理的快感,保證了高優(yōu)先級(jí)任務(wù)的實(shí)時(shí)性,同時(shí)系統(tǒng)中斷也能夠提供給用戶在核心發(fā)生錯(cuò)誤之后進(jìn)行處理的機(jī)會(huì)。STM32F103系列單片機(jī)中斷非常強(qiáng)大,每個(gè)外設(shè)都可以產(chǎn)生中斷,F(xiàn)103 在

    2024年02月04日
    瀏覽(17)
  • 【STM32】STM32學(xué)習(xí)筆記-定時(shí)器定時(shí)中斷 定時(shí)器外部時(shí)鐘(14)

    【STM32】STM32學(xué)習(xí)筆記-定時(shí)器定時(shí)中斷 定時(shí)器外部時(shí)鐘(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中斷服務(wù)函數(shù) 參考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定時(shí)器定時(shí)中斷.rar 10-定時(shí)器外部時(shí)鐘.rar 參考: 【STM32】江科大STM32學(xué)習(xí)筆記匯總

    2024年02月03日
    瀏覽(97)
  • 基于STM32CubeMX和keil采用STM32F407的基本定時(shí)器中斷實(shí)現(xiàn)LED閃爍

    基于STM32CubeMX和keil采用STM32F407的基本定時(shí)器中斷實(shí)現(xiàn)LED閃爍

    定時(shí)器有三種,基本定時(shí)器,通用定時(shí)器,以及高級(jí)定時(shí)器。 這篇博客以最簡單的基本定時(shí)器為例,實(shí)現(xiàn)LED的閃爍。 后面兩種定時(shí)器的用法后面再寫。 實(shí)現(xiàn)功能: TIM6控制LED每隔0.5s變一次狀態(tài)。 TIM7控制LED1常量2s后熄滅。 因?yàn)槎际怯玫絃ED,所以和上一篇基于STM32CubeMX與keil采

    2024年02月04日
    瀏覽(25)
  • STM32定時(shí)器編碼器模式實(shí)現(xiàn)直流有刷電機(jī)測(cè)速(HAL庫)

    STM32定時(shí)器編碼器模式實(shí)現(xiàn)直流有刷電機(jī)測(cè)速(HAL庫)

    最近在做一個(gè)單片機(jī)大作業(yè),要用到直流有刷,在這里把學(xué)習(xí)編碼器的知識(shí)記錄一下,學(xué)習(xí)參考資料: 正點(diǎn)原子DMF407電機(jī)控制專題教程_V1.0 我所使用的編碼器是市面上常見的 磁電增量式編碼器 ,其有AB兩相,用于輸出電機(jī)轉(zhuǎn)動(dòng)時(shí)的 脈沖數(shù) ,AB兩相的先后順序決定了電機(jī)的

    2023年04月24日
    瀏覽(33)
  • HAL STM32基于系統(tǒng)滴答定時(shí)器(SysTick)實(shí)現(xiàn)多任務(wù)時(shí)間片輪詢

    HAL STM32基于系統(tǒng)滴答定時(shí)器(SysTick)實(shí)現(xiàn)多任務(wù)時(shí)間片輪詢

    ??RTOS(實(shí)時(shí)操作系統(tǒng))和定時(shí)器時(shí)間片輪詢是兩種不同的任務(wù)調(diào)度和執(zhí)行方式的差異簡介 ?? 以下部分內(nèi)容,由AI給出的解答: ??RTOS(實(shí)時(shí)操作系統(tǒng)): ??RTOS是一種專門設(shè)計(jì)用于實(shí)時(shí)系統(tǒng)的操作系統(tǒng),它可以有效地管理多個(gè)任務(wù),提供任務(wù)調(diào)度、同步和通信等功能。 ??

    2024年02月21日
    瀏覽(20)
  • STM32定時(shí)器-定時(shí)器中斷功能詳解

    STM32定時(shí)器-定時(shí)器中斷功能詳解

    STM32的眾多定時(shí)器中我們使用最多的是高級(jí)定時(shí)器和通用定時(shí)器,而高級(jí)定時(shí)器一般也是用作通用定時(shí)器的功能,下面我們就以通用定時(shí)器為例進(jìn)行講解,其功能和特點(diǎn)包括: 通用與基本定時(shí)器(2~7)位于低速的APB1總線上 高級(jí)定時(shí)器(1、8)位于高速的APB2總線上 自動(dòng)裝載計(jì)

    2024年02月08日
    瀏覽(108)
  • STM32CUBEMX配置 定時(shí)器中斷 和 上升沿中斷(實(shí)現(xiàn)檢測(cè)1s以內(nèi)的脈沖個(gè)數(shù))

    STM32CUBEMX配置 定時(shí)器中斷 和 上升沿中斷(實(shí)現(xiàn)檢測(cè)1s以內(nèi)的脈沖個(gè)數(shù))

    ———————————————————————————————————— ? 大家好哇!我是小光,嵌入式愛好者,一個(gè)想要成為系統(tǒng)架構(gòu)師的大三學(xué)生。 ?最近在開發(fā)一個(gè)STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驅(qū)動(dòng),包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    瀏覽(16)
  • STM32——定時(shí)器——定時(shí)中斷

    STM32——定時(shí)器——定時(shí)中斷

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 本節(jié)先只講解定時(shí)器的定時(shí)中斷,內(nèi)外中斷源選擇。 TIM(Timer)定時(shí)器 定時(shí)器可以 對(duì)輸入的時(shí)鐘進(jìn)行計(jì)數(shù) ,并在計(jì)數(shù)值達(dá)到設(shè)定值時(shí)觸發(fā)中斷。 16位計(jì)數(shù)器、預(yù)分頻器、自動(dòng)重裝寄存器的時(shí)基單元 ,

    2024年04月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包