【STM32CubeMX学习】定时器输入捕获读取红外NEC码

1、NEC编码介绍

NEC Protocol是目前广泛使用的红外遥控的编码,其载波频率位为38khz,即每秒可产生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会发一个重复码。

9ms的有效脉冲 + 2.25ms的空闲间隔 ,总时长为11.25ms。

 2、STM32CubeMX配置

原理图如下:

STM32CubeMX配置如下:

分频系数为71,而主频为72mhz,因此定时器频率为72mhz/(71+1)=1mhz,即每1µs计数一次。

计数方式为向上计数。

自动加载值为最大值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 */
}

在main函数里打印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