红外接收原理,简单来说就是一个 “接收-还原” 的过程:负责接收的装置将接收到的、带有编码信息的红外光信号,转换为电信号,并最终还原出原始的控制指令。
这个过程主要发生在红外接收头内部,它是一个将光电二极管和处理芯片集成在一起的小模块。
二:工作的主要流程如下所示:
第一步:光电转换
这是整个接收过程的基础。当红外遥控器发出的940nm波长的红外光照射到红外接收头内部的光敏元件(通常是PIN光电二极管)上时,这个元件就会将接收到的光信号转换为微弱的电信号。这个电信号非常微弱,而且混杂着各种干扰,无法直接使用。
第二步:放大与自动增益控制
微弱的电信号进入接收头内部的前置放大器。放大器会把这个信号的强度提升数百甚至数千倍,使其达到可以被后续电路处理的水平。
同时,一个叫做“自动增益控制”(AGC)的电路也开始工作。它的作用就像一个聪明的音量调节器:当接收到的红外信号很强(比如遥控器离得很近)时,它会降低放大器的增益;当信号很弱(比如离得远或有遮挡)时,它会提高增益。
这样可以确保无论距离远近,最终输出的信号幅度都能保持稳定。
第三步:滤波与解调
这是整个接收过程的核心,也是最巧妙的一步。
滤波:为了抵抗干扰(如阳光、节能灯等),红外遥控信号在发射前,会被“加载”到一个特定频率的载波上,最常见的是38kHz。接收头内部有一个精准的带通滤波器,它就像一个只允许38kHz信号通过的“关卡”,可以有效地滤除其他频率的杂波干扰,
只保留我们需要的38kHz调制信号。
解调:随后,解调电路开始工作,它的任务是将“加载”上去的38kHz载波剥离掉,还原出隐藏在其中的原始二进制脉冲码(也就是由“0”和“1”组成的数字信号)。这个还原出的信号,就是我们最终要用的数据。
第四步:输出与解码
经过上述处理后,红外接收头会通过其输出引脚,直接输出一个与原始指令相对应的、标准的TTL电平信号(通常是高电平为5V,低电平为0V的数字信号)。
这个信号会被送入单片机等主控芯片。单片机通过测量信号中高、低电平的持续时间,就可以解析出其中的逻辑“0”和逻辑“1”。例如,在常见的NEC协议中,一个0.56ms的低电平加上一个0.56ms的高电平代表“0”,
而一个0.56ms的低电平加上一个1.68ms的高电平则代表“1”。将这些二进制数据组合起来,主控芯片就能明白用户按下的是哪个键,从而执行相应的操作,比如换台、调音量等。
值得一提的是,一体化红外接收头的输出信号逻辑电平与发射端的原始信号是相反的。即发射端原始信号为高电平时,接收头输出为低电平;发射端为低电平时,接收头输出为高电平。
三:软件代码如下所示:
3.1 红外采样的时间定义:
#define IR_SAMPLE_TIME (1000000UL/SysTick) //查询时间间隔, us, 红外接收要求在60us~250us之间 #if ((IR_SAMPLE_TIME <= 250) && (IR_SAMPLE_TIME >= 60)) #define D_IR_sample IR_SAMPLE_TIME //定义采样时间,在60us~250us之间 #endif #define D_IR_SYNC_MAX (15000/D_IR_sample) //SYNC max time #define D_IR_SYNC_MIN (9700 /D_IR_sample) //SYNC min time #define D_IR_SYNC_DIVIDE (12375/D_IR_sample) //decide data 0 or 1 #define D_IR_DATA_MAX (3000 /D_IR_sample) //data max time #define D_IR_DATA_MIN (600 /D_IR_sample) //data min time #define D_IR_DATA_DIVIDE (1687 /D_IR_sample) //decide data 0 or 1 #define D_IR_BIT_NUMBER 32 //bit number
3.2 数据处理
void IR_RX_NEC(void)
{
u8 SampleTime;
IR_SampleCnt++; //Sample + 1
F0 = P_IR_RX_temp; //Save Last sample status
P_IR_RX_temp = P_IR_RX; //Read current status
if(F0 && !P_IR_RX_temp) //Pre-sample is high,and current sample is low, so is fall edge
{
SampleTime = IR_SampleCnt; //get the sample time
IR_SampleCnt = 0; //Clear the sample counter
if(SampleTime > D_IR_SYNC_MAX) B_IR_Sync = 0; //large the Maxim SYNC time, then error
else if(SampleTime >= D_IR_SYNC_MIN) //SYNC
{
if(SampleTime >= D_IR_SYNC_DIVIDE)
{
B_IR_Sync = 1; //has received SYNC
IR_BitCnt = D_IR_BIT_NUMBER; //Load bit number
}
}
else if(B_IR_Sync) //has received SYNC
{
if(SampleTime > D_IR_DATA_MAX) B_IR_Sync=0; //data samlpe time too large
else
{
IR_DataShit >>= 1; //data shift right 1 bit
if(SampleTime >= D_IR_DATA_DIVIDE) IR_DataShit |= 0x80; //devide data 0 or 1
if(--IR_BitCnt == 0) //bit number is over?
{
B_IR_Sync = 0; //Clear SYNC
if(~IR_DataShit == IR_data) //判断数据正反码
{
UserCode = ((u16)IR_UserH << 8) + IR_UserL;
IR_code = IR_data;
B_IR_Press = 1; //数据有效
}
}
else if((IR_BitCnt & 7)== 0) //one byte receive
{
IR_UserL = IR_UserH; //Save the User code high byte
IR_UserH = IR_data; //Save the User code low byte
IR_data = IR_DataShit; //Save the IR data byte
}
}
}
}
} 四:实物测试如下所示:


我要赚赏金
