{"id":1360,"date":"2026-07-13T20:24:11","date_gmt":"2026-07-13T12:24:11","guid":{"rendered":"https:\/\/aimc.skyate.com\/?page_id=1360"},"modified":"2026-07-13T20:24:11","modified_gmt":"2026-07-13T12:24:11","slug":"pcb-layout-tools","status":"publish","type":"page","link":"https:\/\/aimc.skyate.com\/index.php\/pcb-layout-tools\/","title":{"rendered":"PCB\u7ebf\u5bbd\u8ba1\u7b97\u5668"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\" \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n    <title>PCB \u5e03\u7ebf\u5bbd\u5ea6 &#038; \u7ebf\u963b\u8ba1\u7b97\u5668<\/title>\n    <style>\n        \/* \u5168\u5c40\u91cd\u7f6e\uff08\u9650\u5b9a\u5728 .pcb-wrap \u5185\u90e8\uff09 *\/\n        .pcb-wrap * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        .pcb-wrap {\n            font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n            background: transparent;\n            max-width: 760px;\n            margin: 20px auto;\n            padding: 0 16px;\n        }\n        .pcb-wrap .container {\n            background: #ffffff;\n            border-radius: 28px;\n            box-shadow: 0 20px 60px rgba(0, 20, 40, 0.08), 0 8px 24px rgba(0, 20, 40, 0.04);\n            padding: 32px 28px;\n            border: 1px solid #edf2f7;\n        }\n        .pcb-wrap .header {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            margin-bottom: 28px;\n            flex-wrap: wrap;\n            gap: 12px;\n        }\n        .pcb-wrap .header h1 {\n            font-size: 24px;\n            font-weight: 600;\n            color: #0b1a2e;\n            letter-spacing: -0.3px;\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            margin: 0;\n        }\n        .pcb-wrap .header h1 span {\n            background: #eef3fa;\n            padding: 4px 14px;\n            border-radius: 40px;\n            font-size: 13px;\n            font-weight: 500;\n            color: #2c5f8a;\n        }\n        .pcb-wrap .form-group {\n            margin-bottom: 16px;\n            display: flex;\n            flex-wrap: wrap;\n            align-items: center;\n            gap: 8px 16px;\n        }\n        .pcb-wrap .form-group label {\n            font-weight: 500;\n            color: #2c4058;\n            min-width: 70px;\n        }\n        .pcb-wrap .form-group .field {\n            flex: 1;\n            min-width: 120px;\n            display: flex;\n            align-items: center;\n            gap: 6px;\n        }\n        .pcb-wrap .form-group input,\n        .pcb-wrap .form-group select {\n            padding: 8px 12px;\n            border: 1px solid #d0ddee;\n            border-radius: 10px;\n            font-size: 15px;\n            background: #f9fbfd;\n            transition: border-color 0.15s;\n            width: 100%;\n            font-family: inherit;\n        }\n        .pcb-wrap .form-group input:focus,\n        .pcb-wrap .form-group select:focus {\n            outline: none;\n            border-color: #b6cde3;\n            box-shadow: 0 0 0 3px rgba(182, 205, 227, 0.2);\n        }\n        .pcb-wrap .form-group .unit-hint {\n            color: #7a8b9f;\n            font-size: 14px;\n            white-space: nowrap;\n        }\n        .pcb-wrap .form-row {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 16px 24px;\n            margin-bottom: 12px;\n        }\n        .pcb-wrap .form-row .form-group {\n            flex: 1;\n            min-width: 150px;\n            margin-bottom: 0;\n        }\n        .pcb-wrap .action-bar {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin: 8px 0 24px;\n            justify-content: center;\n        }\n        .pcb-wrap .action-btn {\n            padding: 10px 28px;\n            border: none;\n            border-radius: 40px;\n            font-size: 15px;\n            font-weight: 500;\n            background: #edf2f8;\n            color: #1d3b5a;\n            cursor: pointer;\n            transition: background 0.15s, transform 0.1s, box-shadow 0.15s;\n            display: inline-flex;\n            align-items: center;\n            gap: 6px;\n        }\n        .pcb-wrap .action-btn:hover {\n            background: #dde6f0;\n            box-shadow: 0 2px 8px rgba(0, 20, 40, 0.06);\n        }\n        .pcb-wrap .action-btn:active {\n            transform: scale(0.96);\n        }\n        .pcb-wrap .action-btn.primary {\n            background: #1a3d5e;\n            color: #ffffff;\n        }\n        .pcb-wrap .action-btn.primary:hover {\n            background: #0f2e4a;\n            box-shadow: 0 4px 14px rgba(20, 60, 120, 0.20);\n        }\n        .pcb-wrap .result-box {\n            background: #f7faff;\n            border-radius: 18px;\n            padding: 20px 24px;\n            border: 1px solid #e3ebf5;\n            margin-top: 12px;\n        }\n        .pcb-wrap .result-box .result-item {\n            display: flex;\n            justify-content: space-between;\n            padding: 8px 0;\n            border-bottom: 1px solid #edf2f7;\n            font-size: 16px;\n        }\n        .pcb-wrap .result-box .result-item:last-child {\n            border-bottom: none;\n        }\n        .pcb-wrap .result-box .result-item .label {\n            color: #5f6f82;\n        }\n        .pcb-wrap .result-box .result-item .value {\n            font-weight: 600;\n            color: #0b1a2e;\n            font-family: 'SF Mono', 'Fira Code', monospace;\n        }\n        .pcb-wrap .footer-bar {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            flex-wrap: wrap;\n            gap: 12px;\n            margin-top: 20px;\n            padding-top: 16px;\n            border-top: 1px solid #edf2f7;\n            font-size: 13px;\n            color: #7a8b9f;\n        }\n        .pcb-wrap .footer-bar .status {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n        }\n        .pcb-wrap .footer-bar .status .dot {\n            display: inline-block;\n            width: 8px;\n            height: 8px;\n            border-radius: 50%;\n            background: #b6cde3;\n        }\n        .pcb-wrap .footer-bar .status .dot.active {\n            background: #2a9d6e;\n        }\n        .pcb-wrap .text-muted {\n            color: #8a9bae;\n        }\n        @media (max-width: 480px) {\n            .pcb-wrap .container {\n                padding: 20px 16px;\n            }\n            .pcb-wrap .header h1 {\n                font-size: 20px;\n            }\n            .pcb-wrap .form-group {\n                flex-direction: column;\n                align-items: stretch;\n            }\n            .pcb-wrap .form-group label {\n                min-width: auto;\n            }\n            .pcb-wrap .form-row {\n                flex-direction: column;\n            }\n            .pcb-wrap .result-box .result-item {\n                flex-wrap: wrap;\n                gap: 4px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n<div class=\"pcb-wrap\">\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>\n                \u26a1 PCB \u5e03\u7ebf\u5bbd\u5ea6 &#038; \u7ebf\u963b\n                <span>IPC-2221<\/span>\n            <\/h1>\n        <\/div>\n\n        <!-- \u53c2\u6570\u884c\uff1a\u7535\u6d41\u3001\u6e29\u5347\u3001\u94dc\u539a -->\n        <div class=\"form-row\">\n            <div class=\"form-group\">\n                <label for=\"current\">\u7535\u6d41 (A)<\/label>\n                <div class=\"field\">\n                    <input type=\"number\" id=\"current\" value=\"2\" step=\"0.01\" min=\"0.001\" \/>\n                <\/div>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"tempRise\">\u6e29\u5347 (\u2103)<\/label>\n                <div class=\"field\">\n                    <input type=\"number\" id=\"tempRise\" value=\"10\" step=\"1\" min=\"1\" \/>\n                <\/div>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"copperThick\">\u94dc\u539a<\/label>\n                <div class=\"field\">\n                    <select id=\"copperThick\">\n                        <option value=\"0.5\">0.5 oz (0.7 mil)<\/option>\n                        <option value=\"1\" selected>1 oz (1.37 mil)<\/option>\n                        <option value=\"2\">2 oz (2.74 mil)<\/option>\n                        <option value=\"3\">3 oz (4.11 mil)<\/option>\n                        <option value=\"custom\">\u81ea\u5b9a\u4e49 (mil)<\/option>\n                    <\/select>\n                    <input type=\"number\" id=\"customThick\" style=\"display:none; width:80px;\" placeholder=\"mil\" step=\"0.1\" min=\"0.1\" \/>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- \u53c2\u6570\u884c\uff1a\u8d70\u7ebf\u5c42\u3001\u8f93\u51fa\u5355\u4f4d\u3001\u8d70\u7ebf\u957f\u5ea6 -->\n        <div class=\"form-row\">\n            <div class=\"form-group\">\n                <label for=\"layer\">\u8d70\u7ebf\u5c42<\/label>\n                <div class=\"field\">\n                    <select id=\"layer\">\n                        <option value=\"outer\">\u5916\u5c42 (\u5916\u90e8)<\/option>\n                        <option value=\"inner\">\u5185\u5c42<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"unit\">\u5bbd\u5ea6\u5355\u4f4d<\/label>\n                <div class=\"field\">\n                    <select id=\"unit\">\n                        <option value=\"mil\">mil<\/option>\n                        <option value=\"mm\">mm<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"length\">\u8d70\u7ebf\u957f\u5ea6<\/label>\n                <div class=\"field\">\n                    <input type=\"number\" id=\"length\" value=\"10\" step=\"0.1\" min=\"0.01\" style=\"flex:2;\" \/>\n                    <select id=\"lengthUnit\" style=\"flex:1;\">\n                        <option value=\"mm\">mm<\/option>\n                        <option value=\"cm\">cm<\/option>\n                        <option value=\"inch\">inch<\/option>\n                        <option value=\"m\">m<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"action-bar\">\n            <button class=\"action-btn primary\" id=\"calcBtn\">\u8ba1\u7b97<\/button>\n            <button class=\"action-btn\" id=\"resetBtn\">\u91cd\u7f6e\u9ed8\u8ba4<\/button>\n        <\/div>\n\n        <!-- \u7ed3\u679c -->\n        <div class=\"result-box\" id=\"resultBox\">\n            <div class=\"result-item\">\n                <span class=\"label\">\u6240\u9700\u7ebf\u5bbd<\/span>\n                <span class=\"value\" id=\"widthResult\">\u2014<\/span>\n            <\/div>\n            <div class=\"result-item\">\n                <span class=\"label\">\u5bf9\u5e94\u94dc\u539a<\/span>\n                <span class=\"value\" id=\"thickResult\">\u2014<\/span>\n            <\/div>\n            <div class=\"result-item\">\n                <span class=\"label\">\u516c\u5f0f\u7cfb\u6570 (k)<\/span>\n                <span class=\"value\" id=\"kResult\">\u2014<\/span>\n            <\/div>\n            <div class=\"result-item\">\n                <span class=\"label\">\u7ebf\u963b (20\u00b0C)<\/span>\n                <span class=\"value\" id=\"resistanceResult\">\u2014<\/span>\n            <\/div>\n        <\/div>\n\n        <div class=\"footer-bar\">\n            <div class=\"status\">\n                <span class=\"dot\" id=\"statusDot\"><\/span>\n                <span id=\"statusText\">\u5c31\u7eea<\/span>\n            <\/div>\n            <span class=\"text-muted\">\u94dc\u7535\u963b\u7387 1.68e-8 \u03a9\u00b7m<\/span>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    (function() {\n        \"use strict\";\n\n        const wrap = document.querySelector(\".pcb-wrap\");\n        if (!wrap) return;\n\n        \/\/ \u83b7\u53d6\u6240\u6709\u8f93\u5165\u5143\u7d20\n        const currentInput = wrap.querySelector(\"#current\");\n        const tempRiseInput = wrap.querySelector(\"#tempRise\");\n        const copperSelect = wrap.querySelector(\"#copperThick\");\n        const customThickInput = wrap.querySelector(\"#customThick\");\n        const layerSelect = wrap.querySelector(\"#layer\");\n        const unitSelect = wrap.querySelector(\"#unit\");\n        const lengthInput = wrap.querySelector(\"#length\");\n        const lengthUnitSelect = wrap.querySelector(\"#lengthUnit\");\n\n        const calcBtn = wrap.querySelector(\"#calcBtn\");\n        const resetBtn = wrap.querySelector(\"#resetBtn\");\n\n        const widthResult = wrap.querySelector(\"#widthResult\");\n        const thickResult = wrap.querySelector(\"#thickResult\");\n        const kResult = wrap.querySelector(\"#kResult\");\n        const resistanceResult = wrap.querySelector(\"#resistanceResult\");\n\n        const statusText = wrap.querySelector(\"#statusText\");\n        const statusDot = wrap.querySelector(\"#statusDot\");\n\n        \/\/ \u94dc\u539a\u6620\u5c04 (oz -> mil)\n        const ozToMil = {\n            \"0.5\": 0.7,\n            \"1\": 1.37,\n            \"2\": 2.74,\n            \"3\": 4.11\n        };\n\n        \/\/ \u663e\u793a\/\u9690\u85cf\u81ea\u5b9a\u4e49\u94dc\u539a\u8f93\u5165\n        copperSelect.addEventListener(\"change\", function() {\n            if (this.value === \"custom\") {\n                customThickInput.style.display = \"inline-block\";\n            } else {\n                customThickInput.style.display = \"none\";\n            }\n        });\n\n        \/\/ \u83b7\u53d6\u94dc\u539a (mil)\n        function getCopperThickness() {\n            const val = copperSelect.value;\n            if (val === \"custom\") {\n                const c = parseFloat(customThickInput.value);\n                if (!isNaN(c) && c > 0) return c;\n                else return NaN;\n            } else {\n                return ozToMil[val] || 1.37;\n            }\n        }\n\n        function getCopperDesc() {\n            const val = copperSelect.value;\n            if (val === \"custom\") {\n                const c = parseFloat(customThickInput.value);\n                if (!isNaN(c) && c > 0) return c.toFixed(2) + \" mil\";\n                else return \"\u81ea\u5b9a\u4e49 (\u65e0\u6548)\";\n            } else {\n                return val + \" oz (\" + ozToMil[val] + \" mil)\";\n            }\n        }\n\n        function setStatus(text, isActive) {\n            statusText.textContent = text;\n            if (isActive) {\n                statusDot.classList.add(\"active\");\n            } else {\n                statusDot.classList.remove(\"active\");\n            }\n        }\n\n        \/\/ \u4e3b\u8ba1\u7b97\u51fd\u6570\n        function calculate() {\n            \/\/ 1. \u8bfb\u53d6\u53c2\u6570\n            const I = parseFloat(currentInput.value);\n            const dT = parseFloat(tempRiseInput.value);\n            const H_mil = getCopperThickness();\n            const layer = layerSelect.value;\n            const unit = unitSelect.value;\n            const L_val = parseFloat(lengthInput.value);\n            const L_unit = lengthUnitSelect.value;\n\n            \/\/ \u9a8c\u8bc1\n            if (isNaN(I) || I <= 0) { setStatus(\"\u8bf7\u8f93\u5165\u6709\u6548\u7535\u6d41 (>0)\", false); return; }\n            if (isNaN(dT) || dT <= 0) { setStatus(\"\u8bf7\u8f93\u5165\u6709\u6548\u6e29\u5347 (>0)\", false); return; }\n            if (isNaN(H_mil) || H_mil <= 0) { setStatus(\"\u8bf7\u8f93\u5165\u6709\u6548\u94dc\u539a (>0)\", false); return; }\n            if (isNaN(L_val) || L_val <= 0) { setStatus(\"\u8bf7\u8f93\u5165\u6709\u6548\u957f\u5ea6 (>0)\", false); return; }\n\n            \/\/ 2. \u8ba1\u7b97\u7ebf\u5bbd (IPC-2221)\n            const k = (layer === \"outer\") ? 0.048 : 0.024;\n            const dT_exp = Math.pow(dT, 0.44);\n            const denominator = k * dT_exp;\n            const ratio = I \/ denominator;\n            const W_mil = Math.pow(ratio, 1 \/ 0.725) \/ H_mil;\n\n            if (!isFinite(W_mil) || W_mil <= 0) {\n                setStatus(\"\u8ba1\u7b97\u5f02\u5e38\uff0c\u8bf7\u68c0\u67e5\u53c2\u6570\", false);\n                return;\n            }\n\n            \/\/ 3. \u5355\u4f4d\u8f6c\u6362\uff1a\u5bbd\u5ea6\n            let widthVal, widthUnit;\n            if (unit === \"mm\") {\n                widthVal = W_mil * 0.0254;\n                widthUnit = \"mm\";\n            } else {\n                widthVal = W_mil;\n                widthUnit = \"mil\";\n            }\n\n            \/\/ 4. \u8ba1\u7b97\u7ebf\u963b\uff1aR = \u03c1 * L \/ (W * H)\n            \/\/ \u7edf\u4e00\u4e3a\u7c73\u5236\uff1a\u03c1 = 1.68e-8 \u03a9\u00b7m\n            const rho = 1.68e-8; \/\/ \u03a9\u00b7m\n            \/\/ \u5c06\u5bbd\u5ea6\u3001\u539a\u5ea6\u3001\u957f\u5ea6\u8f6c\u4e3a\u7c73\n            const W_m = W_mil * 0.0000254;      \/\/ mil -> m\n            const H_m = H_mil * 0.0000254;       \/\/ mil -> m\n            \/\/ \u957f\u5ea6\u8f6c\u7c73\n            let L_m;\n            switch (L_unit) {\n                case \"mm\":  L_m = L_val \/ 1000; break;\n                case \"cm\":  L_m = L_val \/ 100; break;\n                case \"inch\": L_m = L_val * 0.0254; break;\n                case \"m\":   L_m = L_val; break;\n                default: L_m = L_val \/ 1000; break;\n            }\n\n            const area = W_m * H_m; \/\/ m^2\n            if (area <= 0) {\n                setStatus(\"\u622a\u9762\u79ef\u4e3a\u96f6\uff0c\u65e0\u6cd5\u8ba1\u7b97\u7535\u963b\", false);\n                return;\n            }\n            const R = rho * L_m \/ area; \/\/ \u03a9\n\n            \/\/ \u663e\u793a\u7535\u963b\uff0c\u5355\u4f4d\u81ea\u52a8\u9009\u62e9\uff1a\u5c0f\u4e8e0.001\u03a9\u663e\u793am\u03a9\uff0c\u5426\u5219\u663e\u793a\u03a9\n            let resDisplay;\n            if (R < 0.001) {\n                resDisplay = (R * 1000).toFixed(3) + \" m\u03a9\";\n            } else {\n                resDisplay = R.toFixed(4) + \" \u03a9\";\n            }\n\n            \/\/ 5. \u66f4\u65b0\u7ed3\u679c\n            widthResult.textContent = widthVal.toFixed(3) + \" \" + widthUnit;\n            thickResult.textContent = getCopperDesc();\n            kResult.textContent = k.toFixed(4);\n            resistanceResult.textContent = resDisplay;\n\n            setStatus(\"\u8ba1\u7b97\u5b8c\u6210\", true);\n        }\n\n        \/\/ \u91cd\u7f6e\n        function resetDefaults() {\n            currentInput.value = \"2\";\n            tempRiseInput.value = \"10\";\n            copperSelect.value = \"1\";\n            customThickInput.style.display = \"none\";\n            customThickInput.value = \"\";\n            layerSelect.value = \"outer\";\n            unitSelect.value = \"mil\";\n            lengthInput.value = \"10\";\n            lengthUnitSelect.value = \"mm\";\n            widthResult.textContent = \"\u2014\";\n            thickResult.textContent = \"\u2014\";\n            kResult.textContent = \"\u2014\";\n            resistanceResult.textContent = \"\u2014\";\n            setStatus(\"\u5df2\u91cd\u7f6e\", false);\n        }\n\n        \/\/ \u4e8b\u4ef6\u7ed1\u5b9a\n        calcBtn.addEventListener(\"click\", calculate);\n        resetBtn.addEventListener(\"click\", resetDefaults);\n\n        \/\/ \u56de\u8f66\u89e6\u53d1\u8ba1\u7b97\n        const inputs = [currentInput, tempRiseInput, customThickInput, lengthInput];\n        inputs.forEach(function(inp) {\n            inp.addEventListener(\"keydown\", function(e) {\n                if (e.key === \"Enter\") {\n                    e.preventDefault();\n                    calculate();\n                }\n            });\n        });\n\n        \/\/ \u521d\u59cb\u5316\u72b6\u6001\n        setStatus(\"\u5c31\u7eea \u00b7 \u8f93\u5165\u53c2\u6570\u540e\u70b9\u51fb\u8ba1\u7b97\", false);\n        thickResult.textContent = getCopperDesc();\n        kResult.textContent = \"\u2014\";\n        resistanceResult.textContent = \"\u2014\";\n    })();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PCB \u5e03\u7ebf\u5bbd\u5ea6 &#038; \u7ebf\u963b\u8ba1\u7b97\u5668 \u26a1 PCB \u5e03\u7ebf\u5bbd\u5ea6 &#038; \u7ebf\u963b IPC-2221 \u7535\u6d41  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1360","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/pages\/1360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/comments?post=1360"}],"version-history":[{"count":1,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/pages\/1360\/revisions"}],"predecessor-version":[{"id":1361,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/pages\/1360\/revisions\/1361"}],"wp:attachment":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/media?parent=1360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}