ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

红外通信F题实战:链路预算、收发电路与抗干扰调参全解析

2026/9/19 1:13:27 拓冰建站 浏览量
红外通信F题实战:链路预算、收发电路与抗干扰调参全解析 简介2013年全国大学生电子设计竞赛红外光通信装置F题的完整设计文档系统阐述了信号产生、红外光发送与接收三大模块的实现方案面向电子竞赛参赛者、电子设计初学者及红外通信爱好者适用于课程设计与备赛实战。全文共13页单个docx文件压缩包仅899KB内容涵盖系统方案论证、发射管与运放选型、LM386/AD623/AD8608放大电路设计、Altium Designer原理图与PCB绘制流程、测试条件与结果分析以及温度信号获取与显示模块设计。文档从赛题要求出发重点解析了基于LM386的信号产生电路、分压式共射放大、LED红外发送与接收管、200倍增益运放驱动喇叭等关键环节并附有英文摘要和详细目录便于快速检索方案论证、理论分析与电路设计等内容。目前已有254人学习/下载是一份值得反复研读、可直接用于备赛冲刺的完整参考方案。1. 为什么红外通信总在电子设计大赛F题里翻车电子设计大赛的 F 题只要挂上“红外通信”三个字现场的翻车率就会显著高于同组别的电源题和控制题。原因倒不是红外这个物理层有多难而是大多数队伍把精力放在了编码和协议上忽视了模拟前端——发射管的角度、接收管的偏置、环境光的干扰这三样任何一个没处理好程序写得再漂亮也是白搭。F 题常见的场景是语音传输、双向小数据通信或点对点测距联动本质都是“近距离、强方向性、低速率可靠链路”的验证而不是让你做一个通用红外收发模块。这决定了方案选型的优先级先保证链路不丢包再谈速率和功能扩展。适合的人群是正在备赛的学生以及想用红外做短距数据链路的工程师本文按“链路预算→电路搭法→实测调参→抗干扰→验证方法”的顺序把一套可以直接抄的思路完整讲清楚。2. 红外通信的链路预算与载波频率选型2.1 光功率预算先算不算现场就抓瞎红外通信的本质是光链路任何光链路都要做功率预算。发射端的关键参数是辐射强度 (I_e)单位是 mW/sr接收端的关键参数是探测灵敏度单位是 mW/cm²而这两者之间隔着距离、角度和光学衰减。典型 5mm 红外发射管在 20mA 驱动下辐射强度大约在 1540 mW/sr接收管PIN 光电二极管的响应度大约 0.5 A/W前置放大器的噪声等效功率决定了你能探测到的最小光功率。把链路方程列出来接收面照度 (E I_e / d^2)在距离 3 米时若有 20 mW/sr接收面照度只有 2.2 mW/m²换算到每平方厘米就是 0.22 μW再乘上接收管有效面积和响应度输出的光电流只有几十纳安。这个量级已经低于普通运放直接处理的舒适区了。常见做法的链路余量通常按 610dB 设计F 题现场的距离一般 13 米角度偏差允许 ±15°所以发射端用两个串联发射管扩大覆盖角度接收端加一个窄带带通滤波器提升信噪比。如果发现距离拉不开优先检查的不是程序而是你的发射电流是否真的打进去了。用万用表串在发射管回路上测峰值电流很多人看到示波器上波形对了就以为驱动正常实际上 GPIO 直接驱动时电压被拉垮电流可能只有 5mA 不到。2.2 载波频率38kHz 之外的选项红外遥控器把 38kHz 做成行业标准是因为这个频率避开了大部分节能灯和 LED 驱动器的噪声峰而且成本最低。但 F 题并不是做家电遥控器链路需要更快的响应或更高的抗干扰能力这时 38kHz 未必是最优解。常见可选频率包括 36kHz、38kHz、40kHz、56kHz接收头如 TSOP 系列的频率选择性从中心频率到 ±2kHz 都有明显衰减所以发射频率必须和接收头中心频率对齐偏差超过 3kHz 时灵敏度会掉 10dB 以上。调制的意义是把基带信号搬到载波上接收端只认特定频率从而抑制日光灯 100Hz 闪烁和阳光的直流分量。用通用运放搭建接收电路时中心频率由带通滤波器的 RC 参数决定不需要依赖成品接收头这时常见做法是把载波频率降到 30kHz 以下以换取更高的环路增益和更窄的带宽。低频载波的好处是滤除高频噪声更容易缺点也明显副载波的每个周期变长基带速率上限会被压住。比如用 38kHz 载波传 2.4kbps 的基带信号每个比特只有约 15.8 个载波周期接收端的包络检波已经能工作如果降到 20kHz同样速率下只有 8.3 个周期解调余量明显变小。所以频率选型要看基带速率需求传语音8kHz 采样、4bit 量化时载波至少要 100kHz 以上这时成品接收头全部不能用了。2.3 调制的三种方式对比OOK 是 F 题性价比之选调制方式实现难度抗干扰能力带宽效率F 题适用度OOK(副载波通断)低中较低高PPM(脉冲位置)中中中中ASK(多电平幅度)中低中低FSK(频移键控)高高低低多数队伍直接用 OOK即载波在逻辑 1 时发射、逻辑 0 时停发发射管工作在开关状态。OOK 的解调用低通滤波加比较器就能完成程序上只需用定时器产生指定频率的方波去驱动发射管再把接收端解调出来的电平信号接 GPIO 输入捕获。PPM 靠脉冲位置编码能省平均功耗但 F 题供电一般不是瓶颈反而增加了定时器同步的难度。这里建议先固定一种调制不放把所有参数在一个模式下调通不要中途换调制方式——有很多队伍的失败来自首次现场联调时收发两侧的调制表格版本对不上。3. 红外通信收发电路的硬件搭法与参数计算3.1 发射端MCU 定时器生成载波的三要素发射端的核心就是让发射管以载波频率通断同时把基带数据叠加进去。常见做法是用 MCU 的定时器 PWM 模式产生 38kHz、占空比 1/3 的方波再用一个 IO 口控制 PWM 信号的闸门。需要注意占空比不要取 50%红外发射管的峰值电流承受能力通常远大于平均电流占空比 1/3 时可以把峰值电流推到 60100mA平均电流只有 2033mA这样既保证了发射功率又不会烧管。驱动部分不要用 GPIO 直接推发射管STM32 的 GPIO 在 3.3V 下最大输出电流只有 20mA 左右距离一远就不够。至少要用一个 NPN 三极管如 S8050做开关串在 VCC 与发射管之间基极串 1kΩ 限流电阻接到 MCU 输出脚。// STM32 定时器 PWM 产生 38kHz 载波1/3 占空比 void IR_Timer_Init(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 72MHz / (prescaler1) / (period1) 38kHz // 取 prescaler0, period1893 → 72e6 / 1894 ≈ 38015Hz TIM_BaseInitStructure.TIM_Prescaler 0; TIM_BaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_BaseInitStructure.TIM_Period 1893; TIM_BaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, TIM_BaseInitStructure); // 占空比 1/3CCR 设为 Period 的三分之一 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 631; // 1894 / 3 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState TIM_OCIdleState_Reset; TIM_OC1Init(TIM3, TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); }这段代码里TIM_Period和TIM_Pulse决定载波频率与占空比实际 38kHz 时周期约为 26.3μs高电平时间约 8.8μs。如果 MCU 主频不是 72MHz需要按同样的比例关系换算不要直接复制参数。发射管的限流电阻阻值由电源电压、发射管压降和所需峰值电流共同决定(R(V_{CC}-V_F)/I_{peak})红外发射管的正向压降约 1.21.5V用 5V 供电推 100mA 峰值时限流电阻约 33Ω同时要在发射管两端反向并联一个二极管防止反复开关产生的感性尖峰击穿管子。另一个容易忽略的点是基带数据与载波信号的时序同步在中断里控制 PWM 使能时要等当前载波周期结束后再切否则接收端解调波形会多出半截毛刺导致解码错位。实践中常见做法是让基带切换发生在载波的低电平区间或者在接收解码时只采样载波稳定后的中间区间。3.2 接收端光电二极管、跨阻放大与带通滤波接收端是所有翻车事故的重灾区。直接用一个红外接收二极管接比较器没有放大通路通常距离零点几米就收不到了。正确做法分成三级第一级跨阻放大器TIA把光电流转成电压第二级带通滤波器BPF把载波频率附近的成分选出来第三级比较器把模拟信号整形为数字方波。跨阻放大器的关键是反馈电阻 (R_F) 的选取光电流几十纳安时要得到几百毫伏的电压(R_F) 至少 1MΩ同时为了抑制高频噪声需要在 (R_F) 上并联一个小电容形成低通极点极点频率设在载波频率的 23 倍左右。// 接收端放大级示意参数计算非完整程序 // Vout Iphoto * Rf // 目标100nA 光电流 → 300mV 电压摆幅 // Rf 0.3V / 100nA 3MΩ 偏大实际取 1MΩ 两级放大 // 反馈电容 Cf 1 / (2π * Rf * f_BW) // 载波 38kHz带宽放宽到 100kHz // Cf 1 / (2π * 1e6 * 100e3) ≈ 1.59pF → 取 1.5pF // 运放选型GBW 至少 10MHz输入偏置电流 1nA如 OPA2376、MCP6002 不理想TIA 的寄生参数比电阻精度更影响实际电路1MΩ 反馈电阻和运放输入电容形成的零极点可能在几十 kHz 就产生振荡。常见做法是 PCB 上把反馈电容紧贴运放反馈引脚缩短走线长度同时反馈电阻用两个 500kΩ 串联以减少寄生电感。如果纹波大检查运放电源去耦电容是否靠近电源引脚至少放一个 0.1μF 陶瓷电容。带通滤波部分直接用 Sallen-Key 拓扑品质因数 Q 取 12 比较合适Q 太高会在载波频率附近产生振铃阶跃响应变差Q 太低则选择性不够。中心频率 38kHz、Q1.5 时带宽约 25kHz能有效滤除 100kHz 以上的开关电源噪声但对 38kHz 附近的窄带干扰抑制有限。比较器整形可以选用 LM393 或 TLV3501后者速度更快但成本高。比较器的阈值用分压电阻设置在带通输出的中值而不是固定电平因为接收到的光信号强度会随距离剧烈变化。更稳妥的做法是加一个峰值检测电路用二极管和电容提取带通输出的包络峰值再把比较器阈值设在峰值的 1/3 到 1/2 之间。这样近距离强信号时阈值自动抬高不会因为信号削顶导致输出一直高电平远距离弱信号时阈值自动降低保留更多灵敏度。F 题现场很容易出现近处正常、拉远两三米就完全失灵多半就是阈值固定造成的。3.3 供电纹波对红外通信接收电路的隐性影响接收前端是微伏级信号放大电路对供电纹波异常敏感。开关电源的纹波一般在 30100mV直接给 TIA 供电时等效到输出端会被放大因为运放的电源抑制比PSRR在 38kHz 往往已经下降到 4060dB100mV 纹波仍有 1mV 左右漏到输出而此时弱信号的输出电压峰值也才 100mV。所以接收电路必须用 LDO 单独供电或者在运放电源脚加 RC 滤波51Ω 电阻串一个 10μF 电容截止频率约 312Hz能把 38kHz 纹波衰减约 42dB。发射端可以共用电源但不要在接收板的地线上走发射管的回流电流数字地和模拟地单点连接布局上接收前端远离电感。4. 红外通信 F 题程序框架编码、解码与状态机4.1 编码策略帧结构比纠错算法更重要F 题的程序框架不需要复杂协议栈但帧结构必须对标常见的失败模式。最常见的问题是收发测试时用连续方波验证代码里没有帧同步一旦中间丢一个 bit 整包错乱。建议帧结构包含四段前导码若干个载波脉冲、起始标志、数据段、校验段。前导码用连续几个特定的高低电平交替比如 4ms 高电平加 2ms 低电平接收端检测到这个模式就开始采样。起始标志可以用曼彻斯特编码的非回零特性来构建曼彻斯特编码把每个 bit 中间的电平跳变作为时钟自带同步信息抗基线漂移能力强于 NRZ 编码。// 发送一帧数据前导码 起始位 数据 CRC8 void IR_SendFrame(uint8_t *data, uint8_t len) { // 1. 发送前导码载波通 4ms断 2ms IR_Carrier_Enable(1); delay_ms(4); IR_Carrier_Enable(0); delay_ms(2); // 2. 起始标志2.5ms 连续载波 IR_Carrier_Enable(1); delay_ms(2); IR_Carrier_Enable(0); // 3. 发送数据位波特率 2400bps每位约 416us for (uint16_t i 0; i len * 8; i) { uint8_t bit (data[i / 8] (7 - (i % 8))) 0x01; if (bit) { IR_Carrier_Enable(1); delay_us(208); // 半位高 IR_Carrier_Enable(0); delay_us(208); } else { IR_Carrier_Enable(0); delay_us(416); } } // 4. 帧结束 IR_Carrier_Enable(0); }这个代码里用曼彻斯特编码把逻辑 1 表示成“高半位低半位”逻辑 0 表示成“连续低”这样接收端在每个 bit 的中间采样时总能根据边沿位置对齐时钟避免了长时间连续电平导致的失步。delay_us(208)在 2400bps 下每位持续约 416μs半位 208μs 是实际测量值不是推算值因为 MCU 调用开关注入的延迟会让时间偏大需要实测修正。CRC8 的生成多项式可以用常见的 0x31软件查表实现帧尾加 2ms 的静默时间作为帧间分隔。注意发送端不要在中断里用阻塞式延时否则主循环被卡死F 题现场容易因为按键响应不及时被判失误。4.2 解码端定时器输入捕获算脉宽还是外部中断加轮询解码端的第一个决策是用输入捕获还是外部中断。输入捕获的优势在于高精度测量脉宽不会占用 CPU 连续采样缺点是每个边沿都触发一次中断在 38kHz 载波、多路信号叠加时中断频率可能高达几十 kHzMCU 忙不过来。外部中断加定时器轮询的方式是把接收脚接 EXTI检测到下降沿后启动定时器测量持续的低电平或高电平时间这种适合电平切换频率不超过几 kHz 的基带信号。如果 F 题要求传语音基带速率达到 10kbps那就必须用输入捕获或者 DMA 采样轮询会在高电平持续时间短时漏掉边沿。// 外部中断 定时器测量脉宽 // 接收脚下降沿触发记录两次边沿之间的时间差 void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line5) ! RESET) { uint32_t now TIM_GetCounter(TIM2); uint32_t diff now - last_edge; last_edge now; IR_Pulse_Width diff; // 存入全局变量主循环解析 EXTI_ClearITPendingBit(EXTI_Line5); } }上面的中断里把脉宽记录到全局变量主循环再根据脉宽判别脉宽在 380450μs判定为曼彻斯特半位。脉宽大于 1ms判定为前导码或起始标志。脉宽小于 100μs判为毛刺直接丢弃。判别逻辑不要放在中断里做否则中断服务函数过长会影响下一次边沿的捕获精度。实际调试中第一次总是失败的原因往往是示波器探头接地夹造成的高频振荡把接收信号波形拉花程序判别正常而硬件输出不对。4.3 连续通信的状态机设计数据通信不是发一次就完F 题往往要求连续上报或交互这时发送和接收得共用一套状态机避免重复代码和竞态条件。建议状态机分为空闲、发送前导、发送数据、等待应答、重传判断这几个状态用固定的 tick例如 1ms驱动。接收端的状态机则从空闲切入前导检测检测到有效前导后进入接收数据每收一个字节做一次累积校验。重传逻辑用简单的超时计数发送后 50ms 内没收到应答重传最多三次每次重传前随机退避 1030ms避免两台设备同时重传永远冲突。PWM 载波和基带数据的调制在同一颗 MCU 上实现时定时器资源要提前规划一个定时器做载波、一个做波特率、一个做状态机 tickSTM32F103 刚好够用。5. 红外通信抗干扰与现场调试示波器和三件套5.1 环境光干扰的实测特征与对策红外接收管对阳光和节能灯的响应非常灵敏阳光直射时接收管进入饱和光电流完全淹没信号带通滤波器也无济于事。F 题现场如果有窗户或强射灯一定要先做遮挡测试判断干扰来源。节能灯干扰的特征是 100Hz 的周期性幅度变化在示波器上看带通输出会看到 100Hz 的包络波动而信号波形叠加在上面比较器输出会有规律地误触发。对应措施增加高通滤波截止频率到 5kHz 以上滤掉 100Hz或者把带通品质因数从 1.5 提到 2.5。阳光干扰的特征是直流饱和用万用表测接收管两端电压如果不到正常值的一半说明光电流已经饱和没有别的办法只能用遮光罩。用黑色热缩管套在接收管外面长度 10mm能有效挡住来自侧面的杂散光这是成本最低且有效的做法。5.2 现场调参的示波器观察点示波器要测三个点发射管电流波形、接收端带通输出、比较器输出。发射管电流用电流探头或测限流电阻两端电压换算观察是否是干净的方波有没有过冲和振铃。带通输出要观察幅值是否稳定在持续发射载波时应该是一个等幅正弦波如果有明显的缓慢幅度波动说明 AGC自动增益控制不足或者环境光在变化。比较器输出是最终的基带数字信号用它来验证解码程序是否符合预期。测量时探头要使用 10× 衰减挡1× 挡的探头电容会加载接收电路让 38kHz 信号衰减 30% 以上导致本来能通过的信号变得临界。有一个容易被忽略的细节红外发射管和接收管的轴线角度。F 题现场经常出现在正对时通信良好稍微偏一点就断这是发射管的半功率角不够。常用 5mm 发射管半功率角约 ±15°接收管约 ±60°链路角度预算主要由发射端限制。处理办法是发射端用两个发射管一只正装、一只与主轴线成 30° 夹角用同一个驱动信号同时驱动这样覆盖角度可以扩大到 ±30°。两只管子串联会提高驱动电压要求并联则各串独立限流电阻推荐并联方案因为发射管压降不一致时串联会导致电流分配不均。5.3 距离拉不远的排查顺序先查驱动电流把示波器探头接到限流电阻两端看峰值压降是否达到设计值电阻压降 峰值电流 × 电阻值如果实际电流只有设计值的 30%多半是 GPIO 高电平电压不够三极管没完全导通。再查接收端运放供电LDO 输出有没有 100mV 级别的纹波有就加 RC 滤波或者换更大容量的输出电容。然后查带通的中心频率是否偏了用信号发生器在接收管位置用红外 LED 模拟发射改变载波频率扫描接收幅值最大的频率点如果和设计值偏差大调整 RC 参数。最后查比较器阈值近距离阈值太高会把弱信号判成噪声远距离阈值太低会把噪声判成信号用峰值检测电路让阈值自动浮动。6. 红外通信发射管驱动的 3 个容易丢分的高级调理备赛经验里完成基本收发只算及格以下的细节能让方案稳定性和分数拉开差距。第一个技巧是限流电阻改用 PW 调制启动。发射管冷态时电阻低瞬间电流可能超过额定值 3 倍批量测试时不易察觉但连续通信半小时后发射管亮度明显下降。常见做法是软件上先把载波占空比从 10% 逐步升到 33%持续 5ms避免冷启动冲击而且对接收端的 AGC 也更友好。第二个技巧是在接收端软件里做 3 次中值滤波对 100Hz 干扰引起的周期性误码用 3ms 窗口取中值能压掉大部分孤立毛刺这个在帧同步之后做不影响正常数据延迟。中值滤波配合曼彻斯特解码时要确保滤波窗口不跨越 bit 边界否则会削掉有效边沿建议滤波以 bit 周期为单位滑窗。第三个技巧是发射载波频率在启动时做一次“频率微扫”发送端先发 36kHz 和 40kHz 各 2ms 的探测脉冲接收端用两个带通通道分别检测幅度选择幅度较大的频率作为工作频点然后双方锁定在同一频率。这个方案要求接收端至少有两个带通滤波器通道硬件成本略高但 F 题的现场电磁环境复杂接收头中心频率可能因为温漂产生 1kHz 的偏移固定 38kHz 可能落在接收带宽边缘。当然如果只用一个接收头频率微扫就不适用改用接收端的数字滤波算法来补偿频偏在 MCU 里对采样后的带通输出做 Goertzel 算法分别计算 36、38、40kHz 处的能量选最大值对应的频率进行解调这个思路是软件定义接收的雏形处理开销在 STM32F4 级别可以接受。最后验证环节用一发一收对测发射端持续发送固定帧含序号接收端统计丢包率和误码率记录 1 分钟数据。环境光干扰大的时间段用 5.1 节的方法复测对比遮光罩前后的丢包率这个数据要写进设计报告评审提问时能直接回答“如何在阳光下保证通信”实测数字比任何原理描述都有说服力。红外通信的所有坑都在模拟与数字的交界处链路预算和现场实测做好F 题就能稳住。本文还有配套的精品资源点击获取