简介:面向Altium Designer初学者与硬件开发者的33个经典电路制作实例合集,围绕从原理图绘制到PCB布局、电路仿真与制造文件输出的完整流程,帮助读者在真实项目中熟悉这款EDA工具。压缩包共535个文件、约36.3MB,以33个dsn原理图为核心,配套C源码、hex烧录文件、m51/lst编译清单、uvproj/uvopt工程文件,以及PDF说明、JPG截图和bak备份等,覆盖数字逻辑、模拟电路、微控制器接口、电源管理、信号处理与控制电路等方向;从流水灯、数码管动态扫描、矩阵键盘到中断计数、定时器、模拟交通灯与继电器控制,均配有可对照的电路图与源代码。已有3567人学习下载。读者可按“读图—打开工程—仿真验证—修改参数”的路径练习,理解元器件连接、程序与外设配合及布线要点,逐步提升设计与调试效率,适合课程设计、毕业设计与自学进阶。
1. 33个电路实例放在一起,这套 AD 资源能省掉不少重复劳动
上周一个做硬件的朋友发来一个压缩包,说他接的小单子要改一块控制板,想看看里面有没有能直接拿来用的电源电路。解压后是 33 个目录,每个目录一套工程,从流水灯、数码管驱动到开关电源、USB 转串口都有,原理图和 PCB 大多是画完的状态。这类 ad Altium designer 实例合集的价值不在“学软件操作”,而在于你画板卡在某个电路上时,能翻到一个已经跑通过的设计,把拓扑、参数和布局一起参考下来。刚学 AD 想把整套流程走一遍的人适合从里面挑简单的练手,接私活需要快速搭出方案的人适合把它当模块库翻。下面按我实际复现的顺序,从目录结构一路拆到怎么改成自己的东西。
2. 资源结构:33套工程怎么分类,每套里到底装了什么
拿到这种合集,先别急着双击工程文件。我吃过亏:直接打开某个.PrjPcb,弹出一堆“文件未找到”,原理图上全是红叉,折腾半天才发现是工程引用的库还在原作者机器的绝对路径下。先花十分钟把目录结构和文件类型摸清楚,后面能省掉大量无效操作。
2.1 目录层级与文件类型对照
这批实例的组织方式基本一致:一个根目录下面按功能分成若干组,每组里一个子目录就是一套完整工程。判断“是不是一套完整工程”的标准很简单——看有没有.PrjPcb工程文件,它是把这堆散文档串起来的入口,双击它才会加载关联的原理图、PCB 和库。
| 扩展名 | 实际作用 | 打开方式 | 缺失或损坏时的表现 |
|---|---|---|---|
.PrjPcb | 工程索引,记录成员文档与编译选项 | 直接双击 | 没有它,原理图和 PCB 之间断开关联,无法同步网表 |
.SchDoc | 原理图文档 | 工程内双击 | 编译报错,PCB 里没有网络 |
.PcbDoc | PCB 文档,含层叠、规则、布线 | 工程内双击 | 无法出 Gerber |
.SchLib/.PcbLib | 原理图符号库 / 封装库 | 单独打开或用库面板 | 元件显示为方框,封装全部 Not Found |
.OutJob | 输出作业,Gerber、BOM、坐标文件都靠它 | 工程内双击 | 只能手动一层层导,容易漏层 |
.Net/.csv | 网表、BOM 导出结果 | 文本编辑器 / 表格 | 只影响核对,不影响工程本身 |
.c/.h | 部分实例附带的单片机源码 | 任意编辑器 | 电路照常能看,只是没法烧录验证 |
我一般会先写个脚本把整个目录扫一遍,生成一张清单:哪套工程有 PCB、哪套只有原理图、哪套带了源码。这样挑练手对象时不用一套套点开。
import os from pathlib import Path # 解压后的根目录,改成你自己的路径 root = Path("./AD_33_Examples") # 只认工程文件,其他后缀归到“附带资源”里统计 DOC_EXT = {".schdoc", ".pcbdoc", ".schlib", ".pcblib", ".outjob", ".c", ".h", ".csv"} rows = [] for prj in root.rglob("*"): if prj.suffix.lower() != ".prjpcb": continue # 工程所在目录视为一个实例 files = [p for p in prj.parent.rglob("*") if p.is_file()] kinds = {} for f in files: ext = f.suffix.lower() if ext in DOC_EXT: kinds[ext] = kinds.get(ext, 0) + 1 rows.append((prj.parent.name, len(files), kinds)) # 按文件数从少到多排,文件少的通常是纯原理图的小例子 rows.sort(key=lambda r: r[1]) for name, total, kinds in rows: detail = " ".join(f"{k}:{v}" for k, v in sorted(kinds.items())) print(f"{name:<30} 共{total:>4}个文件 {detail}")这段脚本的逻辑很直接:用rglob递归找所有.PrjPcb,把工程所在目录当成一个实例单元,统计该目录下各类文档的数量。suffix.lower()是为了兼容老工程里大小写混用的后缀(早期版本存出来是.PrjPCB,新版本是.PrjPcb,Windows 下不敏感但脚本里得统一)。参数只需要改root。跑完你大概率会看到两种情况:一种是.schdoc和.pcbdoc各一份的完整工程,另一种是只有.schdoc和一堆.schlib的纯原理图示例——后者适合拿来学画图,不适合走完整的出板流程。
2.2 一套典型实例工程的内部构成
随便挑一套完整的看,内部结构大致是四层。第一层是工程文件本身,里面记着文档列表、编译设置、以及“用哪几个库”的引用关系,这个引用关系就是最容易出问题的地方。第二层是原理图,通常主图加若干子图,用 Port 或网络标签跨图纸连接;电源部分常常单独一张图,方便复用。第三层是 PCB,板框画在 Keep-Out 层,层叠一般是两层,少数带高速接口的会做四层。第四层是输出与辅助文件,包括 OutJob、BOM 模板、以及部分实例附带的单片机源码和烧录说明。
值得单独说的是库。老工程的库引用大多是绝对路径,比如指向原作者桌面上的某个.SchLib。换一台机器打开,AD 找不到这个路径,元件就退化成带问号的方框,原理图编译直接报一堆“Unknown Pin”。处理办法不是一个个重新指定,而是把工程目录里的.SchLib和.PcbLib先Add Existing to Project加进工程,再到库面板的Available Libraries里把失效的绝对路径移除。这样工程和库就绑在一起,整个目录拷给谁都能开。
还有一点:部分实例里的元件符号是“一个器件拆成多个 Part”的画法,比如运放画成单元 A、单元 B,电源引脚单独一个 Part。这类器件在看图时容易漏掉隐藏的电源引脚,编译不报错但网络是断的,PCB 里表现为某个芯片的电源脚上没有飞线。遇到这种,先在原理图里把器件的所有 Part 都放出来检查一遍。
2.3 按难度给33套排个序,别一上来就啃开关电源
33 套全画一遍不现实,我的建议是按“能不能独立验证”来分批。第一批挑纯数字的:流水灯、按键消抖、数码管动态扫描这类,元件少、封装简单、两层板就能搞定,目的是把“建工程—画原理图—编译—导 PCB—布线—出 Gerber”这条链路走顺。第二批挑带接口的:USB 转串口、RS485、SPI 存储,这类重点在差分对、阻抗和防护器件,布线上有讲究但电路不复杂。第三批才是电源和模拟前端:LDO、DC-DC、运放调理,这些对布局位置极其敏感,同一张图不同摆法性能能差一截,适合放到最后练。
分批的好处是每批都能独立跑通一次完整流程。我见过有人第一套就挑了开关电源,结果卡在环路补偿和地平面分割上,两礼拜没出第一块板,直接放弃。按批次来,第一块板哪怕只是个流水灯,只要 Gerber 出对了、板厂做回来了、焊上能跑,后面就有底气。
3. 跑通第一套:从导入工程到导出 Gerber 的完整操作链
挑一套最简单的数字电路,目标是让它从压缩包变成一块能发去板厂的板子。这条链路我走过很多遍,每一步都有具体的检查点,卡住了也知道去哪儿看。
3.1 环境准备与工程导入
先确认软件版本。这套实例里的工程多数是较早版本存的,用较新版本打开时会弹“工程格式需要转换”的提示,点确认后会生成一个备份文件,这是正常行为,不用慌。真正要留意的是字体:老原理图里常有用系统字体标注的中文注释,换机器后可能显示成方框,不影响电气连接,但看图会很难受。在原理图首选项里把字体统一改成系统里已有的中文字体即可。
工程导入的顺序是:先把整个实例目录拷到本地一个不含中文和空格的路径下(路径里带中文是另一个经典坑,后面避坑章细说),再打开.PrjPcb。打开后第一件事不是看图,是打开库面板检查元件状态。如果看到大量元件名前面带问号图标,说明库没加载上,按 2.2 里的方法把本地库加进工程。
接着做一次工程编译。在工程面板上右键选Compile PCB Project,编译信息会输出到 Messages 面板。理想状态是只有警告没有错误。错误一般集中在三类:找不到引脚、网络重名、电源网络未连接。这三类都要在这一步消掉,不能带到 PCB 阶段,否则导网表时会更难查。
3.2 原理图检查与 ERC 消掉红线
编译通过不代表电气规则没问题。ERC(电气规则检查)会把“输出脚对接输出脚”“输入脚悬空”“电源脚没接电源”这类问题标出来。新手看到满屏红叉容易慌,其实按优先级处理很快。
我通常先把 ERC 设置里的检查项过一遍。默认配置对“未连接的引脚”报得特别严,但实例里很多芯片的 NC 脚本来就是悬空的,这类可以关掉或者单独给个 No ERC 标记,不要为了消红叉硬连一根线上去。真正要处理的是“多个输出脚连到同一个网络”和“电源引脚未驱动”这两类,前者会烧器件,后者板子根本不工作。
处理完再编译一次,Messages 面板清空或者只剩注释类警告,就可以导网表了。这一步的检查点很明确:Design → Update PCB Document,弹出的 ECO 对话框里看变更条目数。如果条目数是 0,说明原理图和 PCB 之间没有同步关系,通常是工程里没关联 PCB 文档;如果条目数几百条,多半是封装库没对上,先别点执行,回去查封装。
3.3 封装匹配与 PCB 导入
ECO 对话框里最值得看的是“Add Components”那一栏,每个元件后面跟着它的封装名。封装名对不上库的时候,这里会显示成Footprint Not Found,执行之后 PCB 上会出现一堆没有焊盘的方块。所以点执行之前,先把这一栏扫一遍。
封装匹配这件事,靠肉眼一个个核对不现实。我会把 AD 导出的 BOM 拉出来,和封装库里的封装名清单做一次比对,把缺失的挑出来单独处理。
import csv from pathlib import Path # AD 导出的 BOM,表头需包含 Designator / Footprint / Comment bom_path = Path("./project_bom.csv") # 封装名清单:从 PcbLib 面板里全选复制出来的封装名,一行一个 lib_path = Path("./pcb_lib_footprints.txt") known = {ln.strip() for ln in lib_path.read_text(encoding="utf-8").splitlines() if ln.strip()} missing = [] with bom_path.open(encoding="utf-8-sig", newline="") as f: for row in csv.DictReader(f): fp = (row.get("Footprint") or "").strip() des = row.get("Designator", "").strip() if not fp or fp in ("-", "None"): missing.append((des, "<空封装>")) elif fp not in known: missing.append((des, fp)) for des, fp in missing: print(f"{des:<8}{fp}") print(f"待处理 {len(missing)} 个")逻辑是把 BOM 里的封装字段和库里的封装名做集合比对。encoding="utf-8-sig"是为了处理用表格软件另存过的 BOM,那种文件开头带 BOM 头,直接按 utf-8 读第一列列名会变成乱码。Designator、Footprint、Comment这几个列名要和你在 AD 里选的 BOM 模板表头一致,模板不同列名就不同,改一下字典的 key 就行。跑出来的<空封装>是原理图里压根没填封装的元件,这种必须先补,比对不了。
封装全部对上之后,PCB 里会多出一堆元件,默认堆在板框外面。这时先别急着摆,打开规则管理器把布线规则过一遍:线宽、间距、过孔尺寸、铺铜连接方式。两层板做数字电路,线宽 10mil、间距 8mil、过孔 0.3/0.6mm 是个稳妥的起点,电源线单独加宽到 20mil 以上。规则设完再做一次 DRC,把元件堆在外面的报错先忽略,等布局完再统一看。
3.4 输出制造文件:Gerber、钻孔、BOM 和坐标
出 Gerber 这一步,有 OutJob 就用 OutJob,没有就手动一层层导。手动导最容易出的问题是漏层:两层板至少要有顶层铜、底层铜、顶层阻焊、底层阻焊、顶层丝印、底层丝印、钻孔图、板框,八份文件缺一不可。板框那份单独说明一下,要放在机械层或者 Keep-Out 层导出,板厂靠它铣外形,漏了就没法做。
钻孔文件单独导,格式选 Excellon,单位跟板厂确认,多数要毫米、前导零抑制。Gerber 的格式一般是 RS-274X,精度 2:4 或 2:5,同一批文件里必须统一,混着来板厂会打电话问你。
导出之后别直接打包发走。我的习惯是用 Gerber 查看器打开自己看一眼:焊盘有没有偏心、丝印有没有压在焊盘上、板框是不是闭合的、钻孔有没有落在焊盘中心。这一步花五分钟,能挡掉大部分返工。BOM 和坐标文件一起导出来,BOM 用于采购,坐标文件用于贴片,哪怕手工焊也用得上,至少能对着坐标核对位号。
4. 核心电路拆解:几类经典电路的读图重点和布局要点
33 套里真正值得反复看的是那些“教科书上讲原理、实际画起来全是细节”的电路。挑四类说,每一类我都写清楚看图时先看哪儿、布局时哪根线不能乱走。
4.1 电源类:LDO 与 DC-DC 的布局分区
LDO 看着简单,翻车点集中在输入输出电容的位置上。看图时先找输入电容和输出电容,它们必须紧贴芯片引脚,走线越短越好,地要直接回芯片的地脚,不能绕到板子另一头再回来。很多实例里会在输出端并一个小容量陶瓷电容加一个大容量电解,前者管高频、后者管瞬态,两个都不能省。
DC-DC 的讲究更多。看图时重点看三处:电感的位置、续流回路的面、反馈走线。电感要靠近开关脚,输入电容和续流二极管(或同步整流管)构成的回路面积要尽可能小,这个回路是主要的辐射源。反馈分压电阻要靠近反馈脚,取样点从输出电容之后取,不要从电感后面直接取,否则输出纹波会进反馈。
| 电路类型 | 布局顺序 | 关键走线 | 常见错误 |
|---|---|---|---|
| LDO | 输入电容 → 芯片 → 输出电容 | 输入输出走线短而宽,地就近回芯片 | 电容离芯片太远,地绕远路 |
| 非隔离 DC-DC | 输入电容 → 开关管 → 电感 → 输出电容 | 开关回路面积最小,反馈单独走 | 反馈从电感端取,地平面被割裂 |
| 电荷泵 | 飞电容紧贴芯片 | 飞电容走线短,输出电容靠近负载 | 飞电容走线过长导致效率低 |
还有一点,电源部分在 PCB 上要单独划一块区域,和数字部分用地平面分隔但不割裂。实例里常见做法是整板铺一个完整地,电源区域下面不开槽,靠布局把噪声源圈在一个角落,比硬切地平面稳。
4.2 数字接口类:USB、串口、SPI 的走线与防护
USB 这类接口,看图时先看有没有串联匹配电阻和 ESD 防护器件。全速 USB 的差分对要等长、平行走,阻抗按 90 欧姆控制,两层板做不到严格的阻抗控制,那就把差分对走得尽量短、尽量少打过孔。防护器件要放在接口附近,走线先经过防护再到芯片,顺序反了防护就形同虚设。
串口相对宽松,但电平转换和隔离要看清。带隔离的实例里会有隔离电源和数字隔离器,这两部分的地是分开的,看图时注意两边的地网络名不一样,PCB 上也要留足爬电距离,别为了让铺铜连成一片把隔离破了。
SPI 这类板内总线,重点是时钟线的串扰。走线尽量短,时钟和数据之间留出间距,实在挤不下就在中间加一根地线。多从设备的实例里,片选线要各自独立,不能共用,看图时数一下片选数量跟从设备数量对不对得上。
4.3 模拟前端:运放与传感器的地处理
运放电路看图先看供电方式:单电源还是双电源,单电源的话有没有做偏置。很多实例用电阻分压造一个虚拟地,这个虚拟地要加电容滤波,而且要单独走线回运放的地脚,不能随便接到数字地上。
传感器前端的核心是噪声。看图时找信号链上的滤波:输入端有没有 RC 低通,反馈网络上的电容是补偿还是滤波,输出端有没有缓冲。布局上,模拟部分和数字部分要分区,ADC 的模拟地和数字地通常在芯片下方单点连接,这个连接点在实例的 PCB 里能看到,是一个短而宽的铜皮或者一个 0 欧电阻。
还有个小细节:高阻节点的走线要短,必要时在 PCB 上做保护环。这类实例里如果看到某个运放周围有一圈接地走线,那不是装饰,是防漏电流的,抄的时候别把它删了。
4.4 单片机最小系统:晶振、复位、下载口的三个高频坑
最小系统几乎是每套实例的基础,但也是最容易想当然的地方。晶振要尽量靠近芯片,两根走线等长,晶振下面铺地但不走其他信号,负载电容的地就近回芯片地。有些实例为了省地方把晶振放到板子边缘,能用但抗干扰差,不建议学。
复位电路看有没有RC延时和手动复位按键,电容取值一般在百纳法级,太小起不到延时作用,太大复位会迟钝。下载口看引脚顺序和丝印是否一致,我见过实例里丝印标的顺序和实际封装引脚对不上,照着丝印接线死活连不上,最后拿万用表量通断才发现。
电源引脚的去耦电容是另一个高频坑。每对电源脚配一个 0.1uF,位置紧贴引脚,容量大的储能电容可以放远一点。看图时数一下去耦电容数量跟电源脚对数是否匹配,少了就在自己改的时候补上。
5. 避坑与排查:复现这批实例时最容易翻车的几处
下面五条都是我自己或者身边人真实遇到过的,按“现象—原因—解决”写,遇到了直接对号入座。
5.1 打开与编译阶段的三个坑
现象一:打开工程后原理图满屏红叉,元件全是带问号的方框,Messages 里刷屏“Footprint Not Found”。原因:工程引用的库是绝对路径,指向原作者的本地目录,换机器后路径失效。 解决:把工程目录下的.SchLib、.PcbLib用Add Existing to Project加进工程,再到Available Libraries里删掉失效路径,重新指向工程内的库。加完之后重新编译,红叉会大面积消失。别一个个元件手工改,那样改完下次换机器还会犯。
现象二:编译不报错,但 PCB 里某个芯片的电源脚上没有飞线,DRC 也不提示。原因:多 Part 器件只放了信号部分,隐藏的电源 Part 没放出来,或者电源脚被设成了隐藏引脚且没有连到电源网络。 解决:在原理图里选中该器件,检查属性里的 Part 数量,把所有 Part 都放出来看一遍。隐藏电源脚的老做法现在不推荐,遇到就手动补一根线到电源网络,别依赖隐藏连接。
现象三:工程放在带中文或空格的路径下,编译时报“无法写入临时文件”或者直接崩溃。原因:老版本 AD 对非 ASCII 路径处理不完善,临时文件和中间产物写不进去。 解决:把整个实例目录挪到纯英文、无空格的路径,比如D:\work\ad_examples\下面。这个坑很玄学,报错信息完全不提路径,但换路径就好,血泪经验。
5.2 出板与制造阶段的两个坑
现象四:Gerber 发给板厂,对方回复“缺少外形层”或者“钻孔和焊盘对不上”。原因:板框画在了非机械层,导出时没勾选;或者钻孔文件的单位和 Gerber 不一致,一个用英寸一个用毫米。 解决:板框统一画在机械层,OutJob 里把该层加进 Gerber 输出;钻孔文件单独设置单位,和 Gerber 保持毫米、2:4 精度一致。导完用查看器叠一遍,钻孔偏心的能直接看出来。
现象五:DRC 报一片“丝印到阻焊层间距”违规,实际板子做出来没问题。原因:规则阈值设得太严,或者封装里的丝印画到了焊盘边缘,属于封装库的历史遗留问题。 解决:先看违规位置,如果丝印确实压着焊盘,改封装把丝印挪开;如果只是规则太严,把该规则的间距值调小。不要图省事一次性全部 Waive,那样真正的问题也被盖掉了。我一般是逐条看,确认是误报才忽略单条。
6. 二次开发:把这33套实例变成自己的可复用模块库
复现几套之后,真正的价值在于把它们拆成自己的模块。我的做法是分三步走。第一步,按功能给每套实例打标签,电源、接口、MCU 最小系统、模拟前端各归一类,同一功能的不同实现放在一起对比,比如三种不同的 LDO 电路,看它们在电容配置和布局上的差别。第二步,把验证过的电路块单独存成原理图片段,AD 支持把选中的电路存成 Snippet,下次直接拖出来用,连网络标签都带着。第三步,建自己的库:符号库按功能分类,封装库只保留自己常用的那几十个,每个封装旁边注明适用的板厚和工艺。
这一步最容易忽略的是参数统一。33 套实例来自不同时期,同一个 0.1uF 电容可能有三四种不同写法,有的写容值,有的写型号,导出 BOM 时全乱。我会在每套实例的 BOM 里统一三列:Comment 写规格值,Footprint 写封装名,Description 写用途备注。统一之后再做合并,才有一张能直接下单的采购表。
import csv from pathlib import Path from collections import defaultdict # 把多个实例目录下的 BOM 合并成一张总表,按“规格值 + 封装”聚合 total = defaultdict(lambda: {"qty": 0, "refs": [], "src": set()}) for csv_file in Path("./AD_33_Examples").rglob("*BOM*.csv"): with csv_file.open(encoding="utf-8-sig", newline="") as f: for row in csv.DictReader(f): comment = (row.get("Comment") or "").strip() fp = (row.get("Footprint") or "").strip() if not comment: continue key = (comment, fp) total[key]["qty"] += int(row.get("Quantity") or 1) total[key]["refs"].append(row.get("Designator", "")) total[key]["src"].add(csv_file.parent.name) with open("merged_bom.csv", "w", encoding="utf-8-sig", newline="") as f: w = csv.writer(f) w.writerow(["Comment", "Footprint", "Qty", "Refs", "Sources"]) for (comment, fp), v in sorted(total.items(), key=lambda x: -x[1]["qty"]): w.writerow([comment, fp, v["qty"], " ".join(v["refs"]), " ".join(sorted(v["src"]))])这段代码做的是跨工程的 BOM 聚合。rglob("*BOM*.csv")假设文件名里带 BOM 字样,如果你的实例里叫别的名字,改成按扩展名匹配即可。聚合键选“规格值 + 封装”是因为同一个容值不同封装不能混着采购,0805 和 0603 是两种料。Quantity缺省按 1 算,防止老 BOM 里这一列是空的。输出的Sources列记录了这个料出现在哪几套实例里,出现次数多的说明是通用料,值得多备一些。
跑完这张表你会发现,33 套实例的元件重合度其实很高,电阻电容翻来覆去就那几种,真正需要单独采购的可能不到五十种。这一步做完,后面再拆新实例,直接往这张表里加就行,不用每次从头理。
从那以后我每拆一个这类实例包,第一件事都是先扫目录、再拉 BOM 跑一遍脚本、最后才动手开工程,顺序反了就是无穷无尽的手工核对。希望帮到你。
本文还有配套的精品资源,点击获取