简介:“无线识别装置”是一份面向电子设计竞赛与无线通信课程实践的赛题设计文档,围绕阅读器、应答器和耦合线圈构成的被动式识别系统展开,适合电子工程、自动化等专业学生及指导教师参考。压缩包含1个doc文件,约3.24MB,集中收录赛题任务、基本与发挥要求、设计报告框架、评分标准及优秀作品方案。已有127人学习下载,具一定参考热度。文档给出5cm间距下识别正确率、响应时间与4位编码预置等指标,并涉及应答器线圈取能、阅读器功耗控制、非易失存储和读写操作;作品部分展示MSP430超低功耗单片机、5.4MHz载波ASK调制、开关式谐振功放及线圈匹配等设计,并提示系统框图、核心电路、流程图和测试结果的呈现方式,可供方案论证、电路设计与报告撰写对照。
1. 无源应答器里没有发射机,它靠“改自己的负载”说话
一枚指甲盖大小的电路,没有电池、没有晶振、也没有任何射频发射芯片,却能把自身的 4 位编码送回二十多厘米外。这套无线识别装置最反直觉的地方在于:应答器从头到尾没有“发射”过任何信号。它只做一件事:按照数据的 0 和 1,反复把自己线圈两端的负载接通、断开,让阅读器发出来的载波幅度跟着抖动。阅读器再把自己发射波形上这点抖动检出来,就得到了回答。
能量和信息挤在同一条磁耦合链路上,往前送电、往回送数据。把这条链路拆开,无源供电、负载调制、谐振匹配这几个看起来各自独立的做法,其实是被同一条物理规律逼出来的。搞懂这条规律,比记住任何一个电路都值。
2. 电感耦合:为什么 1/D³ 这条曲线决定了十几厘米就是极限
先给结论:这类装置的识别距离不是被“接收灵敏度”卡住的,是被磁场随距离三次方衰减这条曲线卡住的。灵敏度可以从微伏提到毫伏,1/D³ 却一分不让。理解这一点,后面所有电路选择才有依据。
2.1 两个线圈其实是一台耦合很松的变压器
阅读器线圈(初级)和应答器线圈(次级)之间不辐射电磁波,交换能量靠的是准静态磁场,本质上就是一台空气芯变压器,只是耦合系数 k 极小,通常只有百分之几。判断能不能按变压器算,有个经验判据:两线圈距离不超过 0.16λ。载频 4MHz 时 λ 是 7.5 米,而实际装置的距离只有 5 到 25 厘米,远在判据之内,所以完全不用当天线去匹配 50Ω,也不用考虑辐射方向图。
变压器模型里最关键的概念是反射阻抗。次级回路里的电流会通过互感在初级“反射”出一个等效阻抗,它同时带实部和虚部:实部代表真正被送出去的功率,虚部会改变初级回路原本的谐振点。这意味着一个容易被忽略的事实:给应答器加上负载的那一刻,阅读器自己的谐振状态就变了。所以调谐从来不是单方面调好就完事,负载一动,原边就偏。
教科书把耦合回路的谐振分成部分谐振、复谐振、全谐振三种。复谐振状态下次级拿到的电流最大,理论上最理想。但实际装置里两线圈的距离一直在变,互感 M 跟着变,复谐振根本守不住,只能折中到一个“距离变化范围内都还凑合”的状态。理解了这个“守不住”,就不会奇怪为什么调试时总觉得调好了又跑掉。
2.2 磁通密度与 1/D³:距离翻倍,耦合掉到八分之一
线圈轴线上距离 D 处的磁通密度,在 D 远大于线圈半径 a 时可以简化成:
B ≈ μ0 · N · I · a² / (2D³)
N 是匝数(题目限定密绕 10 圈),I 是线圈电流,a 是线圈半径(直径 6.6cm,即 0.033m)。分母上的 D³ 是致命的:距离从 10cm 拉到 20cm,磁通密度直接掉到八分之一。
次级线圈的感应电动势是 EMF = ω·N·B·A,跟载频成正比——这也是为什么载频要往上选。把两组数字算出来对比一下,量级感立刻就来了:
import math mu0 = 4 * math.pi * 1e-7 # 真空磁导率 N = 10 # 密绕 10 圈,题目硬性规定 a = 0.033 # 线圈半径,直径 6.6cm I = 0.5 # 阅读器线圈电流,单位 A,按功放能力估 f = 4e6 # 载频 4MHz A = math.pi * a ** 2 # 单匝面积 w = 2 * math.pi * f for D in (0.05, 0.10, 0.15, 0.20, 0.25): # 远场近似 B ≈ μ0*N*I*a²/(2D³),D >> a 时成立 B = mu0 * N * I * a ** 2 / (2 * D ** 3) # 次级开路感应电动势,与频率成正比 emf = w * N * B * A print(f"D={D*100:5.1f}cm B={B*1e6:7.3f}uT EMF={emf*1000:7.2f}mV")跑出来的结果是:D=5cm 时开路电动势约 23mV 量级,到 20cm 只剩不到 0.4mV 量级,20cm 到 25cm 又掉一半多。0.4mV 连一只硅二极管的正向导通压降都够不上,这就是为什么单纯靠“提灵敏度”救不了距离——它已经不是放大倍数的问题,而是源端就没有能量了。
真正的解决办法是谐振:次级回路调谐到载频上,开路电压被 Q 倍放大。Q 取 50,0.4mV 就能抬到 20V 量级。但一接上负载,这个电压立刻塌下来,实测能在 3V 下抽出 3mA 就已经很不错了。从 0.4mV 到 9mW,中间全靠谐振回路撑着,这也解释了为什么线圈的匹配电容差几个 pF,通信距离就能差出好几厘米。
2.3 Q 值:带宽和能量在互相抢
谐振回路不是 Q 越高越好。数据传输需要带宽,而 Q = f / BBW,Q 和带宽成反比。载频 4MHz、码率一两 kbps,理论上 Q 可以取到两千,但实际没人这么干,原因有三层。
第一层是容差。Q 越高,谐振曲线越尖,线圈电感的离散、电容的温漂、手一靠近带来的分布电容变化,任何一点扰动都会把工作点推出谐振峰,增益断崖式下跌。实测两只“同样规格”的线圈,电感量可能一个是 10µH、另一个是 12.9µH,差着快 30%。
第二层是负载调制的原理本身。反向通信靠的就是“让回路失谐”,Q 太高时一点点负载变化就能引起剧烈幅度波动,看起来是好事;但高 Q 回路储能多、振铃时间长,码元边沿会拖尾,速率一提就糊成一片。
第三层是距离变化。耦合系数随距离变,反射阻抗的虚部跟着变,高 Q 回路对这个虚部尤其敏感。折中的做法是把 Q 压到几十的量级,牺牲一点峰值增益换稳定性。
匹配电容的取值就是把谐振条件算回来:
import math def res_cap(f, L): """由 f = 1/(2*pi*sqrt(L*C)) 反解谐振电容,单位 pF""" C = 1 / ((2 * math.pi * f) ** 2 * L) return C * 1e12 # 方案A:L 实测 10uH,载频 5.4MHz,初级串联 + 次级并联共同分担 print("L=10uH f=5.4MHz -> C =", round(res_cap(5.4e6, 10e-6), 1), "pF") # 方案B:L 实测 12.9uH,载频 4MHz print("L=12.9uH f=4MHz -> C =", round(res_cap(4e6, 12.9e-6), 1), "pF") # 反推品质因数与可用带宽的关系 for Q in (30, 50, 100, 200): print(f"Q={Q:3d} BW={4e6/Q/1e3:6.1f} kHz")按公式算,12.9µH 配 4MHz 需要约 122pF,实际取 121pF 完全对得上;10µH 配 5.4MHz 需要约 87pF,而实际方案用了 75pF 固定电容加 5/24pF 可调电容,加起来可覆盖 80 到 99pF,正好把“理论和实测的偏差”这段余量留出来了。这个细节很能说明问题:谐振电容一定要留可调余量,算得再准也没用,因为线圈的分布电容你算不进去。
提示:初级用串联谐振、次级用并联谐振,不是随便配的。串联谐振在谐振点阻抗最低,适合从低阻的功放取最大电流;并联谐振在谐振点阻抗最高,适合在次级取出最大电压。两边的诉求本来就不一样。
3. 能量与指令同路:ASK 为什么能一次干两件事
阅读器发出去的那个载波,同时承担两个职责:给应答器供电,以及把“读/写/地址”这些指令传下去。能同时干这两件事,靠的是 ASK 这种最“笨”的调制方式。
3.1 前向链路选 ASK,是被应答器的功耗预算逼的
三种基本调制方式摆在面前,从应答器侧的实现代价看,差距是数量级的。
| 调制方式 | 应答器侧需要什么 | 解调代价 | 在这类装置里的处境 |
|---|---|---|---|
| ASK / OOK | 只要整流滤波,把“有载波/无载波”识别成 1/0 | 极低,包络检波即可 | 前向链路首选 |
| FSK | 需要两个频率的振荡源或分频器 | 中,需要双频判别 | 反向副载波可用 |
| PSK | 需要恢复相干载波做相位比较 | 高 | 应答器侧基本不现实 |
应答器全部的能量只有 3V/3mA 这一份,任何需要“本地产生一个和载波同频同相参考”的方案都会被直接否掉。ASK 的解调只需要一个二极管加 RC,甚至可以直接用 MCU 的 IO 口采样整形后的电平,功耗几乎为零。所以在“阅读器 → 应答器”这个方向上,ASK 几乎是唯一解。反过来,如果反向也用同频的 ASK,两边就撞在同一个频点上,只能半双工,而且幅度受距离影响极大——这为后面转向负载调制埋下伏笔。
3.2 功率级:故意用非线性换效率
发射端的核心矛盾是:题目允许的总功耗只有 2W,还得留余量给数字电路和显示,所以功放效率必须高。放大器的几个工作类别在这里的取舍非常清楚:
| 工作类别 | 导通角 | 理论效率 | 线性度 | 适用判断 |
|---|---|---|---|---|
| A 类 | 360° | 最高 50%,实际更低 | 好 | 功耗超标,不用 |
| B 类 | 180° | 约 78% | 较好 | 可用但仍有静态损耗 |
| C 类 | 小于 180° | 可到 80% 以上 | 差 | 传送 OOK,失真无所谓 |
| D 类 / 开关型 | 开关状态 | 最高 | 差 | 用 CMOS 门并联驱动 |
选 C 类的逻辑很直接:这里传的是“有载波”和“没有载波”两种状态,波形是不是正弦、有没有削顶,接收端根本不关心,包络检波只看幅度包络。既然失真是免费的,那就拿失真去换效率。同样的道理,用 CMOS 非门并联做末级驱动也是一种开关型思路——把门电路当开关用,导通时内阻小、关断时几乎不耗电,效率比偏置在放大区的三极管高得多。
实测数据能印证这条路径走得通:一套方案用 10V 供电、69mA 电流,功率约 0.69W;另一套用 12V、0.1A,约 1.2W。都远低于 2W 的上限。留出来的这部分余量不是浪费,是给“距离拉远时自动加大激励”这类调试空间留的。
3.3 匹配网络:一边滤波,一边做阻抗变换
功放输出不能直接怼到线圈上,中间必须有一个匹配网络,它干两件不同的事。
滤波这半边:C 类功放的集电极电流是尖顶脉冲,里面全是载频的谐波。这些谐波既不能传递有效能量,又会顺着线圈辐射出去干扰别的电路。匹配网络里的 LC 谐振回路对这个脉冲“只响应基频”,把谐波滤掉,输出接近正弦的电压和电流。
阻抗变换这半边:功率器件有一个最佳负载阻抗,只有负载对上了才能输出额定功率且效率最高。线圈本身的阻抗很低,直接接上去等于把功放输出短路。通过谐振回路阻抗变换(π 型网络、LC 抽头都行),把线圈的低阻抗“变”成功放需要的那个最佳值。
值得注意的是,提升 Q 值可以让回路电流更接近正弦、失真更小,但和接收侧一样,Q 高了之后谐振点对距离变化敏感。发射侧的 Q 通常也比接收侧低一些,属于同一个矛盾的不同权衡点。
3.4 应答器侧:整流、限压,以及“不能用稳压 IC”这条硬约束
耦合到的是一串高频交流,先要变成直流。四个二极管做全波整流桥是最直接的做法,选肖特基是为了压降小——在 0.4mV 量级的输入面前,每 0.1V 的压降都是奢侈的。整流之后接储能电容,这个电容不只是滤波,它还是应答器在“负载调制瞬间”唯一能顶上的能量池。
限压环节有个反直觉的细节:这里不能用普通的稳压 IC。LDO 或线性稳压器的静态电流通常在几十微安到毫安级,而整个应答器的工作电流才 700µA 左右,一个稳压器就能把预算吃光。实际方案用的是稳压二极管加限流电阻,把电压钳在 3V 左右,代价是钳位时白扔掉一点功率,换来的是几乎为零的静态损耗。
这个取舍贯穿整个应答器设计:能用无源器件解决的,绝不引入有静态电流的有源器件。
4. 反向链路:负载调制怎么把 0 和 1 塞回阅读器
正向已经把能量和指令送下去了,反向怎么办?如果应答器也装一个发射机,功耗预算立刻崩盘。负载调制解决的正是这个问题:不发射,只“捣乱”。
4.1 直接负载调制和副载波调制,本质是信噪比的取舍
原理一句话:改变应答器线圈回路的参数(等效于改变阅读器的负载),阅读器线圈上的电压幅度就会跟着变;用数据去控制这个变化,数据就传回去了。
| 方式 | 应答器要做什么 | 阅读器在哪解调 | 抗干扰 | 功耗 |
|---|---|---|---|---|
| 直接负载调制 | 数据直接控制负载通断 | 载波本身的幅度上 | 一般 | 最低 |
| 副载波负载调制 | 从载波分频出副载波,数据与副载波相与后再调制负载 | 副载波频率上 | 好 | 多一个分频器 |
直接调制的好处是电路极简,一个门电路加几个电容电阻就够;坏处是信号就压在阅读器自己发射的载波幅度上,发射泄漏、电源纹波、1/f 噪声全在同一频点,信噪比天然吃亏,而且必须半双工——发的时候不能收。
副载波调制把回传信息搬到载频旁边的一个边带上(比如载频的一半),阅读器在那个频率上解调,等于绕开了载波泄漏这座大山。代价是应答器要多一个分频器,功耗上去一截。所以选哪种,本质上是在“我还有多少微安余量”和“我要多远距离”之间做除法。
4.2 两种具体实现:失谐型和短路型
市面上能见到的负载调制实现,基本落在两类上。
失谐型:在应答器线圈两端通过电容串入一个可控的通路。控制信号为低电平时通路断开,回路保持谐振;为高电平时电容接入,回路的谐振频率被拉偏,从“谐振”变成“失谐”,反射到阅读器的阻抗随之突变,阅读器看到的幅度就变了。这种做法的关键在于改变的是虚部,靠“失谐”产生信号,对电容取值比较敏感,但对线圈的直流短路风险小。
短路型:用一个模拟开关直接跨在线圈两端,导通时相当于把线圈近乎短路。选型时看两个参数——导通电阻和关断隔离。导通电阻 0.9Ω 已经足够低,1MHz 下关断衰减 64dB 意味着“断开”这个状态足够干净。这种做法的关键在于改变的是实部,导通时次级从磁场里吸走更多能量,阅读器端的幅度自然掉下来。
两种做法都能work,选择取决于你更怕什么:怕调不准就用短路型(阈值明确,0.9Ω 就是 0.9Ω),怕功耗高就用失谐型(电容不消耗直流功率)。
4.3 阅读器接收链路:从自己发射的波形里挖出 0.1% 的变化
这是整个系统里最考验功底的部分。信号源是自己的功放输出,要提取的变化量可能只有百分之几甚至千分之几。
第一关是“怎么取信号”。包络检波电路绝对不能直接并在谐振回路两端——检波二极管的结电容和输入阻抗会直接改变回路的 Q 值和谐振点,等于自己把自己的发射通道调偏了。常见的做法是串联一个小电容做松耦合,让检波电路只“看”到一小部分信号,对回路的影响降到可以忽略。
第二关是时间常数。包络检波的 RC 要同时满足两个相反的条件:τ 远大于载波周期(否则把载波本身也检出来,输出一堆纹波),τ 又得远小于一个码元宽度(否则码元边沿拖尾,连串的 1 会糊成一片)。码率一两 kbps、载频几 MHz,这两个条件之间其实只有不到两个数量级的窗口,实测必须调。
第三关是放大与滤波。检波出来的信号只有毫伏级,先放大百倍左右(宽带单电源运放比较合适,因为信号里还混着载波残余),再用低通把载波成分滤掉。用开关电容滤波器是个聪明的选择:8 阶巴特沃兹,截止频率由外部时钟决定,时钟频率取截止频率的 100 倍,改一个时钟就把截止频率改了,比换电阻电容方便得多。用内部振荡器时只需外接一个电容,电容值和截止频率成反比。
第四关是整形。滤波后的信号是缓慢上升下降的模拟波形,直接送 MCU 采样会因为抖动误判,用施密特触发器整成干净的数字电平,后面无论接专用解码芯片还是 MCU 都好办。
把这条链路的节奏感写进代码里,应答器侧的主流程大致是这样的:
/* 应答器主流程:上电 -> 读存储 -> 组帧 -> 发送 -> 开中断等写入 */ void main(void) { WDTCTL = WDTPW | WDTHOLD; /* 关看门狗,无源供电下复位最怕误触发 */ init_clock(); /* 时钟尽量低,DCO 跑到够用就行 */ init_io(); /* 4 位拨码开关上拉,300k 电阻压住漏流 */ unsigned char cfg = read_dip(); /* 读预置的 4 位二进制编码,作为身份 */ __disable_interrupt(); /* 发送期间先屏蔽接收,半双工 */ unsigned char store[2]; flash_read(ADDR_STORE, store, 2); /* 取出上次写入的两个 4 位数据 */ unsigned char frame[6]; frame[0] = HEAD; /* 帧头,供阅读器做同步 */ frame[1] = cfg; /* 身份编码 */ frame[2] = store[0]; /* 存储区 1 */ frame[3] = store[1]; /* 存储区 2 */ frame[4] = crc8(frame, 4); /* 前 4 字节的 CRC,抗误码 */ frame[5] = TAIL; send_frame(frame, 6); /* 负载调制把帧打回阅读器 */ __enable_interrupt(); /* 发送完毕,切到接收,等阅读器写入 */ while (1) { LPM3; /* 低功耗模式 3,靠串口中断唤醒 */ } } /* 接收中断:校验通过才写 flash,失败直接丢弃等下一帧 */ #pragma vector=USCIAB0RX_VECTOR __interrupt void rx_isr(void) { unsigned char b = UCA0RXBUF; if (frame_push(b) == FRAME_OK) { /* 收到完整帧 */ if (crc8(rxbuf, 4) == rxbuf[4]) { /* 校验通过 */ flash_write(ADDR_STORE, rxbuf + 2, 2); /* 落盘,断电不丢 */ } frame_reset(); /* 无论成败都重置状态机 */ } __low_power_mode_off_on_exit(); }这段流程里有三个决定成败的细节。一是“先发后收”:上电后立刻把身份和存储内容播一遍,再开接收中断等写入,这样阅读器不必先发指令、应答器也不必先收——省掉一次交互,响应时间直接从秒级压到亚秒级。二是写 flash 前必须过 CRC,无源供电下电压本来就不稳,一个位翻转写进去就永久错了,校验不通过宁可不写。三是整个循环用 LPM3 睡眠,靠中断唤醒,工作电流从毫安级降到微安级,这是 700µA 总预算能成立的前提。
参数上还要注意拨码开关的上拉电阻。用 300kΩ 而不是常见的 10kΩ,是因为 3V/300kΩ = 10µA,四位一共 40µA;换成 10kΩ 就是 1.2mA,直接把预算吃穿。这是典型的“看起来无关紧要的一个电阻决定方案可行性”。
4.4 半双工与帧结构:为什么必须有同步码和 CRC
同一频点上不能同时收发,所以整套系统是半双工的:阅读器发指令时,应答器只能听;应答器回数据时,阅读器必须停止调制载波幅度(否则自己的调制会盖住对方的回传)。这个约束会传导到软件上——状态机必须明确“我现在是在发还是在收”,切换点要有超时保护,否则一端卡死另一端就永远等下去。
帧结构上,专用编解码套片的思路值得借鉴。这类芯片把一帧拆成地址码、数据码、同步码三段:同步码给接收端做位同步和增益归位,地址码做匹配过滤(地址对不上直接丢弃,避免误触发),数据码才是内容。地址位做成三态(悬空/接高/接低),12 位就能组合出五十多万种地址,对于“识别多个应答器”这种扩展需求已经够用。自己用 MCU 软解码时,同步码和 CRC 这两样一个都不能省——同步码解决“从哪一位开始算”,CRC 解决“这一帧到底对不对”。
5. 避坑与排查:这类装置最容易翻车的五个点
纸上推演都对,一上电全错,是这类项目的常态。下面五条是按“现象 → 原因 → 解决”整理的高频翻车记录。
5.1 调谐时峰值很漂亮,手一靠近就失灵
现象:用示波器看线圈电压,调到谐振点时幅度最大,波形也干净;但把应答器放到 5cm 以外再放回来,或者手靠近线圈,通信立刻断掉,重新调一下又能用。
原因:Q 值取得太高,谐振曲线太尖。线圈电感的离散、人体带来的分布电容、两线圈距离变化引起的反射阻抗虚部变化,任何一项都足以把工作点推出谐振峰。这类系统的耦合状态本来就是动态的,用一个静态最优点去应对动态工况,必然失效。
解决:把 Q 压到几十的量级,宁可牺牲峰值增益。具体做法是在谐振回路上并一个阻尼电阻,或者把匹配电容从固定值改成可调电容(5/24pF 这种),在“最远工作距离”那个点上调,而不是在“最近距离”调。调谐的基准点选错了,后面怎么调都是错的。
5.2 应答器一上电就反复复位,数据发不出来
现象:应答器单独用电池供电时工作完全正常,改成从线圈取电后,阅读器只能偶尔收到半帧数据,抓到波形看是一串不完整的脉冲。
原因:储能不足加上负载调制瞬间的电流冲击。整流后的储能电容在负载调制导通的那一瞬间被抽走一大口电流,端电压瞬间跌破 MCU 的掉电复位门限,芯片复位,发送中断,下一轮重新上电又从头开始——表现出来就是“偶尔能收到半帧”。
解决:加大储能电容是最直接的办法,但会拖慢上电建立时间;更聪明的做法是降低发送时的瞬时功耗——把 MCU 时钟降下来、发送期间关掉不必要的外设、把连续发送改成分段发送留出充电间隙。还有一个细节:上电复位电路的时间常数要留够,让电压稳定之后再释放复位。
5.3 能识别到“有应答器”,但编码全是乱的
现象:阅读器的“检测到应答器”指示灯正常亮,但显示的 4 位编码每次都不一样,或者固定错某一位。
原因:检波电路的时间常数和码率不匹配。τ 太大,码元边沿拖尾,连续的 1 后面跟着的 0 会被“拉平”,读出来全是 1;τ 太小,检波输出跟着载波纹波一起抖,施密特触发器在边沿上反复翻转,多出一堆假脉冲。另一个常见原因是松耦合电容取值不当,取的信号太弱,信噪比不够。
解决:按“τ 约等于半个到一个码元宽度”去选 RC,然后用示波器直接看检波后的波形,边沿是不是干脆、有没有振铃、高低电平是不是分明,这三个问题肉眼就能判断。不要靠改代码去修模拟端的问题——数字滤波只能修饰,不能创造信息。
5.4 换一只线圈就不好使了
现象:同一套电路,换一只“同规格”的手工线圈,通信距离从 20cm 掉到 5cm。
原因:手工绕制的空心线圈电感离散极大,实测能差出 30%(10µH 对 12.9µH)。谐振电容是按某一只线圈配的,换一只就失谐,而且失谐的方向不确定。题目限定线圈直径 6.6cm、密绕 10 圈、线径不大于 1mm,但绕制的松紧、引线的长短、焊点的位置都会影响电感。
解决:匹配电容一定要留可调余量,并且把“换线圈必须重调”写进调试流程。更工程化的做法是在线圈两端并联一个固定的“粗调”电容加一个可调的“细调”电容,粗调负责把范围框住,细调负责对准。有条件的用 LCR 表实测每只线圈的电感,按实测值配电容,而不是按标称值。
5.5 断电后存储的信息丢了
现象:阅读器写入成功、当场读回来也对,但把应答器的供电断开再上电,读出来是空白的或者旧数据。
原因:三种可能。一是写 flash 之前没有等电源电压稳定,欠压状态下写进去的是垃圾;二是写完没有回读校验,写失败了你也不知道;三是把数据存在了 RAM 里靠备用电池维持,电池一撤就没了。
解决:写之前先判断电压门限(很多 MCU 有内置的欠压检测),写之后必须回读比对,不一致就重试;数据结构上加一个校验字或者版本号,上电时先验证再使用,验证不过就按默认值处理。题目要求“存储容量不小于两个 4 位二进制数”,听起来很小,但可靠性要求和存几 KB 是一样的——存储的难点从来不在于容量,而在于掉电那一刻的完整性。
6. 电流预算与掉电存储:3mA 的额度怎么分,以及两条路线的取舍
把整个应答器的静态电流摊开看,会发现问题根本不在“选什么芯片”,而在“哪些东西本来就不该存在”。
| 消耗项 | 电流量级 | 备注 |
|---|---|---|
| MCU 待机(低功耗模式) | 0.7µA | 大部分时间应该待在这里 |
| MCU 工作(发送/接收时) | 小于 500µA | 时钟越低越省,够用即可 |
| 4 位拨码开关上拉(300kΩ × 4) | 40µA | 换成 10kΩ 就是 1.2mA,直接崩 |
| 稳压管限压支路 | 数十 µA | 牺牲一点功率换零静态损耗 |
| 模拟开关/调制级 | 视方案而定 | 短路型几乎不耗直流 |
加起来的量级就是 700µA 左右,相对整流能提供的 3mA 还有四倍余量。这个余量不是天然的,是砍出来的:拨码开关上拉用 300kΩ 而不是 10kΩ、限压用稳压管而不是 LDO、MCU 常年睡在低功耗模式、外围电路只保留上电复位。每一个决定单看都是小事,叠起来决定方案能不能成。
掉电存储那条,路线选择的差别比想象中大。片内 flash 的优点是零外部器件、容量够、接口就是寄存器;缺点是写入慢、寿命有限(十万次量级)、写入过程怕掉电。片外 EEPROM 写入稳、寿命长,但多一颗芯片就是多一份静态电流和一块板子面积。用 RAM 加备用电源最省事,但“不允许使用电池”这条硬约束直接把它排除了。所以在这类无源装置里,片内 flash 加写入前电压判断、写入后回读校验,基本是唯一可行的组合。
真正值得琢磨的取舍在编解码这一层。用专用编解码套片,电路极简、几根线接上就能跑、解码逻辑不用写一行代码,代价是灵活性差——地址和数据位宽被芯片锁死,想加 CRC 或者改帧格式都做不到。用 MCU 软编解码,帧结构随便设计、CRC 想加几层加几层、还能顺便做低功耗管理,代价是代码量和调试时间,而且 MCU 在解码期间必须保持唤醒,电流比套片高。
我自己的判断标准是:如果任务是“把功能做出来”,选套片;如果任务是“把指标做到极限”,选软解码。因为距离和功耗这两项指标,最终都是靠“每一个微安、每一个 dB 都要自己掌控”抠出来的,套片给不了你这个控制权。前面那套做到 23cm、0.69W 的方案,用的是 MCU 全程接管;另一套做到 22cm、1.2W 的方案,用的是套片加模拟开关,电路确实简单,但功耗和距离都卡在了器件给定的天花板上。
从那以后我每次碰这类无源装置,都会先把电流预算表和 1/D³ 的曲线摊在桌上算一遍再动手,算完了才决定用什么芯片、绕几圈线圈。硬件的坑,九成是在画第一根线之前就埋下的。希望帮到你。
本文还有配套的精品资源,点击获取