[STM32CubeMX 学習] タイマー入力キャプチャが赤外線 NEC コードを読み取ります

1. NECコーディング入門

NEC プロトコルは、現在広く使用されている赤外線リモコンのコードで、その搬送波周波数は 38khz、つまり 1 秒間に 38000 パルスを生成でき、各パルス周期は 1000000us/38000=26.3us です。

NEC プロトコルは、パルス間隔を使用してデータの各ビットをエンコードし、異なるデータ ビットの時間間隔を使用して異なる論理ビットを表します。

送信データの上位ビットが先になります。

注:リモコン受信機は、パルスを受信するとロー レベルになり、アイドル状態になるとハイ レベルになります

論理「0」: 562.5µs のアクティブ パルス + 562.5µs のアイドル間隔、合計 1.125ms。

論理「1」: 562.5µs のアクティブ パルス + 1.6875ms のアイドル間隔、合計 2.25ms の持続時間。

開始ビット: 9ms の有効パルス + 4.5ms のアイドル間隔、合計持続時間は 13.5ms です。

 これに基づいて、NEC はデータのフレームを送信します: 開始ビット + アドレス コード + アドレス コード反転 + コマンド コード + コマンド コード反転

 リピートコード: ボタンを押し続けると、データのフレームを送信した後、110ms ごとにリピートコードが送信されます。

9 ミリ秒のアクティブ パルス + 2.25 ミリ秒のアイドル インターバル、合計持続時間は 11.25 ミリ秒です。

 2.STM32CubeMX の設定

概略図は次のとおりです。

STM32CubeMX は次のように構成されます。

分周比は71でメイン周波数は72mhzなので、タイマー周波数は72mhz/(71+1)=1mhz、つまり1μsに1回カウントします。

カウント方法はカウントアップです。

オートロード値は最大値の 65535 で、65.535µs でオーバーフローします。これはすべてのロジック ビットよりも大きいため、オーバーフローについて心配する必要はありません。

自動ロードを有効にします。

立ち下がりエッジ トリガー。

 

 割り込み有効、ピンセットプルアップ。

3. コード分析 NECコード

TIM3の初期化後にインプットキャプチャを開始

  /* USER CODE BEGIN TIM3_Init 2 */
  
  HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3); //启动输入捕获

  /* USER CODE END TIM3_Init 2 */

 グローバル変数を定義する

uint16_t IRTimer_Data = 0;//存放计数值
uint32_t IRCode = 0;//存放红外码
uint8_t IR_Flag = 0;//IR解析完成标志位
uint8_t IR_LeaderCode = 0;

割り込み処理機能と解析機能

/* USER CODE BEGIN 4 */
void Paser_IRCode(uint16_t PData)
{  
  if((PData>12000)&&(PData<15000))//获得引导码,理论值13500
    IR_LeaderCode = 1;

  if(IR_LeaderCode==1)
  {
    if((PData>1000)&&(PData<1300))//0,理论值1125
    {
      IRCode=(IRCode<<1);
      i++;
    }
    else if((PData>2000)&&(PData<2500))//1,理论值2250
    {
      IRCode = (IRCode<<1)|0x01;
      i++;
    }
    if(i==32)
    {
      i = 0;
      IR_LeaderCode = 0;
      IR_Flag = 1;
    }
  }
}

void TIM_IRQHandler(void)
{	
    IRTimer_Data = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3);//获取当前的捕获值. 
    __HAL_TIM_SET_COUNTER(&htim3,0);   //设置计数寄存器的值变为0
    Paser_IRCode(IRTimer_Data);
}

関数を割り込み関数に入れることを忘れないでください

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */
  
  /* USER CODE END TIM3_IRQn 0 */
  TIM_IRQHandler();
  /* USER CODE BEGIN TIM3_IRQn 1 */
  
  /* USER CODE END TIM3_IRQn 1 */
}

メイン関数でNECコードを出力

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    
    if(IR_Flag ==1) 
    {
      printf("%08x\r\n",IRCode);
      IR_Flag = 0;
    }

  }
  /* USER CODE END 3 */

リモコンのボタン 1 を押した結果は、アドレスコードが 0x00、アドレスの反転が 0xff、コマンドコードが 0x68、コマンドの反転が 0x97 であることがわかります。

おすすめ

転載: blog.csdn.net/weixin_46183891/article/details/123455852