|
|
@@ -0,0 +1,1372 @@
|
|
|
+<!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>
|