红外调制与解调
光谱位于红色光之外, 波长为0.76~1.5μm,比红色光的波长还长,这样的光被称为红外线。
红外遥控是利用红外线进行传递信息的一种控制系统,红外遥控具有抗干扰,电路简单,编码
及解码容易,功耗小,成本低的优点,目前几乎所有的视频和音频设备都支持这种控制方式。
一、红外遥控系统结构
红外遥控系统主要分为调制、发射和接收三部分,如图1 所示:
图1 红外遥控系统
1.调制
红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源
功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的
455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。
图2 载波波形
1.发射系统
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片
的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有
足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常
一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,
它发出的是红外线而不是可见光。
图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所示:
图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; //开全局中断
}
}
} |