红外通信

Posted zhj868

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红外通信相关的知识,希望对你有一定的参考价值。

红外线系统一般由红外发射装置和红外接收设备两大部分组成。

红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。

红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。

常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。

 

 

红外线接收

 

 红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处理器。近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VOUT)。在使用时注意成品红外接收头的载波频率,另外在遥控编码芯片输出的波形与接收头端收到的波形。

 

 技术图片

 

 正对接收头的突起处看,从左至右,管教以此是1:vout,2:GND,3:VCC

 

由于红外接收头在没有脉冲的时候为高电平,当收到脉冲的时候为低电平,
所以可以通过外部中断的下降沿触发中断,在中断内通过计算高电平时间来判断 接收到的数据是 0 还是 1。

 

 

红外发射管

红外遥控发射装置,也就是通常我们说的红外遥控器是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管。它实际上是一只特殊的发光二极管;由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它便发出的是红外线而不是可见光。目前大量的使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通φ5发光二极管相同。

技术图片

 

 

 红外遥控器发射

通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。

二进制脉冲码的形式有多种,其中最为常用的是NEC协议的PWM码(脉冲宽度调制码)Philips RC-5 Protocol协议PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)如果要开发红外接收设备,一定要知道红外遥控器的编码方式和载波频率,我们才可以选取一体化红外接收头和制定解码方案。

技术图片

 

NEC协议的PWM码特征:

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

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

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

4、载波频率为 38Khz;

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

 

      用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM。

 

 

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

 技术图片

 

 

 

NEC 遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反
码。编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。引导码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反 码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发 送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下:

技术图片

 

 

 

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

 

红外数值如何读取(代码)

 1 /*******************************************************************************
 2 * 函 数 名         : delay
 3 * 函数功能           : 延时函数,i=1时,大约延时10us
 4 *******************************************************************************/
 5 void delay(u16 i)
 6 {
 7     while(i--);    
 8 }
 9 
10 
11 
12 
13 /*******************************************************************************
14 * 函数名         : ReadIr()
15 * 函数功能           : 读取红外数值的中断函数
16 * 输入           : 无
17 * 输出              : 无
18 *******************************************************************************/
19 
20 void ReadIr() interrupt 0
21 {
22     u8 j,k;
23     u16 err;
24     Time=0;                     
25     delay(700);    //7ms
26     if(IRIN==0)        //确认是否真的接收到正确的信号
27     {     
28         
29         err=1000;                //1000*10us=10ms,超过说明接收到错误的信号
30         /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
31         侯,程序死在这里*/    
32         while((IRIN==0)&&(err>0))    //等待前面9ms的低电平过去          
33         {            
34             delay(1);
35             err--;
36         } 
37         if(IRIN==1)            //如果正确等到9ms低电平
38         {
39             err=500;
40             while((IRIN==1)&&(err>0))         //等待4.5ms的起始高电平过去
41             {
42                 delay(1);
43                 err--;
44             }
45             for(k=0;k<4;k++)        //共有4组数据
46             {                
47                 for(j=0;j<8;j++)    //接收一组数据    
48                 {
49 
50                     err=60;        
51                     while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
52                     {
53                         delay(1);
54                         err--;
55                     }
56                     err=500;
57                     while((IRIN==1)&&(err>0))     //计算高电平的时间长度。
58                     {
59                         delay(10);     //0.1ms
60                         Time++;
61                         err--;
62                         if(Time>30)
63                         {
64                             return;
65                         }
66                     }
67                     IrValue[k]>>=1;     //k表示第几组数据
68                     if(Time>=8)            //如果高电平出现大于565us,那么是1
69                     {
70                         IrValue[k]|=0x80;
71                     }
72                     Time=0;        //用完时间要重新赋值                            
73                 }
74             }
75         }
76         if(IrValue[2]!=~IrValue[3])
77         {
78             return;
79         }
80     }            
81 }

 

 

 

 

以上是关于红外通信的主要内容,如果未能解决你的问题,请参考以下文章

结合STM32Arduino理解红外遥控编解码通信原理

rs232串口通信光电(红外)隔离电路设计

光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门

在tablayout片段之间进行通信[重复]

单片机串口通信控制led灯的点亮

与另一个片段通信的片段接口