| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>PCB轴向磁通电机设计-双转子单定子(无铁芯) - Stackup Rev</title>
- <style>
- /* =========================================
- CSS 样式定义区 (保持原有样式不变)
- ========================================= */
- :root {
- --primary-dark: #1e293b;
- --primary-blue: #2563eb;
- --accent-teal: #059669;
- --danger-red: #dc2626;
- --bg-color: #f8fafc;
- --border-light: #cbd5e1;
- --text-main: #334155;
- --input-bg: #fff7ed;
- --header-height: 80px;
- }
- body {
- font-family: "Inter", "Segoe UI", "Microsoft YaHei", sans-serif;
- background-color: var(--bg-color);
- color: var(--text-main);
- margin: 0;
- display: flex;
- flex-direction: column;
- height: 100vh;
- overflow: hidden;
- }
- /* 顶部导航栏样式 */
- .sticky-header {
- height: var(--header-height);
- background: #ffffff;
- border-bottom: 1px solid var(--border-light);
- display: flex;
- align-items: center;
- padding: 0 30px;
- box-shadow: 0 4px 12px -2px rgba(0, 0, 0, 0.08);
- flex-shrink: 0;
- justify-content: space-between;
- z-index: 100;
- }
- .app-title { font-size: 24px; font-weight: 800; color: var(--primary-dark); display:flex; align-items:center; gap:12px;}
- .app-subtitle { font-size: 13px; color: #64748b; margin-top: 4px; font-weight: 500;}
- .version-tag { background: #dcfce7; color: #166534; padding: 2px 6px; border-radius: 4px; font-size: 11px; margin-left: 8px; vertical-align: middle; }
- /* 自动保存状态指示器 */
- .save-status {
- font-size: 11px;
- color: #059669;
- background: #ecfdf5;
- padding: 2px 8px;
- border-radius: 4px;
- margin-left: 12px;
- opacity: 0;
- transition: opacity 0.3s;
- }
- .save-status.show { opacity: 1; }
- .save-status.saving { color: #d97706; background: #fffbeb; }
- /* HUD */
- .hud-grid { display: flex; gap: 25px; align-items: center; }
- .hud-item { text-align: center; }
- .hud-label { font-size: 12px; color: #94a3b8; text-transform: uppercase; font-weight: 700; margin-bottom: 4px;}
- .hud-val { font-size: 30px; font-weight: 700; color: var(--primary-dark); font-family: "Consolas", monospace; }
- .hud-unit { font-size: 12px; color: #cbd5e1; margin-left: 2px; font-weight: 600; }
- .val-highlight { color: var(--primary-blue); }
- .val-loss { color: #dc2626; }
- .val-cost { color: #d97706; }
- .btn-action {
- background: var(--primary-blue); color: white; border: none; padding: 12px 24px;
- border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 15px;
- box-shadow: 0 4px 6px rgba(37, 99, 235, 0.2); transition: all 0.2s;
- display: flex; align-items: center; gap: 8px;
- }
- .btn-action:hover { background: #1d4ed8; transform: translateY(-1px); }
- /* 主容器布局 */
- .container { display: flex; flex: 1; overflow: hidden; }
- /* 侧边栏样式 */
- .sidebar {
- width: 260px; background: var(--primary-dark); color: #f1f5f9;
- display: flex; flex-direction: column; flex-shrink: 0; padding-top: 20px;
- }
- .nav-group-title { padding: 20px 25px 10px; font-size: 12px; color: #94a3b8; font-weight: 800; letter-spacing: 1px; }
- .nav-btn {
- padding: 16px 25px; border: none; background: transparent; color: #cbd5e1;
- text-align: left; cursor: pointer; border-right: 4px solid transparent;
- transition: all 0.2s; font-size: 15px; display: flex; align-items: center; gap: 12px;
- }
- .nav-btn.active { background: rgba(37, 99, 235, 0.2); color: white; border-right-color: var(--primary-blue); font-weight: 600; }
- .nav-btn svg { width: 20px; height: 20px; opacity: 0.7; }
- .nav-btn.active svg { opacity: 1; color: var(--primary-blue); }
-
- /* 内容区样式 */
- .main-content {
- flex: 1; padding: 30px 50px; overflow-y: auto; scroll-behavior: smooth;
- background-image: radial-gradient(#cbd5e1 1.5px, transparent 1.5px); background-size: 24px 24px;
- }
- /* --- 表格核心样式 --- */
- h2 {
- font-size: 22px; color: var(--primary-dark); border-left: 6px solid var(--primary-blue);
- padding-left: 15px; margin: 0 0 25px 0; font-weight: 800;
- }
- h3 {
- font-size: 18px; color: #475569; margin: 25px 0 15px 0; font-weight: 700;
- }
-
- .section-card {
- background: white; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);
- padding: 30px; margin-bottom: 30px; border: 1px solid var(--border-light);
- }
- table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 15px; table-layout: fixed; margin-bottom: 25px;}
-
- thead th {
- background: #f1f5f9; color: #475569; font-weight: 700; text-align: left;
- padding: 14px 15px; border-bottom: 2px solid #cbd5e1;
- font-size: 14px; letter-spacing: 0.5px;
- }
- td {
- padding: 14px 15px; border-bottom: 1px solid #e2e8f0; vertical-align: middle;
- color: #1e293b; line-height: 1.6;
- }
- /* 列宽定义 */
- .col-param { width: 14%; font-weight: 600; font-size: 16px; color: #334155; }
- .col-sym { width: 8%; font-weight: 600; font-size: 16px; color: #334155; }
- .col-val { width: 14%; font-weight: 600; font-size: 16px; color: #334155;}
- .col-unit { width: 8%; font-weight: 600; font-size: 16px; color: #334155;}
- .col-form { width: 28%; font-weight: 600; font-size: 16px; color: #334155; }
- .col-def { width: 28%; font-weight: 600; font-size: 16px; color: #334155; }
- /* 变量高亮样式 */
- .col-def span { color: #000; font-weight: 600; font-family: "Times New Roman", serif; font-style: italic; margin-right: 2px;}
- /* 输入框样式 */
- input[type="number"], select {
- width: 100%; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 6px;
- background: var(--input-bg); font-family: "JetBrains Mono", monospace; font-weight: 700; color: #c2410c;
- font-size: 15px; transition: all 0.2s; box-sizing: border-box;
- }
- input[type="number"]:focus { border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); outline: none; }
-
- /* 结果数字样式 */
- .res-val { color: var(--accent-teal); font-weight: 700; font-family: "JetBrains Mono", monospace; font-size: 17px; }
- .res-bad { color: var(--danger-red); }
-
- /* 状态指示样式 */
- .status-ok { color: var(--accent-teal); background: #ecfdf5; padding: 4px 8px; border-radius: 4px; border: 1px solid #10b981; display: inline-block;}
- .status-warn { color: var(--danger-red); background: #fef2f2; padding: 4px 8px; border-radius: 4px; border: 1px solid #ef4444; display: inline-block;}
- /* 页面切换动画 */
- .page-section { display: none; animation: fadeIn 0.2s ease-out; }
- .page-section.active { display: block; }
- @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
- </style>
- </head>
- <body>
- <header class="sticky-header">
- <div class="app-brand">
- <span class="app-title">
- <svg width="28" height="28" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24"><path d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
- Axial PCB Motor Design
- <span class="version-tag">V16</span>
- <span id="saveStatus" class="save-status">已自动保存</span>
- </span>
- <span class="app-subtitle">PCB轴向磁通电机设计 </span>
- </div>
-
- <div class="hud-grid">
- <div class="hud-item">
- <div class="hud-label">额定功率</div>
- <div class="hud-value-group"><span class="hud-val" id="hud_Pnom">0</span><span class="hud-unit">W</span></div>
- </div>
- <div class="hud-item">
- <div class="hud-label">额定转矩</div>
- <div class="hud-value-group"><span class="hud-val val-highlight" id="hud_T">0.00</span><span class="hud-unit">Nm</span></div>
- </div>
-
- <div class="hud-item">
- <div class="hud-label">电机效率</div>
- <div class="hud-value-group"><span class="hud-val val-highlight" id="hud_Eff">0.0</span><span class="hud-unit">%</span></div>
- </div>
-
- <div class="hud-item">
- <div class="hud-label">总损耗</div>
- <div class="hud-value-group"><span class="hud-val val-loss" id="hud_Loss">0</span><span class="hud-unit">W</span></div>
- </div>
- <div class="hud-item">
- <div class="hud-label">预估成本</div>
- <div class="hud-value-group"><span class="hud-val val-cost" id="hud_Cost">0</span><span class="hud-unit">¥</span></div>
- </div>
- <div class="hud-item">
- <div class="hud-label">绕阻温度</div>
- <div class="hud-value-group"><span class="hud-val" id="hud_Temp">0</span><span class="hud-unit">℃</span></div>
- </div>
-
- <div class="hud-item">
- <div class="hud-label">载流校验</div>
- <div class="hud-value-group"><span class="hud-val" style="font-size:24px;" id="hud_IPC">--</span></div>
- </div>
- </div>
- <button class="btn-action" onclick="app.ui.exportExcel()">
- <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg>
- 导出结果
- </button>
- </header>
- <div class="container">
- <nav class="sidebar">
- <div class="nav-group-title">DESIGN MODULES</div>
- <button class="nav-btn active" onclick="app.ui.nav('input')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg>
- 1. 规格与几何 (Input)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('stator')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
- 2. 定子参数 (Stator)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('mag')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
- 3. 磁路分析 (Magnetic)
- </button>
-
- <div class="nav-group-title">ANALYSIS MODULES</div>
- <button class="nav-btn" onclick="app.ui.nav('perf')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg>
- 4. 性能指标 (Perf)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('loss')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"></path></svg>
- 5. 损耗分析 (Loss)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('therm')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 .5-5 2.986-7C14 5 16.09 5.777 17.656 7.343A7.975 7.975 0 0120 13a7.975 7.975 0 01-2.343 5.657z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.879 16.121A3 3 0 1012.015 11L11 14H9c0 .768.293 1.536.879 2.121z"></path></svg>
- 6. 热分析 (Thermal)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('cost')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
- 7. 成本明细 (Cost)
- </button>
- <button class="nav-btn" onclick="app.ui.nav('ipc')">
- <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
- 8. 载流校验 (IPC-2152)
- </button>
- </nav>
- <main class="main-content">
- <section id="input" class="page-section active">
- <div class="section-card">
- <h2>1. 设计规格与几何输入 (Input)</h2>
-
- <h3>A. 性能规格 (Specifications)</h3>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">输入值</th><th class="col-unit">单位</th><th class="col-form">计算公式 / 说明</th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr><td>额定功率</td><td>P<sub>nom</sub></td><td><input type="number" id="P_nom" value="300" oninput="app.calculate()"></td><td>W</td><td>User Input</td><td>设计目标机械输出功率</td></tr>
- <tr><td>额定转速</td><td>n<sub>nom</sub></td><td><input type="number" id="n_nom" value="3000" oninput="app.calculate()"></td><td>rpm</td><td>User Input</td><td>额定工作点机械转速</td></tr>
- <tr><td>母线电压</td><td>V<sub>dc</sub></td><td><input type="number" id="V_dc" value="48" oninput="app.calculate()"></td><td>V</td><td>User Input</td><td>直流供电电压</td></tr>
- <tr><td>极对数</td><td>p</td><td><input type="number" id="p" value="6" oninput="app.calculate()"></td><td>-</td><td>User Input</td><td><span>p</span>: 磁极对数 (总极数=2p)</td></tr>
- </tbody>
- </table>
- <h3>B. 几何尺寸 (Geometry)</h3>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">输入值</th><th class="col-unit">单位</th><th class="col-form">计算公式 / 说明</th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr><td>定子外径</td><td>D<sub>out</sub></td><td><input type="number" id="D_out" value="100" oninput="app.calculate()"></td><td>mm</td><td>User Input</td><td>PCB线圈区外边缘直径</td></tr>
- <tr><td>定子内径</td><td>D<sub>in</sub></td><td><input type="number" id="D_in" value="40" oninput="app.calculate()"></td><td>mm</td><td>User Input</td><td>PCB线圈区内孔直径</td></tr>
- <tr><td>机械气隙</td><td>g</td><td><input type="number" id="g_mech" value="0.5" step="0.1" oninput="app.calculate()"></td><td>mm</td><td>User Input (Single Side)</td><td>PCB表面到转子磁钢表面的距离</td></tr>
- <tr><td>磁铁厚度</td><td>h<sub>m</sub></td><td><input type="number" id="h_m" value="3.0" step="0.5" oninput="app.calculate()"></td><td>mm</td><td>User Input</td><td>单侧转子上贴的磁钢厚度</td></tr>
- </tbody>
- </table>
- <h3>C. PCB 叠层与绕组 (IPC Stack-up)</h3>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">输入值</th><th class="col-unit">单位</th><th class="col-form">计算公式 / 说明</th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr><td>PCB层数</td><td>N<sub>lyr</sub></td><td><input type="number" id="layers" value="8" step="2" oninput="app.calculate()"></td><td>-</td><td>User Input</td><td>必须为偶数 (4, 6, 8...)</td></tr>
-
- <tr><td>基底铜厚</td><td>t<sub>oz</sub></td><td><input type="number" id="oz" value="3" oninput="app.calculate()"></td><td>oz</td><td>User Input</td><td>内层物理铜厚 (1oz≈35um)</td></tr>
-
- <tr><td>外层电镀</td><td>t<sub>plate</sub></td><td><input type="number" id="t_plate" value="25" step="5" oninput="app.calculate()"></td><td>μm</td><td>Process Value</td><td>外层孔金属化增加的厚度</td></tr>
- <tr><td>芯板厚度</td><td>t<sub>core</sub></td><td><input type="number" id="t_core" value="0.15" step="0.01" oninput="app.calculate()"></td><td>mm</td><td>Material (Core)</td><td>FR4 覆铜板绝缘层厚度</td></tr>
- <tr><td>PP片厚度</td><td>t<sub>pp</sub></td><td><input type="number" id="t_pp" value="0.10" step="0.01" oninput="app.calculate()"></td><td>mm</td><td>Material (Prepreg)</td><td>层间粘结片压合后厚度</td></tr>
-
- <tr><td>阻焊厚度</td><td>t<sub>mask</sub></td><td><input type="number" id="t_mask" value="0.02" step="0.005" oninput="app.calculate()"></td><td>mm</td><td>Solder Mask</td><td>单面绿油/黑油厚度</td></tr>
- <tr><td>每层每相匝数</td><td>N<sub>t/l</sub></td><td><input type="number" id="turns_layer" value="5" oninput="app.calculate()"></td><td>-</td><td>User Input</td><td>单层内一相绕组的圈数</td></tr>
- <tr><td>线宽</td><td>w<sub>tr</sub></td><td><input type="number" id="w_trace" value="0.6" step="0.05" oninput="app.calculate()"></td><td>mm</td><td>User Input</td><td>线圈铜导线的宽度</td></tr>
- <tr><td>端部长度系数</td><td>k<sub>end</sub></td><td><input type="number" id="k_end" value="1.2" step="0.1" oninput="app.calculate()"></td><td>-</td><td>User Input</td><td>端部绕组延伸比例</td></tr>
- </tbody>
- </table>
- <h3>D. 材料属性 (Materials)</h3>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">输入/选择</th><th class="col-unit">单位</th><th class="col-form">计算公式 / 说明</th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr>
- <td>磁钢牌号</td><td>Grade</td>
- <td>
- <select id="mag_grade" onchange="app.ui.updateMagGrade()">
- <option value="ATMAX50SH" selected>ATMAX50SH (Br=1.42T)</option>
- <option value="N35">N35 (Br=1.17T)</option>
- <option value="N52">N52 (Br=1.45T)</option>
- <option value="custom">-- 自定义 --</option>
- </select>
- </td>
- <td>-</td><td>Database Selection</td><td>选择牌号自动填入Br</td>
- </tr>
- <tr><td>剩磁</td><td>B<sub>r</sub></td><td><input type="number" id="Br" value="1.425" step="0.01" oninput="app.calculate()"></td><td>T</td><td>From Material Property</td><td>磁铁材料的剩余磁感应强度</td></tr>
- <tr><td>相对磁导率</td><td>μ<sub>r</sub></td><td><input type="number" id="mu_r" value="1.05" step="0.01" oninput="app.calculate()"></td><td>-</td><td>Material Constant</td><td>磁铁相对于真空的导磁率</td></tr>
- <tr><td>极弧系数</td><td>α<sub>p</sub></td><td><input type="number" id="alpha_p" value="0.75" step="0.05" oninput="app.calculate()"></td><td>-</td><td>Design Factor</td><td>磁钢宽度占极距的比例(0~1)</td></tr>
- <tr><td>磁钢电导率</td><td>σ<sub>mag</sub></td><td><input type="number" id="sigma_mag" value="625000" step="1000" oninput="app.calculate()"></td><td>S/m</td><td>Material Property</td><td>钕铁硼电导率(典型0.6~0.8×10⁶ S/m)</td></tr>
- <tr><td>铜电阻率</td><td>ρ<sub>cu</sub></td><td><input type="number" id="rho_cu" value="0.0178" step="0.0001" oninput="app.calculate()"></td><td>Ω·mm²/m</td><td>Physical Constant</td><td>20℃下铜的电阻率</td></tr>
- <tr><td>铜温漂系数</td><td>α<sub>cu</sub></td><td><input type="number" id="alpha_cu" value="0.00393" step="0.00001" oninput="app.calculate()"></td><td>1/K</td><td>Physical Constant</td><td>电阻随温度变化的线性系数</td></tr>
- <tr><td>磁体密度</td><td>ρ<sub>mag</sub></td><td><input type="number" id="rho_mag" value="7.5" step="0.1" oninput="app.calculate()"></td><td>g/cm³</td><td>Material Property</td><td>用于计算磁钢重量及成本</td></tr>
- <tr><td>PCB板材Tg</td><td>T<sub>g</sub></td><td><input type="number" id="Tg" value="130" oninput="app.calculate()"></td><td>°C</td><td>Material Limit</td><td>玻璃化转变温度 (FR4通常130-170)</td></tr>
- <tr><td>空气密度</td><td>ρ<sub>air</sub></td><td><input type="number" id="rho_air" value="1.225" step="0.001" oninput="app.calculate()"></td><td>kg/m³</td><td>Standard Atmosphere</td><td>20℃标准大气密度</td></tr>
- <tr><td>摩擦系数</td><td>C<sub>f</sub></td><td><input type="number" id="cf_fric" value="0.01" step="0.001" oninput="app.calculate()"></td><td>-</td><td>Empirical Value</td><td>转盘风阻/轴承摩擦综合系数(0.005~0.03)</td></tr>
- </tbody>
- </table>
- <h3>E. 修正系数 (Correction Factors)</h3>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">输入值</th><th class="col-unit">单位</th><th class="col-form">逻辑说明</th><th class="col-def">物理含义</th></tr>
- </thead>
- <tbody>
- <tr>
- <td>漏磁系数</td><td>k<sub>leak</sub></td>
- <td><input type="number" id="k_leak" value="0.95" step="0.01" oninput="app.calculate()"></td>
- <td>-</td>
- <td>经验值 (0.9~0.98)</td>
- <td>考虑极间漏磁导致的磁通损失</td>
- </tr>
- <tr>
- <td>绕组系数</td><td>k<sub>w</sub></td>
- <td><input type="number" id="k_w" value="0.95" step="0.01" oninput="app.calculate()"></td>
- <td>-</td>
- <td>k<sub>w</sub> = k<sub>p</sub> × k<sub>d</sub></td>
- <td>基波绕组系数 (分布效应与短距效应)</td>
- </tr>
- <tr>
- <td>功率因数</td><td>PF</td>
- <td><input type="number" id="PF" value="0.95" step="0.01" oninput="app.calculate()" min="0.8" max="1.0"></td>
- <td>-</td>
- <td>PCB轴向电机典型值 (0.92-0.98)</td>
- <td>电压与电流相位差的余弦值</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="stator" class="page-section">
- <div class="section-card">
- <h2>2. 定子与电阻计算 (Stator)</h2>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">计算结果</th><th class="col-unit">单位</th><th class="col-form">计算公式 </th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr><td>PCB总厚度</td><td>h<sub>s</sub></td><td><span class="res-val" id="res_hs">0</span></td><td>mm</td><td>h<sub>s</sub> = H<sub>mask</sub> + H<sub>cu</sub> + H<sub>dielectric</sub></td><td>IPC 叠层计算值(含Core/PP/铜/阻焊)</td></tr>
- <tr><td>平均半径</td><td>R<sub>avg</sub></td><td><span class="res-val" id="res_Ravg">0</span></td><td>mm</td><td>R<sub>avg</sub> = (D<sub>out</sub> + D<sub>in</sub>) / 4</td><td><span>D<sub>out</sub></span>:定子外径, <span>D<sub>in</sub></span>:定子内径</td></tr>
- <tr><td>每相总匝数</td><td>N<sub>ph</sub></td><td><span class="res-val" id="res_Nph">0</span></td><td>-</td><td>N<sub>ph</sub> = N<sub>lyr</sub> × N<sub>t/l</sub></td><td><span>N<sub>lyr</sub></span>:层数, <span>N<sub>t/l</sub></span>:每层每相匝数</td></tr>
- <tr><td>绕组总长度</td><td>L<sub>tot</sub></td><td><span class="res-val" id="res_Ltot">0</span></td><td>m</td><td>L<sub>tot</sub> = N<sub>ph</sub> × (2L<sub>cond</sub> + 2k<sub>end</sub>τ<sub>p</sub>)</td><td><span>N<sub>ph</sub></span>:总匝数, <span>k<sub>end</sub></span>:端部系数</td></tr>
- <tr><td>相电阻(20℃)</td><td>R<sub>20</sub></td><td><span class="res-val" id="res_R20">0</span></td><td>Ω</td><td>R<sub>20</sub> = Σ (R<sub>inner</sub> + R<sub>outer</sub>)</td><td>考虑内外层铜厚差异 (外层含电镀)</td></tr>
- <tr><td>相电阻(热)</td><td>R<sub>ph</sub></td><td><span class="res-val" id="res_Rhot">0</span></td><td>Ω</td><td>R<sub>ph</sub> = R<sub>20</sub> × [1 + α(T-20)]</td><td><span>R<sub>20</sub></span>:冷态电阻, <span>α</span>:铜温漂系数, <span>T</span>:温度</td></tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="mag" class="page-section">
- <div class="section-card">
- <h2>3. 磁路分析 (Flux Linkage Method)</h2>
- <p style="color:#64748b; font-size:14px; margin-bottom:15px; border-left:4px solid #f59e0b; padding-left:10px;">
- <b>无铁芯修正 (Coreless Correction):</b> 采用磁通链法计算。磁通量 $\Phi$ 基于有效扇区面积积分计算,而非简单的导线切割长度。
- </p>
- <table>
- <thead>
- <tr><th class="col-param">参数名称</th><th class="col-sym">符号</th><th class="col-val">计算结果</th><th class="col-unit">单位</th><th class="col-form">计算公式 </th><th class="col-def">公式变量物理含义</th></tr>
- </thead>
- <tbody>
- <tr><td>有效气隙</td><td>g<sub>eff</sub></td><td><span class="res-val" id="res_geff">0</span></td><td>mm</td><td>g<sub>eff</sub> = h<sub>s</sub> + 2g</td><td><span>h<sub>s</sub></span>:定子PCB厚度, <span>g</span>:单侧机械气隙</td></tr>
- <tr><td>磁路负载点</td><td>PC</td><td><span class="res-val" id="res_PC">0</span></td>
- <td>-</td>
- <td>PC = 2h<sub>m</sub> / (g<sub>eff</sub> × μ<sub>r</sub>)</td>
- <td><span>h<sub>m</sub></span>:单块磁铁厚, <span>g<sub>eff</sub></span>:总气隙, <span>μ<sub>r</sub></span>:回复磁导率</td>
- </tr>
- <tr>
- <td>气隙磁密(平台)</td>
- <td>B<sub>g</sub></td>
- <td><span class="res-val" id="res_Bg">0</span></td>
- <td>T</td>
- <td>B<sub>g</sub> = [2h<sub>m</sub>/(2h<sub>m</sub>+g<sub>eff</sub>)] × B<sub>r</sub></td>
- <td>无铁芯结构的有效气隙磁感应强度</td>
- </tr>
- <tr>
- <td>有效极面积</td>
- <td>A<sub>pole</sub></td>
- <td><span class="res-val" id="res_Apole">0</span></td>
- <td>mm²</td>
- <td>A = π(R<sub>o</sub>²-R<sub>i</sub>²)/2p × α<sub>p</sub></td>
- <td>单个磁极覆盖的扇形有效面积</td>
- </tr>
- <tr>
- <td>每极磁通</td>
- <td>Φ</td>
- <td><span class="res-val" id="res_Phi">0</span></td>
- <td>Wb</td>
- <td>Φ = B<sub>g</sub> × A<sub>pole</sub> × k<sub>leak</sub></td>
- <td>穿过定子绕组的有效磁通总量</td>
- </tr>
- </table>
- </div>
- </section>
- <section id="perf" class="page-section">
- <div class="section-card">
- <h2>4. 性能指标 (Performance)</h2>
- <table>
- <thead>
- <tr>
- <th class="col-param">参数名称</th>
- <th class="col-sym">符号</th>
- <th class="col-val">计算结果</th>
- <th class="col-unit">单位</th>
- <th class="col-form">计算公式</th>
- <th class="col-def">公式变量物理含义</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>感应电动势</td>
- <td>E<sub>rms</sub></td>
- <td><span class="res-val" id="res_Erms">0</span></td>
- <td>V</td>
- <td>E = √2·π · f · N<sub>ph</sub> · Φ · k<sub>w</sub></td>
- <td><span>f</span>:电频率, <span>N<sub>ph</sub></span>:相匝数, <span>k<sub>w</sub></span>:绕组系数</td>
- </tr>
- <tr>
- <td>反电势常数</td>
- <td>K<sub>e</sub></td>
- <td><span class="res-val" id="res_Ke">0</span></td>
- <td>V·s/rad</td>
- <td>K<sub>e</sub> = E<sub>rms</sub> / ω</td>
- <td><span>E<sub>rms</sub></span>:相电势, <span>ω</span>:机械角速度</td>
- </tr>
- <tr>
- <td>Kv 值</td>
- <td>K<sub>v</sub></td>
- <td><span class="res-val" id="res_Kv">0</span></td>
- <td>rpm/V</td>
- <td>K<sub>v</sub> ≈ 9.55 / K<sub>e</sub></td>
- <td><span>K<sub>e</sub></span>:反电势常数, 9.55:单位换算常数</td>
- </tr>
- <tr>
- <td>额定力矩</td>
- <td>T<sub>nom</sub></td>
- <td><span class="res-val" id="res_Tnom">0</span></td>
- <td>Nm</td>
- <td>T<sub>nom</sub> = P<sub>nom</sub> / ω</td>
- <td><span>P<sub>nom</sub></span>:额定功率, <span>ω</span>:机械角速度(rad/s)</td>
- </tr>
- <tr>
- <td>电磁转矩常数</td>
- <td>K<sub>t</sub></td>
- <td><span class="res-val" id="res_Kt">0</span></td>
- <td>Nm/A</td>
- <td>K<sub>t</sub> = 3 · p · Ψ / √2</td>
- <td><span>p</span>:极对数, <span>Ψ</span>:磁链</td>
- </tr>
- <tr>
- <td>输入电功率</td>
- <td>P<sub>in</sub></td>
- <td><span class="res-val" id="res_Pin">0</span></td>
- <td>W</td>
- <td>P<sub>in</sub> = P<sub>nom</sub> / η</td>
- <td><span>P<sub>nom</sub></span>:输出功率, <span>η</span>:电机效率</td>
- </tr>
- <tr>
- <td>相电流(RMS)</td>
- <td>I<sub>rms</sub></td>
- <td><span class="res-val" id="res_Irms">0</span></td>
- <td>A</td>
- <td>I<sub>rms</sub> = P<sub>in</sub> / (3 · E<sub>rms</sub> · PF)</td>
- <td>基于能量守恒,考虑效率和功率因数</td>
- </tr>
- <tr>
- <td>电流密度</td>
- <td>J</td>
- <td><span class="res-val" id="res_J">0</span></td>
- <td>A/mm²</td>
- <td>J = I<sub>rms</sub> / A<sub>cu</sub></td>
- <td><span>I<sub>rms</sub></span>:相电流RMS, <span>A<sub>cu</sub></span>:铜线截面积</td>
- </tr>
- <tr>
- <td>功率因数</td>
- <td>PF</td>
- <td><span class="res-val" id="res_PF">0</span></td>
- <td>-</td>
- <td>用户输入值,PCB轴向电机典型0.92-0.98</td>
- <td>电压与电流相位差的余弦值</td>
- </tr>
- <tr>
- <td>电机效率</td>
- <td>η</td>
- <td><span class="res-val" id="res_Eff_perf">0</span></td>
- <td>%</td>
- <td>η = P<sub>nom</sub> / P<sub>in</sub> × 100%</td>
- <td>输出机械功率与输入电功率之比</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="loss" class="page-section">
- <div class="section-card">
- <h2>5. 损耗分析 (High-Fidelity Loss Analysis)</h2>
- <p style="color:#64748b; font-size:14px; margin-bottom:20px;">
- 包含集肤/邻近效应产生的交流铜损(AC Loss)、磁钢涡流损耗(谐波感应)以及工程杂散损耗(Stray Loss)。
- </p>
- <table>
- <thead>
- <tr>
- <th class="col-param">参数名称</th>
- <th class="col-sym">符号</th>
- <th class="col-val">计算结果</th>
- <th class="col-unit">单位</th>
- <th class="col-form">计算公式 / 说明</th>
- <th class="col-def">公式变量物理含义</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>PCB 直流铜损</td>
- <td>P<sub>cu,dc</sub></td>
- <td><span class="res-val" id="res_Pcu_dc">0</span></td>
- <td>W</td>
- <td>P<sub>cu,dc</sub> = 3 × I<sub>rms</sub>² × R<sub>ph</sub></td>
- <td><span>I<sub>rms</sub></span>:相电流, <span>R<sub>ph</sub></span>:热态相电阻</td>
- </tr>
- <tr>
- <td>PCB 交流铜损</td>
- <td>P<sub>cu,ac</sub></td>
- <td><span class="res-val" id="res_Pcu_ac">0</span></td>
- <td>W</td>
- <td>P<sub>cu,ac</sub> = P<sub>cu,dc</sub> × (k<sub>ac</sub> - 1)</td>
- <td><span>k<sub>ac</sub></span>:交流电阻系数(与频率 f² 相关)</td>
- </tr>
- <tr>
- <td>PCB 涡流损耗</td>
- <td>P<sub>eddy</sub></td>
- <td><span class="res-val" id="res_Peddy">0</span></td>
- <td>W</td>
- <td>P = (π²·f²·B²·w²·Vol) / (12·ρ)</td>
- <td><span>w</span>:线宽, <span>Vol</span>:铜体积, <span>ρ</span>:电阻率</td>
- </tr>
- <tr>
- <td>磁钢涡流损耗</td>
- <td>P<sub>mag</sub></td>
- <td><span class="res-val" id="res_Pmag_eddy">0</span></td>
- <td>W</td>
- <td>P = (π²·f²·B²·t²·σ·Vol) / 6</td>
- <td><span>t</span>:磁钢厚, <span>σ</span>:电导率, <span>Vol</span>:磁钢体积</td>
- </tr>
- <tr>
- <td>机械损耗</td>
- <td>P<sub>mech</sub></td>
- <td><span class="res-val" id="res_Pmech">0</span></td>
- <td>W</td>
- <td>P = 0.5·C<sub>f</sub>·ρ·ω³·(R<sub>o</sub>⁵-R<sub>i</sub>⁵)</td>
- <td><span>C<sub>f</sub></span>:摩擦系数, <span>ρ</span>:空气密度, <span>ω</span>:角速度</td>
- </tr>
- <tr>
- <td>杂散损耗</td>
- <td>P<sub>stray</sub></td>
- <td><span class="res-val" id="res_Pstray">0</span></td>
- <td>W</td>
- <td>P<sub>stray</sub> ≈ 0.008 × P<sub>nom</sub></td>
- <td><span>P<sub>nom</sub></span>:额定功率 (工程经验值),包含结构件涡流、PCB介质损耗、轴承密封圈/润滑脂的额外阻力</td>
- </tr>
- <tr style="background-color:#fef2f2;">
- <td style="font-weight:800">总损耗</td>
- <td>P<sub>loss</sub></td>
- <td><span class="res-val res-bad" id="res_Ploss">0</span></td>
- <td>W</td>
- <td>P<sub>loss</sub> = Σ (P<sub>cu</sub> + P<sub>mag</sub> + P<sub>mech</sub>...)</td>
- <td>所有损耗分量之和</td>
- </tr>
- <tr>
- <td>总效率</td>
- <td>η</td>
- <td><span class="res-val" id="res_Eff">0</span></td>
- <td>%</td>
- <td>η = P<sub>nom</sub> / (P<sub>nom</sub> + P<sub>loss</sub>)</td>
- <td><span>P<sub>nom</sub></span>:输出功率, <span>P<sub>loss</sub></span>:总损耗</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="therm" class="page-section">
- <div class="section-card">
- <h2>6. 热分析 (Thermal Analysis)</h2>
-
- <h3>A. 边界条件</h3>
- <table>
- <thead>
- <tr>
- <th class="col-param">参数</th>
- <th class="col-sym">符号</th>
- <th class="col-val">输入/结果</th>
- <th class="col-unit">单位</th>
- <th class="col-form">说明</th>
- <th class="col-def">物理含义</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>换热系数</td>
- <td>h</td>
- <td><input type="number" id="h_conv" value="50" oninput="app.calculate()"></td>
- <td>W/m²K</td>
- <td>User Input</td>
- <td>表面对流散热系数(自然:10, 强迫:50+)</td>
- </tr>
- <tr>
- <td>环境温度</td>
- <td>T<sub>amb</sub></td>
- <td><input type="number" id="T_amb" value="25" oninput="app.calculate()"></td>
- <td>°C</td>
- <td>User Input</td>
- <td>电机所处的环境空气温度</td>
- </tr>
- </tbody>
- </table>
- <h3>B. 稳态温升</h3>
- <table>
- <thead>
- <tr>
- <th class="col-param">参数</th>
- <th class="col-sym">符号</th>
- <th class="col-val">结果</th>
- <th class="col-unit">单位</th>
- <th class="col-form">计算公式</th>
- <th class="col-def">公式变量物理含义</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>定子表面积</td>
- <td>A<sub>surf</sub></td>
- <td><span class="res-val" id="res_Asurf">0</span></td>
- <td>m²</td>
- <td>A<sub>surf</sub> = 2 × π × (R<sub>out</sub>² - R<sub>in</sub>²)</td>
- <td><span>R<sub>out/in</sub></span>: 定子有效区域外/内半径</td>
- </tr>
- <tr>
- <td>温升</td>
- <td>ΔT</td>
- <td><span class="res-val" id="res_dT">0</span></td>
- <td>K</td>
- <td>ΔT = P<sub>loss</sub> / (h × A<sub>surf</sub>)</td>
- <td><span>P<sub>loss</sub></span>:总热损耗, <span>h</span>:换热系数, <span>A</span>:面积</td>
- </tr>
- <tr>
- <td>最终温度</td>
- <td>T<sub>coil</sub></td>
- <td><span class="res-val" id="res_Tfinal">0</span></td>
- <td>°C</td>
- <td>T<sub>coil</sub> = T<sub>amb</sub> + ΔT</td>
- <td><span>T<sub>amb</sub></span>:环境温度, <span>ΔT</span>:计算温升</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="cost" class="page-section">
- <div class="section-card">
- <h2>7. 成本明细 (Cost Estimation)</h2>
- <table class="cost-table">
- <thead>
- <tr>
- <th style="width:25%;font-weight: 600; font-size: 16px; color: #334155;">组件名称</th>
- <th style="width:20%;font-weight: 600; font-size: 16px; color: #334155;">单价输入 (¥)</th>
- <th style="width:25%;font-weight: 600; font-size: 16px; color: #334155;">用量计算 / 备注</th>
- <th style="width:10%;font-weight: 600; font-size: 16px; color: #334155;">单位</th>
- <th style="width:20%;font-weight: 600; font-size: 16px; color: #334155;">小计 (¥)</th>
- </tr>
- </thead>
- <tbody>
- <tr class="cost-row">
- <td><b>钕铁硼磁铁</b></td>
- <td><input type="number" class="cost-input" id="price_mag" value="400" oninput="app.calculate()"></td>
- <td>用量: <span id="res_Mmag" style="font-weight:bold;">0</span> kg</td>
- <td>元/kg</td>
- <td><span class="res-val" id="sub_mag">0</span></td>
- </tr>
- <tr class="cost-row">
- <td><b>PCB定子</b></td>
- <td><input type="number" class="cost-input" id="price_pcb_unit" value="60" oninput="app.calculate()"></td>
- <td>按片计价</td>
- <td>元/pcs</td>
- <td><span class="res-val" id="sub_pcb">0</span></td>
- </tr>
- <tr class="cost-row">
- <td><b>轴承</b></td>
- <td><input type="number" class="cost-input" id="price_bearing" value="8" oninput="app.calculate()"></td>
- <td>用量:2</td>
- <td>元/个</td>
- <td><span class="res-val" id="sub_bearing">0</span></td>
- </tr>
- <tr class="cost-row">
- <td><b>机加件(轴/壳)</b></td>
- <td><input type="number" class="cost-input" id="price_mech" value="50" oninput="app.calculate()"></td>
- <td>CNC/压铸/3D打印</td>
- <td>元/套</td>
- <td><span class="res-val" id="sub_mech">0</span></td>
- </tr>
- <tr class="cost-row">
- <td><b>辅材/人工</b></td>
- <td><input type="number" class="cost-input" id="price_labor" value="25" oninput="app.calculate()"></td>
- <td>组装费</td>
- <td>元/台</td>
- <td><span class="res-val" id="sub_labor">0</span></td>
- </tr>
- <tr class="cost-total">
- <td colspan="4" style="text-align:right; padding-right:20px;">整机 BOM 预估总成本:</td>
- <td><span class="res-val" id="res_CostTotal">0</span> ¥</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- <section id="ipc" class="page-section">
- <div class="section-card">
- <h2>8. 载流校验与安全 (IPC-2152 Validation)</h2>
- <p style="color:#64748b; font-size:14px; margin-bottom:20px;">基于 IPC-2221/IPC-2152 标准,针对内层导体(最恶劣散热条件)计算载流能力。</p>
-
- <table>
- <thead>
- <tr>
- <th class="col-param">校验项目</th>
- <th class="col-sym">符号</th>
- <th class="col-val">结果/状态</th>
- <th class="col-unit">单位</th>
- <th class="col-form">阈值与逻辑</th>
- <th class="col-def">说明</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>IPC最大载流(10℃温升)</td>
- <td>I<sub>IPC10</sub></td>
- <td><span class="res-val" id="res_Iipc10">0</span></td>
- <td>A</td>
- <td>I = k · ΔT<sup>0.44</sup> · A<sup>0.725</sup></td>
- <td>保守运行条件下的最大电流 (k=0.024)</td>
- </tr>
- <tr>
- <td>IPC最大载流(40℃温升)</td>
- <td>I<sub>IPC40</sub></td>
- <td><span class="res-val" id="res_Iipc40">0</span></td>
- <td>A</td>
- <td>I = k · ΔT<sup>0.44</sup> · A<sup>0.725</sup></td>
- <td>常规设计温升上限对应的电流</td>
- </tr>
- <tr>
- <td>当前相电流</td>
- <td>I<sub>rms</sub></td>
- <td><span class="res-val" id="res_CheckIrms">0</span></td>
- <td>A</td>
- <td>Ref from Performance</td>
- <td>实际工作电流</td>
- </tr>
- <tr>
- <td><b>电流安全裕度</b></td>
- <td>Margin</td>
- <td><span id="res_IPCMargin">--</span></td>
- <td>-</td>
- <td>Compare I<sub>rms</sub> vs I<sub>IPC40</sub></td>
- <td>PASS: I<sub>rms</sub> < I<sub>IPC40</sub></td>
- </tr>
- <tr>
- <td><b>Tg 热失效风险</b></td>
- <td>Risk</td>
- <td><span id="res_TgRisk">--</span></td>
- <td>-</td>
- <td>T<sub>final</sub> vs (T<sub>g</sub> - 20)</td>
- <td>确保线圈温度低于材料Tg点至少20度</td>
- </tr>
- </tbody>
- </table>
- </div>
- </section>
- </main>
- </div>
- <script>
- /**
- * @namespace App
- * @description Core namespace for the Motor Design Application.
- */
- const App = (() => {
- const Config = {
- storageKey: 'drss_v10_design_data',
- magnets: {
- "ATMAX50SH": 1.425,
- "N35": 1.17,
- "N52": 1.45
- },
- physics: {
- k_ipc: 0.024,
- eddy_correction: 1.2,
- mu0: 4 * Math.PI * 1e-7, // 真空磁导率 H/m
- k_ind_geom: 0.45 // PCB绕组几何形状修正系数 (扁平线圈非理想螺线管)
- }
- };
- class PhysicsEngine {
-
- static calcGeometry(inputs) {
- // 1. 基础参数准备
- const t_base_mm = inputs.oz * 0.035; // 1oz = 0.035mm
- const t_plate_mm = inputs.t_plate_um / 1000;
-
- // 2. 复杂叠层厚度计算 (Stack-up Calculation Logic)
- let h_s = 0;
- let h_copper_total = 0;
- let h_mask_total = 2 * inputs.t_mask;
- // Resistance Calculation Variables
- const R_out = inputs.D_out / 2;
- const R_in = inputs.D_in / 2;
- const R_avg = (R_out + R_in) / 2;
- const tau_p = (Math.PI * 2 * R_avg / 1000) / (2 * inputs.p);
- const L_cond = (R_out - R_in) / 1000;
-
- // 假设所有层串联
- const N_ph = inputs.layers * inputs.turns;
- const L_turn = 2 * L_cond + 2 * (tau_p * inputs.k_end);
- const L_total = N_ph * L_turn;
-
- // 单层绕组长度
- const L_per_layer_total = inputs.turns * L_turn;
- // 电阻计算截面积
- // 外层:基铜 + 电镀
- const A_outer = inputs.w_tr * (t_base_mm + t_plate_mm);
- // 内层:仅基铜
- const A_inner = inputs.w_tr * t_base_mm;
- let R_20 = 0;
- if (inputs.layers <= 2) {
- // 双面板结构 (Mask - OutCu - Core - OutCu - Mask)
- const h_cu_outer = 2 * (t_base_mm + t_plate_mm);
- h_s = h_mask_total + h_cu_outer + inputs.t_core;
- h_copper_total = h_cu_outer;
-
- // 电阻计算 (全按外层算)
- R_20 = (inputs.rho_cu * L_total) / A_outer;
- } else {
- // 多层板结构 (N >= 4)
- // 结构:[Mask-OuterCu-PP] - [Core-InnerCu]... - [PP-OuterCu-Mask]
-
- const h_cu_outer = 2 * (t_base_mm + t_plate_mm);
- const h_cu_inner = (inputs.layers - 2) * t_base_mm;
-
- // 绝缘介质层: Core数 = N/2 - 1, PP数 = N/2
- const num_cores = (inputs.layers / 2) - 1;
- const num_pp = inputs.layers / 2;
- const h_dielectric = (num_cores * inputs.t_core) + (num_pp * inputs.t_pp);
-
- // 总厚度
- h_s = h_mask_total + h_cu_outer + h_cu_inner + h_dielectric;
-
- h_copper_total = h_cu_outer + h_cu_inner;
- // 精确电阻计算:分别计算外层和内层电阻然后叠加
- const R_outer_layer = (inputs.rho_cu * L_per_layer_total) / A_outer;
- const R_inner_layer = (inputs.rho_cu * L_per_layer_total) / A_inner;
-
- // 2层外层 + (N-2)层内层
- R_20 = (2 * R_outer_layer) + ((inputs.layers - 2) * R_inner_layer);
- }
-
- // 用于 IPC 计算的单层截面积 (取最恶劣情况:内层)
- const A_cu_worst = inputs.w_tr * t_base_mm;
- return {
- t_base_mm, t_plate_mm, h_s,
- R_out, R_in, R_avg, tau_p, L_cond, N_ph, L_turn, L_total,
- A_cu: A_cu_worst, // 导出给 IPC 模块使用
- R_20
- };
- }
- static calcMagnetic(inputs, geom) {
- // --- 核心定义:有效气隙 (Effective Gap) ---
- // 在DRSS结构中,磁通穿过两个机械气隙和定子厚度
- const g_eff = geom.h_s + 2 * inputs.g;
-
- const h_mag_tot = 2 * inputs.h_m;
- const PC = h_mag_tot / (g_eff * inputs.mu_r);
-
- // Airgap Flux Density
- const B_g = (h_mag_tot / (h_mag_tot + g_eff)) * inputs.Br;
- const R_out_m = geom.R_out / 1000;
- const R_in_m = geom.R_in / 1000;
-
- // Flux Linkage Area
- const A_annulus = Math.PI * (Math.pow(R_out_m, 2) - Math.pow(R_in_m, 2));
- const A_pole = (A_annulus / (2 * inputs.p)) * inputs.alpha_p;
- const A_pole_mm2 = A_pole * 1e6;
- // Flux per pole
- const Phi = B_g * A_pole * inputs.k_leak;
-
- return { g_eff, h_mag_tot, PC, B_g, A_pole, A_pole_mm2, Phi, A_annulus };
- }
- static calcPerformance(inputs, geom, mag) {
- const omega = inputs.n_nom * 2 * Math.PI / 60;
- const f_elec = inputs.n_nom * inputs.p / 60;
-
- // 1. Back-EMF (Standard RMS Calculation)
- // Correct Physics: E_rms = (2*PI/sqrt(2)) * f * N * Phi * kw
- // sqrt(2)*PI approx 4.44
- const E_rms = (Math.SQRT2 * Math.PI) * f_elec * geom.N_ph * mag.Phi * inputs.k_w;
- const Ke = E_rms / omega;
- const Kv = 9.55 / Ke;
- const T_nom = inputs.P_nom / omega;
-
- // 2. 电磁转矩常数 Kt = 3 * p * Ψ / √2,其中 Ψ = N_ph * Φ * k_w / √2
- const Psi = geom.N_ph * mag.Phi * inputs.k_w / Math.SQRT2;
- const Kt = 3 * inputs.p * Psi / Math.SQRT2;
-
- // 3. 耦合迭代计算电流、损耗和效率
- const iterativeResult = this.calcIterativePerformance(inputs, geom, mag, E_rms, T_nom, omega, f_elec);
-
- const I_rms = iterativeResult.I_rms;
- const J = I_rms / geom.A_cu;
- // --- DETAILED INDUCTANCE CALCULATION ---
-
- // 1. Magnetic Path Length for Inductance (一致性修正)
- // 直接引用 Section 3 计算的 mag.g_eff
- const g_total_m = mag.g_eff / 1000;
- // 2. Phase Area (Approx 1/3 of annulus)
- const A_phase_m2 = mag.A_annulus / 3;
- const A_phase_mm2 = A_phase_m2 * 1e6;
- // 3. Inductance Calculation
- const L_ph_H = (Config.physics.k_ind_geom * Config.physics.mu0 * Math.pow(geom.N_ph, 2) * A_phase_m2) / g_total_m;
- const L_ph_uH = L_ph_H * 1e6;
- // Electrical Time Constant
- const Tau_e_s = L_ph_H / geom.R_20;
- const Tau_e_us = Tau_e_s * 1e6;
- return {
- omega, f_elec, E_rms, Ke, Kv, T_nom, Kt,
- I_rms, J,
- L_ph_uH, Tau_e_us,
- A_phase_mm2,
- N_ph_sq: Math.pow(geom.N_ph, 2),
- // 迭代计算结果
- Pin: iterativeResult.Pin,
- PF: inputs.PF,
- eta: iterativeResult.eta * 100
- };
- }
- static calcIterativePerformance(inputs, geom, mag, E_rms, T_nom, omega, f_elec) {
- // 初始假设效率 85%
- let eta_guess = 0.85;
- let iterCount = 0;
- let I_rms, Pin, eta_final;
-
- do {
- // 输入电功率 = 输出机械功率 / 效率
- Pin = inputs.P_nom / eta_guess;
-
- // 相电流 (考虑功率因数)
- const PF = inputs.PF; // PCB轴向电机功率因数估计
- I_rms = Pin / (3 * E_rms * PF);
-
- // 计算此电流下的损耗(简化版本,实际应调用完整损耗模型)
- const T_coil_guess = inputs.T_amb + 40;
- const R_hot = geom.R_20 * (1 + inputs.alpha_cu * (T_coil_guess - 20));
- const P_cu = 3 * I_rms * I_rms * R_hot;
-
- // 估算其他损耗(简化处理)
- const w_m = inputs.w_tr / 1000;
- const Vol_cu_total = (geom.L_total * 3 * inputs.w_tr * geom.t_base_mm) / 1e6;
- const P_eddy_tr = (Math.pow(Math.PI,2) * Math.pow(f_elec,2) * Math.pow(mag.B_g,2) * Math.pow(w_m,2) * Vol_cu_total * Config.physics.eddy_correction) / (12 * 1.68e-8);
-
- // 磁钢涡流损耗
- const t_mag_m = inputs.h_m / 1000;
- const Vol_mag = 2 * mag.A_pole * (2 * inputs.p) * t_mag_m;
- const k_harm = 0.04;
- const n_harm = 5;
- const B_ac = mag.B_g * k_harm;
- const f_eff = f_elec * n_harm;
- let P_mag_calc = (Math.pow(Math.PI,2)/6) * Math.pow(f_eff,2) * Math.pow(B_ac,2) * Math.pow(t_mag_m,2) * inputs.sigma_mag * Vol_mag;
- const P_mag_eddy = Math.max(0, Math.min(P_mag_calc, inputs.P_nom * 0.02));
-
- // 机械损耗
- const R_out_m = geom.R_out / 1000;
- const R_in_m = geom.R_in / 1000;
- const P_mech = 0.5 * inputs.cf_fric * inputs.rho_air * Math.pow(omega, 3) * (Math.pow(R_out_m, 5) - Math.pow(R_in_m, 5));
-
- const P_stray = inputs.P_nom * 0.008;
-
- const P_loss_total = P_cu + P_eddy_tr + P_mag_eddy + P_mech + P_stray;
-
- // 计算实际效率
- eta_final = inputs.P_nom / (inputs.P_nom + P_loss_total);
-
- // 更新效率猜测
- eta_guess = eta_guess * 0.7 + eta_final * 0.3; // 加权更新
-
- iterCount++;
- } while (Math.abs(eta_guess - eta_final) > 0.001 && iterCount < 20);
-
- // 最终电流计算使用最终效率
- Pin = inputs.P_nom / eta_final;
- I_rms = Pin / (3 * E_rms * inputs.PF);
-
- return { I_rms, Pin, eta: eta_final };
- }
- static calcLosses(inputs, geom, mag, perf) {
- let T_coil = inputs.T_amb + 40;
- let R_hot = geom.R_20;
- let P_cu_dc = 0, P_cu_ac = 0, P_eddy_tr = 0, P_mag_eddy = 0;
- let P_mech = 0, P_stray = 0, P_loss = 0;
- for(let iter = 0; iter < 4; iter++) {
- R_hot = geom.R_20 * (1 + inputs.alpha_cu * (T_coil - 20));
- P_cu_dc = 3 * Math.pow(perf.I_rms, 2) * R_hot;
-
- const k_ac_factor = 1 + Math.pow(perf.f_elec / 1200, 2);
- P_cu_ac = P_cu_dc * (k_ac_factor - 1);
-
- // --- PCB Eddy Current Loss ---
- const w_m = inputs.w_tr / 1000;
- const Vol_cu_total = (geom.L_total * 3 * inputs.w_tr * geom.t_base_mm) / 1e6;
- P_eddy_tr = (Math.pow(Math.PI,2) * Math.pow(perf.f_elec,2) * Math.pow(mag.B_g,2) * Math.pow(w_m,2) * Vol_cu_total * Config.physics.eddy_correction) / (12 * 1.68e-8);
-
- // --- Magnet Eddy Current Loss ---
- const t_mag_m = inputs.h_m / 1000;
- const Vol_mag = 2 * mag.A_pole * (2 * inputs.p) * t_mag_m;
- const k_harm = 0.04;
- const n_harm = 5;
- const B_ac = mag.B_g * k_harm;
- const f_eff = perf.f_elec * n_harm;
- let P_mag_calc = (Math.pow(Math.PI,2)/6) * Math.pow(f_eff,2) * Math.pow(B_ac,2) * Math.pow(t_mag_m,2) * inputs.sigma_mag * Vol_mag;
- P_mag_eddy = Math.max(0, Math.min(P_mag_calc, inputs.P_nom * 0.02));
-
- // --- Mechanical Loss ---
- const R_out_m = geom.R_out / 1000;
- const R_in_m = geom.R_in / 1000;
- P_mech = 0.5 * inputs.cf_fric * inputs.rho_air * Math.pow(perf.omega, 3) * (Math.pow(R_out_m, 5) - Math.pow(R_in_m, 5));
-
- P_stray = inputs.P_nom * 0.008;
-
- P_loss = P_cu_dc + P_cu_ac + P_eddy_tr + P_mag_eddy + P_mech + P_stray;
-
- const A_surf = 2 * Math.PI * Math.pow(geom.R_out/1000, 2);
- const dT = P_loss / (inputs.h_conv * A_surf);
- T_coil = inputs.T_amb + dT;
- }
-
- const Eff = (inputs.P_nom / (inputs.P_nom + P_loss)) * 100;
- return { R_hot, P_cu_dc, P_cu_ac, P_eddy_tr, P_mag_eddy, P_mech, P_stray, P_loss, Eff, T_coil };
- }
- static calcThermal(inputs, losses, geom) {
- const A_surf = 2 * Math.PI * (Math.pow(geom.R_out/1000, 2) - Math.pow(geom.R_in/1000, 2));
- const dT = losses.P_loss / (inputs.h_conv * A_surf);
- const T_final = inputs.T_amb + dT;
- return { A_surf, dT, T_final };
- }
- static calcCost(inputs, geom) {
- const Area_ring_cm2 = Math.PI * (Math.pow(geom.R_out/10,2) - Math.pow(geom.R_in/10,2));
- const Vol_mag_cm3 = (2 * Area_ring_cm2 * inputs.alpha_p * inputs.h_m) / 10;
- const M_mag = (Vol_mag_cm3 * inputs.rho_mag) / 1000;
- const Cost_Mag = M_mag * inputs.price_mag;
- const Cost_PCB = inputs.price_pcb;
- const Cost_Bear = inputs.price_bearing * 2;
- const Cost_Mech = inputs.price_mech;
- const Cost_Labor = inputs.price_labor;
- const Cost_Total = Cost_Mag + Cost_PCB + Cost_Bear + Cost_Mech + Cost_Labor;
- return { M_mag, Cost_Mag, Cost_PCB, Cost_Bear, Cost_Mech, Cost_Labor, Cost_Total };
- }
- static calcIPC(inputs, geom, perf, thermal) {
- const A_mils = geom.A_cu * 1550.0;
- const k = Config.physics.k_ipc;
- const I_ipc10 = k * Math.pow(10, 0.44) * Math.pow(A_mils, 0.725);
- const I_ipc40 = k * Math.pow(40, 0.44) * Math.pow(A_mils, 0.725);
- let ipcStatus = perf.I_rms < I_ipc40 ? "PASS" : "WARNING";
- let ipcClass = perf.I_rms < I_ipc40 ? "status-ok" : "status-warn";
- let tgStatus = (inputs.Tg - thermal.T_final > 20) ? "OK" : "RISK";
- let tgClass = (inputs.Tg - thermal.T_final > 20) ? "status-ok" : "status-warn";
- return { I_ipc10, I_ipc40, ipcStatus, ipcClass, tgStatus, tgClass };
- }
- }
- class Store {
- static getInputs() {
- const v = (id) => parseFloat(document.getElementById(id).value) || 0;
- return {
- P_nom: v('P_nom'), n_nom: v('n_nom'), V_dc: v('V_dc'), p: v('p'),
- D_out: v('D_out'), D_in: v('D_in'), g: v('g_mech'), h_m: v('h_m'),
-
- // --- PCB Stackup ---
- layers: v('layers'),
- oz: v('oz'),
- t_plate_um: v('t_plate'),
- t_core: v('t_core'),
- t_pp: v('t_pp'),
- t_mask: v('t_mask'),
- turns: v('turns_layer'),
- w_tr: v('w_trace'),
- k_end: v('k_end'),
- // -----------------------------
- Br: v('Br'), mu_r: v('mu_r'), alpha_p: v('alpha_p'),
- sigma_mag: v('sigma_mag'), rho_cu: v('rho_cu'), alpha_cu: v('alpha_cu'),
- rho_mag: v('rho_mag'), rho_air: v('rho_air'), cf_fric: v('cf_fric'), Tg: v('Tg'),
- k_leak: v('k_leak'), k_w: v('k_w'), PF: v('PF'), // 新增功率因数
- h_conv: v('h_conv'), T_amb: v('T_amb'),
- price_mag: v('price_mag'), price_pcb: v('price_pcb_unit'),
- price_bearing: v('price_bearing'), price_mech: v('price_mech'), price_labor: v('price_labor'),
- mag_grade: document.getElementById('mag_grade').value
- };
- }
- static save(inputs) { localStorage.setItem(Config.storageKey, JSON.stringify(inputs)); }
- static load() {
- try {
- const saved = localStorage.getItem(Config.storageKey);
- if (!saved) return false;
- const data = JSON.parse(saved);
- Object.keys(data).forEach(key => {
- const el = document.getElementById(key);
- if (el) el.value = data[key];
- });
- return true;
- } catch (e) { return false; }
- }
- }
- class UIManager {
- constructor() { this.exportData = []; }
-
- updateView(data) {
- const { inputs, geom, mag, perf, losses, thermal, cost, ipc } = data;
- const set = (id, val, d=2) => { const el = document.getElementById(id); if(el) el.innerText = val.toFixed(d); };
- const setHTML = (id, html) => { const el = document.getElementById(id); if(el) el.innerHTML = html; };
- // HUD
- set('hud_Pnom', inputs.P_nom, 0); set('hud_T', perf.T_nom, 2); set('hud_Eff', perf.eta, 1);
- set('hud_Loss', losses.P_loss, 1); set('hud_Cost', cost.Cost_Total, 1); set('hud_Temp', thermal.T_final, 0);
- setHTML('hud_IPC', `<span class="${ipc.ipcClass}">${ipc.ipcStatus}</span>`);
- // Main Sections
- set('res_hs', geom.h_s, 2); set('res_Ravg', geom.R_avg, 1); set('res_Nph', geom.N_ph, 0);
- set('res_Ltot', geom.L_total, 2); set('res_R20', geom.R_20, 4); set('res_Rhot', losses.R_hot, 4);
- set('res_geff', mag.g_eff, 2); set('res_PC', mag.PC, 3); set('res_Bg', mag.B_g, 3);
- set('res_Apole', mag.A_pole_mm2, 0); set('res_Phi', mag.Phi, 6);
- set('res_Erms', perf.E_rms, 2); set('res_Ke', perf.Ke, 4); set('res_Kv', perf.Kv, 0);
- set('res_Tnom', perf.T_nom, 2); set('res_Kt', perf.Kt, 3);
- set('res_Pin', perf.Pin, 1); set('res_Irms', perf.I_rms, 2); set('res_J', perf.J, 1);
- set('res_PF', perf.PF, 2); set('res_Eff_perf', perf.eta, 1);
- // 电感相关行
- this.updateOrInsertRow('perf', '<b>相电感', 'L<sub>ph</sub>', perf.L_ph_uH, 'μH',
- `L ≈ k·μ₀·N<sub>ph</sub>²·A<sub>ph</sub> / g<sub>eff</sub>`,
- 'res_Lph',
- `<span>k</span>:0.45(形状修正), <span>μ₀</span>:真空磁导率, <span>N<sub>ph</sub></span>:总匝数, <span>A<sub>ph</sub></span>:相面积`
- );
-
- this.updateOrInsertRow('perf', '└─ 线圈磁路气隙', 'g<sub>eff</sub>', mag.g_eff, 'mm',
- `g<sub>eff</sub> = h<sub>s</sub> + 2g`,
- 'res_g_coil',
- `<span>h<sub>s</sub></span>:定子厚, <span>g</span>:单侧气隙`
- );
- this.updateOrInsertRow('perf', '└─ 单相有效面积', 'A<sub>ph</sub>', perf.A_phase_mm2, 'mm²',
- `A<sub>ph</sub> ≈ A<sub>ring</sub> / 3`,
- 'res_Aph',
- `<span>A<sub>ring</sub></span>:定子圆环总面积 (假设三相均分)`
- );
- this.updateOrInsertRow('perf', '<b>电气时间常数', 'τ<sub>e</sub>', perf.Tau_e_us, 'μs',
- `τ<sub>e</sub> = L<sub>ph</sub> / R<sub>20</sub>`,
- 'res_Taue',
- `<span>L<sub>ph</sub></span>:相电感, <span>R<sub>20</sub></span>:冷态电阻`
- );
- set('res_Pcu_dc', losses.P_cu_dc, 1); set('res_Pcu_ac', losses.P_cu_ac, 1);
- set('res_Peddy', losses.P_eddy_tr, 1); set('res_Pmag_eddy', losses.P_mag_eddy, 2);
- set('res_Pmech', losses.P_mech, 1); set('res_Pstray', losses.P_stray, 1);
- set('res_Ploss', losses.P_loss, 1); set('res_Eff', losses.Eff, 1);
- set('res_Asurf', thermal.A_surf, 4); set('res_dT', thermal.dT, 1); set('res_Tfinal', thermal.T_final, 1);
- set('res_Mmag', cost.M_mag, 3); set('sub_mag', cost.Cost_Mag, 1); set('sub_pcb', cost.Cost_PCB, 1);
- set('sub_bearing', cost.Cost_Bear, 1); set('sub_mech', cost.Cost_Mech, 1);
- set('sub_labor', cost.Cost_Labor, 1); set('res_CostTotal', cost.Cost_Total, 1);
- set('res_Iipc10', ipc.I_ipc10, 2); set('res_Iipc40', ipc.I_ipc40, 2); set('res_CheckIrms', perf.I_rms, 2);
- setHTML('res_IPCMargin', `<span class="${ipc.ipcClass}">${ipc.ipcStatus}</span>`);
- setHTML('res_TgRisk', `<span class="${ipc.tgClass}">${ipc.tgStatus}</span>`);
- this.exportData = [
- {cat:"Input", name:"额定功率", sym:"P_nom", val:inputs.P_nom, unit:"W"},
- {cat:"Performance", name:"输入电功率", sym:"P_in", val:perf.Pin, unit:"W"},
- {cat:"Performance", name:"电机效率", sym:"eta", val:perf.eta, unit:"%"},
- {cat:"Performance", name:"功率因数", sym:"PF", val:perf.PF, unit:""},
- {cat:"Magnetic", name:"气隙磁密Bg", sym:"B_g", val:mag.B_g, unit:"T"},
- {cat:"Performance", name:"相电动势RMS", sym:"E_rms", val:perf.E_rms, unit:"V"},
- {cat:"Performance", name:"相电流RMS", sym:"I_rms", val:perf.I_rms, unit:"A"},
- {cat:"Performance", name:"转矩常数", sym:"K_t", val:perf.Kt, unit:"Nm/A"},
- {cat:"Dynamics", name:"相电感", sym:"L_ph", val:perf.L_ph_uH, unit:"uH"},
- {cat:"Dynamics", name:"有效气隙", sym:"g_eff", val:mag.g_eff, unit:"mm"},
- {cat:"Dynamics", name:"电气时间常数", sym:"Tau_e", val:perf.Tau_e_us, unit:"us"},
- {cat:"Loss", name:"直流铜损", sym:"P_cu_dc", val:losses.P_cu_dc, unit:"W"},
- {cat:"Loss", name:"总损耗", sym:"P_loss", val:losses.P_loss, unit:"W"},
- {cat:"Cost", name:"总成本", sym:"Total", val:cost.Cost_Total, unit:"RMB"}
- ];
- this.animateSaveStatus();
- }
- // Enhanced helper to inject detailed rows
- updateOrInsertRow(sectionId, name, sym, val, unit, formula, valId, defText) {
- let el = document.getElementById(valId);
- // If row doesn't exist, create it dynamically
- if (!el) {
- const tbody = document.querySelector(`#${sectionId} tbody`);
- const tr = document.createElement('tr');
- // Add subtle background for sub-items
- if(name.includes('└─')) tr.style.backgroundColor = "#f8fafc";
-
- tr.innerHTML = `
- <td>${name}</td>
- <td class="col-sym">${sym}</td>
- <td><span class="res-val" id="${valId}">0</span></td>
- <td>${unit}</td>
- <td class="col-form" style="font-size:13px;">${formula}</td>
- <td class="col-def" style="font-size:12px; color:#64748b;">${defText || ''}</td>
- `;
- tbody.appendChild(tr);
- el = document.getElementById(valId);
- }
- // Update value
- el.innerText = val.toFixed(1);
- }
- animateSaveStatus() {
- const statusEl = document.getElementById('saveStatus');
- statusEl.innerText = "保存中...";
- statusEl.className = "save-status show saving";
- setTimeout(() => {
- statusEl.innerText = "已自动保存";
- statusEl.className = "save-status show";
- setTimeout(() => { statusEl.classList.remove('show'); }, 2000);
- }, 300);
- }
- updateMagGrade() {
- const sel = document.getElementById("mag_grade");
- const val = sel.value;
- const brInput = document.getElementById("Br");
- if (val === "custom") {
- brInput.readOnly = false;
- brInput.style.backgroundColor = "#fffbf0";
- } else {
- if (Config.magnets[val]) { brInput.value = Config.magnets[val]; app.calculate(); }
- brInput.readOnly = true; brInput.style.backgroundColor = "#f1f5f9";
- }
- }
- nav(pageId) {
- document.querySelectorAll('.page-section').forEach(el => el.classList.remove('active'));
- document.getElementById(pageId).classList.add('active');
- document.querySelectorAll('.nav-btn').forEach(el => el.classList.remove('active'));
- const buttons = document.querySelectorAll('.nav-btn');
- for (let btn of buttons) { if(btn.getAttribute('onclick').includes(pageId)) btn.classList.add('active'); }
- }
- exportExcel() {
- let csvContent = "data:text/csv;charset=utf-8,\uFEFF";
- csvContent += "Category,Parameter,Symbol,Value,Unit\n";
- this.exportData.forEach(row => {
- const v = (typeof row.val === 'number') ? row.val.toFixed(4) : row.val;
- csvContent += `${row.cat},${row.name},${row.sym},${v},${row.unit}\n`;
- });
- const link = document.createElement("a");
- link.setAttribute("href", encodeURI(csvContent));
- link.setAttribute("download", "Motor_Design_Report.csv");
- document.body.appendChild(link); link.click(); document.body.removeChild(link);
- }
- }
- class Application {
- constructor() { this.ui = new UIManager(); }
- init() { Store.load(); this.ui.updateMagGrade(); this.calculate(); }
- calculate() {
- const inputs = Store.getInputs();
- const geom = PhysicsEngine.calcGeometry(inputs);
- const mag = PhysicsEngine.calcMagnetic(inputs, geom);
- const perf = PhysicsEngine.calcPerformance(inputs, geom, mag);
- const losses = PhysicsEngine.calcLosses(inputs, geom, mag, perf);
- const thermal = PhysicsEngine.calcThermal(inputs, losses, geom);
- const cost = PhysicsEngine.calcCost(inputs, geom);
- const ipc = PhysicsEngine.calcIPC(inputs, geom, perf, thermal);
- this.ui.updateView({ inputs, geom, mag, perf, losses, thermal, cost, ipc });
- Store.save(inputs);
- }
- }
- return new Application();
- })();
- window.onload = () => App.init();
- window.app = App;
- </script>
- </body>
- </html>
|