☰
AD 33例经典电路实战:工程拆包、PCB导入与源码对齐
2026/11/5 8:36:51 网站建设 项目流程

简介:面向Altium Designer初学者和硬件开发者的实例型学习包,围绕33个经典电路制作案例,提供电路图、工程源文件与配套源码,适合用来熟悉原理图绘制、PCB布局、仿真验证及单片机接口设计。压缩包共535个文件、约36.3MB,含33个dsn原理图与工程文件、35个c及hex/m51源码、lst/obj编译中间文件,并附pdf说明文档、jpg预览和uv2/uvproj工程配置,目录按实例分类便于查找。案例覆盖流水灯、数码管、矩阵键盘、模拟交通灯、继电器控制等训练场景,每个实例配有电路图和源代码,读者可对照原理观察工程结构,打开源码开展仿真与修改练习,进而理解数字逻辑、模拟电路、微控制器应用和电源管理等基础知识。已有3567人学习下载,适合作为循序练习与查漏补缺的素材,逐步提升软件操作与设计效率。

1. 从一份33例的AD实例包说起:为什么它比看十小时视频更管用

很多人学 Altium Designer 的路径都差不多:装软件、跟着视频画一遍最小系统、然后卡在“画完了不知道对不对”这一步。这份《学习Altium Designer—33个经典电路制作实例》走的是另一条路——33个完整电路制作实例,每个都带电路图和配套源代码,覆盖电源、放大滤波、单片机最小系统、接口驱动几大类。你拿到的不是一段演示,而是已经跑通的一批工程样本。

它解决的问题很具体:原理图符号怎么和 PCB 封装对上、设计规则怎么设才不报假错、代码里的引脚定义怎么和图上网络名对齐。适合三类人:刚学完 AD 基础操作、想找真实工程练手的;做嵌入式想补硬件底子的;手上有个小项目想直接借模块电路的。下面按拆包、导板、对代码、避坑、沉淀模板的顺序走一遍。

2. 拆包先拆工程:33个实例的目录结构与依赖关系

拿到一个几十兆的 rar 包,最常见的错误操作是双击解压到一个中文路径下的临时文件夹,然后直接双击.PrjPcb打开。AD 对中文路径和过深的目录层级容忍度很低,轻则库路径全部失效,重则工程打开一片空白。正确做法是先建一个纯英文、层级浅的工作目录,把包解进去,再逐个盘点每个实例工程的完整度。

2.1 一份AD工程由哪些文件构成

AD 的工程不是单个文件,而是一组互相引用的文件集合。项目文件.PrjPcb只是索引,真正的内容分散在原理图、PCB、库和输出配置里。少一个,打开时就会提示找不到文档或者封装为空。

后缀作用缺失后的典型表现
.PrjPcb工程索引,记录文档列表与编译选项无法整体编译,只能单开文档
.SchDoc原理图,含元件、网络标号、连线没有电路图,PCB 成了无源之水
.PcbDocPCB 布局布线文件需要从网表重新导入并摆放
.SchLib/.PcbLib原理图符号库 / 封装库编译报 unknown footprint
.IntLib集成库,符号与封装已绑定库面板里器件显示为灰色
.OutJob输出作业配置,管 Gerber、BOM、钻孔出图要手工一项项点
.NET导出的网表,记录网络与引脚对应无法做网表与源码的交叉核对

33个实例里,有的工程把库内嵌在工程中,有的引用外部集成库。判断方法很简单:打开工程后看 Projects 面板里有没有Libraries节点,以及原理图元件的属性里 Footprint 字段是不是空的。这一步花两分钟,能省掉后面半小时的报错排查。

提示:解压前先确认磁盘剩余空间。33个实例带 PCB 和源码,解压后体积通常是压缩包的 3 到 5 倍,放在系统盘容易在编译时因为临时文件写满而失败。

2.2 按难度分三层,先挑能跑通的那几个

33个实例不要从头到尾顺着做。我一般按信号链复杂度分三层,从下往上推进,每一层都能独立验证结果,不会出现“画到一半发现前面全错”的情况。

第一层是纯模拟与电源类:整流滤波、线性稳压、运放放大、比较器。这类电路元件少、网络简单,适合熟悉 AD 的编译流程和 ERC 报错含义。第二层是数字接口类:串口电平转换、I2C 上拉、LED 驱动、按键消抖。这一层开始出现网络标号和总线,是练习命名规范的好素材。第三层是带固件的系统类:单片机最小系统、下载接口、外设扩展,这类实例同时有电路图和源代码,是后面做软硬件对齐的主战场。

分层之后,每个实例只做三件事:编译看 ERC、导网表看封装、打开 PCB 看布局。三件事都过的工程才值得投入时间细看布线。

2.3 用脚本盘点每个工程的完整度

手工点开33个工程太慢,写个脚本一次扫完。压缩包在 Linux 或 macOS 下用unrar,Windows 下直接右键解压到英文目录即可,注意不要解压到桌面这种带用户名的深层路径。

# 建立独立工作目录,路径保持纯英文、层级不超过三层 mkdir -p ~/ad_labs && cd ~/ad_labs # 解压 rar 包到 src_raw,保留原始目录结构 unrar x ~/Downloads/ad_33_examples.rar ./src_raw/ # 粗看每个实例目录的文件类型分布,快速判断哪些工程是完整的 find ./src_raw -maxdepth 2 -type d | while read -r d; do echo "== $d" find "$d" -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn | head -8 done

这段脚本的作用是给每个实例目录做一次“后缀直方图”。如果某个目录里只有.SchDoc没有.PcbDoc,说明它只是原理图示例;如果出现大量.c、.h,说明带固件。参数上-maxdepth 2是为了适配“实例包/编号目录/工程文件”这种两层结构,目录再深就要调大这个值,否则会漏掉嵌套工程。

接下来用 Python 做结构化盘点,把每个工程的库依赖和源码情况输出成 JSON,方便后面按需筛选。

import json from pathlib import Path def scan(root: str) -> dict: """扫描 root 下所有 .PrjPcb,统计每个工程的配套文件情况""" report = {} for proj in Path(root).rglob("*.PrjPcb"): d = proj.parent # 只统计工程所在目录及其子目录,避免把同级其他工程算进来 suffixes = {p.suffix.lower() for p in d.rglob("*") if p.is_file()} report[str(proj)] = { "sch": ".schdoc" in suffixes, "pcb": ".pcbdoc" in suffixes, "libs": sorted(s for s in suffixes if s in (".schlib", ".pcblib", ".intlib")), "src": sorted(s for s in suffixes if s in (".c", ".h", ".asm", ".ino")), "has_outjob": ".outjob" in suffixes, } return report if __name__ == "__main__": result = scan("./src_raw") print(json.dumps(result, indent=2, ensure_ascii=False)) # 判断规则:libs 为空且 sch 为 True 的工程,打开前必须先补库

脚本的核心逻辑是“以工程文件为锚点向外看”。rglob("*.PrjPcb")找到所有工程入口,再对工程所在目录做一次后缀集合统计。libs为空说明这个工程的符号和封装依赖外部集成库,直接打开会在编译阶段报一堆 unknown footprint;has_outjob为假说明出 Gerber 要手工配置,后面做制造文件时得自己补一个输出作业。

2.4 打开工程前先做的三件事

第一件,复制一份只读副本。原包当作母本,所有动手操作都在副本上做,改坏了直接删掉重来,不用重新解压。第二件,检查库路径。AD 的库搜索路径是全局设置,工程里引用的相对路径在换机器后会失效,打开后在 Preferences 的库面板里确认一遍。第三件,把.PrjPcb用文本编辑器打开看一遍,里面是 XML 结构,能直接看到文档列表和编译选项,哪个文档缺失一目了然。

3. 原理图到PCB:封装匹配、规则设置与一次成功导入

从原理图到 PCB 这一步,新手翻车的比例最高。原因不是操作复杂,而是中间隔着一层“网表”——原理图里的元件必须带着正确的封装名和唯一的位号,才能被 PCB 端正确识别。这一章把这条链路拆开,先讲网表怎么工作,再讲封装缺失怎么补,最后讲规则怎么设。

3.1 网表把原理图和PCB绑在一起的机制

AD 在编译工程时会生成内部网表,核心是三个字段:位号(Designator)、封装名(Footprint)、引脚到网络的映射(Pin-Net)。PCB 导入时按位号找器件,按封装名去库里找图形,按网络映射生成飞线。三个字段任何一个出问题,导入就会失败或者生成一堆孤立焊盘。

常见报错有三类,含义各不相同。Footprint not found是封装名在库里不存在,通常是库没加载或者名字拼错。Duplicate Designator是位号重复,多见于复制粘贴元件后忘了重新编号。Net not found是网络标号写错或者用了非法字符,比如带空格、带中文。ERC 编译报告里会逐条列出来,位置精确到元件引脚,照着改就行,不要凭感觉猜。

我一般会在编译前先做一次位号重编号,Tools 菜单下的 Annotate 用“按位置编号”,这样位号和 PCB 上的物理位置对应,后期查线更直观。编号完再编译,能消掉一大半重复位号的报错。

3.2 封装缺失的两条补救路径

33个实例里最常缺的是封装库。遇到 unknown footprint,先别急着画封装,按下面两条路径判断。

路径一,从实例自带的 PCB 里反向导出。打开同工程的.PcbDoc,在 Design 菜单里选 Make PCB Library,AD 会把板子上所有器件的封装提取成一个新的.PcbLib。这条路径的前提是 PCB 文件存在且器件完整,导出的封装尺寸和原设计完全一致,最省事。

路径二,用 IPC 向导重建。适用于 PCB 文件也缺失、只剩原理图的情况。Tools 菜单里的 IPC Compliant Footprint Wizard,按器件手册输入引脚数、间距、焊盘长宽、本体尺寸,向导会按 IPC 标准算出焊盘和丝印。这里的关键参数有三个:焊盘长度一般取引脚长度加 0.3 到 0.5 毫米的 toe 余量,焊盘宽度取引脚宽度加 0.1 到 0.2 毫米,丝印外框比本体每边外扩 0.15 毫米左右,避免压到焊盘。

注意:向导生成的封装默认按公制输入,如果手册给的是英制 mil,先在纸上换算再填,不要在两套单位之间反复切,很容易填错一位。

3.3 设计规则先设再布线,六个参数必须改

AD 的默认规则是给通用场景准备的,直接拿来布实例板子会报一堆假错。我的习惯是导入 PCB 后第一件事就改规则,改完再布线,顺序反了就要返工。

规则项默认值建议值(普通双层板)说明
最小线宽10 mil8 mil信号线可用 8 到 10 mil,电源线单独放宽
最小间距10 mil8 mil普通工艺 6 mil 也能做,留 8 mil 更稳
过孔直径 / 孔径50 / 28 mil24 / 12 mil孔径不要小于板厂最小钻孔
铜皮到板边20 mil30 mil铣边公差会吃掉一部分,留够余量
丝印到阻焊04 mil丝印压焊盘是 DRC 报错大户
阻焊扩展4 mil4 到 6 mil太小会导致焊盘露铜不足

规则可以在图形界面逐条建,也可以用脚本批量写。AD 支持 DelphiScript 脚本工程,适合一次给几十个工程套用同一套规则。

// 在 AD 的 Script 工程中新建 .pas 文件,对当前 PCB 批量设置线宽与间距 procedure SetBasicRules; var Board : IPCB_Board; Rule : IPCB_Rule; begin Board := PCBServer.GetCurrentPCBBoard; if Board = nil then Exit; // 信号线宽度规则:最小 8mil,最大 20mil,优先 10mil Rule := PCBServer.PCBRuleFactory(eRule_MaxMinWidth); Rule.Name := 'Width_Signal'; Rule.Scope1Expression := 'All'; Rule.MinWidth := MilsToCoord(8); Rule.MaxWidth := MilsToCoord(20); Rule.PreferredWidth := MilsToCoord(10); Board.AddPCBObject(Rule); // 安全间距规则:所有对象之间最小 8mil Rule := PCBServer.PCBRuleFactory(eRule_Clearance); Rule.Name := 'Clearance_All'; Rule.Gap := MilsToCoord(8); Board.AddPCBObject(Rule); end;

脚本的关键是MilsToCoord,AD 内部用坐标单位存储尺寸,直接写数字会被当成极小值。Scope1Expression决定规则作用范围,'All'表示全板生效;如果要给电源网络单独放宽线宽,把它改成'InNetClass(''Power'')',前提是先在网络类里建好 Power 类。跑完脚本后 DRC 会按新规则重新检查,之前报的间距错可能全部消失,那不是 bug,是规则终于对了。

3.4 导入后的第一步是摆位和层叠

很多人导入 PCB 后第一反应是拉线,结果布到一半发现器件全挤在板框外。正确顺序是:确认板框尺寸、设置层叠、按信号流摆放器件、锁定关键器件、再布线。

层叠设置决定阻抗和布线通道。双层板按默认的顶层信号加底层信号就行,四层板常见做法是顶层信号、内层地、内层电源、底层信号,地和电源层完整不切割,回流路径最短。33个实例大多是小板,双层足够,遇到带高速接口的实例再考虑四层。

摆位遵循“信号从左到右、电源在上、接口靠边”的原则。连接器放在板边方便插拔,晶振靠近芯片并远离板边,去耦电容紧贴电源引脚,这些在实例的 PCB 里都能直接看到布局意图,照着摆比凭空想快得多。

4. 硬件与源码对齐:把原理图网络名映射到固件宏定义

33个实例里带源代码的那部分,价值不只是“能编译”,而是提供了一个软硬件对照的样本。真实项目里最常见的低级错误是硬件改了一版、代码没跟着改,或者引脚定义分散在多个头文件里互相冲突。这一章讲怎么把原理图的网络名和源码里的宏定义对齐,做成一张可核对的表。

4.1 为什么实例代码能编译却跑不对

编译通过只说明语法和符号没问题,不说明引脚对。常见的三种错位:原理图上 LED 接在 PC13,代码里宏定义写的是 PB13;串口引脚在原理图上标了 TX/RX,代码里外设复用没打开;按键上拉电阻在原理图上有,代码里又配了内部下拉。这三种都能编译,烧进去就是不工作或者时好时坏。

根因是硬件描述和软件描述是两套独立文本,中间没有强制校验。解决办法是建一张对照表,从原理图导出的网表里取网络名,从源码头文件里取宏定义,两边做字符串匹配,对不上的就是可疑点。

4.2 从网表到宏定义:自动生成引脚对照表

AD 可以导出 Protel 格式的网表文件,内容是括号包裹的网络块,每块第一行是网络名,后面是位号加引脚号。源码这边,宏定义一般是#define XXX_PIN加#define XXX_PORT成对出现。用 Python 把两边读进来匹配。

import re from pathlib import Path def parse_netlist(path: str) -> dict: """解析 Protel 网表,返回 {网络名: [位号-引脚, ...]}""" nets, cur = {}, None for line in Path(path).read_text(errors="ignore").splitlines(): s = line.strip() if s.startswith("(") and not s.startswith("(Net"): cur = s.lstrip("(").strip() nets.setdefault(cur, []) elif s == ")": cur = None elif cur and s: nets[cur].append(s) return nets def parse_macros(path: str) -> dict: """从 C 头文件提取形如 LED1_PIN 的宏,返回 {前缀: 值}""" macros = {} pat = re.compile(r"#define\s+(\w+?)_(PIN|PORT)\s+(\S+)") for m in pat.finditer(Path(path).read_text(errors="ignore")): name, kind, val = m.group(1), m.group(2), m.group(3) macros.setdefault(name, {})[kind] = val return macros if __name__ == "__main__": nets = parse_netlist("./project/board.NET") macros = parse_macros("./project/board.h") # 网络名与宏前缀做精确匹配,大小写统一后再比 for net, pins in nets.items(): key = net.upper() if key in macros: print(f"{net:12s} 网表引脚={pins} 代码={macros[key]}") else: print(f"{net:12s} 网表引脚={pins} 代码=<未定义>")

这段脚本的输出直接就是对照表。网表解析按括号层级走,遇到左括号开新网络,右括号结束当前网络,中间的行都是引脚。宏解析用正则抓前缀_PIN和前缀_PORT成对的写法,这是单片机代码里最常见的命名约定。匹配阶段统一转大写,避免Led1和LED1对不上。输出里“未定义”那些行,要么是电源地这种不需要代码控制的网络,要么就是真的漏了定义,需要人工确认。

4.3 编译烧录前的静态检查清单

对照表出来之后,不要急着烧录,先过一遍下面几项。这些是血泪经验攒出来的顺序,跳过任何一项都可能在上电瞬间损失一颗芯片。

检查项方法不通过的后果
电源引脚电压空板先焊电源部分,万用表测输出电压偏高直接烧芯片
引脚复用配置对照芯片手册查复用表外设无输出,误判为代码问题
上下拉冲突原理图电阻与代码内部上下拉比对按键电平不稳定
晶振负载电容对照晶振手册核对容值起振困难或频率偏移
下载接口电平确认目标板与下载器电平一致连不上目标,反复重试

我一般会把这张表打印出来,焊一步勾一项,不在脑子里记。看起来笨,但比事后拿示波器一根根找信号快得多。

4.4 上电前用万用表确认三处连接

第一处是电源对地阻值,红笔接地黑笔测电源,正常应该有几百欧以上,接近零说明有短路。第二处是每个芯片的电源引脚到地,确认没有虚焊。第三处是下载接口的每根信号线到芯片对应引脚,确认走线连通且没有和相邻脚短路。这三步做完再插电,能挡掉大部分“一上电就发烫”的事故。

5. 避坑与排查:五个让工程打不开或板子报废的细节

这一章单独拎出来,是因为这些坑在33个实例里几乎每个都会碰到至少一个,而且报错信息往往指向错误的方向。每条按“现象、原因、解决”写,照着对号入座就行。

5.1 打开与编译阶段的三个坑

