🖥 Thiết kế mạch PCB với Altium Designer
Từ mạch nguyên lý, layout 2 lớp, thư viện linh kiện chuẩn IPC tới mạch 4 lớp, chống nhiễu, dòng lớn, mạch điều khiển và đo lường.
?Khóa học này dành cho ai?
Học sinh, sinh viên đã làm dự án Arduino/ESP32 trên testboard và muốn biến nó thành mạch in hoàn chỉnh: gọn, chắc chắn, đem đi thi và trình diễn được — tiến tới thiết kế mạch 4 lớp, mạch điều khiển công suất và mạch đo lường như kỹ sư phần cứng.
📖 3 khóa con
Basic → Thiết kế thư viện → Mạch 4 lớp & highspeed, đúng như giáo trình.
🖼️ Hình minh hoạ kỹ thuật
Mặt cắt lớp mạch, via, pad, land pattern, đường hồi dòng, thắt cổ chai, Kelvin, cặp vi sai…
🧮 Tính toán chạy thật
6 script Python theo chuẩn IPC + 3 máy tính tương tác ngay trên trang.
📁Tài liệu gốc (Google Drive)
| Khóa | Tài liệu |
|---|---|
| Khóa basic | Thư mục tài liệu khóa basic |
| Khóa Altium 4 lớp highspeed | Thư mục tài liệu 4 lớp & highspeed |
| Khóa Altium thiết kế thư viện | Thư mục tài liệu thư viện |
| Thắt cổ chai & đường ống nước | Thư mục tài liệu bổ sung |
⚙Chuẩn bị
- Altium Designer 18 trở lên (bản dùng thử 15 ngày, hoặc giấy phép giáo dục miễn phí cho học sinh/sinh viên). Có thể học song song bằng KiCad (miễn phí) — khái niệm giống hệt.
- Python 3 để chạy các script tính toán (không bắt buộc — đã có sẵn kết quả và máy tính tương tác).
- Datasheet của linh kiện dùng trong dự án; thước kẹp để đo linh kiện thật.
≡Đối chiếu với giáo trình
⌚Lộ trình gợi ý — 15 buổi
🧭 Tổng quan PCB và Altium Designer
Hiểu mạch in là gì, quy trình thiết kế từ ý tưởng tới mạch thật, và làm quen giao diện Altium Designer 18.
- Biết PCB gồm những gì, 1 lớp / 2 lớp / 4 lớp khác nhau thế nào
- Nắm quy trình 8 bước thiết kế PCB
- Biết cấu trúc project và các loại file của Altium
- Làm quen giao diện, phím tắt quan trọng
1PCB là gì?
PCB (Printed Circuit Board – mạch in) là tấm vật liệu cách điện (thường là sợi thuỷ tinh epoxy FR-4) có các đường đồng nối các linh kiện thay cho dây điện. So với hàn dây trên testboard: gọn, bền, ít nhiễu, sản xuất hàng loạt được.
| Loại | Dùng khi | Giá gia công (tham khảo) |
|---|---|---|
| 1 lớp | mạch rất đơn giản, tự làm thủ công (là ủi, ăn mòn) | rẻ nhất |
| 2 lớp | đa số dự án học sinh, Arduino shield, mạch nguồn | ~2 USD / 5 tấm 10×10 cm |
| 4 lớp | vi điều khiển tốc độ cao, WiFi/BLE, USB, nhiều nguồn | ~7–10 USD / 5 tấm |
| 6+ lớp | BGA, DDR, máy tính nhúng | cao |
2Quy trình thiết kế
Mọi phần mềm (Altium, KiCad, EasyEDA, OrCAD) đều theo quy trình này. Altium Designer là phần mềm chuyên nghiệp phổ biến trong doanh nghiệp Việt Nam; KiCad (miễn phí) và EasyEDA (trực tuyến) có cùng khái niệm — học một cái là dùng được cái kia.
3Altium Designer: project và giao diện
| File | Nội dung |
|---|---|
.PrjPcb | project – gom tất cả file lại, chứa cấu hình output |
.SchDoc | bản vẽ nguyên lý |
.PcbDoc | bản vẽ mạch in (layout) |
.SchLib / .PcbLib | thư viện ký hiệu nguyên lý / thư viện footprint |
.IntLib | thư viện tích hợp (symbol + footprint + 3D đã đóng gói) |
.OutJob | cấu hình xuất file sản xuất một lần bấm |
| Phím tắt | Tác dụng |
|---|---|
| P → P | đặt linh kiện (Place Part) |
| P → W / Ctrl+W | vẽ dây (wire) trong Schematic |
| P → T / Ctrl+W | đi dây (track) trong PCB |
| Space, X, Y | xoay, lật linh kiện khi đang kéo |
| Tab | sửa thuộc tính khi đang đặt |
| Q | đổi đơn vị mm ↔ mil |
| G | đổi bước lưới (grid) |
| 2 / 3 | xem 2D / 3D |
| L | bật/tắt hiển thị các lớp |
| Shift+S | xem một lớp duy nhất |
✎Bài tập về nhà
🥪 Các thành phần và các lớp (layer) trên mạch PCB
Hiểu ý nghĩa từng lớp trong Altium để vẽ đúng lớp và đọc hiểu file sản xuất.
- Phân biệt lớp đồng, solder mask, paste, silkscreen, mechanical, keep-out, drill
- Hiểu pad, via, track, polygon
- Biết các loại via
1Các lớp trong Altium
| Lớp | Ý nghĩa | Ghi chú |
|---|---|---|
| Top / Bottom Layer | lớp đồng dẫn điện | 4 lớp thêm Mid-Layer / Internal Plane |
| Top / Bottom Overlay | silkscreen – chữ, ký hiệu, khung linh kiện in màu trắng | chữ cao ≥ 0.8–1 mm, nét ≥ 0.15 mm |
| Top / Bottom Solder | solder mask – vùng KHÔNG phủ sơn (để lộ đồng ra hàn) | vẽ “âm bản” |
| Top / Bottom Paste | lớp kem hàn – làm khuôn (stencil) cho linh kiện dán | chỉ có ở pad SMD |
| Mechanical 1… | đường viền mạch, kích thước, lỗ bắt vít, ghi chú | quy ước tuỳ công ty |
| Keep-Out Layer | vùng cấm đi dây/đổ đồng | mép mạch, anten |
| Drill Guide / Drill Drawing | bản vẽ lỗ khoan | xuất kèm file NC Drill |
| Multi-Layer | đối tượng có trên mọi lớp đồng (pad chân xuyên, via) |
2Đối tượng trên lớp đồng
- Pad: chỗ hàn chân linh kiện (chân xuyên: Multi-Layer có lỗ; chân dán: chỉ Top hoặc Bottom).
- Track: đường đồng nối các pad.
- Via: lỗ mạ đồng nối giữa các lớp, không để hàn linh kiện.
- Polygon pour: vùng đồng lớn (thường nối GND) — giảm nhiễu, tản nhiệt, giảm lượng đồng phải ăn mòn.
- Fiducial: dấu tròn để máy gắp đặt linh kiện tự căn chỉnh.
🔧Áp dụng trong lập trình nhúng
- Độ dày đồng 1 oz/ft² ≈ 35 µm là mặc định; mạch công suất đặt 2 oz.
- Màu solder mask (xanh, đen, đỏ…) chỉ là thẩm mỹ, xanh lá rẻ và dễ kiểm tra nhất.
✎Bài tập về nhà
📐 Thiết kế mạch nguyên lý (Schematic)
Vẽ bản nguyên lý rõ ràng, đúng điện, sẵn sàng chuyển sang layout.
- Đặt linh kiện, nối dây, net label, power port
- Chia trang, hierarchical sheet, bus
- Đánh số linh kiện (annotate), kiểm tra ERC, xuất BOM
1Các bước vẽ nguyên lý
- Đặt linh kiện (PP) từ thư viện; đặt giá trị (10k, 100nF) và footprint cho từng linh kiện.
- Nối dây (Ctrl+W); chỗ 3 dây gặp nhau phải có chấm nối (junction).
- Dùng Net Label thay cho dây dài: hai điểm có cùng tên net là được nối với nhau.
- Power Port cho nguồn và đất (VCC, 3V3, GND) — đặt tên thống nhất.
- Mạch lớn: chia thành nhiều trang theo khối chức năng (nguồn, MCU, cảm biến, giao tiếp), nối bằng Port hoặc Hierarchical Sheet.
- Annotate (Tools → Annotation): đánh số R1, R2, C1… tự động.
- Compile / ERC (Project → Validate): kiểm tra chân bỏ trống, net chỉ có 1 chân, hai đầu ra nối nhau…
- Xuất BOM (Reports → Bill of Materials) để mua linh kiện.
2Quy tắc trình bày
✅ Nên
Tín hiệu đi từ trái sang phải, nguồn ở trên, GND ở dưới · nhóm linh kiện theo khối, có khung và tiêu đề · ghi chú giá trị, công suất, điện áp tụ · tụ decoupling vẽ ngay cạnh IC mà nó phục vụ · đặt test point cho tín hiệu quan trọng.
❌ Không nên
Dây chéo nhau lung tung · nối dây vào giữa thân chân khác · đặt net label lơ lửng không chạm dây · dùng chung tên net vô tình (ví dụ hai net “OUT”) · để chân IC không dùng mà không đánh dấu No-ERC.
Ví dụ khối nguồn chuẩn cho ESP32: jack DC/USB → diode chống ngược → tụ 10 µF → LDO AMS1117-3.3 → tụ 10 µF + 100 nF → 3V3, kèm LED báo nguồn có điện trở 1k.
⚠Lỗi thường gặp
- Quên gán footprint → không chuyển được sang PCB.
- Ký hiệu symbol đúng nhưng thứ tự chân footprint sai (đặc biệt transistor, LDO, MOSFET) — luôn đối chiếu datasheet.
- Bỏ qua cảnh báo ERC.
✎Bài tập về nhà
🛠 Thiết kế layout mạch 2 lớp
Chuyển nguyên lý sang mạch in, sắp xếp linh kiện hợp lý, đặt quy tắc, đi dây, đổ đồng và kiểm tra DRC.
- Import nguyên lý vào PCB (Update PCB Document)
- Vẽ khung mạch, đặt linh kiện theo khối
- Đặt Design Rules: clearance, width, via
- Đi dây, đổ đồng GND, chạy DRC
1Từ nguyên lý sang PCB
- Design → Update PCB Document: linh kiện và các đường “chuột” (ratsnest) xuất hiện.
- Vẽ đường viền mạch trên lớp Mechanical 1 rồi Design → Board Shape → Define from selected objects; bo góc 1–2 mm, lỗ bắt vít M3 (lỗ 3.2 mm) cách mép ≥ 3 mm.
- Đặt linh kiện (placement) — chiếm 50% chất lượng mạch:
- Đặt trước: connector, nút, LED, màn hình (vị trí do vỏ hộp quyết định).
- Theo khối chức năng giống nguyên lý; tụ decoupling sát chân nguồn IC; thạch anh sát vi điều khiển.
- Phần công suất (nguồn, driver động cơ) tách khỏi phần tín hiệu/analog.
- Xoay linh kiện cho đường chuột ngắn và ít chéo nhau; cùng loại linh kiện cùng hướng.
2Design Rules – quy tắc thiết kế
| Quy tắc | Giá trị an toàn cho xưởng giá rẻ (JLCPCB, PCBWay) |
|---|---|
| Clearance (khoảng cách đồng–đồng) | ≥ 0.2 mm (8 mil); nguồn 220 V AC: ≥ 2.5–3 mm và có rãnh cách ly |
| Width – tín hiệu | 0.25 mm (10 mil) |
| Width – nguồn | tính theo dòng (xem máy tính bên dưới), thường 0.5–1.5 mm |
| Via | lỗ 0.3 mm, đường kính 0.6 mm |
| Khoảng cách đồng tới mép mạch | ≥ 0.3–0.5 mm |
Đặt trong Design → Rules. Có thể tạo rule riêng cho một net/lớp net: ví dụ InNetClass('Power') rộng 0.8 mm.
🧮 Máy tính bề rộng đường mạch (IPC-2221)
3Đi dây, đổ đồng và DRC
- Đi dây nguồn và tín hiệu quan trọng trước; góc gãy 45° (không 90°).
- Mạch 2 lớp: ưu tiên một lớp đi ngang, một lớp đi dọc; hạn chế cắt vụn mặt GND ở lớp Bottom.
- Polygon Pour (PG) nối net GND trên cả hai lớp, rải thêm via nối hai mặt GND (“via stitching”) mỗi 5–10 mm.
- Tools → Design Rule Check: sửa hết lỗi (khoảng cách, chưa nối, ngắn mạch, silkscreen đè pad).
⚠Lỗi thường gặp
- Đi dây trước khi sắp xếp linh kiện xong.
- Đường nguồn mảnh như đường tín hiệu.
- Đổ đồng xong không nối vào net GND (polygon “chết”).
- Bỏ qua lỗi DRC “Un-Routed Net”.
✎Bài tập về nhà
🎨 Thiết kế logo và chữ trên mạch
Đưa logo trường, đội, tên dự án lên mạch đẹp và in được.
- Chuẩn bị ảnh logo đúng cách
- Đưa logo vào lớp silkscreen hoặc đồng
- Biết giới hạn kích thước của xưởng
1Cách đưa logo lên mạch
- Chuẩn bị ảnh đen trắng (1 bit, không xám), độ phân giải đủ cao, dạng BMP/PNG.
- Altium: chạy script PCB Logo Creator (DXP → Run Script →
PCBLogoCreator.PRJSCR) hoặc File → Import → DXF/DWG nếu logo là file vector. - Chọn lớp: Top Overlay (chữ trắng), Top Layer + Top Solder (logo đồng vàng/ENIG lộ ra), hoặc khoét solder mask để logo màu đồng.
- Chỉnh kích thước, đặt ở vùng trống, không đè lên pad.
| Thông số silkscreen | Tối thiểu (xưởng phổ thông) |
|---|---|
| Bề rộng nét | 0.15 mm |
| Chiều cao chữ | 0.8–1.0 mm |
| Khoảng cách tới pad | 0.15 mm (sẽ bị cắt nếu đè pad) |
Nên ghi trên mạch: tên dự án, phiên bản (v1.0), ngày, tên đội/trường, chú thích chân connector (GND, 5V, TX, RX), chiều cắm (+/−).
✎Bài tập về nhà
📦 Xuất file sản xuất và thực hành dự án PCB mẫu
Xuất đầy đủ file cho xưởng, đặt gia công và hoàn thành trọn vẹn một dự án mẫu.
- Xuất Gerber, NC Drill, Pick & Place, BOM
- Kiểm tra file bằng trình xem Gerber
- Đặt gia công tại xưởng
- Thực hiện dự án mẫu từ đầu tới cuối
1Bộ file gửi xưởng
| File | Altium | Dùng để |
|---|---|---|
| Gerber (RS-274X) | File → Fabrication Outputs → Gerber Files | hình ảnh từng lớp: đồng, mask, silk, viền |
| NC Drill (Excellon) | File → Fabrication Outputs → NC Drill Files | toạ độ và kích thước lỗ khoan |
| Pick & Place (CPL) | File → Assembly Outputs → Generates pick and place files | toạ độ, góc xoay linh kiện (nếu nhờ xưởng hàn) |
| BOM | Reports → Bill of Materials | danh sách linh kiện |
Gerber: chọn đơn vị mm, định dạng 4:4; chọn đủ các lớp đang dùng + Mechanical viền mạch. Nén tất cả thành một file .zip, kiểm tra lại bằng trình xem Gerber của xưởng trước khi đặt hàng. Dùng OutJob để lần sau chỉ bấm một nút.
2Dự án mẫu: mạch đo nhiệt độ – độ ẩm ESP32
- Yêu cầu: ESP32-WROOM, nguồn USB-C 5 V → 3.3 V, cảm biến SHT31 (I2C), màn hình OLED 0.96" (I2C), 2 nút nhấn, LED trạng thái, header mở rộng.
- Nguyên lý: 4 khối — nguồn, ESP32 (kèm mạch reset/boot và nạp qua CH340C), cảm biến/màn hình, nút/LED.
- Thư viện: tải footprint ESP32 module và USB-C từ nhà sản xuất; tự làm footprint SHT31 (DFN) theo bài 9.
- Layout: mạch 2 lớp 60 × 40 mm; anten module nhô ra mép, cấm đồng dưới anten; cảm biến đặt xa LDO và ESP32 (tránh nhiệt) và có khe cắt cách nhiệt.
- Kiểm tra: ERC, DRC, xem 3D đối chiếu vỏ hộp, in giấy tỉ lệ 1:1 đặt linh kiện thật lên thử.
- Xuất file, đặt hàng, hàn, nạp code đo kiểm.
⚠Lỗi thường gặp
- Quên lớp viền (Mechanical/Keep-Out) trong Gerber → xưởng không biết cắt.
- Quên file khoan.
- Không kiểm tra lại Gerber trước khi đặt hàng.
✎Bài tập về nhà
📚 Sử dụng và quản lý thư viện linh kiện
Tìm, cài và quản lý thư viện linh kiện; biết khi nào dùng thư viện có sẵn, khi nào tự làm.
- Hiểu symbol, footprint, model 3D và thông số (parameter)
- Cài thư viện, tìm linh kiện bằng Manufacturer Part Search
- Tải thư viện từ SnapEDA, Ultra Librarian, LCSC/EasyEDA
- Tổ chức thư viện riêng của nhóm
1Một linh kiện gồm những gì?
| Thành phần | Nằm ở | Mô tả |
|---|---|---|
| Symbol | .SchLib | ký hiệu trên nguyên lý, các chân có số và tên |
| Footprint | .PcbLib | hình pad thực tế trên mạch, đúng kích thước datasheet |
| 3D model | .step | để kiểm tra va chạm, xuất cho vỏ hộp |
| Parameter | trong symbol | giá trị, mã nhà sản xuất, nhà cung cấp, giá |
Chân số N của symbol phải nối với pad số N của footprint — sai ở đây là lỗi nguy hiểm nhất, mạch in ra không chạy mà nhìn không thấy.
2Nguồn thư viện
- Components panel → Manufacturer Part Search (Altium 18+): tìm theo mã, kéo thả linh kiện đã có đủ symbol, footprint, 3D.
- SnapEDA, Ultra Librarian, Component Search Engine: tải miễn phí theo mã linh kiện, chọn định dạng Altium.
- LCSC / EasyEDA: thư viện linh kiện có sẵn ở kho JLCPCB (tiện khi nhờ xưởng hàn).
- Thư viện của nhóm: một file .SchLib + .PcbLib (hoặc .IntLib) dùng chung, đặt tên theo quy ước, mỗi linh kiện được kiểm tra một lần.
✎Bài tập về nhà
📌 Thiết kế thư viện linh kiện chân xuyên (THT)
Tự vẽ symbol và footprint chân xuyên chính xác từ datasheet.
- Đọc bản vẽ kích thước trong datasheet
- Tính lỗ khoan và pad
- Vẽ footprint DIP, header, TO-220 bằng tay và bằng IPC Footprint Wizard
- Vẽ symbol, gán footprint, thêm 3D
1Lỗ khoan và pad
"""Tính lỗ khoan và pad cho linh kiện CHÂN XUYÊN (THT) – theo khuyến nghị IPC-2222 / IPC-7251
Lỗ khoan = đường kính chân lớn nhất + khe hở (0.2 mm mức B; 0.25 mm mức A)
Pad = lỗ khoan + 2 x vành khuyên (annular ring, tối thiểu ~0.15–0.25 mm, nên >= 0.3 mm khi hàn tay)
Chân hình chữ nhật: dùng đường chéo sqrt(a² + b²) làm "đường kính chân"
Chạy: python 02-lo-khoan-pad-cham-xuyen.py"""
import math
KHE_HO = 0.20 # mm
VANH_KHUYEN = 0.30 # mm – thoải mái cho hàn tay / xưởng giá rẻ
LO_CHUAN = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 2.0, 3.2] # mũi khoan xưởng hay có (mm)
def tinh(ten, chan_mm=None, chan_cn=None):
d = chan_mm if chan_mm else math.hypot(*chan_cn)
lo_toi_thieu = d + KHE_HO
lo = next(x for x in LO_CHUAN if x >= lo_toi_thieu - 1e-9) # làm tròn lên mũi khoan có sẵn
pad = lo + 2 * VANH_KHUYEN
return ten, d, lo, pad
ds = [
tinh("Điện trở 1/4W", chan_mm=0.6),
tinh("LED 5 mm", chan_cn=(0.5, 0.5)),
tinh("Header 2.54 mm", chan_cn=(0.64, 0.64)),
tinh("IC DIP-8 (NE555)", chan_cn=(0.53, 0.25)),
tinh("Tụ hoá 10x16", chan_mm=0.6),
tinh("Diode 1N5408 (3A)", chan_mm=1.3),
tinh("Transistor TO-220", chan_cn=(0.9, 0.5)),
tinh("Domino KF301 (5.0)", chan_cn=(1.0, 0.8)),
]
print(f"{'Linh kiện':<22}| {'chân (mm)':>9} | {'lỗ khoan':>8} | {'pad':>5}")
print("-" * 54)
for ten, d, lo, pad in ds:
print(f"{ten:<22}| {d:>9.2f} | {lo:>8.2f} | {pad:>5.2f}")
print("\nKiểm tra khoảng hở giữa 2 pad header 2.54 mm:")
pad_header = ds[2][3]
khe = 2.54 - pad_header
print(f" pad {pad_header:.2f} mm -> khe giữa 2 pad = {khe:.2f} mm "
f"({'đi được 1 đường 0.25 mm + 2 khe 0.2 mm' if khe >= 0.65 else 'KHÔNG đủ chỗ đi dây giữa 2 chân'})")
python 02-lo-khoan-pad-cham-xuyen.pyLinh kiện | chân (mm) | lỗ khoan | pad ------------------------------------------------------ Điện trở 1/4W | 0.60 | 0.80 | 1.40 LED 5 mm | 0.71 | 1.00 | 1.60 Header 2.54 mm | 0.91 | 1.20 | 1.80 IC DIP-8 (NE555) | 0.59 | 0.80 | 1.40 Tụ hoá 10x16 | 0.60 | 0.80 | 1.40 Diode 1N5408 (3A) | 1.30 | 1.50 | 2.10 Transistor TO-220 | 1.03 | 1.30 | 1.90 Domino KF301 (5.0) | 1.28 | 1.50 | 2.10 Kiểm tra khoảng hở giữa 2 pad header 2.54 mm: pad 1.80 mm -> khe giữa 2 pad = 0.74 mm (đi được 1 đường 0.25 mm + 2 khe 0.2 mm)
Giải thích
- Header 2.54 mm có chân vuông 0.64 mm → đường chéo 0.91 mm → lỗ 1.2 mm, pad 1.8 mm, vẫn đủ chỗ đi 1 đường giữa 2 chân.
- Diode 3 A chân to 1.3 mm cần lỗ 1.5 mm — dùng nhầm footprint của diode 1 A (lỗ 0.8 mm) sẽ không cắm được linh kiện.
🧮 Máy tính lỗ khoan & pad chân xuyên
2Các bước vẽ footprint trong PcbLib
- Tools → New Blank Footprint, đặt tên theo quy ước (ví dụ
DIP8_W7.62mm,TO220-3_Vertical). - Đặt pad (PP) lớp Multi-Layer, nhập kích thước lỗ và pad đã tính; pad 1 hình vuông/chữ nhật.
- Đặt pad theo toạ độ chính xác (khoảng cách chân 2.54 mm, hàng cách 7.62 mm với DIP-8) — dùng Edit → Set Reference → Center để gốc toạ độ ở tâm linh kiện.
- Vẽ khung trên Top Overlay (nét 0.15–0.2 mm) và dấu chân 1; vẽ courtyard trên lớp Mechanical.
- Gắn mô hình 3D (Place → 3D Body → .step).
- Nhanh hơn: Tools → IPC Compliant Footprint Wizard → chọn loại gói (DIP, SIP…), nhập kích thước datasheet.
⚠Lỗi thường gặp
- Nhìn nhầm kích thước inch/mm trong datasheet.
- Đặt gốc toạ độ lệch → máy gắp đặt sai vị trí.
- Footprint nhìn từ dưới (bottom view) bị lật ngược thứ tự chân.
✎Bài tập về nhà
🔲 Thiết kế thư viện IC chân dán (SMD)
Vẽ footprint SMD chuẩn IPC-7351 cho IC (SOIC, SOT-23, QFN, QFP).
- Hiểu land pattern: toe, heel, side fillet
- Dùng IPC Compliant Footprint Wizard
- Thêm pad tản nhiệt (exposed pad), lớp paste, courtyard
1Land pattern IPC-7351
Pad SMD phải dài hơn chân linh kiện để tạo mối hàn đẹp: phần nhô ra phía ngoài (toe), phía trong (heel) và hai bên (side). IPC-7351 có 3 mức mật độ: Most (pad to, dễ hàn tay), Nominal (cân bằng – mặc định), Least (mạch dày đặc).
| Gói | Ghi chú khi vẽ |
|---|---|
| SOT-23 | 3 chân, thứ tự chân khác nhau giữa các hãng — kiểm tra kỹ (đặc biệt MOSFET, LDO) |
| SOIC-8 | bước chân 1.27 mm, pad ~1.5 × 0.6 mm |
| QFN | chân nằm dưới thân + pad tản nhiệt giữa (nối GND, có via tản nhiệt); chia paste thành ô nhỏ (~50–60% diện tích) |
| QFP / TQFP | bước 0.5–0.8 mm, cần solder mask giữa các pad |
2Quy trình với IPC Compliant Footprint Wizard
- Tools → IPC Compliant Footprint Wizard → chọn họ (SOIC, SOT23, QFN, PQFP…).
- Nhập kích thước tổng thể và kích thước chân lấy từ bảng kích thước trong datasheet (min/max).
- Chọn mức mật độ, kiểm tra hình xem trước, đặt tên theo chuẩn IPC (ví dụ
SOIC127P600X175-8N). - Kiểm tra pad tản nhiệt, lớp paste, dấu chân 1, tâm toạ độ; gắn 3D.
⚠Lỗi thường gặp
- Quên solder mask giữa các pad bước nhỏ → chân dính thiếc.
- Pad tản nhiệt QFN phủ paste kín → linh kiện “nổi” lên, chân không ăn thiếc.
- Lấy kích thước điển hình (typ) thay vì min/max.
✎Bài tập về nhà
📏 Tính toán thiết kế thư viện điện trở, tụ điện dán
Tự tính kích thước pad cho linh kiện chip (0402–1206) bằng công thức IPC-7351 và tạo footprint.
- Hiểu mã kích thước 0402/0603/0805/1206 hệ inch và hệ mét
- Áp dụng công thức Z, G, X
- Chọn kích thước phù hợp hàn tay hay hàn máy
1Kích thước linh kiện chip
| Mã (inch) | Mã (mét) | Công suất điện trở thường gặp | Gợi ý |
|---|---|---|---|
| 0402 | 1005 | 1/16 W | chỉ hàn máy |
| 0603 | 1608 | 1/10 W | hàn tay được với nhíp + kính lúp |
| 0805 | 2012 | 1/8 W | dễ hàn tay nhất cho người mới |
| 1206 | 3216 | 1/4 W | dòng/áp lớn hơn |
| 2512 | 6332 | 1 W | điện trở shunt đo dòng |
2Tính land pattern
"""Tính land pattern (pad) cho điện trở / tụ dán (chip) – theo ý tưởng IPC-7351 (rút gọn, dùng kích thước danh định)
S (khe giữa 2 đầu cực) = L − 2·T
Z (mép ngoài 2 pad) = L + 2·Jt + Cz Jt: mối hàn mũi (toe)
G (mép trong 2 pad) = S − 2·Jh − Cg Jh: mối hàn gót (heel)
X (rộng pad) = W + 2·Js + Cx Js: mối hàn cạnh (side)
Mức B (nominal) cho chip >= 0603: Jt = 0.35, Jh = −0.05, Js = 0.00 (mm)
Cz, Cg, Cx: tổng dung sai = sqrt(dung_sai_linh_kien² + F² + P²), F = sai số chế tạo 0.05, P = sai số gắp đặt 0.05
Chạy: python 03-footprint-chip-smd.py"""
import math
JT, JH, JS = 0.35, -0.05, 0.00
F, P = 0.05, 0.05
# Kích thước linh kiện theo datasheet điện trở chip (mm): (L, ±L, W, ±W, T đầu cực, ±T)
LINH_KIEN = {
"0402 (1005)": (1.00, 0.05, 0.50, 0.05, 0.25, 0.10),
"0603 (1608)": (1.60, 0.10, 0.80, 0.10, 0.30, 0.20),
"0805 (2012)": (2.00, 0.10, 1.25, 0.10, 0.40, 0.20),
"1206 (3216)": (3.20, 0.10, 1.60, 0.10, 0.50, 0.25),
}
def land_pattern(L, dL, W, dW, T, dT):
S = L - 2 * T
Cz = math.sqrt(dL ** 2 + F ** 2 + P ** 2)
Cg = math.sqrt(dL ** 2 + (2 * dT) ** 2 + F ** 2 + P ** 2) / 2
Cx = math.sqrt(dW ** 2 + F ** 2 + P ** 2)
Z = L + 2 * JT + Cz
G = S - 2 * JH - Cg
X = W + 2 * JS + Cx
return Z, G, X, (Z - G) / 2, (Z + G) / 2
print(f"{'Gói':<12}| {'Z':>5} | {'G':>5} | {'pad dài x rộng':>15} | {'tâm–tâm':>7}")
print("-" * 56)
for ten, kt in LINH_KIEN.items():
Z, G, X, l, c = land_pattern(*kt)
print(f"{ten:<12}| {Z:>5.2f} | {G:>5.2f} | {l:>6.2f} x {X:<6.2f} | {c:>7.2f}")
print("\nGhi chú: làm tròn tới 0.05 mm khi nhập vào Altium; courtyard = Z và X cộng thêm 0.25 mm mỗi phía.")
Z, G, X, l, c = land_pattern(*LINH_KIEN["0603 (1608)"])
print(f"Ví dụ 0603 nhập vào Altium: 2 pad {round(l / .05) * .05:.2f} x {round(X / .05) * .05:.2f} mm, "
f"tâm pad tại x = ±{c / 2:.3f} mm, courtyard {Z + 0.5:.2f} x {X + 0.5:.2f} mm")
python 03-footprint-chip-smd.pyGói | Z | G | pad dài x rộng | tâm–tâm -------------------------------------------------------- 0402 (1005) | 1.79 | 0.49 | 0.65 x 0.59 | 1.14 0603 (1608) | 2.42 | 0.89 | 0.77 x 0.92 | 1.66 0805 (2012) | 2.82 | 1.09 | 0.87 x 1.37 | 1.96 1206 (3216) | 4.02 | 2.04 | 0.99 x 1.72 | 3.03 Ghi chú: làm tròn tới 0.05 mm khi nhập vào Altium; courtyard = Z và X cộng thêm 0.25 mm mỗi phía. Ví dụ 0603 nhập vào Altium: 2 pad 0.75 x 0.90 mm, tâm pad tại x = ±0.828 mm, courtyard 2.92 x 1.42 mm
Giải thích
- Kết quả 0603: pad 0.75 × 0.90 mm, tâm cách tâm 1.66 mm — gần với footprint chuẩn của các hãng.
- Muốn dễ hàn tay hơn: chọn mức Most (Jt = 0.55) → pad dài thêm 0.2 mm về phía ngoài.
- Courtyard (vùng chiếm chỗ) giúp DRC phát hiện hai linh kiện đặt quá sát nhau.
✎Bài tập về nhà
🧱 Thiết kế mạch 4 lớp, stack-up và trở kháng (Altium 18)
Thiết kế mạch 4 lớp đúng chuẩn: chọn stack-up, mặt GND/nguồn, đường trở kháng có kiểm soát.
- Dùng Layer Stack Manager trong Altium 18
- Hiểu vì sao stack-up SIG–GND–PWR–SIG phổ biến
- Hiểu đường hồi dòng (return path)
- Tính bề rộng đường 50 Ω và cặp vi sai 90 Ω
1Stack-up 4 lớp
Layer Stack Manager (Design → Layer Stack Manager): thêm 2 lớp nội (Internal Plane cho mặt nguồn/GND, hoặc Signal Layer). Nhập độ dày prepreg/lõi và hằng số điện môi theo stack-up của xưởng (JLCPCB công bố stack-up JLC04161H-7628).
- L2 = GND liền mạch: mọi tín hiệu ở L1 có đường hồi ngay bên dưới, cách 0.21 mm → nhiễu giảm mạnh.
- L3 = nguồn: chia vùng 3V3, 5V bằng Split Plane.
- Tín hiệu đi ở L1 và L4; khi đổi lớp tín hiệu nhanh, đặt via GND ngay cạnh via tín hiệu.
2Đường hồi dòng
Ở tần số cao, dòng hồi luôn đi theo đường có cảm kháng nhỏ nhất — ngay bên dưới đường tín hiệu. Nếu mặt GND bị cắt bởi khe hở, dòng hồi phải đi vòng, tạo vòng dòng lớn = anten phát nhiễu. Không bao giờ cho tín hiệu nhanh đi qua khe của mặt GND.
3Trở kháng có kiểm soát
"""Tính trở kháng đặc tính của đường microstrip (đường trên lớp ngoài, có mặt GND ngay lớp dưới)
Công thức IPC-2141: Z0 = 87 / sqrt(εr + 1.41) · ln( 5.98·h / (0.8·w + t) ) (hợp lệ khi 0.1 < w/h < 2)
Cặp vi sai (gần đúng): Zdiff ≈ 2·Z0·(1 − 0.48·e^(−0.96·s/h))
Stack-up mẫu: mạch 4 lớp 1.6 mm, lớp prepreg 7628 dày h = 0.21 mm, εr ≈ 4.4, đồng ngoài 1 oz (t = 0.035 mm)
Chạy: python 04-tro-khang-microstrip.py"""
import math
H, ER, T = 0.21, 4.4, 0.035
def z0(w, h=H, er=ER, t=T):
return 87 / math.sqrt(er + 1.41) * math.log(5.98 * h / (0.8 * w + t))
def zdiff(w, s, h=H):
return 2 * z0(w, h) * (1 - 0.48 * math.exp(-0.96 * s / h))
def tim_be_rong(muc_tieu, h=H):
lo, hi = 0.02, 3 * h # Z0 giảm khi w tăng -> chia đôi
for _ in range(60):
mid = (lo + hi) / 2
if z0(mid, h) > muc_tieu: lo = mid
else: hi = mid
return (lo + hi) / 2
print("Z0 theo bề rộng đường (h = 0.21 mm, εr = 4.4):")
for w in [0.15, 0.20, 0.30, 0.40, 0.50]:
print(f" w = {w:.2f} mm -> Z0 = {z0(w):5.1f} Ω")
w50 = tim_be_rong(50)
print(f"\nĐường 50 Ω (anten 2.4 GHz, RF): w ≈ {w50:.3f} mm")
print("\nCặp vi sai USB 2.0 (mục tiêu 90 Ω ± 10%):")
for w, s in [(0.15, 0.15), (0.20, 0.15), (0.25, 0.15), (0.25, 0.20)]:
z = zdiff(w, s)
print(f" w = {w:.2f}, s = {s:.2f} mm -> Zdiff ≈ {z:5.1f} Ω {'✓' if 81 <= z <= 99 else ''}")
print("\nNếu là mạch 2 lớp 1.6 mm (h = 1.5 mm), đường 50 Ω phải rộng:",
f"{tim_be_rong(50, 1.5):.2f} mm -> quá to, vì vậy RF/high-speed nên dùng mạch 4 lớp.")
python 04-tro-khang-microstrip.pyZ0 theo bề rộng đường (h = 0.21 mm, εr = 4.4): w = 0.15 mm -> Z0 = 75.5 Ω w = 0.20 mm -> Z0 = 67.2 Ω w = 0.30 mm -> Z0 = 54.8 Ω w = 0.40 mm -> Z0 = 45.6 Ω w = 0.50 mm -> Z0 = 38.3 Ω Đường 50 Ω (anten 2.4 GHz, RF): w ≈ 0.349 mm Cặp vi sai USB 2.0 (mục tiêu 90 Ω ± 10%): w = 0.15, s = 0.15 mm -> Zdiff ≈ 114.5 Ω w = 0.20, s = 0.15 mm -> Zdiff ≈ 101.9 Ω w = 0.25, s = 0.15 mm -> Zdiff ≈ 91.7 Ω ✓ w = 0.25, s = 0.20 mm -> Zdiff ≈ 97.7 Ω ✓ Nếu là mạch 2 lớp 1.6 mm (h = 1.5 mm), đường 50 Ω phải rộng: 2.76 mm -> quá to, vì vậy RF/high-speed nên dùng mạch 4 lớp.
Giải thích
- Mạch 4 lớp: đường 50 Ω chỉ rộng 0.35 mm — dễ đi tới anten, connector u.FL.
- Mạch 2 lớp dày 1.6 mm: đường 50 Ω phải rộng 2.76 mm — lý do RF và USB tốc độ cao nên dùng 4 lớp.
- Altium 18 tính trở kháng ngay trong Layer Stack Manager (tab Impedance) và đặt rule Width theo trở kháng.
⚠Lỗi thường gặp
- Đặt hai lớp tín hiệu kề nhau ở giữa mà không có mặt tham chiếu.
- Chia vụn mặt GND ở L2.
- Dùng stack-up mặc định của Altium thay vì stack-up thật của xưởng.
✎Bài tập về nhà
📡 Thiết kế chống nhiễu và tín hiệu tốc độ cao
Áp dụng các quy tắc layout giúp mạch chạy ổn định, ít nhiễu, đạt EMC.
- Đặt tụ decoupling đúng
- Bố trí thạch anh, analog/digital, nguồn xung
- Đi cặp vi sai, cân chiều dài
- Quy tắc 3W, 20H, via stitching
1Nguồn và tụ decoupling
- Mỗi chân nguồn IC có một tụ 100 nF đặt sát nhất có thể, via GND ngay cạnh tụ; thêm tụ 10 µF cho cả khối.
- Dòng đi: nguồn → tụ → chân IC (đi qua tụ trước rồi mới vào IC).
- Nguồn xung (buck): vòng dòng gồm tụ vào – MOSFET – diode phải nhỏ nhất; cuộn cảm và chân SW tránh xa tín hiệu nhạy.
2Tín hiệu tốc độ cao
- Thạch anh sát chân vi điều khiển, tụ tải đối xứng, bao quanh bằng GND, không đi dây khác bên dưới.
- Analog/Digital: đặt tách vùng, dùng chung một mặt GND liền nhưng không để dòng digital chạy qua vùng analog.
- Cặp vi sai (USB, CAN, RS485, Ethernet): Altium → Place → Differential Pair Routing; đặt rule Differential Pairs; cân chiều dài bằng Interactive Length Tuning.
- Via stitching dọc mép mạch và quanh vùng RF mỗi λ/20.
🔧Áp dụng trong lập trình nhúng
- ESP32: chân EN cần mạch RC (10k + 1 µF) chống reset do nhiễu; chân GPIO0 có điện trở kéo lên.
- Động cơ DC: tụ 100 nF hàn trực tiếp hai cực động cơ, dây động cơ xoắn đôi, driver và MCU dùng GND công suất riêng nối tại một điểm.
⚠Lỗi thường gặp
- Tụ decoupling đặt xa, nối bằng đường dài mảnh.
- Đường clock chạy song song sát đường analog.
- Đổ đồng tạo “đảo” đồng không nối GND (anten nhỏ).
✎Bài tập về nhà
🚰 Sửa lỗi thắt cổ chai và layout “đường ống nước” cho dòng lớn
Tính và vẽ đúng đường dòng lớn: bề rộng, via, polygon, thermal relief — tránh điểm nghẽn gây nóng cháy.
- Tính bề rộng đường theo dòng và mức tăng nhiệt (IPC-2221)
- Phát hiện và sửa điểm thắt cổ chai
- Tính số via cần thiết
- Dùng polygon, đồng dày, thermal relief hợp lý
1Dòng điện như nước chảy trong ống
Lưu lượng của cả đường ống do chỗ hẹp nhất quyết định. Một đường nguồn rộng 3 mm nhưng phải lách qua giữa 2 chân IC bằng đoạn 0.25 mm thì khả năng chịu dòng chỉ còn của đoạn 0.25 mm. Các điểm hẹp hay bị bỏ sót: lối vào pad, chỗ đổi lớp (1 via duy nhất), chỗ polygon bị thắt bởi via/lỗ, cổ thermal relief.
2Tính bề rộng đường
"""Tính bề rộng đường mạch theo dòng điện – công thức IPC-2221
I = k · ΔT^0.44 · A^0.725 (A: tiết diện, đơn vị mil²)
k = 0.048 với lớp NGOÀI (top/bottom), 0.024 với lớp TRONG (khó toả nhiệt hơn)
Chạy: python 01-be-rong-duong-mach.py"""
import math
MIL = 0.0254 # 1 mil = 0.0254 mm
OZ_TO_MIL = 1.378 # 1 oz/ft² đồng ≈ 1.378 mil ≈ 35 µm
RHO_CU = 1.72e-8 # điện trở suất đồng (Ω·m) ở 20°C
def be_rong_mm(dong_A, tang_nhiet=10, oz=1.0, lop_ngoai=True):
k = 0.048 if lop_ngoai else 0.024
tiet_dien_mil2 = (dong_A / (k * tang_nhiet ** 0.44)) ** (1 / 0.725)
return tiet_dien_mil2 / (oz * OZ_TO_MIL) * MIL
def sut_ap(dong_A, rong_mm, dai_mm, oz=1.0):
day_m = oz * 35e-6
R = RHO_CU * (dai_mm / 1000) / ((rong_mm / 1000) * day_m)
return R, dong_A * R, dong_A ** 2 * R
print("Bề rộng tối thiểu (mm) cho phép tăng nhiệt ΔT = 10°C")
print(f"{'Dòng (A)':>9} | {'ngoài 1oz':>10} | {'ngoài 2oz':>10} | {'trong 1oz':>10}")
print("-" * 49)
for I in [0.3, 0.5, 1, 2, 3, 5, 10]:
print(f"{I:>9} | {be_rong_mm(I):>10.2f} | {be_rong_mm(I, oz=2):>10.2f} | {be_rong_mm(I, lop_ngoai=False):>10.2f}")
print("\nẢnh hưởng của mức tăng nhiệt cho phép (2 A, lớp ngoài, 1 oz):")
for dT in [5, 10, 20, 30]:
print(f" ΔT = {dT:>2}°C -> {be_rong_mm(2, dT):.2f} mm")
print("\nSụt áp & công suất toả nhiệt trên đường dài 50 mm, 1 oz:")
for I, w in [(0.5, 0.25), (2, 0.8), (5, 2.5)]:
R, V, P = sut_ap(I, w, 50)
print(f" {I} A, rộng {w} mm: R = {R * 1000:.1f} mΩ, sụt áp = {V * 1000:.0f} mV, P = {P * 1000:.0f} mW")
python 01-be-rong-duong-mach.pyBề rộng tối thiểu (mm) cho phép tăng nhiệt ΔT = 10°C
Dòng (A) | ngoài 1oz | ngoài 2oz | trong 1oz
-------------------------------------------------
0.3 | 0.06 | 0.03 | 0.15
0.5 | 0.12 | 0.06 | 0.30
1 | 0.30 | 0.15 | 0.78
2 | 0.78 | 0.39 | 2.03
3 | 1.37 | 0.68 | 3.56
5 | 2.77 | 1.38 | 7.19
10 | 7.19 | 3.60 | 18.71
Ảnh hưởng của mức tăng nhiệt cho phép (2 A, lớp ngoài, 1 oz):
ΔT = 5°C -> 1.19 mm
ΔT = 10°C -> 0.78 mm
ΔT = 20°C -> 0.51 mm
ΔT = 30°C -> 0.40 mm
Sụt áp & công suất toả nhiệt trên đường dài 50 mm, 1 oz:
0.5 A, rộng 0.25 mm: R = 98.3 mΩ, sụt áp = 49 mV, P = 25 mW
2 A, rộng 0.8 mm: R = 30.7 mΩ, sụt áp = 61 mV, P = 123 mW
5 A, rộng 2.5 mm: R = 9.8 mΩ, sụt áp = 49 mV, P = 246 mWGiải thích
- 1 A cần 0.30 mm ở lớp ngoài nhưng 0.78 mm ở lớp trong — lớp trong khó toả nhiệt.
- Đồng 2 oz cho phép đường hẹp đi một nửa.
- Ngoài nhiệt, kiểm tra cả sụt áp: 2 A qua đường 0.8 mm dài 50 mm mất 61 mV.
3Via và thermal relief
"""Via chịu được bao nhiêu dòng? – coi thân via mạ đồng như một đường mạch lớp TRONG (IPC-2221, k = 0.024)
Tiết diện thành via = π · (d_lỗ + t) · t t: độ dày lớp mạ (thường 20–25 µm)
Chạy: python 05-via-dong-dien.py"""
import math
MIL = 0.0254
def dong_qua_via(d_lo_mm, t_ma_mm=0.025, tang_nhiet=10):
tiet_dien_mm2 = math.pi * (d_lo_mm + t_ma_mm) * t_ma_mm
tiet_dien_mil2 = tiet_dien_mm2 / (MIL * MIL)
return 0.024 * tang_nhiet ** 0.44 * tiet_dien_mil2 ** 0.725
print(f"{'Lỗ via (mm)':>11} | {'dòng tối đa (A)':>15}")
print("-" * 30)
for d in [0.2, 0.3, 0.4, 0.5, 0.6]:
print(f"{d:>11.1f} | {dong_qua_via(d):>15.2f}")
I, d = 5, 0.3
n = math.ceil(I / dong_qua_via(d) * 1.25) # +25% dự phòng
print(f"\nĐưa {I} A từ lớp TOP xuống lớp POWER bằng via {d} mm cần ít nhất {n} via (đã cộng 25% dự phòng).")
print("Mẹo: đặt các via thành cụm ngay sát pad, thay vì 1 via to ở xa.")
python 05-via-dong-dien.pyLỗ via (mm) | dòng tối đa (A)
------------------------------
0.2 | 0.73
0.3 | 0.95
0.4 | 1.16
0.5 | 1.35
0.6 | 1.53
Đưa 5 A từ lớp TOP xuống lớp POWER bằng via 0.3 mm cần ít nhất 7 via (đã cộng 25% dự phòng).
Mẹo: đặt các via thành cụm ngay sát pad, thay vì 1 via to ở xa.Giải thích
- Một via 0.3 mm chịu khoảng 1 A → 5 A cần cụm 7 via.
- Altium: Design → Rules → Plane → Polygon Connect Style chọn Relief Connect cho chân tín hiệu, Direct Connect cho net dòng lớn.
⚠Lỗi thường gặp
- Đường nguồn đổi lớp qua 1 via nhỏ.
- Polygon bị via và lỗ cắt thành dải hẹp.
- Thermal relief nan mảnh trên chân cấp nguồn động cơ.
✎Bài tập về nhà
🎛 Thiết kế mạch điều khiển (vi điều khiển + công suất)
Bố trí mạch có cả vi điều khiển và phần công suất (driver động cơ, relay) chạy ổn định, an toàn.
- Bố trí module ESP32/STM32: anten, nguồn, nạp code
- Layout mạch cầu H / driver động cơ
- Cách ly công suất – tín hiệu, relay, optocoupler
1Khối vi điều khiển
- Module WiFi: anten nhô ra ngoài mép mạch hoặc vùng dưới anten không có đồng ở mọi lớp.
- Mạch nạp: CH340/CP2102 + 2 transistor tự động EN/GPIO0; header UART dự phòng.
- Chân I/O ra ngoài (connector) có điện trở nối tiếp 100–330 Ω hoặc TVS chống tĩnh điện.
2Khối công suất
- Driver động cơ (L298N, TB6612, DRV8833, cầu H MOSFET): tụ bulk + tụ gốm sát nguồn driver; đường động cơ rộng theo dòng (xem bài 13).
- Diode xả (flyback) song song cuộn relay/động cơ; transistor/MOSFET kích relay có điện trở kéo xuống ở cực G/B.
- Điện áp cao (220 V): khoảng cách cách điện ≥ 3 mm, có khe phay (slot) giữa phần cao áp và hạ áp, dùng optocoupler/relay cách ly.
⚠Lỗi thường gặp
- GND động cơ dùng chung đường mảnh với GND vi điều khiển → MCU reset khi động cơ khởi động.
- Thiếu diode flyback → đỉnh áp làm chết transistor.
- Đồng dưới anten WiFi.
✎Bài tập về nhà
📈 Thiết kế mạch đo dòng và đo áp
Thiết kế mạch đo điện áp và dòng điện chính xác cho vi điều khiển: phân áp, shunt, khuếch đại, lọc và layout Kelvin.
- Tính cầu phân áp cho ADC
- Chọn điện trở shunt, bộ khuếch đại dòng (INA180/INA219), cảm biến Hall (ACS712)
- Lọc nhiễu RC trước ADC
- Layout Kelvin và đường analog sạch
1Tính toán
"""Mạch đo dòng (điện trở shunt) và đo áp (cầu phân áp) cho ADC 12 bit của ESP32 (0–3.3 V)
Chạy: python 06-do-dong-do-ap.py"""
ADC_BIT, VREF = 12, 3.3
LSB = VREF / (2 ** ADC_BIT)
print("== ĐO ÁP: pin 24 V qua cầu phân áp R1 (trên) – R2 (dưới) ==")
V_MAX = 25.2 # pin 6S đầy 25.2 V
for R1, R2 in [(100e3, 10e3), (100e3, 15e3), (68e3, 10e3)]:
he_so = R2 / (R1 + R2)
v_adc = V_MAX * he_so
dong_tieu_thu = V_MAX / (R1 + R2)
ok = "VƯỢT 3.3 V – hỏng chân ADC!" if v_adc > VREF else ("sát 3.3 V, không còn dự phòng" if v_adc > 0.9 * VREF else "OK")
print(f" R1 = {R1 / 1e3:.0f}k, R2 = {R2 / 1e3:.0f}k: Vadc max = {v_adc:.2f} V ({ok}), "
f"độ phân giải = {LSB / he_so * 1000:.1f} mV/bước, dòng rò = {dong_tieu_thu * 1e6:.0f} µA")
R_LOC, C_LOC = 10e3, 100e-9
import math
fc = 1 / (2 * math.pi * R_LOC * C_LOC)
print(f" Lọc RC {R_LOC / 1e3:.0f}k + {C_LOC * 1e9:.0f}nF trước chân ADC: tần số cắt {fc:.0f} Hz")
print("\n== ĐO DÒNG: điện trở shunt + khuếch đại (INA180 gain 50) ==")
I_MAX, V_SHUNT_MAX = 5.0, 0.05 # muốn sụt áp trên shunt <= 50 mV ở dòng max
R_SHUNT = V_SHUNT_MAX / I_MAX
GAIN = 50
P = I_MAX ** 2 * R_SHUNT
v_ra = I_MAX * R_SHUNT * GAIN
print(f" R_shunt = {R_SHUNT * 1000:.0f} mΩ, công suất ở {I_MAX} A = {P:.2f} W -> chọn shunt 2512 loại 1 W")
print(f" Điện áp ra khuếch đại ở {I_MAX} A = {v_ra:.2f} V (<= 3.3 V: OK)")
print(f" Độ phân giải dòng = {LSB / (R_SHUNT * GAIN) * 1000:.1f} mA/bước ADC")
for I in [0.1, 1.0, 2.5]:
adc = round(I * R_SHUNT * GAIN / LSB)
print(f" I = {I:>4} A -> giá trị ADC ≈ {adc}")
print("\nLayout: nối 2 dây cảm biến của bộ khuếch đại vào shunt theo kiểu KELVIN (4 dây),")
print("đi song song sát nhau tới chân IN+/IN−, không dùng chung đường dòng lớn.")
python 06-do-dong-do-ap.py== ĐO ÁP: pin 24 V qua cầu phân áp R1 (trên) – R2 (dưới) == R1 = 100k, R2 = 10k: Vadc max = 2.29 V (OK), độ phân giải = 8.9 mV/bước, dòng rò = 229 µA R1 = 100k, R2 = 15k: Vadc max = 3.29 V (sát 3.3 V, không còn dự phòng), độ phân giải = 6.2 mV/bước, dòng rò = 219 µA R1 = 68k, R2 = 10k: Vadc max = 3.23 V (sát 3.3 V, không còn dự phòng), độ phân giải = 6.3 mV/bước, dòng rò = 323 µA Lọc RC 10k + 100nF trước chân ADC: tần số cắt 159 Hz == ĐO DÒNG: điện trở shunt + khuếch đại (INA180 gain 50) == R_shunt = 10 mΩ, công suất ở 5.0 A = 0.25 W -> chọn shunt 2512 loại 1 W Điện áp ra khuếch đại ở 5.0 A = 2.50 V (<= 3.3 V: OK) Độ phân giải dòng = 1.6 mA/bước ADC I = 0.1 A -> giá trị ADC ≈ 62 I = 1.0 A -> giá trị ADC ≈ 621 I = 2.5 A -> giá trị ADC ≈ 1552 Layout: nối 2 dây cảm biến của bộ khuếch đại vào shunt theo kiểu KELVIN (4 dây), đi song song sát nhau tới chân IN+/IN−, không dùng chung đường dòng lớn.
Giải thích
- Cầu 100k/10k cho pin 6S: áp vào ADC tối đa 2.29 V — an toàn và nằm trong vùng ADC ESP32 tuyến tính tốt (khoảng 0.15–2.5 V).
- Shunt 10 mΩ + INA180 gain 50: 5 A cho 2.5 V, độ phân giải 1.6 mA/bước.
- Mạch đo áp ăn dòng liên tục 229 µA — với thiết bị chạy pin lâu ngày, dùng điện trở lớn hơn hoặc MOSFET ngắt cầu phân áp khi không đo.
🧮 Máy tính cầu phân áp cho ADC 3.3 V
2Layout mạch đo
- Kelvin 4 dây: dây cảm biến nối riêng vào hai đầu shunt (footprint shunt 4 pad hoặc tách đường ngay tại pad).
- Hai dây cảm biến đi song song, sát nhau như cặp vi sai, tới chân IN+/IN− của bộ khuếch đại.
- Tụ lọc RC đặt sát chân ADC; đường analog tránh xa nguồn xung, thạch anh, đường PWM.
- Low-side (shunt phía GND) dễ làm nhưng làm “nổi” GND của tải; high-side (phía nguồn) cần IC chịu được điện áp chung (common-mode) cao như INA180/INA226.
✓Tóm tắt
- Khóa basic: nguyên lý → layout 2 lớp → xuất file → dự án mẫu.
- Thư viện: đọc datasheet, tính lỗ/pad THT, land pattern SMD theo IPC-7351.
- Nâng cao: stack-up 4 lớp, đường hồi dòng, trở kháng, chống nhiễu, dòng lớn, mạch điều khiển và đo lường.