STM32CubeMX系列 | 红外遥控

发布时间:2023-03-23  

1. 红外遥控简介

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。红外遥控通讯系统一般由红外发射装置和红外接收设备两部分组成。

1.1 红外发射装置

红外发射装置(红外遥控器)是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管(目前使用的红外线波长多为940nm)。红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,红外遥控器将遥控信号(二进制脉冲码)调制在38kHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。

二进制脉冲码目前最广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制)。本例程遥控器使用的是NEC协议,其特征如下:

- 8位地址和8位指令长度
- 地址和命令2次传输(确保可靠性)
- PWM脉冲位置调制,以发射红外载波的占空比代表0和1
- 载波频率为38kHz
- 位时间为1.125ms或2.25ms

NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0传输需要1.125ms(560us脉冲+560us低电平)。 而红外接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样在接收头端收到的信号为:逻辑1应该是560us低电平+1680us高电平,逻辑0应该是560us低电平+560us高电平。所以可以通过计算高电平时间判断接收到的数据是0还是1。

NEC 码位定义时序图如下图

NEC 遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。引导码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下:

NEC 码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms 高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发射连发码,可以通过统计连发码的次数来标记按键按下的长短或次数。

1.2 红外接收设备

红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、 检波、整形,形成遥控指令脉冲,输出至遥控微处理器。 由于红外接收头在没有脉冲的时候为高电平,当收到脉冲的时候为低电平,所以可以通过外部中断的下降沿触发中断,在中断内通过计算高电平时间来判断接收到的数据是0还是1。

2. 硬件设计

D1指示灯用来提示系统运行状态,红外遥控器用来发射红外键值的编码信号,通过红外接收头进行解码,并将解码后的数据通过串口1打印输出

  • D1指示灯

  • USART1

  • 红外遥控器和红外接收头

  • TIM7(提供us延时)

3. 软件设计

3.1 STM32CubeMX设置

  • RCC设置外接HSE,时钟设置为72M

  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位

  • PG15设置为GPIO中断模式、引脚设为上拉(红外接收头在没有脉冲的时候为高电平)、下降沿触发中断,NVIC中开启中断并设置优先级

  • 激活TIM7,预分频因子设为72-1,向上计数,自动重载值为65535;因此计数器CNT_CLK = 1MHz,计数器周期为1us

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码

3.2 MDK-ARM编程

  • 在tim.c文件下实现微秒延时(us)函数

void delay_us(uint16_t us){

    uint16_t differ = 0xffff-us-5;              

    __HAL_TIM_SET_COUNTER(&htim7,differ);   //设定TIM7计数器起始值

    HAL_TIM_Base_Start(&htim7);     //启动定时器 


    while(differ < 0xffff-5){   //判断

        differ = __HAL_TIM_GET_COUNTER(&htim7);     //查询计数器的计数值

    }

    HAL_TIM_Base_Stop(&htim7);

}

创建按键驱动文件irremote.c 和相关头文件irremote.h

uint8_t IR_HighLevelPeriod(void){   //高电平持续时间函数

    uint8_t t=0;

    while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_15)==1){  //高电平

        t++;

        delay_us(20);

        if(t>=250) return t;    //超时溢出

    }

    return t;

}

//在中断回调函数中完成红外解码

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){     //红外遥控外部中断回调函数

    uint8_t Tim=0,Ok=0,Data,Num=0;

    while(1){

        if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_15)==1){

             Tim = IR_HighLevelPeriod();    //获得此次高电平时间


             if(Tim>=250) 

                break;      //无用的信号

             if(Tim>=200 && Tim<250)

                Ok=1;       //收到起始信号

             else if(Tim>=60 && Tim<90)

                Data=1;     //收到数据1

             else if(Tim>=10 && Tim<50)

                Data=0;     //收到数据0


             if(Ok==1){

                receive_Code <<= 1;

                receive_Code += Data;

                if(Num>=32){

                    receive_Flag=1;

                    break;

                }

             }

             Num++;

        }

    }

}

在main.c文件下编写红外遥控测试代码

int main(void){

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_TIM7_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  printf("IR Remote testing...please press the controller!!!rn");

  /* USER CODE END 2 */

  while (1){

    if(receive_Flag == 1){

        receive_Flag = 0;

        printf("IR Received Code: %0.8xrn",receive_Code);

        receive_Code = 0;

    }       

    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);

    HAL_Delay(200);

  }

}

4. 下载验证

编译无误下载到开发板后,可以看到D1指示灯不断闪烁,当按下红外遥控器按键时,串口将打印出解码后的数据(地址码+地址反码+控制码+控制反码)


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

相关文章

    基于51单片机的红外遥控器设计;引言 人们的生活已经全面迈入了信息化的时代,使用红外遥控的家电种类开始增多,在日常生活中利用红外遥控来控制红外控制的家电种类非常的多,普通的家电就有:电视、DVD机......
    接收设备两部分组成。 1.1 红外发射装置 红外发射装置(红外遥控器)是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管(目前使用的红外线波长多为940nm)。红外遥控器......
    红外遥控接收模块+普中51单片机+江科大自化协;1 实验现象   LCD1602上显示红外解码遥控器地址、键值。通过红外遥控器,按下某个按键时,遥控器通过红外发光二极管发射红外线,红外......
    TC9012F为核心的9012型红外遥控器被广泛使用且价格便宜。将设计的基于单片机AT89C51的9012型红外遥控解码器应用于生产即时显示系统中,作为参数设置和系统控制用红外遥控器,在实......
    基于CW32L083的空调遥控器方案设计;红外遥控技术在我们日常生活中的应用可以说是非常广泛了,凡是涉及到遥控人们第一个想到的就是红外遥控红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外......
    管、三极管、示波器、可调电源等 常用的基础元器件列队 电池类 电机类 仪器,仪表类 单片机与集成电路类 传感器 再来看个有意思的仿真 红外遥控信号测量 我们可以看到当遥控按下时,示波器上会出现遥控器......
    红外遥控电机调速+普中51单片机+江科大自化协;1 实验现象    基于STC89C52单片机设计一个红外遥控直流电机调速系统。一上电,数码管上显示0,此时直流电机不转动。当按下红外遥控器上的“1......
    型的莫过于电视机、空调等家用电器通过红外遥控器进行控制。随着科技的进步,大众生活水平的不断提高,人们对家居智能化的要求也越来越高,诸如灯光控制、背景音乐、安防报警等方面也逐渐开始转向智能化控制。 红外......
    使用AT89S51单片机制作红外遥控器,;本文档的主要内容详细介绍的是使用AT89S51单片机制作红外遥控器的资料和源代码详细说明。 一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz......
    解码NEC协议的红外遥控信号,如果拿一款别的遥控器来,编码协议未知,整个程序就无能为力了;   3. 接收到信号时实时解码,没有保存红外波形信息,不能输出波形进行分析;   4. 只能发送NEC协议的红外遥控......

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

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

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

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

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

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

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