红外调制与解调

光谱位于红色光之外, 波长为0.76~1.5μm,比红色光的波长还长,这样的光被称为红外线。
红外遥控是利用红外线进行传递信息的一种控制系统,红外遥控具有抗干扰,电路简单,编码
及解码容易,功耗小,成本低的优点,目前几乎所有的视频和音频设备都支持这种控制方式。 

一、红外遥控系统结构
红外遥控系统主要分为调制、发射和接收三部分,如图1 所示:
红外调制与解调_第1张图片
图1 红外遥控系统

1.调制

红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源
功耗。

调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的
455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。

图2 载波波形 

1.发射系统

目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片
的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有
足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常
一点误差可以忽略不计。

红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,
它发出的是红外线而不是可见光。
红外调制与解调_第2张图片                    红外调制与解调_第3张图片
图3a 简单驱动电路                        图3b 射击输出驱动电路


如图3a和图3b是LED的驱动电路,图3a是最简单电路, 选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向
电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。

图3a电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图3b所示的
射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,
发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥
控距离。

1.一体化红外接收头
   红外信号收发系统的典型电路如图1所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。

内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,
然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流
信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出
高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
一体化红外接收头,如图5所示:
红外调制与解调_第4张图片
图5 红外接收头
    红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制
载波的不同应选用相应解调频率的接收头。

     红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。
有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。

    红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,推荐使用超小封装(TSSOP20)的STC12C4052AD
或STC12C5406AD,可产生37.91KHz的PWM, PWM占空比设置为1/3, 通过简单的定时中断开关PWM, 即可产生发射波形。

    接收部分电路和程序比较简单,这里不一一赘述。

红外遥控解码程序

 

 

红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

1 红外遥控系统

通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

2 遥控发射器及其编码

遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。

UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。

遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间。

当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。

3接收器及解码

一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲,本程序经过试用,能解大部分遥控器的编码!

//串口通信程序
//向pc串口发送数据
//pc端使用 超级终端 建立连接
//9600 8位数据 1位停止

#include <iom16v.h>
#include <macros.h>
#include "uart0.h"
#define uint unsigned int
#define uchar unsigned char

uchar irr_b=0,s_s=0;
uchar wb=0,a=0,ds=0;
long da=0;
uchar d1,d2,d3,d4;
uchar ten_1,ten_2,ten_3,ten_4,i;


void ms(uint aa)
{
    for(;aa>0;aa--);
}

void write_cn(uchar *cn,uchar cn_nub)
{
    uchar i;
    for(i=0;i<(cn_nub);i++)
{
        uart_tx(cn[i]);       //发送数据i
   PORTA=i; 
   ms(60000);
}
}

//定时器T1初始化
void t1_init()
{
    TCCR1B=0x00;   //关闭定时器
    TCNT1H=0x00;   //定时器初值
    TCNT1L=0x00;
    TCCR1A=0x00;   //普通模式
    TCCR1B=0x05;   //1024分频
}
#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数
//中断接收
void ext_int0_isr(void)
{
   if(irr_b==0)        //第一个中断
   {
      irr_b=1;         //状态为:开始接收
      TCNT1L=0x00;     //定时器清零
   }
   else if(irr_b==1)   //第二个以后的中断
   {
      a=TCNT1L;        //读取定时器的值
      //判断是引导,还是数据
      if((170<a)&&(a<235))       //引导
      {
          wb=0;                   //数据计数清零     
       da=0;                   //数据清零
       TCNT1L=0x00;            //定时器清零 
   }
      else if((8<a)&&(a<25))     //数据0
      { 
          wb++;
          da=(da<<1);
       TCNT1L=0x00;
      }
      else if((25<a)&&(a<45))    //数据1
      {
          wb++;
       da=(da<<1)+1;
       TCNT1L=0x00;
      }
   }
   if(wb==32)                    //数据长度够32位
   {
      irr_b=0;                    //状态为停止接收
      wb=0;                       //数据计数清零
      s_s=1;                      //打开显示许可
   }
}
//与计算机通信的程序
//计算机端使用超级终端,建立一个连接,9600,8位,1个停止位
void main()
{
    uchar i=0,rx_temp;
    init_devices();    //串行口初始化   
    DDRA=0xff;
    PORTA=0x00;
DDRB=0xff;
DDRD=0x00;         //中断输入
PORTD=0xff;        //内部上拉

t1_init();         //定时器t1初始化
MCUCR = 0x02;      //下降沿中断
GICR = 0x40;      //开外部中断int_0
TIMSK = 0x00;      
SREG=0x80;         //开全局中断
s_s=1;             //开机进行一次显

ms(3000);

write_cn("开始红外实验/r/n",14);
while(1){
   ds=TCNT1L;
   if(ds>250)     //定时器超时,接收复位
   {
   TCNT1L=0;
      irr_b=0;
      da=0;
         wb=0; 
         s_s=0;
   }
   if(s_s==1)     //显示开关打开,开始显示
   {
      SREG=0x00;     //关闭全局中断
      //显示设备码
      d1=da>>24;
    write_cn(&d1,1);
      d1=da>>16;
    write_cn(&d1,1);
      d1=da>>8;
    write_cn(&d1,1);
      d1=da;
    write_cn(&d1,1);
   
      DDRD=0x00;    //中断输入
         PORTD=0xff;   //内部上拉
      s_s=0;        //关闭显示开关
      SREG=0x80;    //开全局中断
       }
}
}

你可能感兴趣的:(c,工作,ext,IE,终端)