stm32自带遥控怎么使用(STM32嵌入式-红外遥控)

本章我们将向大家介绍如何通过 STM32 来解码红外遥控器的信号。 开发板标配了红外接收头和一个很小巧的红外遥控器。在本章中,我们将利用 STM32 的外部中断功能,解码开发板标配的这个红外遥控器的编码信号,并将解码后的键值数据通过 printf 打印输出在串口助手上。 本章分为以下学习目标:

1. 了解红外遥控的解码原理

1.1 红外遥控简介简介

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

1、 8 位地址和 8 位指令长度;

2、地址和命令 2 次传输(确保可靠性)

3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”;

4、载波频率为 38Khz;

5、位时间为 1.125ms 或 2.25ms;

NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms( 560us 脉冲 1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲 560us 低电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低 1680us 高,逻辑 0 应该是 560us低 560us 高。NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(1)

ENC 特点如下:

1)协议规定低位首先发送。一串信息首先发送 9ms 的 AGC(自动增益 控制)的高脉冲,接着发送 4.5ms 的起始低电平,接下来是发送四 个字节的地址码和命令码,这四个字节分别为:地址码;地址码反 码;命令码;命令码反码。

2)如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以 110ms为周期的重复码。

3)接收到的信号是跟发送信号正好反向的。

2. 重复码的格式

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(2)

重复码的格式是由 9ms 的 AGC 高电平和 4.5ms 的低电平及一个 560us 的高电平

组成。

3. 逻辑“1”的表示

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(3)

逻辑 1 的是由 560us 的高电平和 1.69ms 的低电平组成的脉冲表示。

4. 逻辑“0”的表示

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(4)

5. ENC 的解码过程

一般 ENC 的解码过程为:

1) 产生下降沿,进入外部中断 15 的中断函数,延时一下之后检测 IO 口是否还是低电平,是就等待 9ms 的低电平过去。

2) 等待完 9ms 低电平过去,再去等待 4.5ms 的高电平过去。

3) 接着开始接收传送的 4 组数据

 先等待 560us 的低电平过去

 检测高电平的持续时间,如果超过 1.12ms 那么是高电平( 高电平的的持续时间为 1.69ms,低电平的持续时间为 565us。)

4) 检测接收到的数据和数据的反码进行比较,是否等到的数据是一 样的。

6.ENC 的解码函数为:

void EXTI15_10_IRQHandler(void) //红外遥控外部中断 { u8 Tim=0,Ok=0,Data,Num=0; while(1) { if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1) { Tim=HW_jssj();//获得此次高电平时间 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) { hw_jsm<<=1; hw_jsm =Data;if(Num>=32) { hw_jsbz=1; break; } } Num ; } } EXTI_ClearITPendingBit(EXTI_Line15); }

/************************************************************************** ***** * 函 数 名 : HW_jssj * 函数功能 : 高电平持续时间,将记录的时间保存在 t 中返回,其中一次大 约 20us * 输 入 : 无 * 输 出 : t *************************************************************************** ****/ u8 HW_jssj() { u8 t=0; while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1)//高电平 { t ; delay_us(20);if(t>=250) return t;//超时溢出 } return t; }

1.2 电路设计

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(5)

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(6)

从上图我们可以看出,红外接收头使用的是一跟数据线传输数据,跟 DS18B20 差不多。我们开发板上面使用的单片机的 PG15 口。

1.3 例程主函数

/**************************************************************************** * Function Name : main * Description : Main program. * Input : None* Output : None * Return : None ****************************************************************************/ int main() { hwjs_init(); //红外接口初始化 printf_init(); //printf 初始化 while(1) { if(hw_jsbz==1) //如果红外接收到 { hw_jsbz=0; //清零 printf("红外接收码 %0.8X\r\n",hw_jsm); //打印 hw_jsm=0; //接收码清零 } } }

主程序的效果是,解码红外遥控的键值,将其地址码和反码还有控制码及反码通过 printf 输

出到串口助手上,如下:

stm32自带遥控怎么使用(STM32嵌入式-红外遥控)(7)

当程序下载进去后,打开串口,对 DTR 前进行勾选,然后在取消。再通过发送字符即可显示。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页