STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式

发布时间:2023-07-26  

概述

本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。

硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

选择芯片型号

在这里插入图片描述

配置时钟源

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:

在这里插入图片描述

串口配置

本次实验使用的串口1进行串口通信,波特率配置为115200。

在这里插入图片描述

在这里插入图片描述

定时器配置

本次使用定时器1的通道2进行检测,配置入下。

在这里插入图片描述

红外接收管

这里使用VS838的接收管,如下所示:

在这里插入图片描述

红外编码

NEC协议载波:38khz

其逻辑1与逻辑0的表示如图所示:

在这里插入图片描述

NEC协议格式:

在这里插入图片描述

自定义红外编码

协议如下:

在这里插入图片描述

代码

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。


/* USER CODE BEGIN Includes */

#include "stdio.h"

/* USER CODE END Includes */

红外接收口定义


/* USER CODE BEGIN PTD */

#define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)

/* USER CODE END PTD */

函数声明和串口重定向:


/* USER CODE BEGIN PFP */

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE

{

    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

uint32_t OrderData = 0;

uint8_t ReadyFlag = 0;

uint8_t OK = 0;

/* USER CODE END 0 */

定时器配置


/* USER CODE BEGIN 2 */

    HAL_TIM_Base_Start_IT(&htim1);//启动定时器

    HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断

    printf("IR Capture !! 

");

  /* USER CODE END 2 *

红外接收代码


[4400,5000]是用于捕获4.5ms的信号

[550,700]是用于捕获560us的数据0信号

[1100,1250]是用于捕获1120us的数据1信号

[2000,2500]是用于捕获2240us的截止位信号

/* USER CODE BEGIN 4 */

// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

    uint32_t fallingCount = 0 ; // 下降沿计数

    uint8_t temp = 0 ;

    // 判断是否是定时器1的外部捕获口2

    if(htim->Instance == TIM1)

    {

        // 捕获到了上升沿

        if(IR_IN1)

        {

            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获

            __HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计

        }

        else

        {

            fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间

            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获

            if( ((fallingCount > 4400) && (fallingCount <5000))) 

                OK = 1;/// 4.5ms引导电平

            else if (((fallingCount > 550) && (fallingCount < 700)))    

            {

                temp = 0;//560 us,数据为0

            }   

            else if (((fallingCount > 1100) && (fallingCount < 1250)))

            {


                temp = 1;//1120 us,数据为1

            }


            else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))   //2.240ms截止码

            {

              ReadyFlag = 1 ;

                OK = 0;

            }

            if(OK)

            {

                OrderData <<= 1 ;

                OrderData += temp ;

                KeyCount = 0; // 按键次数

            }

        }

    }

}

/* USER CODE END 4 */

主函数


/* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

        if(ReadyFlag)

        {

            printf("order=%08X , code=%d

",OrderData,OrderData);

            OrderData = 0;

            OK = 0;

            ReadyFlag = 0;      

        }

  }

  /* USER CODE END 3 */

结果演示

红外连续发送5次码值,发送分别为

  • 1011(11)

  • 11 1010(58)

  • 11 0001(49)

  • 11 1111(63)

  • 11 0011(51)

分别如下所示:

在这里插入图片描述


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    基于物联网的远程温湿度监测系统(1):创建云端产品,烧录Gagent;前言 本文通过使用STM32F103C8T6作为主控MCU,ESP8266作为数据透传模块,接入机智云AIoT云平台,通过......
    -12S,配置方式不一样,具体可参考下文: 入门教程3:如何给ESP8266烧录Gagent固件,快速接入机智云实现透传功能 ESP8266接线方式 我这里也查看自己的模块型号,确定SPI Flash......
    空调遥控功能的实现。要实现这个功能,首先要获取空调遥控器板上红外按钮的值。 ESP8266 使用红外接收器获取空调的红外键值,并将该红外键值烧录到 ESP8266WIFI 模块中。然后将ESP8266......
    步骤一步一步来,五分钟内完成!有手就行! 2 给ESP8266模块烧录固件 接下来,我们还需要给ESP8266模块烧录固件。(下面步骤是针对乐鑫ESP8266模块进行串口模式烧写流程,ESP8266的购......
    云的官方文档给了我极大帮助。 ③esp8266烧录对于供电要求十分苛刻,导致多次烧录都失败了,所以在制pcb的时候加上了esp8266烧录接口,以及GPIO的接地开关,还有复位电路。PCB扩展......
    从5方面描述STM32F407+ESP8266连接机智云过程;一、硬件组成如下图所示: 硬件全家福: STM32F407ZGT6+ESP8266 二、下载通用APP DEMO: 1.在应......
    STM32驱动ESP8266连接阿里云(1)----使用AT指令连接阿里云;烧录MQTT固件 购买的ESP8266一般没带MQTT固件,所以无法通过MQTT指令与云平台通信,需要烧录......
    市场需要,Atmel当然也可以再恢复生产AT89C51。   51单片机连接ESP8266串口WiFi模块   引脚连接      烧录固件   打开烧录软件,选择配置选项卡,点击......
    WIFI_ESP8266通信系统设计;实验任务 任务:基于 和 底板 完成WIFI_ESP8266通信系统设计并观察调试结果 要求:通过手机或电脑网络调试助手给ESP8266模块发送数据,FPGA......
    STM32驱动ESP8266连接阿里云(2)----接入阿里IoT Studio实现Web可视化;烧录MQTT固件 概述 阿里IoT Studio是一个物联网开发平台,可用......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>