纯数字电路实现自动换挡频率计:从闸门时间到量程切换的完整设计
玩频率计这么多年我一直觉得它的原理简单到“十个字就能说清”在固定时间里数脉冲。可真到自己动手做一台能长期使用的频率计时才发现最折磨人的根本不是计数而是量程切换。手动挡机器最经典的翻车画面有两种测25MHz信号忘了拨挡计数器溢出满屏跑9谁都看不出真实值测50Hz工频闸门时间太短计数只有个位数精度连毛都算不上。自动换挡频率计要解决的就是让机器自己判断被测频率的量级挑一个合适的闸门时间再把结果显示得让用户不用心算。这篇文章只谈一件事怎样用纯数字电路而不是单片机加几行if判段把“自动换挡”这套逻辑优雅地做出来。适合正在做数字电路课程设计、或者想拿74系列、4000系列芯片从零搭仪器的朋友参考。1. 量程切换的本质不是换放大倍数而是换分母T1.1 频率测量逃不开的公式任何频率测量方法追到根上都是同一个公式f N / TT是闸门时间也就是计数器打开的时间窗口N是窗口内进入计数器的脉冲个数。闸门时间拉得越长N就越大测量的分辨率越高但N太大计数器会溢出。闸门时间越短可测频率范围越高但低频时N太小读数的有效位数很难看。这个一长一短的矛盾就是量程切换存在的根本原因。手动挡频率计本质上就是一个“手动选择分母T”的仪表。很多初学者会把频率计的量程切换和万用表的量程切换混为一谈以为要换输入衰减网络。实际不是。频率计前端一般就是一个电压比较器把正弦波、三角波各种波形整形成为数字电路能用的方波只要输入幅度在比较器灵敏度范围内前端电路根本不需要切换。真正要切换的只有一件事闸门时间T也就是计数器数哪一路时基、数多少下关闸门。1.2 固定闸门时间的死穴如果用固定1秒闸门去测一个1MHz信号1秒钟内要数100万个脉冲6位计数器勉强能装下看似还能用。但测10MHz呢1秒内要数1000万个脉冲6位计数器直接溢出。把闸门改短到1ms10MHz信号只数10000个脉冲能测了精度却变成了10kHz级别的分辨率低频信号又没法看。手动挡频率计的挡位设计就是在“溢出”和“精度崩掉”之间走钢丝。你每次测量前都得对信号频率有个预估然后手动选挡。测量过程中信号频率变了还得重新拨挡。实验室里慢慢测还好维修现场或者做信号链路调试时待测信号的频率经常是未知的从高挡往低挡一档一档试错体验非常不好。1.3 自动换挡的验收标准自动换挡频率计要替代人工判断核心目标非常明确无论输入信号频率怎么变机器在一个或几个测量周期之后能自己落到合适的挡位上保证计数结果既不溢出又尽量占满有效显示位数。我在设计时给这个目标定了一个可量化的验收标准输入一个稳定频率系统自动换挡后显示读数必须稳定不发生挡位来回跳变读数有效位数至少5位即N≥100000当输入频率超出可测范围时能明确提示溢出或量程极限而不是卡在一个不合理的状态。后面整个数字电路的换挡判据、控制逻辑、显示处理全是围绕这套标准展开的。2. 换挡判据的设计用最高位空不空来决定而不是做一次除法2.1 为什么把阈值定在100000自动换挡的第一步是确定“计数结果好不好”的判定标准。很多人第一反应是做除法用当前计数除以闸门时间算出频率值再跟频率范围比较。这个思路在单片机上写程序当然没问题但在纯数字电路里做除法非常不划算占用的逻辑资源多时序也非常难凑。换个角度想频率计的显示位数是固定的我把显示做成6位那么理想计数N就应该落在100000到999999之间。低于100000说明闸门时间内数的脉冲太少有效位数不足高于999999说明计数器要溢出频率太高。为什么要选100000这个数而不是90000、500000因为“N低于100000”在数字电路里有一个极其廉价的判定方法6位计数器的最高位是0也就是十万位BCD码为0000。反过来“N达到100000”就是最高位不再是0。不需要比较器不需要减法器只要对最高位计数器的BCD输出做一次四输入或非门判断就能知道当前计数是否达标。这个细节是整个设计的精髓之一。很多自动量程电路做复杂了其实是把一个本来很简单的“位空判断”做成了算术运算。用纯数字电路做设计最值钱的思路就是“把算法问题转化成逻辑门问题”。2.2 换挡逻辑的完整规则6位计数器每一位用BCD计数器级联。最高位是十万位当它从9加1进位到更高位时会拉出一个进位脉冲这就是溢出信号。我用了这两条线来做换挡判据升挡条件最高位BCD为0即N 100000当前挡位下计数太少需要增大闸门时间。降挡条件最高位计数器产生进位即N ≥ 1000000计数溢出需要减小闸门时间。挡位方向要注意描述清楚。我这里把挡位从低到高设计成挡位11ms闸门、挡位210ms、挡位30.1s、挡位41s。计数太少时向挡位增大的方向调整也就是增大T让同一个频率在窗口内产生更多计数溢出了就向挡位减小的方向调整缩短闸门。完整规则如下表当前挡位N 100000N ≥ 1000000保持条件挡位11ms切到挡位2显示量程超限100000 ≤ N ≤ 999999挡位210ms切到挡位3切到挡位1100000 ≤ N ≤ 999999挡位30.1s切到挡位4切到挡位2100000 ≤ N ≤ 999999挡位41s保持挡位4切到挡位3N ≥ 100000这里有个特殊情况挡位4已经是1s闸门低频信号下N始终小于100000不能再往大换挡了就保持1s挡。1Hz分辨率的低频测量对绝大多数场景已经够用。如果还有低频高分辨率的特殊需求可以再加10s挡位但那种情况下测量周期太长对自动换挡系统来说是另一套取舍一般仪表不太会做。2.3 滞回区间的必要性如果只在100000这一个点上做切换临界频率附近会出现一个非常讨厌的现象挡位来回跳。比如信号恰好让当前挡位计数在100000附近这次测量结果99000升挡下一次测量因为存在±1计数误差或者时基偏差变成100100又不升了。两挡之间反复横跳读数就无法稳定。解决方法是引入滞回区间用两个阈值代替一个阈值升挡阈值还是100000但降挡阈值改成999990附近中间留出缓冲区。更准确地说判定条件是只有当“最高位为0”时才触发升挡动作只有当“最高位进位产生溢出”时才触发降挡动作两者都不是就保持当前挡位。这样设计天然带滞回效果。因为升挡需要N低于100000降挡需要N超过999999中间隔着很大的区间信号的微小波动不会导致挡位抖动了。2.4 测量周期的节奏设计换挡动作不能随心所欲在测量中途插进来。计数器闸门已经打开了中途换挡前面计的数就不知道按哪个挡位算数据直接作废。我设计的测量节拍是固定四拍启动 → 开闸计数 → 关闸锁存 → 判定换挡 → 复位 → 下一周期判定换挡必须发生在闸门关闭之后、下一次复位之前。为了让换挡反应更快可以在测量周期结束后的短暂判断窗口里用计数最高位的状态直接更新挡位寄存器这样下一个周期就能按新挡位跑。整套逻辑用数字电路实现本质上是一个带反馈的状态机。3. 纯数字电路搭出来的自动换挡控制逻辑3.1 时基与挡位时钟从1MHz分出四路定时源自动换挡频率计需要一个稳定时基。我用的方案是1MHz有源晶振加74HC390十进制分频链。74HC390内部是两个独立的÷2和÷5计数器级联起来就能做十进制分频。1MHz时基经过三级74HC390级联分频分别输出100kHz、10kHz、1kHz。这四个频率就是挡位对应的定时时钟挡位定时时钟定时器计数值闸门时间挡位11MHz10001ms挡位2100kHz100010ms挡位310kHz10000.1s挡位41kHz10001s注意这里的设计思路定时计数器永远数1000个脉冲不变变的是进入定时计数器的时钟频率。1MHz时钟数1000下是1ms100kHz时钟数1000下是10ms10kHz时钟数1000下是0.1s1kHz时钟数1000下正好1s。这种做法的好处是定时计数器只需要做成固定的三位十进制000到999电路结构完全统一不用做多档预置数。3.2 闸门控制RS触发器加三片计数器闸门控制是整个频率计的中枢。我用两个与非门交叉构成RS触发器Q输出作为闸门信号。启动时一个复位脉冲把RS触发器置为高电平闸门打开被测信号进入6位计数链同时定时计数器也从复位的000状态开始对挡位时钟计数。当定时器数到999、下一次进位到来时产生结束脉冲把RS触发器复位闸门关闭。这里有一个特别容易踩的设计错误有些资料直接从分频链输出端取一个方波沿来关闸看起来也对但细想就会出问题。因为闸门开启时刻和分频方波边沿之间没有同步关系从开启到下一个边沿的时间在0到1个方波周期之间随机最多会有接近一个周期的误差。对1kHz时钟做1s挡这个误差是1ms虽然相对1s不算大但在1ms挡位下直接就有1个计数的不确定性这会让系统变成“等精度”失败的设计。正确的做法就是让定时计数器从复位状态开始数闸门时间严格由挡位时钟的周期数决定。开闸瞬间计数器从0开始数满1000个时钟关闸误差只来自晶振本身相位问题完全消除。3.3 挡位判定逻辑最高位状态直接驱动控制端6位被测计数链由6片CD4510或74LS192等BCD十进制计数器级联组成。最高位计数器有两个关键信号它的BCD输出和它的进位输出。最高位BCD输出为0000说明N 100000产生升挡信号。最高位进位输出为高电平说明计数已超过999999产生降挡信号。升挡和降挡信号送到挡位寄存器。挡位寄存器我用两片74HC74双D触发器编码成两位。考虑到升挡信号和降挡信号同时为1的概率极低我用一个简单组合逻辑把两个信号转换成加计数和减计数控制驱动74HC192组成的可逆计数器或者直接用两个D触发器加门电路实现一个小型状态机。挡位寄存器的输出一路送给74HC151八选一数据选择器选通对应的挡位时钟进入定时计数器另一路送给显示小数点驱动电路。这样整个自动换挡的反馈闭环就建起来了测量结果决定计数状态计数状态决定挡位信号挡位信号决定下一次测量的闸门时间。3.4 上电快速捕获一个额外的粗测周期纯比较器判据有个缺点如果上电时挡位在挡位11ms输入信号却是50Hz那么第一个测量周期只能数到0或1个脉冲判定升挡到挡位2第二个周期还是很少再升挡需要四五个测量周期才能落到挡位4。低频下每个周期1秒用户开机后要等好几秒才能看读数体验非常煎熬。我的对策是上电后先跑一个固定500μs的“粗测”短窗口快速统计脉冲数根据粗测结果直接设置一个接近目标挡位的初始挡位然后再进入正常的自动换挡循环。粗测不需要精确只需要判断信号量级所以我可以直接复用挡位1的1MHz定时计数器的部分分频或者单独用一个短脉冲做闸门。这种方法让频率计在绝大多数情况下上电后一个正常测量周期就能显示正确结果只有量级判断严重偏差时才需要额外的调整周期。当然粗测会牺牲一点上电后第一个显示结果的时效但如果一个测量周期本来就长达1秒这几乎是可接受的。追求秒开的用户可以把粗测窗口进一步缩短代价是低频弱信号容易误判需要靠后面的自动调整兜底。4. 显示侧的细节小数点跟着挡位跑前导零自动熄灭4.1 锁存时序关闸后先锁存再复位绝不同步闸门关断之后6位计数链里的数据是好是坏取决于锁存器动作时序。如果锁存信号和计数器复位信号同时到来计数器先复位、数据全变0锁存器就会锁存到一串0显示会瞬间闪黑非常难看。正确做法是锁存信号用闸门信号的下降沿复位信号必须比锁存晚至少几十纳秒。我在实际电路里用一片74HC74把闸门下降沿延迟半个被测时基周期再送到计数器复位端。这样锁存器先捕获数据计数器后复位显示永远保留上一次测量结果直到下一次锁存更新。这个要点十个做课程设计的人里有八个会忽略。4.2 动态扫描与消隐6位计数结果显示我用了CD4511 BCD-7段锁存译码器配合CD4017循环扫描6位共阴数码管。扫描频率至少要做到800Hz以上否则能明显看到数码管闪烁。CD4511本身带锁存功能测量周期结束后的数据直接锁进译码器显示可以保持稳定。扫描电路还有一个容易被忽视的地方CD4511的消隐端BIBlanking Input要利用起来。我把最高位计数器的BCD为0000这个信号接到最高位数码管的消隐端当最高位是0时直接把这个不发生亮的数码管熄灭。前导零熄灭做出来读数从“065.4321MHz”变成“65.4321MHz”观感完全不同。4.3 小数点和单位跟随挡位自动换挡频率计的显示必须告诉用户当前挡位代表什么量级否则换挡等于白换。我用两个LED分别标kHz和MHz再用挡位寄存器的编码逻辑控制数码管的小数点位置。显示换算规则如下挡位显示单位小数点位置示例N654321挡位11msMHz第三位和第4位之间654.321MHz挡位210msMHz第二位和第3位之间65.4321MHz挡位30.1sMHz第一位和第2位之间6.54321MHz挡位41skHz第三位和第4位之间654.321kHz这个规则非常整齐本质上就是把6位计数N和挡位对应的倍率关系直接体现在小数点的位置上。实现时用挡位寄存器的两位编码经过译码逻辑分别驱动6个数码管的小数点位同时点亮对应的单位LED。这里再提醒一下小数点位置必须在换挡信号生效的同时更新如果不同步读数和单位会出现短暂错位看起来非常奇怪。挡位寄存器更新时我把它和小数点译码放在同一个时钟沿保证显示和挡位永远一致。5. 实测数据与三处最值得记录的坑5.1 实测数据我用函数信号发生器分别输出几个典型频率点拿一台商品频率计做参考测试这套自动换挡频率计的实际表现信号源输出参考频率计读数自动挡位本机读数偏差100.0000 kHz100.0000 kHz挡位41s100.000kHz1Hz1.000000 MHz1.000000 MHz挡位30.1s1.00000MHz10Hz10.00000 MHz10.00000 MHz挡位210ms10.0000MHz100Hz48.123456 MHz48.123456 MHz挡位210ms48.1234MHz100Hz100.0000 MHz100.0000 MHz挡位11ms100.000MHz1kHz各频段都能自动落到合适挡位显示有效位数稳定在5到6位。误差来源主要是±1计数误差和晶振自身精度属于频率计的常规水平。5.2 坑一临界频率反复跳挡第一版电路在100kHz边界附近测试时挡位在挡位3和挡位4之间反复跳读数根本无法稳定。原因就是我前面说的升挡阈值和降挡阈值没有做滞回一个点上的微小波动就触发了换挡。解决办法不是调阈值而是直接用“最高位是否为0”和“最高位是否进位”两条判据天然隔离出一个巨大的滞回区间。改完之后信号从低往高扫过边界时挡位只切换一次反向扫描再切换一次完全克服了抖跳。5.3 坑二锁存与复位的竞争面包板版本测试时发现一个随机问题显示偶尔在测量完成瞬间闪一下000000概率很低但非常烦人。用示波器同时看锁存信号和复位信号才发现两个信号来自同一片74HC74的输出存在几个纳秒的偏差而面包板的杂散电容把这个偏差放大了导致计数器先复位、锁存器后锁存锁了一串零。修复方法就是上面说的把复位信号用D触发器再延迟半拍确保锁存一定发生在复位之前。这个坑说明数字电路设计里的“时序竞争”不是教科书里才有的概念在真实电路里随时可能咬你一口。5.4 坑三分频链毛刺误触发关闸还有一次仪器在挡位210ms时偶尔出现测量结果只有正常值的一半像是闸门提前关了。后来发现是74HC390分频链输出的时钟信号经过长走线后边沿产生了振铃毛刺毛刺穿过RS触发器把闸门提前复位了。解决方法是两招并用一是让分频链尽量靠近闸门RS触发器缩短走线二是在挡位时钟进入RS触发器之前加一级74HC14施密特触发器整形把缓变边沿修整成陡峭边沿毛刺基本被滤掉了。这算是高频数字电路实践里一个非常典型的抗干扰案例。5.5 一些个人体会把这套自动换挡频率计从头到尾搭一遍我最深的体会是数字电路设计的“优雅”不在于用了多高级的芯片而在于把问题简化到可以用最基本逻辑门表达。自动换挡听起来需要“智能”实际拆解开来不过是两个判据、一个反馈寄存器、一个多路选择器。用74系列搭一遍这种反馈控制的直觉会印在脑子里以后再看单片机程序里的状态机思路都会更清楚。如果只是想要一个能用的工具直接用单片机写程序当然更快也没必要折腾这些逻辑门。但如果你是做数字电路课程设计或者想真正理解量程切换这件事我建议还是动手搭一次。搭完你会发现那些课本上枯燥的组合逻辑、时序逻辑、状态机概念全都活了过来。这套电路后续还可以扩展加10s闸门做低频高精度测量加周期测量模式或者把挡位寄存器换成EPROM做成查表译码玩法的空间还很大。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →