简介面向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 下用unrarWindows 下直接右键解压到英文目录即可注意不要解压到桌面这种带用户名的深层路径。# 建立独立工作目录路径保持纯英文、层级不超过三层 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, indent2, ensure_asciiFalse)) # 判断规则libs 为空且 sch 为 True 的工程打开前必须先补库脚本的核心逻辑是“以工程文件为锚点向外看”。rglob(*.PrjPcb)找到所有工程入口再对工程所在目录做一次后缀集合统计。libs为空说明这个工程的符号和封装依赖外部集成库直接打开会在编译阶段报一堆 unknown footprinthas_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 LibraryAD 会把板子上所有器件的封装提取成一个新的.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;脚本的关键是MilsToCoordAD 内部用坐标单位存储尺寸直接写数字会被当成极小值。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(errorsignore).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(errorsignore)): 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 后先套模板再改板框尺寸规则不用重设一遍。输出文件用途检查要点GerberRS-274X每层一个文件含线路、阻焊、丝印层数齐全单位与格式与板厂要求一致钻孔文件Excellon过孔与插件孔坐标孔径分档合理不要出现 0.1mm 这种极端孔坐标文件Pick and Place贴片机定位位号、坐标、旋转角度与实物一致BOM采购与焊接位号合并规则正确不要漏掉不上件的元件第三件出图前做一次回读比对。Gerber 导出来后用免费的 Gerber 查看器打开叠在 PCB 截图上看一遍重点看阻焊开窗和丝印位置。这一步听起来多余但我吃过亏有一次导出时阻焊层选错了镜像选项板厂没细看直接做回来整批焊盘开窗全反只能报废重投。从那以后我每次出制造文件都强制走一遍“导出、回读、比对层数”的流程宁可多花十分钟也不赌板厂会帮我检查。33个实例的价值不在于每个都画一遍而在于你从里面攒出一套自己信得过的模板下次遇到新电路能直接套。希望帮到你。本文还有配套的精品资源点击获取