ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

RFID读卡模块设计实战:125kHz天线调谐、曼彻斯特解码与韦根输出

RFID读卡模块设计实战:125kHz天线调谐、曼彻斯特解码与韦根输出 简介一套完整的125kHz RFID读卡模块设计资料覆盖UART与韦根两种输出方式包含曼彻斯特编码、行列奇偶校验及读写器工作流程适合嵌入式开发者、硬件设计人员和物联网爱好者参考学习。压缩包共41个文件约1.61MB除DSN/PCB电路源文件外还包含C语言工程源码、HEX固件、PDF文档、BMP示意图及编译过程生成的MAP/LST等文件方便从原理图、布局到代码逐层对照。已有626人学习。通过学习可掌握125kHz低频RFID系统的完整实现路径从标签耦合激活、信号编解码到数据校验与接口输出均能深入理解同时可利用ATtiny13相关固件与电路图进行二次开发、教学演示或移植到其他MCU平台。其中韦根协议详解、曼彻斯特自同步解码以及行列奇偶校验的工程化应用是具有一定基础的电子工程师快速上手RFID项目的高价值参考资料。1. 从 .rar 到点亮天线RFID 读卡模块到底在做什么拿到「RFID读卡模块电路图、PCB源文件.rar」这种资料包的人多半正要做门禁读头、智能柜格口或考勤终端。解压之后是AD、立创EDA或Cadence的工程那几页原理图和几块铜皮本质上只做一件事天线以125kHz的频率谐振读取非接触卡返回的负载调制信号把曼彻斯特编码还原成卡号最后按韦根协议把卡号推给上位控制器。对硬件工程师来说这个链路最卡人的不是PCB画得漂不漂亮而是天线谐振参数、包络检波整形和曼彻斯特解码时序这三件事。这篇就顺着一条读卡信号链从原理图验算讲到PCB布局再讲到解码和韦根输出的实测方法适合正在做读卡模块设计或者想从头自己搭一套读头的工程师。2. 原理图怎么读125kHz 谐振、包络检波和整形那三段电路2.1 先找天线谐振对L 和 C 的参数怎么验算看原理图我一般先找天线接口。读卡模块原理图里天线通常是一组网络标号为ANT1/ANT2或L_ANT的焊盘旁边一定有一颗并联或串联的谐振电容。这颗电容和天线线圈的电感决定了载波频率对125kHz读卡器目标就是把谐振点压到125kHz附近。你从资料包里打开原理图先别管MCU那一堆网络直接在图上搜ANT、COIL、L_ANT这类关键字把天线回路独立出来看。验算公式是 f0 1 / (2π√(LC))反推电容就是 C 1 / (4π²f0²L)。问题在于原理图上标的电感值往往是个标称值实际板子打样回来走线的几何、线圈匝间间距、板材厚度都会让电感偏离。所以我一般会按原理图标注算一版再预留一个可换贴片电容的焊盘位置方便实测后调整这个方法在项目初期能省一版打样费。实测天线电感 L目标频率 125kHz 下计算 C常用并联组合330uH4.9nF4.7nF 200pF470uH3.4nF3.3nF 100pF680uH2.4nF2.2nF 180pF1mH1.6nF1.5nF 100pF表里的组合电容值不是唯一答案。实际匹配时要看天线的Q值Q太高带宽窄读卡距离近但抗干扰好Q太低灵敏度差。对门禁这种工作距离5到10cm的场景Q值在20到40之间比较合适。判断Q值的方法是看谐振点附近的带宽B f0 / Q125kHz除以Q30带宽约4kHz能覆盖卡片回传的1.95kbps数据速率余量够用。原理图上如果发现谐振电容算出来和实际标称值差了一倍以上比如算出来2.2nF但板上贴的是4.7nF那多半是天线线圈的圈数或尺寸和文件里的不一致或者是面向不同载波频率的版本先把电感实测了再动电容不要盲目猜。2.2 载波激励与包络检波二极管、RC 时间常数被动式RFID卡不装电池读卡器得先持续发载波给卡片供电。分立件方案里常见的是MCU输出125kHz方波经过一级三极管或MOS管推挽驱动LC谐振回路也有用反相器并联增强驱动力的做法。集成方案则用读卡芯片自带的载波发生器比如EM4095这类专用前端。无论哪种方案天线两端都会出现幅度被卡片负载调制过的125kHz正弦波读卡器要从这根正弦波里把卡片的回传数据捞出来。这一步就是包络检波。电路上通常是一颗肖特基二极管或BAT54S双二极管做半波整流后面接一个RC低通。检波之后的信号里既有数据包络也残留125kHz载波RC的截止频率要选在载波和数据速率之间。按2kbps左右的数据率位周期约512usRC时间常数不能大于半位周期的五分之一否则曼彻斯特方波的边沿会被拖慢后级解码时序全偏。我常用的取值是R10kΩ、C1.5nF算出来截止频率约10.6kHz典型参数如下表参数取值作用检波二极管BAT54S 或 1N4148半波整流提取包络R10kΩ与C构成低通滤除载波C1.5nF低通截止约10.6kHz保留2kbps数据比较器LM393 或 74HC14将模拟包络整形成数字方波原理图上看到RC乘积接近这个量级基本没问题。如果RC取值过大示波器上看检波输出是一团圆头圆脑的馒头波边沿变缓取小了则包络上能见到明显的125kHz纹波比较器容易在纹波上来回翻转产生大量毛刺。这两种情况调试时都能通过示波器一眼认出所以第一版尽量按表里的量级贴别在RC上玩花样。2.3 比较器整形和 MCU 输入保护包络检波出来的信号幅度通常只有几百毫伏还带着直流偏置不能直接进MCU。中间需要一级比较器或施密特触发器整形。原理图上常见的做法是LM393加正反馈电阻形成迟滞比较器或者直接用74HC14反相器靠施密特特性整形。阈值电压一般设在检波输出平均电平的一半左右由两个电阻分压给定比如10kΩ和4.7kΩ分压到1.1V左右再接到比较器同相端。迟滞宽度是这一级的关键参数。迟滞太大弱的卡信号会被直接吞掉读卡距离缩水迟滞太小噪声和载波残余会让输出抖动。我一般先按50mV左右设实测读卡距离不理想再加大到100mV。如果MCU选的是带模拟比较器的型号比如STM32F103C8T6的PA0/PA1口可以省掉外部比较器但要记得把内部比较器的迟滞选项打开并配置输入施密特触发否则抗干扰能力会差不少。MCU输入保护也要看一眼。检波输出经过比较器之后是数字方波但卡片靠近瞬间的瞬态干扰可能会在线上串入超范围电压。两个1N4148分别钳位到VCC和GND是常见做法前面再串一个1kΩ电阻限流。这个位置不需要TVS因为信号本身是低速数字电平二极管钳位足够TVS反而会增加结电容影响边沿。到这里原理图的三段就闭合了天线谐振把射频能量送出去检波把回传包络取出来整形把模拟包络变成数字信号。下一块板要解决的是这些元件在PCB上怎么放才不会让天线自己干扰自己。3. PCB 布局与走线天线、地平面和去耦的边界条件3.1 天线线圈走线与铜皮挖空PCB 设计里最不能妥协的是天线线圈。常见做法是把天线画在板子边缘顶层走线线圈内部净空区域不布线。线圈可以画成方形、圆形或跑道形对角尺寸从50mm到80mm不等圈数4到8圈。线宽0.5mm左右、间距0.3mm是比较稳的起点。走线宽度和线圈尺寸决定电感量下面几个组合是常见的起点参考范围天线形状与尺寸圈数线宽/间距预期电感范围方形 50×50mm5圈0.5mm / 0.3mm120~200uH方形 50×50mm8圈0.5mm / 0.3mm400~640uH圆形直径60mm5圈0.5mm / 0.3mm150~280uH圆形直径60mm8圈0.5mm / 0.3mm500~800uH这个范围只能估算不能当最终设计值。天线电感受线圈周围金属、铺地和板材厚度影响很大打样回来的板子必须用LCR表在125kHz档位实测测出来的电感值再反推谐振电容过程和2.1节里验算的一样。原理图文件里的封装如果是通用封装实际画板时线圈大小和圈数改了谐振电容的标称值也得跟着改这个联动很多人会漏。铜皮挖空是新手最容易漏的一步。天线线圈正下方包括线圈内部区域和线圈外侧3到5mm所有层都要禁止铺铜。在AD20里可以给天线区画一个禁止布线层多边形铺铜时把这块设成挖空区域或者铺完铜后选中区域直接删掉铜皮。如果不挖空地平面会在天线下方形成涡流回路相当于给天线并联了一个损耗电阻直接表现就是读卡距离从能用的7cm掉到2cm而且怎么调电容都救不回来。3.2 射频和数字的分区布置元件布局上我习惯把板子一分为二一端是天线线圈和匹配电容另一端是MCU、晶振和韦根输出接口中间放检波二极管和比较器。这样的分区能让125kHz大信号和数字逻辑互不干扰。检波二极管要尽量靠近天线焊盘减少检波前的走线长度比较器稍微离远一点没问题它是高阻输入抗干扰能力强。天线匹配电容的摆放也要注意尽量贴近天线焊盘和IC引脚形成短回路。地平面的处理有一个容易忽略的点不要做模拟地和数字地的跨分割。RFID读卡器的信号频率低跨分割产生的回流路径绕行反而会形成环形天线把开关噪声耦合进检波级。整个板子用一块完整地实在要分就在MCU下方用0Ω电阻单点连接。我见过不少读卡模块问题出在为了隔离而隔离把地劈成两半结果读距上不去改成完整地平面后问题消失。去耦电容的位置按信号路径放MCU电源脚一颗100nF加一颗10uF比较器电源脚一颗100nF全部尽量靠近引脚。晶振和天线之间留出5mm以上距离晶振外壳接地。如果板子空间允许韦根输出接口和天线放在相对的两侧避免输出线上的数字翻转耦合到天线。另外MCU的复位引脚不要拉太长走线复位电容靠近复位脚放防止上电瞬间误复位。3.3 Data0/Data1 输出走线与 ESD 防护韦根的DATA0和DATA1两根线虽然只有低速脉冲但线到了机箱外面的概率很大要走短线、并行走中间夹一条地线或者贴着完整地平面走。每根线上串33Ω电阻目的不是阻抗匹配而是在ESD事件里限流保护MCU引脚。靠近连接器的地方放一颗TVS管或两个二极管钳位参考地对连接器外壳。这个位置不要省TVS门禁读卡器装在大楼门口静电打进来的概率远比实验室里高。上拉电阻看模块输出极而定。开漏输出的话4.7kΩ上拉到3.3V或5V是标准取值推挽输出则不需要。原文件里如果看到10kΩ上拉而且输出是开漏也能用但脉冲上升沿会变慢长线传输时波形可能不干净。我会按4.7kΩ贴第一版实测波形后再决定要不要加大。如果控制器侧的输入已经带上拉模块侧可以只串电阻不加上拉避免两边上拉并联导致电平抬不上去。导出Gerber前跑一遍DRC不是走形式重点检查三项天线线圈间距是否触发最小间距规则、谐振电容焊盘到天线的连接是否断线、挖空区域是否覆盖了所有层。AD20的DRC把规则设到线宽和间距0.3mm以上瓷片电容焊盘间距0.5mm跑完再看报告比到了板厂被工程师打回来要省事得多。DRC报告里连天线区内不允许的过孔也要查一遍天线正下方严禁打过孔。4. 曼彻斯特解码从脉冲序列还原卡号4.1 先看清两种编码约定中间跳变方向决定 1 和 0天线端的负载调制信号经过检波和整形到MCU引脚上的是一串带曼彻斯特编码的方波。曼彻斯特编码的规则一句话就能讲完每一位的中间必有一次电平跳变数据值由跳变方向决定。数据位前半位电平后半位电平中间跳变方向1高低高→低0低高低→高拿序列 1 0 1 1 0 来说1 是中间高→低0 是中间低→高所以这五位的电平是位1先高后低、位0先低后高、位1先高后低、位1先高后低、位0先低后高。连起来看就是高、低、低、高、高、低、低、高、低、高。位与位衔接处如果电平相同就不产生跳变这是曼彻斯特自带的时钟特性也是解码时判断位边界的依据。理解这一点比背编码规则重要因为解码器真正要处理的不是电平本身而是跳变的位置和方向。和NRZ编码相比曼彻斯特的优势是接收端不需要独立的时钟信号每一位中间都有跳变收发双方只要对齐了跳变节奏就能稳定采样。代价是同样的数据率下电平翻转次数多了一倍。在RFID读卡器这条信号链上载波频率125kHz数据速率通常只有1.95kbps左右位周期约512us翻转次数根本不是瓶颈所以曼彻斯特在这类低速近距离读卡里非常常见。4.2 过采样解码的核心代码解码的思路不唯一我习惯用过采样加位中心窗口判断定时器每32us采样一次GPIO一个位周期16个采样点。在每个位周期的中间窗口里检查有没有跳变跳变方向就是这一位的值。窗口设成第6到第9个采样点对应位周期的中间区域能容忍一定程度的时钟偏差实现起来也比输入捕获统计脉宽稳定。/* 曼彻斯特过采样解码器核心逻辑 * 定时器每 32us 调用一次假设位周期 512us一个位周期 16 个采样点 * 引脚输入整形后的曼彻斯特方波空闲为高电平 */ static uint8_t prev_level 1; static uint8_t tick 0; /* 当前位周期内的采样计数 */ static uint8_t mid_dir 0; /* 位中心跳变方向1为高→低0为低→高 */ static uint8_t rx_byte 0; static uint8_t rx_bit_cnt 0; void manchester_sample(uint8_t level) { /* 在位中心窗口内检测跳变 */ if (tick 6 tick 9) { if (level ! prev_level) { mid_dir (prev_level 1 level 0) ? 1 : 0; } } tick; if (tick 16) { tick 0; /* 收集当前位写入字节缓冲 */ rx_byte (rx_byte 1) | mid_dir; rx_bit_cnt; if (rx_bit_cnt 8) { rx_bit_cnt 0; frame_push(rx_byte); /* 交上层帧解析 */ rx_byte 0; } mid_dir 0; } prev_level level; }逻辑说明tick从0数到15代表一个位周期的16个采样点中间窗口6到9的4个采样点用来捕捉中心跳变这样即使MCU时钟和输入位时钟有百分之十几的偏差跳变也能落在窗口内。mid_dir记录的是当前采样到上一采样之间的电平变化方向prev_level为1且当前为0表示高→低判定这一位为1反之低→高判定为0。rx_byte按位左移每8位组成一个字节交给上层。注意这里每16个采样点强制收一位如果某个位周期内中心窗口没有检测到跳变mid_dir保持为0会把这个位解成0这是简化处理实际帧解析里要靠校验把这种错误帧丢掉。实际工程里有两个地方要改。一是采样周期如果模块的位周期不是512us按位周期的1/16去定定时器中断周期位速率由晶振和卡片协议共同决定先查数据手册的RF/64参数。二是抖动处理比较器输出在边沿附近可能有亚微秒级抖动32us采样能滤掉大部分毛刺但环境干扰强的时候可以在采样里加连续两次采样相同才确认电平变化的防抖代价是窗口会变窄位中心窗口要相应调大。也可以在检测到跳变时同时记录跳变前的方向和跳变后的方向再做一次方向有效性判断。4.3 帧格式与校验处理曼彻斯特解码还原的是一串连续位流要从里面切出卡片号还需要帧格式。读卡芯片的常见帧结构是前导码加版本码加数据区加校验位。前导码通常是一串连续相同的位比如连续9个逻辑1或逻辑0让接收端在这个阶段完成位同步。数据区里不同芯片的位序不一样有的高位在前有的低位在前校验方式一般是奇校验、偶校验或行列校验的组合。资料包的原理图里通常会标注读卡芯片型号按型号去查对应datasheet的帧结构定义这是最可靠的做法。帧解析的通用流程是先做前导码检测连续收到指定数量的相同位后进入数据采集模式再从固定偏移位置开始收集版本码和数据区最后按协议做校验校验通过才把数据区转换成卡号。举例来说如果协议定义帧长为56位、前导9位、版本4位、数据32位、校验11位那就按偏移量和长度逐段截取。每种芯片的具体偏移量和校验算法以数据手册为准不要拿A芯片的帧格式去套B芯片这是解码踩坑最多的地方。实际调试时最容易犯的错是把位边界跳变当成中心跳变。位边界跳变什么时候出现4.1节说过它取决于相邻位的后半位和前半位是否相同频率不固定。如果解码器没有按位周期采样而是按跳变计数就会多解出位来帧长度永远对不上。这就是我坚持用位同步加中心窗口的原因而不是简单地每个跳变算一位。调帧解析时用一个已知卡号反复测试把解析出来的原始位流打印到串口跟前导码和数据区定义逐位比对问题很快就能暴露。5. 韦根输出与实物验证示波器、逻辑分析仪和测距5.1 韦根时序DATA0 与 DATA1 到底怎么拉低韦根协议是读卡模块和控制器之间的接口标准。两根线平常都拉高输出0时DATA0拉低约100us输出1时DATA1拉低约100us位与位之间间隔约1ms。注意数据是由低脉冲表达的不是高电平逻辑分析仪抓波形时看到两根线上都是高电平属于正常空闲状态不是没信号。参数最小值典型值最大值说明数据脉冲宽度70us100us150usDATA0或DATA1拉低时间位间隔200us1ms20ms两个脉冲之间的时间帧间隔500us1ms50ms两帧数据之间的时间26位韦根帧是最常见的格式结构是第0位偶校验覆盖第1到第12位数据的1的个数为偶数第1到第8位是站点码第9到第24位是卡号第25位奇校验覆盖第13到第24位数据的1的个数为奇数。34位、37位等长格式原理相同只是数据段更长。从模块端测量韦根输出时用示波器或逻辑分析仪看低脉冲宽度即可多数门禁控制器对脉宽宽容度很高只要落在上表范围内都能识别。5.2 用逻辑分析仪抓一次完整读卡波形我调试时会同时抓三路DATA0接CH0、DATA1接CH1、比较器整形后的曼彻斯特信号接CH2。逻辑分析仪采样率设2MS/s以上触发选择DATA0下降沿预触发10%。卡片贴近天线2秒就能抓到一帧完整的韦根输出。抓到的波形怎么验证先看CH2上的曼彻斯特信号它应该是每半位一次跳变的稳定方波如果中途有毛刺说明检波或整形有问题。再看CH0/CH1每个低脉冲宽度应接近100us间隔接近1ms。最后人工或脚本解码把26位数据解出来和已知卡号对比。下面是一个从逻辑分析仪导出CSV解析韦根位流的Python脚本适合快速验证一帧数据# 解析逻辑分析仪导出的 CSV列time, D0, D1 import csv import sys bits [] prev_d0, prev_d1 1, 1 with open(sys.argv[1], r) as f: for row in csv.reader(f): if len(row) 3: continue t float(row[0]) d0 int(row[1]) d1 int(row[2]) if prev_d0 1 and d0 0: bits.append(0) # DATA0 下降沿 - 逻辑 0 if prev_d1 1 and d1 0: bits.append(1) # DATA1 下降沿 - 逻辑 1 prev_d0, prev_d1 d0, d1 frame bits[:26] if len(frame) 26: print(fcaptured {len(bits)} pulses, need 26) sys.exit(1) site_code int(.join(str(b) for b in frame[1:9]), 2) card_id int(.join(str(b) for b in frame[9:25]), 2) print(fsite_code{site_code:03d} card_id{card_id:05d})脚本逻辑在CSV逐行扫描时如果当前D0为低且上一行为高说明D0出现下降沿记录0D1同理记录1。取前26个脉冲就是一帧。CSV里电平字段有的工具导出为true/false有的是1/0按工具实际输出把int()改成对应映射即可。脚本没有做奇偶校验正式校验按5.1节的两条规则加两句判断即可比如统计frame[1:13]中1的个数加frame[0]应为偶数。5.3 读卡距离近和输出乱码的两个排查方向距离近第一个怀疑对象是天线失谐。用LCR表实测天线电感按2.1的公式算谐振电容再用电容表核对板上实际贴的值。谐振点偏了最直接的修法是换谐振电容比如把2.2nF的换成2.4nF看读距有没有变化。如果换了几颗都没反应再查天线下方是不是有没挖干净的铜皮或者线圈周围有没有平行长走线。金属外壳紧贴天线也会通过耦合改变谐振频率这时候要在天线和外壳之间留出至少10mm空间。输出乱码问题多半出在整形或解码上。示波器看CH2的曼彻斯特信号如果边沿有回勾或者低电平上顶着毛刺加大比较器迟滞或RC滤波。如果是代码里误判位边界回到4.3节检查是不是把边界跳变当成了中心跳变。金属环境导致的读距下降可以用铜箔在PCB背面贴一层做单面屏蔽实测有效再考虑是否画进定型版本里。这几个方向按信号链路从前到后排查十分钟内基本能定位问题出在哪一级。本文还有配套的精品资源点击获取
返回列表