坑一:工程打开后文档列表为空,或者提示文档路径无效。现象是 Projects 面板里只有工程名,下面没有原理图和 PCB。原因是解压路径含中文或特殊字符,AD 内部按相对路径查找文档时解析失败。解决办法是把整个目录移到纯英文路径下,层级不超过三层,重新打开工程。如果工程文件本身记录的是绝对路径,用文本编辑器打开.PrjPcb,把路径节点改成相对路径再保存。

坑二:编译报大量 unknown footprint,但库明明已经加载。现象是库面板里能看到封装,原理图元件的封装名也对,编译就是不认。原因是集成库的版本和工程编译选项里的库搜索顺序冲突,AD 优先匹配了同名的旧库。解决办法是在工程选项的 Libraries 里把当前工程的库移到搜索顺序最前面,或者干脆把集成库拆成.SchLib和.PcbLib单独加载,绕开集成库的匹配逻辑。

坑三:ERC 报单端网络,但图上明明连了线。现象是编译报告里一堆“Net has only one pin”。原因是网络标号只放在导线一端,另一端用的是普通连线但没有形成电气连接,或者两个网络标号拼写差一个字符。解决办法是打开编译选项里的“显示单端网络”,在图上会高亮成特定颜色,逐个检查标号位置。常见做法是给每个网络标号都吸附到导线端点,而不是悬空放在导线旁边。

5.2 制板与上电阶段的两个坑

坑四:覆铜之后 DRC 报丝印压焊盘,数量几十条。现象是丝印层的器件外框和焊盘重叠。原因是封装库里的丝印外框按本体尺寸画,没有留阻焊扩展余量,覆铜后焊盘外扩就压上了。解决办法是回到封装库,把丝印外框每边内缩 0.1 到 0.15 毫米,或者在 PCB 规则里把丝印到阻焊的间距设成 4 mil,让 DRC 提前拦住。不要用“忽略此类错误”糊弄过去,板厂按丝印层做标记,压焊盘会导致焊接时字符残留。

注意:修封装要在库文件里改,改完执行“Update PCB with Current Footprint”同步到板子。直接在 PCB 上挪丝印线,下次从库更新会被覆盖回去。

坑五:板子焊完上电,稳压芯片发烫但输出正常。现象是输出电压对,芯片温度明显偏高。原因是输出电容的 ESR 不匹配导致自激振荡,或者输入输出压差太大、负载电流超出封装散热能力。解决办法是先看手册里的稳定性曲线,确认输出电容的容值和 ESR 落在稳定区;再算功耗,压差乘电流超过封装热阻允许值时换更大封装或者加散热铜皮。这个坑在实例的电源类电路里出现频率很高,因为实例为了体积往往选了小封装。

6. 把实例沉淀成模板:库、规则与制造文件的复用方法

33个实例做完,如果只是“跑通了”,价值有限。真正的收益是把里面反复出现的模块抽出来,变成自己的模板库和规则模板,下一个项目直接调用。我一般做三件事。

第一件,建个人库。把实例里验证过的电源模块、复位电路、下载接口、晶振电路分别存成.SchLib里的独立符号组,封装同步存进.PcbLib。库文件的命名按“功能_电压/接口类型”来,比如LDO_3V3、UART_LEVELSHIFT,不要用Sheet1这种默认名。库放在一个固定目录,AD 的库搜索路径指向它,新建工程直接拖进来。

第二件,把规则存成模板。第 3 章那套规则参数调好之后,在 PCB 界面用 Design 菜单里的规则导出功能存成.RUL文件,或者直接把带规则的空 PCB 存成模板文件。新工程导入 PCB 后先套模板,再改板框尺寸,规则不用重设一遍。

输出文件用途检查要点
Gerber(RS-274X)每层一个文件,含线路、阻焊、丝印层数齐全,单位与格式与板厂要求一致
钻孔文件(Excellon)过孔与插件孔坐标孔径分档合理,不要出现 0.1mm 这种极端孔
坐标文件(Pick and Place)贴片机定位位号、坐标、旋转角度与实物一致
BOM采购与焊接位号合并规则正确,不要漏掉不上件的元件

第三件,出图前做一次回读比对。Gerber 导出来后用免费的 Gerber 查看器打开,叠在 PCB 截图上看一遍,重点看阻焊开窗和丝印位置。这一步听起来多余,但我吃过亏:有一次导出时阻焊层选错了镜像选项,板厂没细看直接做,回来整批焊盘开窗全反,只能报废重投。

从那以后我每次出制造文件都强制走一遍“导出、回读、比对层数”的流程,宁可多花十分钟,也不赌板厂会帮我检查。33个实例的价值不在于每个都画一遍,而在于你从里面攒出一套自己信得过的模板,下次遇到新电路能直接套。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询