红外遥控技术以它的经济而实用的特点被彩电、空调等家用电器采用。现将介绍一种基于AVR单片机的红外摇控开关,供广大电子爱好者在设计中参考。
基本工作原理:如图所示,单片机采用了当前比较流行的一款AVR芯片ATMEGA8,红外摇控器发出的信号被TSOP1738解调后,传送到单片机I/O口,单片机按一定时序进行解码并得到按键代码,根据不同的按键代码控制继电器K1和K2,实现连接在继电器相应输出口的电器电源的开通与关断功能。D1和D2用于同步指示K1和K2的开关状态,Q1和Q2分别用于驱动继电器K1和K2。R4和C3构成TSOP1738供电引脚上的滤波电路,起到了抗干扰作用。
摇控器信号编码:目前在市场上多数彩电的摇控器是由 SAA3010或其兼容产品作为红外发送和键盘检测器件,SAA3010是PHILIPS公司的低电压PPM(脉冲位置调制)型红外摇控信号发送器,它具有扫描键盘和数字信号的调制发射等功能,载波频率为外接时钟频率的1/12,通常电视摇控器时钟由455KHz的晶振产生,为此摇控信号的载波频率为:455KHz/12 ≈ 38KHz。
SAA3010采用了双相位编码发送技术,逻辑1和0的表示方法如下图所示:
在一个位时间内先出现低电平后是高电平表示逻辑1,相反、先出现高电平后再出现低电平表示逻辑0。其中一个位时间 = 3×28×Tosc ,在电视摇控器中一位所使用的时间为: 3×28×(1/455KHz)≈ 1.688ms 。
每一个按键动作将触发一次的控制码发送操作。SAA3010发送一帧控制码的时序如下图所示,它共有如下的4部分组成:
1. 开始位(1.5位):由两个高电平和一个低电平构成。
2. 控制位 (1位):由一个逻辑1 构成
3. 系统码 (5位):系统码因器件的不同而不同如SAA3010-00系统码为 00000, SAA3010-01 的系统码为00001。
4. 数据码 (6位):它由不同的按键动作而产生。
摇控信号解码:摇控器的一次按键动作在TSOP1738的输出口(第3脚)得到如上图所示的数字信号。以下是读取控制码的C语言源程序,由avr-gcc编译。程序使用了AVR内部集成的定时器/计数器0来定时并采样TSOP1738输出的电平信号。从开始位低电平处开始计时采样,每个位时间采样两次,共采样26次,如果在一个位时间内的两次采样结果相同表示失败,没有上述情况时根据采样结果组合一字节(6位有效)的数据码返回。8位定时器/计数器0 计数初值设置为202,这时产生中断的周期为:
T= (255 - 202)/ ( 4MHz /64 ) = 0.848ms ≈ 0.844 ms ,即一个位时间的1/2。
/* Atmega8 外部4MHz */
unsigned char g_bCounter; //采样计数器
unsigned char g_aBuf[26]; //采样电平记录缓冲区
// 定时器/计数器0 中断函数 , 0.844 ms中断一次
SIGNAL(SIG_OVERFLOW0)
{
TCNT0=202; //装载预设计数值
if((IRPIN&_BV(IRBIT))==_BV(IRBIT)) //采样
g_aBuf[g_bCounter]=1;
else
g_aBuf[g_bCounter]=0;
g_bCounter++;
if(g_bCounter>=26) //关闭定时器
{
TIMSK&=~_BV(TOIE0);
TCCR0=0;
}
}
//一次控制码读取函数
unsigned char ReadIRCode(void)
{
unsigned char i,j;
TCNT0=202;
g_bCounter=0;
TCCR0=_BV(CS01)|_BV(CS00); //打开T/C0并时钟源设置为分频64
TIMSK|=_BV(TOIE0); //中断允许
while(g_bCounter<26)
{
DelayMs(1); //延时一毫秒
}
//检测信号正确性
for(i=0;i<26;i+=2)
{
if(g_aBuf[i]==g_aBuf[i+1])
return 0;
}
//根据采样信号,返回后六位控制码
j=0;
for(i=14;i<26;i+=2)
{
j<<=1;
if(g_aBuf[i]==0)
j|=0x01;
}
return j;
}
主程序使用外部中断或循环检测的方式在开始位的低电平时刻调用ReadIRCode函数,便可得到按摇控器的按键代码。
实物图
有兴趣者请从这里下载完整的源程序。
2009.06.18
|
|