如果你在搜索引擎里输入“circuitjs 占空比”,大概率是手上正拿着一个LED调光或电机调速的需求,想在动手焊接之前先看看PWM波形到底长什么样。我遇到过很多类似的场景:只想验证一个分压电阻、看一眼RC充放电曲线、确认555电路输出的占空比公式对不对,难道就要去装一个几个GB的桌面EDA?其实不用,CircuitJS这个在线电路模拟器直接在浏览器里跑,拖几个元件、接上示波器,几十秒就能看到结果。这篇文章把我实际使用CircuitJS的经验整理出来,覆盖从基本搭建、占空比调节到数字电路与微控制器仿真的内容,也把那些容易踩的坑说一下。
1. 为什么我会把一个网页工具当主力仿真环境
1.1 先搞清楚它是什么级别的模拟器
如果你习惯Multisim或Proteus,第一次打开CircuitJS会觉得它“太轻了”,没有封装库,没有BOM表,看起来不像一个正经EDA。但这恰恰是它的定位:一个交互式实时仿真环境。它用JavaScript在浏览器中直接求解电路节点电压,每点一下鼠标,整个电路的状态都会立刻刷新。电阻、电容、电感、二极管、三极管、运放、数字门电路、555定时器、微控制器等元件模型都以简化形式内置,基本覆盖了从入门到进阶常见的实验类型。
不过“简化”是把双刃剑。它很适合理解拓扑和趋势,比如分压、限流、充电、放电、PWM平均电压这些概念,拖个元件就能看见。但如果要精确分析高频寄生效应、器件非线性、热特性,或者做完整的电源纹波评估,它就不合适了。拿它当工程图纸来用会踩坑,拿它当电路草稿纸和计算器来用,体验会非常好。
1.2 它解决的是桌面EDA解决不好的“轻量验证”场景
我经常需要快速验证一个想法:这个比较器接法能不能把正弦波变成方波?RC时间常数会不会太长?PWM占空比20%时输出平均电压是多少?在桌面EDA里,建工程、选封装、放元件、设仿真类型这一套流程可能比验证本身还耗时。而CircuitJS只要在画布上拖元件、拉导线、双击改参数,所有结果同时更新。我把它和桌面工具的使用场景做了个对比:
| 维度 | CircuitJS | 桌面EDA(Multisim/Proteus/LTspice) |
|---|---|---|
| 启动成本 | 浏览器打开即用,无安装无注册 | 需要安装,启动慢,涉及工程配置 |
| 上手曲线 | 拖拽连线,半小时基本能玩 | 需要熟悉设计流程、仿真模型和界面 |
| 交互反馈 | 改参数立即刷新,示波器实时显示 | 通常需要重新仿真,批量扫描更强 |
| 仿真精度 | 模型简化,适合趋势和教学验证 | 模型精细,适合工程分析 |
| 适合人群 | 学生、教师、硬件爱好者、嵌入式开发者 | 研发工程师、需要出正式报告的场景 |
落实到我的工作习惯里,就是“先快速、再精确”。在真实项目动手前,我会先在CircuitJS里把信号链大概跑一遍,确认极性、幅度、频率范围和占空比区间,心里有底之后再上专业工具或直接画板子。这个过程帮我省掉了很多低级错误,尤其是电源接反、地没接、电阻分压算错这类问题。
2. 从空白画布到第一个能看波形的电路
2.1 界面没那么花哨,但效率很高
CircuitJS界面主区域是黑色画布,上方有菜单栏,右侧或侧面是元件分类列表。第一次使用别急着乱点,先滚轮滚动缩放画布,按住空白区域拖拽平移,再把鼠标放到元件接线端上,光标会变成十字,此时拖动就能拉出一根导线。右键元件会有旋转、编辑属性、删除等操作;按住Ctrl再拖动元件可以快速复制一个出来。
有个很实用的学习路径:从顶部“Circuits(电路)”菜单里挑一个官方示例,比如各种演示,加载后你会看到别人是怎么连线的。很多例子都带有示波器模块,改变元件参数后波形立刻跟着变,这对于理解电路行为比看一堆公式快得多。我见过不少初学者一上来就自己从零搭电路,结果被“元件从哪里找”卡住,其实先模仿示例是最高效的入门方式。
2.2 手把手搭一个LED限流电路
假设你要验证5V电源下给LED串联多大电阻。操作如下:在元件分类里找“Passive/被动元件”,放一个电阻;找“Outputs/输出”,放一个LED;再放一个直流电压源和一个接地符号。先把电压源正极连到电阻一端,电阻另一端连LED阳极,LED阴极接到地,最后把电源负极也接到地。如果没有在电路里明确放置接地点,很多节点会处于悬空状态,仿真结果看起来就会很怪。
连线之后双击电阻,把阻值改成220欧姆,双击电源把电压改成5V。LED方向如果接反,仿真里它不会导通,电流表或示波器会告诉你“电路没工作”。如果想知道电流,放一个电流表串联进去,或者直接看元件上的标记——CircuitJS默认会在导线上显示电流方向和小数值,这也是我喜欢拿它上课的原因。看到电流值后你可以反推:5V减去LED导通压降约2V,220欧姆限流大约13mA,数值完全对得上。
如果你手边正在做真实的Arduino或树莓派实验,建议把电源电压设成和实际系统一致。比如Arduino的5V引脚驱动LED,仿真里的参数就可以直接用。养成在仿真时使用真实电压值的习惯,后续把PWM占空比换算成平均电压时,结果才具有参考意义。
2.3 加一个示波器:观察RC电容充放电
只点亮LED太简单,试一下RC充放电。放一个电阻、一个电容、一个电源和一个开关,把开关闭合,电容电压就会按指数曲线上升;断开开关,电容通过电阻放电。在“Outputs/输出”里找到Scope(示波器),把探针接到电容两端,就能看到一条从0V爬升到接近电源电压的曲线。
这里需要留意示波器的时基。如果波形挤成一团或几乎看不到变化,右键示波器,调整Time/Div(每格时间),或者把电容、电阻的值改大一点,让秒级变化变成可见的慢动作。RC时间常数是R乘C,比如10kΩ和10μF是0.1秒,你就能看到一条清晰的指数充电曲线。这个实验特别适合理解“电容电压不能突变”,比背公式直观太多。
3. "占空比"到底去哪儿调:搜索热词背后的那点事
3.1 占空比在仿真里表示什么
占空比是方波信号里高电平时间占整个周期的比例。周期T是频率的倒数,高电平时间为Ton,占空比D就是Ton除以T。50%是标准方波,10%表示大部分时间在低电平,90%表示大部分时间在高电平。对负载来说,占空比越大,平均电压越高,LED亮度、电机转速等宏观表现也随之改变。
在CircuitJS里聊占空比,通常两个目的:一是想直接产生一个占空比可调的PWM信号送给负载;二是想验证一个真实PWM产生电路,比如555搭的电路,其参数和占空比的关系。这两种需求的操作路径完全不同,下面分开说。
3.2 Square Wave信号源:调占空比最直接的方式
很多人搜“circuitjs中添加什么调节占空比”,其实只是想快速得到一个占空比可调的波形。这时候最直接的办法是找到信号源里的Square Wave(方波)元件。把它拖到画布上,输出端接示波器,再双击元件打开属性对话框,里面通常有Frequency(频率)和Duty Cycle(占空比)两栏。把Duty Cycle从默认的50改成20或80,关掉窗口,示波器上的波形立刻变成对应的“窄脉冲”或“宽脉冲”。
如果你的版本里元件叫Pulse(脉冲),参数可能是Pulse Width(脉冲宽度)而不是百分比的占空比,那就做个换算:占空比等于脉冲宽度乘以频率。比如频率1kHz、周期1ms,想要30%占空比就把脉宽设成0.3ms。我建议直接在方波发生器里调百分比,少走一步换算,也方便边调边看波形。
还有一个容易忽略的点:Square Wave的属性里通常还能设置低电平电压和高电平电压。你可以把高电平设成5V来模拟Arduino输出,或者设成3.3V模拟STM32引脚,配合低电平0V,看到的PWM波形就和真实单片机的逻辑电平一一对应了。实测下来,把这套波形接到一个RC低通滤波器后面,示波器会显示一条平滑的直流电压线,电压正好等于占空比乘高电平电压,这就是PWM做调光调压的基本原理。
3.3 想仿真"真实PWM产生电路",用555或比较器
如果需要在课程设计里“用实际电路产生PWM”,只调Square Wave参数就不够了。CircuitJS内置了555定时器,也提供了不少参考示例电路。你可以加载一个555无稳态电路,改变充电电阻和放电电阻的取值比例,占空比就会跟着变,理论公式在仿真里会有直观体现。用运放搭三角波发生器再接比较器,同样可以得到PWM输出,调节比较器的阈值就会改变占空比。
这种做法的价值在于,它把“占空比是一个参数”还原成“占空比是一个电路行为”。调电阻、改电容、改变阈值电压,这些物理操作能让你记住原理,而不只是记住参数面板上那个数字。我在带学生时,通常先让他们在Square Wave上调占空比,理解PWM波形本身,再让他们去搭555电路,理解占空比从哪里来。
4. 进阶玩法:数字逻辑、微控制器与文件的迁移复用
4.1 在同一个画布里玩转门电路和触发器
CircuitJS不只是模拟模拟电路。它的元件库里有一块很完整的数字逻辑区域:与门、或门、非门、异或门、D触发器、JK触发器、计数器、七段数码管、逻辑探针等,都能和模拟元件混搭在同一个电路里。这意味着你可以把一个由门电路构成的振荡器输出接进RC滤波,再进运放,做成一个完整的“数字转模拟”信号链。
逻辑探针是我最喜欢用的调试工具,把它放到某个节点上,高电平它会亮红或变色,低电平则变化,调试组合逻辑比看波形直接得多。示例电路里还有经典的环形振荡器、分频器、双向计数器等。你会发现,这些数字模块和示波器配合起来,频率关系、时序关系都看得一清二楚,对学习时序电路帮助很大。
4.2 微控制器仿真:软件写逻辑、硬件看波形
CircuitJS还内置了一个微控制器模型,类似一个简化的MCU内核,可以通过元件菜单或示例电路找到。在配套窗口里写一段简单的输出程序,芯片引脚就会按照代码切换高、低电平,你可以把引脚接到LED、扬声器、七段数码管甚至外部的RC电路上,观察软件逻辑和硬件电路之间真实的相互影响。
它的功能当然比不上完整的单片机IDE和硬件调试器,不能跑复杂外设库,也不能下到真实芯片里。但用来理解“引脚配置成输出后,如何驱动外部负载”“GPIO波形长什么样”“上下拉电阻如何影响引脚电平”这些问题,它是一个零成本又直观的沙盒。我通常用它来给入门者演示“程序不是直接控制电压,而是通过改变引脚状态来驱动电路”。
4.3 把电路导出成文本,让分享和复现变得很轻松
CircuitJS的File(文件)菜单里有Import(导入)和Export(导出)。导出后你会得到一段紧凑的文本,里面完整描述了电路里的元件、连接关系、参数设置。我把这段文本当作“电路源码”——复制到论坛、聊天窗口或文档里,别人粘贴回Import对话框,就能原样加载出你的电路,不需要传文件、发图片。
实际使用中,这个能力对教学答疑非常方便。学生说“我的电路有问题”,我不用猜他屏幕上的截图,直接让他把导出的文本发来,我导入后一帧帧检查,很快就能定位是接地缺失还是电阻值设错。这也是我特别愿意推荐CircuitJS给身边同事的原因之一:它把“复现一个电路”的成本降到了最低。
5. 现场排错手册:我踩过且很典型的几个坑
5.1 最容易被忽略的参考地
CircuitJS里很多元件符号自带一个隐含的“低端”,看起来好像不接地也能跑,但实际上所有电压都是相对某个参考点定义的。如果电路里没有明确的Ground(地)符号,电源和某些节点的关系就会悬空,仿真器可能给出异常数值或看起来“像是在乱跳”。解决方法是养成习惯:每次搭电路都主动放一个Ground元件,并把电源负极、所有需要参照的公共低端都接到这个点上。
我见过太多新手搭分压电路只连了两个电阻和电源正极,示波器显示的“分压点电压”完全不对,原因就是整个电路没有参考地。加一个地符号之后,数值立马正常。这也是为什么CircuitJS官方示例里几乎每个电路都有一到两个明显的Ground——地是所有仿真的基准,千万别省。
5.2 示波器乱跳不一定是电路错了,先调时基
还有一类常见情况:明明电路就是简单的RC振荡或PWM输出,示波器上却是一堆乱线,看着像振荡了,又像没振荡。这时候先别改电路,右键示波器调整Time/Div或缩放选项。模拟器在浏览器里以帧为单位刷新,它显示的是“当前时刻附近的一小段时间窗”;如果时间窗远小于信号周期,你自然只能看到一条快速翻转的乱线,把每个格子代表的时间调大到与信号周期匹配,波形立刻变得整洁。
同样的道理也适用于频率太高的情况。真想观察一个1MHz的方波,示波器时基固定又不支持自动缩放时,可以试试把仿真速度调慢,或把信号频率降低到几十kHz,让波形显示得更稳。仿真里改频率是很便宜的,先确认“看到的”和“想验证的”在同一个时间尺度上,再去做判断。
5.3 调占空比没反应:你大概率用的是开关而不是信号源
有一个特别典型的误操作:想产生PWM,于是从元件库里拖了一个开关(Switch),然后手动开开关关,觉得这就是在产生脉冲波形。开关确实会让电路通断,但它不会自动按周期切换,示波器上只有你手动操作带来的变化,和占空比概念完全是两回事。调占空比之前,先确认自己用的是Square Wave、Pulse这类信号源,而不是普通开关。搜索“circuitjs中添加什么调节占空比”之后卡住的用户,大部分是卡在这个认知错位上。
另一种情况是用了方波发生器,却只在属性面板里找了“Voltage”和“Frequency”,没找到“Duty Cycle”或“Pulse Width”字段。这时检查一下元件是不是选成了正弦波或三角波发生器,正弦波没有占空比概念,三角波虽然能看上升和下降比,但和PWM的占空比定义不同。只有脉冲类信号源才有Duty Cycle参数。
5.4 界面点不动或元件面板异常:检查浏览器环境
最后说一个和电路无关但经常让我白忙半天的坑。有时候打开CircuitJS,会碰到元件面板加载不出来、右键菜单失效、拖拽没反应,或者界面直接空白。我自己的排查顺序是:先换主流浏览器(Chrome、Edge、Firefox的最新稳定版),再关闭浏览器插件和屏蔽脚本的扩展,重新打开页面。绝大多数“模拟器坏了”的情形,最后都发现是内嵌浏览器或过旧内核的问题,而不是电路文件本身有问题——CircuitJS整个工程其实就是一个网页应用,页面加载正常,仿真才谈得上稳定。
我在真机演示时也习惯先把要展示的电路导出成文本存下来,万一现场某个浏览器环境出问题,换台机器导入文本就能继续,不耽误事。这个习惯来自一次给同事做技术分享时的翻车经历,之后我就再也没让环境问题打断过演示。
最后再分享一个我自己的高频用法:给LED调光或给电机调速,别急着拿单片机写代码,先在CircuitJS里用Square Wave把不同占空比下的平均电压算出来、固定下来,心里有了数再去写PWM寄存器配置。很多参数匹配问题,其实在这个网页工具里就能提前暴露出来,省下的时间远比下载一个EDA软件多。