DRSS V16.html 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>PCB轴向磁通电机设计-双转子单定子(无铁芯) - Stackup Rev</title>
  7. <style>
  8. /* =========================================
  9. CSS 样式定义区 (保持原有样式不变)
  10. ========================================= */
  11. :root {
  12. --primary-dark: #1e293b;
  13. --primary-blue: #2563eb;
  14. --accent-teal: #059669;
  15. --danger-red: #dc2626;
  16. --bg-color: #f8fafc;
  17. --border-light: #cbd5e1;
  18. --text-main: #334155;
  19. --input-bg: #fff7ed;
  20. --header-height: 80px;
  21. }
  22. body {
  23. font-family: "Inter", "Segoe UI", "Microsoft YaHei", sans-serif;
  24. background-color: var(--bg-color);
  25. color: var(--text-main);
  26. margin: 0;
  27. display: flex;
  28. flex-direction: column;
  29. height: 100vh;
  30. overflow: hidden;
  31. }
  32. /* 顶部导航栏样式 */
  33. .sticky-header {
  34. height: var(--header-height);
  35. background: #ffffff;
  36. border-bottom: 1px solid var(--border-light);
  37. display: flex;
  38. align-items: center;
  39. padding: 0 30px;
  40. box-shadow: 0 4px 12px -2px rgba(0, 0, 0, 0.08);
  41. flex-shrink: 0;
  42. justify-content: space-between;
  43. z-index: 100;
  44. }
  45. .app-title { font-size: 24px; font-weight: 800; color: var(--primary-dark); display:flex; align-items:center; gap:12px;}
  46. .app-subtitle { font-size: 13px; color: #64748b; margin-top: 4px; font-weight: 500;}
  47. .version-tag { background: #dcfce7; color: #166534; padding: 2px 6px; border-radius: 4px; font-size: 11px; margin-left: 8px; vertical-align: middle; }
  48. /* 自动保存状态指示器 */
  49. .save-status {
  50. font-size: 11px;
  51. color: #059669;
  52. background: #ecfdf5;
  53. padding: 2px 8px;
  54. border-radius: 4px;
  55. margin-left: 12px;
  56. opacity: 0;
  57. transition: opacity 0.3s;
  58. }
  59. .save-status.show { opacity: 1; }
  60. .save-status.saving { color: #d97706; background: #fffbeb; }
  61. /* HUD */
  62. .hud-grid { display: flex; gap: 25px; align-items: center; }
  63. .hud-item { text-align: center; }
  64. .hud-label { font-size: 12px; color: #94a3b8; text-transform: uppercase; font-weight: 700; margin-bottom: 4px;}
  65. .hud-val { font-size: 30px; font-weight: 700; color: var(--primary-dark); font-family: "Consolas", monospace; }
  66. .hud-unit { font-size: 12px; color: #cbd5e1; margin-left: 2px; font-weight: 600; }
  67. .val-highlight { color: var(--primary-blue); }
  68. .val-loss { color: #dc2626; }
  69. .val-cost { color: #d97706; }
  70. .btn-action {
  71. background: var(--primary-blue); color: white; border: none; padding: 12px 24px;
  72. border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 15px;
  73. box-shadow: 0 4px 6px rgba(37, 99, 235, 0.2); transition: all 0.2s;
  74. display: flex; align-items: center; gap: 8px;
  75. }
  76. .btn-action:hover { background: #1d4ed8; transform: translateY(-1px); }
  77. /* 主容器布局 */
  78. .container { display: flex; flex: 1; overflow: hidden; }
  79. /* 侧边栏样式 */
  80. .sidebar {
  81. width: 260px; background: var(--primary-dark); color: #f1f5f9;
  82. display: flex; flex-direction: column; flex-shrink: 0; padding-top: 20px;
  83. }
  84. .nav-group-title { padding: 20px 25px 10px; font-size: 12px; color: #94a3b8; font-weight: 800; letter-spacing: 1px; }
  85. .nav-btn {
  86. padding: 16px 25px; border: none; background: transparent; color: #cbd5e1;
  87. text-align: left; cursor: pointer; border-right: 4px solid transparent;
  88. transition: all 0.2s; font-size: 15px; display: flex; align-items: center; gap: 12px;
  89. }
  90. .nav-btn.active { background: rgba(37, 99, 235, 0.2); color: white; border-right-color: var(--primary-blue); font-weight: 600; }
  91. .nav-btn svg { width: 20px; height: 20px; opacity: 0.7; }
  92. .nav-btn.active svg { opacity: 1; color: var(--primary-blue); }
  93. /* 内容区样式 */
  94. .main-content {
  95. flex: 1; padding: 30px 50px; overflow-y: auto; scroll-behavior: smooth;
  96. background-image: radial-gradient(#cbd5e1 1.5px, transparent 1.5px); background-size: 24px 24px;
  97. }
  98. /* --- 表格核心样式 --- */
  99. h2 {
  100. font-size: 22px; color: var(--primary-dark); border-left: 6px solid var(--primary-blue);
  101. padding-left: 15px; margin: 0 0 25px 0; font-weight: 800;
  102. }
  103. h3 {
  104. font-size: 18px; color: #475569; margin: 25px 0 15px 0; font-weight: 700;
  105. }
  106. .section-card {
  107. background: white; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);
  108. padding: 30px; margin-bottom: 30px; border: 1px solid var(--border-light);
  109. }
  110. table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 15px; table-layout: fixed; margin-bottom: 25px;}
  111. thead th {
  112. background: #f1f5f9; color: #475569; font-weight: 700; text-align: left;
  113. padding: 14px 15px; border-bottom: 2px solid #cbd5e1;
  114. font-size: 14px; letter-spacing: 0.5px;
  115. }
  116. td {
  117. padding: 14px 15px; border-bottom: 1px solid #e2e8f0; vertical-align: middle;
  118. color: #1e293b; line-height: 1.6;
  119. }
  120. /* 列宽定义 */
  121. .col-param { width: 14%; font-weight: 600; font-size: 16px; color: #334155; }
  122. .col-sym { width: 8%; font-weight: 600; font-size: 16px; color: #334155; }
  123. .col-val { width: 14%; font-weight: 600; font-size: 16px; color: #334155;}
  124. .col-unit { width: 8%; font-weight: 600; font-size: 16px; color: #334155;}
  125. .col-form { width: 28%; font-weight: 600; font-size: 16px; color: #334155; }
  126. .col-def { width: 28%; font-weight: 600; font-size: 16px; color: #334155; }
  127. /* 变量高亮样式 */
  128. .col-def span { color: #000; font-weight: 600; font-family: "Times New Roman", serif; font-style: italic; margin-right: 2px;}
  129. /* 输入框样式 */
  130. input[type="number"], select {
  131. width: 100%; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 6px;
  132. background: var(--input-bg); font-family: "JetBrains Mono", monospace; font-weight: 700; color: #c2410c;
  133. font-size: 15px; transition: all 0.2s; box-sizing: border-box;
  134. }
  135. input[type="number"]:focus { border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); outline: none; }
  136. /* 结果数字样式 */
  137. .res-val { color: var(--accent-teal); font-weight: 700; font-family: "JetBrains Mono", monospace; font-size: 17px; }
  138. .res-bad { color: var(--danger-red); }
  139. /* 状态指示样式 */
  140. .status-ok { color: var(--accent-teal); background: #ecfdf5; padding: 4px 8px; border-radius: 4px; border: 1px solid #10b981; display: inline-block;}
  141. .status-warn { color: var(--danger-red); background: #fef2f2; padding: 4px 8px; border-radius: 4px; border: 1px solid #ef4444; display: inline-block;}
  142. /* 页面切换动画 */
  143. .page-section { display: none; animation: fadeIn 0.2s ease-out; }
  144. .page-section.active { display: block; }
  145. @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
  146. </style>
  147. </head>
  148. <body>
  149. <header class="sticky-header">
  150. <div class="app-brand">
  151. <span class="app-title">
  152. <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>
  153. Axial PCB Motor Design
  154. <span class="version-tag">V16</span>
  155. <span id="saveStatus" class="save-status">已自动保存</span>
  156. </span>
  157. <span class="app-subtitle">PCB轴向磁通电机设计 </span>
  158. </div>
  159. <div class="hud-grid">
  160. <div class="hud-item">
  161. <div class="hud-label">额定功率</div>
  162. <div class="hud-value-group"><span class="hud-val" id="hud_Pnom">0</span><span class="hud-unit">W</span></div>
  163. </div>
  164. <div class="hud-item">
  165. <div class="hud-label">额定转矩</div>
  166. <div class="hud-value-group"><span class="hud-val val-highlight" id="hud_T">0.00</span><span class="hud-unit">Nm</span></div>
  167. </div>
  168. <div class="hud-item">
  169. <div class="hud-label">电机效率</div>
  170. <div class="hud-value-group"><span class="hud-val val-highlight" id="hud_Eff">0.0</span><span class="hud-unit">%</span></div>
  171. </div>
  172. <div class="hud-item">
  173. <div class="hud-label">总损耗</div>
  174. <div class="hud-value-group"><span class="hud-val val-loss" id="hud_Loss">0</span><span class="hud-unit">W</span></div>
  175. </div>
  176. <div class="hud-item">
  177. <div class="hud-label">预估成本</div>
  178. <div class="hud-value-group"><span class="hud-val val-cost" id="hud_Cost">0</span><span class="hud-unit">¥</span></div>
  179. </div>
  180. <div class="hud-item">
  181. <div class="hud-label">绕阻温度</div>
  182. <div class="hud-value-group"><span class="hud-val" id="hud_Temp">0</span><span class="hud-unit">℃</span></div>
  183. </div>
  184. <div class="hud-item">
  185. <div class="hud-label">载流校验</div>
  186. <div class="hud-value-group"><span class="hud-val" style="font-size:24px;" id="hud_IPC">--</span></div>
  187. </div>
  188. </div>
  189. <button class="btn-action" onclick="app.ui.exportExcel()">
  190. <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>
  191. 导出结果
  192. </button>
  193. </header>
  194. <div class="container">
  195. <nav class="sidebar">
  196. <div class="nav-group-title">DESIGN MODULES</div>
  197. <button class="nav-btn active" onclick="app.ui.nav('input')">
  198. <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>
  199. 1. 规格与几何 (Input)
  200. </button>
  201. <button class="nav-btn" onclick="app.ui.nav('stator')">
  202. <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>
  203. 2. 定子参数 (Stator)
  204. </button>
  205. <button class="nav-btn" onclick="app.ui.nav('mag')">
  206. <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>
  207. 3. 磁路分析 (Magnetic)
  208. </button>
  209. <div class="nav-group-title">ANALYSIS MODULES</div>
  210. <button class="nav-btn" onclick="app.ui.nav('perf')">
  211. <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>
  212. 4. 性能指标 (Perf)
  213. </button>
  214. <button class="nav-btn" onclick="app.ui.nav('loss')">
  215. <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>
  216. 5. 损耗分析 (Loss)
  217. </button>
  218. <button class="nav-btn" onclick="app.ui.nav('therm')">
  219. <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>
  220. 6. 热分析 (Thermal)
  221. </button>
  222. <button class="nav-btn" onclick="app.ui.nav('cost')">
  223. <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>
  224. 7. 成本明细 (Cost)
  225. </button>
  226. <button class="nav-btn" onclick="app.ui.nav('ipc')">
  227. <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>
  228. 8. 载流校验 (IPC-2152)
  229. </button>
  230. </nav>
  231. <main class="main-content">
  232. <section id="input" class="page-section active">
  233. <div class="section-card">
  234. <h2>1. 设计规格与几何输入 (Input)</h2>
  235. <h3>A. 性能规格 (Specifications)</h3>
  236. <table>
  237. <thead>
  238. <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>
  239. </thead>
  240. <tbody>
  241. <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>
  242. <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>
  243. <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>
  244. <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>
  245. </tbody>
  246. </table>
  247. <h3>B. 几何尺寸 (Geometry)</h3>
  248. <table>
  249. <thead>
  250. <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>
  251. </thead>
  252. <tbody>
  253. <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>
  254. <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>
  255. <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>
  256. <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>
  257. </tbody>
  258. </table>
  259. <h3>C. PCB 叠层与绕组 (IPC Stack-up)</h3>
  260. <table>
  261. <thead>
  262. <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>
  263. </thead>
  264. <tbody>
  265. <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>
  266. <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>
  267. <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>
  268. <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>
  269. <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>
  270. <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>
  271. <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>
  272. <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>
  273. <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>
  274. </tbody>
  275. </table>
  276. <h3>D. 材料属性 (Materials)</h3>
  277. <table>
  278. <thead>
  279. <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>
  280. </thead>
  281. <tbody>
  282. <tr>
  283. <td>磁钢牌号</td><td>Grade</td>
  284. <td>
  285. <select id="mag_grade" onchange="app.ui.updateMagGrade()">
  286. <option value="ATMAX50SH" selected>ATMAX50SH (Br=1.42T)</option>
  287. <option value="N35">N35 (Br=1.17T)</option>
  288. <option value="N52">N52 (Br=1.45T)</option>
  289. <option value="custom">-- 自定义 --</option>
  290. </select>
  291. </td>
  292. <td>-</td><td>Database Selection</td><td>选择牌号自动填入Br</td>
  293. </tr>
  294. <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>
  295. <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>
  296. <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>
  297. <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>
  298. <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>
  299. <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>
  300. <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>
  301. <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>
  302. <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>
  303. <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>
  304. </tbody>
  305. </table>
  306. <h3>E. 修正系数 (Correction Factors)</h3>
  307. <table>
  308. <thead>
  309. <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>
  310. </thead>
  311. <tbody>
  312. <tr>
  313. <td>漏磁系数</td><td>k<sub>leak</sub></td>
  314. <td><input type="number" id="k_leak" value="0.95" step="0.01" oninput="app.calculate()"></td>
  315. <td>-</td>
  316. <td>经验值 (0.9~0.98)</td>
  317. <td>考虑极间漏磁导致的磁通损失</td>
  318. </tr>
  319. <tr>
  320. <td>绕组系数</td><td>k<sub>w</sub></td>
  321. <td><input type="number" id="k_w" value="0.95" step="0.01" oninput="app.calculate()"></td>
  322. <td>-</td>
  323. <td>k<sub>w</sub> = k<sub>p</sub> × k<sub>d</sub></td>
  324. <td>基波绕组系数 (分布效应与短距效应)</td>
  325. </tr>
  326. <tr>
  327. <td>功率因数</td><td>PF</td>
  328. <td><input type="number" id="PF" value="0.95" step="0.01" oninput="app.calculate()" min="0.8" max="1.0"></td>
  329. <td>-</td>
  330. <td>PCB轴向电机典型值 (0.92-0.98)</td>
  331. <td>电压与电流相位差的余弦值</td>
  332. </tr>
  333. </tbody>
  334. </table>
  335. </div>
  336. </section>
  337. <section id="stator" class="page-section">
  338. <div class="section-card">
  339. <h2>2. 定子与电阻计算 (Stator)</h2>
  340. <table>
  341. <thead>
  342. <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>
  343. </thead>
  344. <tbody>
  345. <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>
  346. <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>
  347. <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>
  348. <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>
  349. <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>
  350. <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>
  351. </tbody>
  352. </table>
  353. </div>
  354. </section>
  355. <section id="mag" class="page-section">
  356. <div class="section-card">
  357. <h2>3. 磁路分析 (Flux Linkage Method)</h2>
  358. <p style="color:#64748b; font-size:14px; margin-bottom:15px; border-left:4px solid #f59e0b; padding-left:10px;">
  359. <b>无铁芯修正 (Coreless Correction):</b> 采用磁通链法计算。磁通量 $\Phi$ 基于有效扇区面积积分计算,而非简单的导线切割长度。
  360. </p>
  361. <table>
  362. <thead>
  363. <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>
  364. </thead>
  365. <tbody>
  366. <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>
  367. <tr><td>磁路负载点</td><td>PC</td><td><span class="res-val" id="res_PC">0</span></td>
  368. <td>-</td>
  369. <td>PC = 2h<sub>m</sub> / (g<sub>eff</sub> × μ<sub>r</sub>)</td>
  370. <td><span>h<sub>m</sub></span>:单块磁铁厚, <span>g<sub>eff</sub></span>:总气隙, <span>μ<sub>r</sub></span>:回复磁导率</td>
  371. </tr>
  372. <tr>
  373. <td>气隙磁密(平台)</td>
  374. <td>B<sub>g</sub></td>
  375. <td><span class="res-val" id="res_Bg">0</span></td>
  376. <td>T</td>
  377. <td>B<sub>g</sub> = [2h<sub>m</sub>/(2h<sub>m</sub>+g<sub>eff</sub>)] × B<sub>r</sub></td>
  378. <td>无铁芯结构的有效气隙磁感应强度</td>
  379. </tr>
  380. <tr>
  381. <td>有效极面积</td>
  382. <td>A<sub>pole</sub></td>
  383. <td><span class="res-val" id="res_Apole">0</span></td>
  384. <td>mm²</td>
  385. <td>A = π(R<sub>o</sub>²-R<sub>i</sub>²)/2p × α<sub>p</sub></td>
  386. <td>单个磁极覆盖的扇形有效面积</td>
  387. </tr>
  388. <tr>
  389. <td>每极磁通</td>
  390. <td>Φ</td>
  391. <td><span class="res-val" id="res_Phi">0</span></td>
  392. <td>Wb</td>
  393. <td>Φ = B<sub>g</sub> × A<sub>pole</sub> × k<sub>leak</sub></td>
  394. <td>穿过定子绕组的有效磁通总量</td>
  395. </tr>
  396. </table>
  397. </div>
  398. </section>
  399. <section id="perf" class="page-section">
  400. <div class="section-card">
  401. <h2>4. 性能指标 (Performance)</h2>
  402. <table>
  403. <thead>
  404. <tr>
  405. <th class="col-param">参数名称</th>
  406. <th class="col-sym">符号</th>
  407. <th class="col-val">计算结果</th>
  408. <th class="col-unit">单位</th>
  409. <th class="col-form">计算公式</th>
  410. <th class="col-def">公式变量物理含义</th>
  411. </tr>
  412. </thead>
  413. <tbody>
  414. <tr>
  415. <td>感应电动势</td>
  416. <td>E<sub>rms</sub></td>
  417. <td><span class="res-val" id="res_Erms">0</span></td>
  418. <td>V</td>
  419. <td>E = √2·π · f · N<sub>ph</sub> · Φ · k<sub>w</sub></td>
  420. <td><span>f</span>:电频率, <span>N<sub>ph</sub></span>:相匝数, <span>k<sub>w</sub></span>:绕组系数</td>
  421. </tr>
  422. <tr>
  423. <td>反电势常数</td>
  424. <td>K<sub>e</sub></td>
  425. <td><span class="res-val" id="res_Ke">0</span></td>
  426. <td>V·s/rad</td>
  427. <td>K<sub>e</sub> = E<sub>rms</sub> / ω</td>
  428. <td><span>E<sub>rms</sub></span>:相电势, <span>ω</span>:机械角速度</td>
  429. </tr>
  430. <tr>
  431. <td>Kv 值</td>
  432. <td>K<sub>v</sub></td>
  433. <td><span class="res-val" id="res_Kv">0</span></td>
  434. <td>rpm/V</td>
  435. <td>K<sub>v</sub> ≈ 9.55 / K<sub>e</sub></td>
  436. <td><span>K<sub>e</sub></span>:反电势常数, 9.55:单位换算常数</td>
  437. </tr>
  438. <tr>
  439. <td>额定力矩</td>
  440. <td>T<sub>nom</sub></td>
  441. <td><span class="res-val" id="res_Tnom">0</span></td>
  442. <td>Nm</td>
  443. <td>T<sub>nom</sub> = P<sub>nom</sub> / ω</td>
  444. <td><span>P<sub>nom</sub></span>:额定功率, <span>ω</span>:机械角速度(rad/s)</td>
  445. </tr>
  446. <tr>
  447. <td>电磁转矩常数</td>
  448. <td>K<sub>t</sub></td>
  449. <td><span class="res-val" id="res_Kt">0</span></td>
  450. <td>Nm/A</td>
  451. <td>K<sub>t</sub> = 3 · p · Ψ / √2</td>
  452. <td><span>p</span>:极对数, <span>Ψ</span>:磁链</td>
  453. </tr>
  454. <tr>
  455. <td>输入电功率</td>
  456. <td>P<sub>in</sub></td>
  457. <td><span class="res-val" id="res_Pin">0</span></td>
  458. <td>W</td>
  459. <td>P<sub>in</sub> = P<sub>nom</sub> / η</td>
  460. <td><span>P<sub>nom</sub></span>:输出功率, <span>η</span>:电机效率</td>
  461. </tr>
  462. <tr>
  463. <td>相电流(RMS)</td>
  464. <td>I<sub>rms</sub></td>
  465. <td><span class="res-val" id="res_Irms">0</span></td>
  466. <td>A</td>
  467. <td>I<sub>rms</sub> = P<sub>in</sub> / (3 · E<sub>rms</sub> · PF)</td>
  468. <td>基于能量守恒,考虑效率和功率因数</td>
  469. </tr>
  470. <tr>
  471. <td>电流密度</td>
  472. <td>J</td>
  473. <td><span class="res-val" id="res_J">0</span></td>
  474. <td>A/mm²</td>
  475. <td>J = I<sub>rms</sub> / A<sub>cu</sub></td>
  476. <td><span>I<sub>rms</sub></span>:相电流RMS, <span>A<sub>cu</sub></span>:铜线截面积</td>
  477. </tr>
  478. <tr>
  479. <td>功率因数</td>
  480. <td>PF</td>
  481. <td><span class="res-val" id="res_PF">0</span></td>
  482. <td>-</td>
  483. <td>用户输入值,PCB轴向电机典型0.92-0.98</td>
  484. <td>电压与电流相位差的余弦值</td>
  485. </tr>
  486. <tr>
  487. <td>电机效率</td>
  488. <td>η</td>
  489. <td><span class="res-val" id="res_Eff_perf">0</span></td>
  490. <td>%</td>
  491. <td>η = P<sub>nom</sub> / P<sub>in</sub> × 100%</td>
  492. <td>输出机械功率与输入电功率之比</td>
  493. </tr>
  494. </tbody>
  495. </table>
  496. </div>
  497. </section>
  498. <section id="loss" class="page-section">
  499. <div class="section-card">
  500. <h2>5. 损耗分析 (High-Fidelity Loss Analysis)</h2>
  501. <p style="color:#64748b; font-size:14px; margin-bottom:20px;">
  502. 包含集肤/邻近效应产生的交流铜损(AC Loss)、磁钢涡流损耗(谐波感应)以及工程杂散损耗(Stray Loss)。
  503. </p>
  504. <table>
  505. <thead>
  506. <tr>
  507. <th class="col-param">参数名称</th>
  508. <th class="col-sym">符号</th>
  509. <th class="col-val">计算结果</th>
  510. <th class="col-unit">单位</th>
  511. <th class="col-form">计算公式 / 说明</th>
  512. <th class="col-def">公式变量物理含义</th>
  513. </tr>
  514. </thead>
  515. <tbody>
  516. <tr>
  517. <td>PCB 直流铜损</td>
  518. <td>P<sub>cu,dc</sub></td>
  519. <td><span class="res-val" id="res_Pcu_dc">0</span></td>
  520. <td>W</td>
  521. <td>P<sub>cu,dc</sub> = 3 × I<sub>rms</sub>² × R<sub>ph</sub></td>
  522. <td><span>I<sub>rms</sub></span>:相电流, <span>R<sub>ph</sub></span>:热态相电阻</td>
  523. </tr>
  524. <tr>
  525. <td>PCB 交流铜损</td>
  526. <td>P<sub>cu,ac</sub></td>
  527. <td><span class="res-val" id="res_Pcu_ac">0</span></td>
  528. <td>W</td>
  529. <td>P<sub>cu,ac</sub> = P<sub>cu,dc</sub> × (k<sub>ac</sub> - 1)</td>
  530. <td><span>k<sub>ac</sub></span>:交流电阻系数(与频率 f² 相关)</td>
  531. </tr>
  532. <tr>
  533. <td>PCB 涡流损耗</td>
  534. <td>P<sub>eddy</sub></td>
  535. <td><span class="res-val" id="res_Peddy">0</span></td>
  536. <td>W</td>
  537. <td>P = (π²·f²·B²·w²·Vol) / (12·ρ)</td>
  538. <td><span>w</span>:线宽, <span>Vol</span>:铜体积, <span>ρ</span>:电阻率</td>
  539. </tr>
  540. <tr>
  541. <td>磁钢涡流损耗</td>
  542. <td>P<sub>mag</sub></td>
  543. <td><span class="res-val" id="res_Pmag_eddy">0</span></td>
  544. <td>W</td>
  545. <td>P = (π²·f²·B²·t²·σ·Vol) / 6</td>
  546. <td><span>t</span>:磁钢厚, <span>σ</span>:电导率, <span>Vol</span>:磁钢体积</td>
  547. </tr>
  548. <tr>
  549. <td>机械损耗</td>
  550. <td>P<sub>mech</sub></td>
  551. <td><span class="res-val" id="res_Pmech">0</span></td>
  552. <td>W</td>
  553. <td>P = 0.5·C<sub>f</sub>·ρ·ω³·(R<sub>o</sub>⁵-R<sub>i</sub>⁵)</td>
  554. <td><span>C<sub>f</sub></span>:摩擦系数, <span>ρ</span>:空气密度, <span>ω</span>:角速度</td>
  555. </tr>
  556. <tr>
  557. <td>杂散损耗</td>
  558. <td>P<sub>stray</sub></td>
  559. <td><span class="res-val" id="res_Pstray">0</span></td>
  560. <td>W</td>
  561. <td>P<sub>stray</sub> ≈ 0.008 × P<sub>nom</sub></td>
  562. <td><span>P<sub>nom</sub></span>:额定功率 (工程经验值),包含结构件涡流、PCB介质损耗、轴承密封圈/润滑脂的额外阻力</td>
  563. </tr>
  564. <tr style="background-color:#fef2f2;">
  565. <td style="font-weight:800">总损耗</td>
  566. <td>P<sub>loss</sub></td>
  567. <td><span class="res-val res-bad" id="res_Ploss">0</span></td>
  568. <td>W</td>
  569. <td>P<sub>loss</sub> = Σ (P<sub>cu</sub> + P<sub>mag</sub> + P<sub>mech</sub>...)</td>
  570. <td>所有损耗分量之和</td>
  571. </tr>
  572. <tr>
  573. <td>总效率</td>
  574. <td>η</td>
  575. <td><span class="res-val" id="res_Eff">0</span></td>
  576. <td>%</td>
  577. <td>η = P<sub>nom</sub> / (P<sub>nom</sub> + P<sub>loss</sub>)</td>
  578. <td><span>P<sub>nom</sub></span>:输出功率, <span>P<sub>loss</sub></span>:总损耗</td>
  579. </tr>
  580. </tbody>
  581. </table>
  582. </div>
  583. </section>
  584. <section id="therm" class="page-section">
  585. <div class="section-card">
  586. <h2>6. 热分析 (Thermal Analysis)</h2>
  587. <h3>A. 边界条件</h3>
  588. <table>
  589. <thead>
  590. <tr>
  591. <th class="col-param">参数</th>
  592. <th class="col-sym">符号</th>
  593. <th class="col-val">输入/结果</th>
  594. <th class="col-unit">单位</th>
  595. <th class="col-form">说明</th>
  596. <th class="col-def">物理含义</th>
  597. </tr>
  598. </thead>
  599. <tbody>
  600. <tr>
  601. <td>换热系数</td>
  602. <td>h</td>
  603. <td><input type="number" id="h_conv" value="50" oninput="app.calculate()"></td>
  604. <td>W/m²K</td>
  605. <td>User Input</td>
  606. <td>表面对流散热系数(自然:10, 强迫:50+)</td>
  607. </tr>
  608. <tr>
  609. <td>环境温度</td>
  610. <td>T<sub>amb</sub></td>
  611. <td><input type="number" id="T_amb" value="25" oninput="app.calculate()"></td>
  612. <td>°C</td>
  613. <td>User Input</td>
  614. <td>电机所处的环境空气温度</td>
  615. </tr>
  616. </tbody>
  617. </table>
  618. <h3>B. 稳态温升</h3>
  619. <table>
  620. <thead>
  621. <tr>
  622. <th class="col-param">参数</th>
  623. <th class="col-sym">符号</th>
  624. <th class="col-val">结果</th>
  625. <th class="col-unit">单位</th>
  626. <th class="col-form">计算公式</th>
  627. <th class="col-def">公式变量物理含义</th>
  628. </tr>
  629. </thead>
  630. <tbody>
  631. <tr>
  632. <td>定子表面积</td>
  633. <td>A<sub>surf</sub></td>
  634. <td><span class="res-val" id="res_Asurf">0</span></td>
  635. <td>m²</td>
  636. <td>A<sub>surf</sub> = 2 × π × (R<sub>out</sub>² - R<sub>in</sub>²)</td>
  637. <td><span>R<sub>out/in</sub></span>: 定子有效区域外/内半径</td>
  638. </tr>
  639. <tr>
  640. <td>温升</td>
  641. <td>ΔT</td>
  642. <td><span class="res-val" id="res_dT">0</span></td>
  643. <td>K</td>
  644. <td>ΔT = P<sub>loss</sub> / (h × A<sub>surf</sub>)</td>
  645. <td><span>P<sub>loss</sub></span>:总热损耗, <span>h</span>:换热系数, <span>A</span>:面积</td>
  646. </tr>
  647. <tr>
  648. <td>最终温度</td>
  649. <td>T<sub>coil</sub></td>
  650. <td><span class="res-val" id="res_Tfinal">0</span></td>
  651. <td>°C</td>
  652. <td>T<sub>coil</sub> = T<sub>amb</sub> + ΔT</td>
  653. <td><span>T<sub>amb</sub></span>:环境温度, <span>ΔT</span>:计算温升</td>
  654. </tr>
  655. </tbody>
  656. </table>
  657. </div>
  658. </section>
  659. <section id="cost" class="page-section">
  660. <div class="section-card">
  661. <h2>7. 成本明细 (Cost Estimation)</h2>
  662. <table class="cost-table">
  663. <thead>
  664. <tr>
  665. <th style="width:25%;font-weight: 600; font-size: 16px; color: #334155;">组件名称</th>
  666. <th style="width:20%;font-weight: 600; font-size: 16px; color: #334155;">单价输入 (¥)</th>
  667. <th style="width:25%;font-weight: 600; font-size: 16px; color: #334155;">用量计算 / 备注</th>
  668. <th style="width:10%;font-weight: 600; font-size: 16px; color: #334155;">单位</th>
  669. <th style="width:20%;font-weight: 600; font-size: 16px; color: #334155;">小计 (¥)</th>
  670. </tr>
  671. </thead>
  672. <tbody>
  673. <tr class="cost-row">
  674. <td><b>钕铁硼磁铁</b></td>
  675. <td><input type="number" class="cost-input" id="price_mag" value="400" oninput="app.calculate()"></td>
  676. <td>用量: <span id="res_Mmag" style="font-weight:bold;">0</span> kg</td>
  677. <td>元/kg</td>
  678. <td><span class="res-val" id="sub_mag">0</span></td>
  679. </tr>
  680. <tr class="cost-row">
  681. <td><b>PCB定子</b></td>
  682. <td><input type="number" class="cost-input" id="price_pcb_unit" value="60" oninput="app.calculate()"></td>
  683. <td>按片计价</td>
  684. <td>元/pcs</td>
  685. <td><span class="res-val" id="sub_pcb">0</span></td>
  686. </tr>
  687. <tr class="cost-row">
  688. <td><b>轴承</b></td>
  689. <td><input type="number" class="cost-input" id="price_bearing" value="8" oninput="app.calculate()"></td>
  690. <td>用量:2</td>
  691. <td>元/个</td>
  692. <td><span class="res-val" id="sub_bearing">0</span></td>
  693. </tr>
  694. <tr class="cost-row">
  695. <td><b>机加件(轴/壳)</b></td>
  696. <td><input type="number" class="cost-input" id="price_mech" value="50" oninput="app.calculate()"></td>
  697. <td>CNC/压铸/3D打印</td>
  698. <td>元/套</td>
  699. <td><span class="res-val" id="sub_mech">0</span></td>
  700. </tr>
  701. <tr class="cost-row">
  702. <td><b>辅材/人工</b></td>
  703. <td><input type="number" class="cost-input" id="price_labor" value="25" oninput="app.calculate()"></td>
  704. <td>组装费</td>
  705. <td>元/台</td>
  706. <td><span class="res-val" id="sub_labor">0</span></td>
  707. </tr>
  708. <tr class="cost-total">
  709. <td colspan="4" style="text-align:right; padding-right:20px;">整机 BOM 预估总成本:</td>
  710. <td><span class="res-val" id="res_CostTotal">0</span> ¥</td>
  711. </tr>
  712. </tbody>
  713. </table>
  714. </div>
  715. </section>
  716. <section id="ipc" class="page-section">
  717. <div class="section-card">
  718. <h2>8. 载流校验与安全 (IPC-2152 Validation)</h2>
  719. <p style="color:#64748b; font-size:14px; margin-bottom:20px;">基于 IPC-2221/IPC-2152 标准,针对内层导体(最恶劣散热条件)计算载流能力。</p>
  720. <table>
  721. <thead>
  722. <tr>
  723. <th class="col-param">校验项目</th>
  724. <th class="col-sym">符号</th>
  725. <th class="col-val">结果/状态</th>
  726. <th class="col-unit">单位</th>
  727. <th class="col-form">阈值与逻辑</th>
  728. <th class="col-def">说明</th>
  729. </tr>
  730. </thead>
  731. <tbody>
  732. <tr>
  733. <td>IPC最大载流(10℃温升)</td>
  734. <td>I<sub>IPC10</sub></td>
  735. <td><span class="res-val" id="res_Iipc10">0</span></td>
  736. <td>A</td>
  737. <td>I = k · ΔT<sup>0.44</sup> · A<sup>0.725</sup></td>
  738. <td>保守运行条件下的最大电流 (k=0.024)</td>
  739. </tr>
  740. <tr>
  741. <td>IPC最大载流(40℃温升)</td>
  742. <td>I<sub>IPC40</sub></td>
  743. <td><span class="res-val" id="res_Iipc40">0</span></td>
  744. <td>A</td>
  745. <td>I = k · ΔT<sup>0.44</sup> · A<sup>0.725</sup></td>
  746. <td>常规设计温升上限对应的电流</td>
  747. </tr>
  748. <tr>
  749. <td>当前相电流</td>
  750. <td>I<sub>rms</sub></td>
  751. <td><span class="res-val" id="res_CheckIrms">0</span></td>
  752. <td>A</td>
  753. <td>Ref from Performance</td>
  754. <td>实际工作电流</td>
  755. </tr>
  756. <tr>
  757. <td><b>电流安全裕度</b></td>
  758. <td>Margin</td>
  759. <td><span id="res_IPCMargin">--</span></td>
  760. <td>-</td>
  761. <td>Compare I<sub>rms</sub> vs I<sub>IPC40</sub></td>
  762. <td>PASS: I<sub>rms</sub> < I<sub>IPC40</sub></td>
  763. </tr>
  764. <tr>
  765. <td><b>Tg 热失效风险</b></td>
  766. <td>Risk</td>
  767. <td><span id="res_TgRisk">--</span></td>
  768. <td>-</td>
  769. <td>T<sub>final</sub> vs (T<sub>g</sub> - 20)</td>
  770. <td>确保线圈温度低于材料Tg点至少20度</td>
  771. </tr>
  772. </tbody>
  773. </table>
  774. </div>
  775. </section>
  776. </main>
  777. </div>
  778. <script>
  779. /**
  780. * @namespace App
  781. * @description Core namespace for the Motor Design Application.
  782. */
  783. const App = (() => {
  784. const Config = {
  785. storageKey: 'drss_v10_design_data',
  786. magnets: {
  787. "ATMAX50SH": 1.425,
  788. "N35": 1.17,
  789. "N52": 1.45
  790. },
  791. physics: {
  792. k_ipc: 0.024,
  793. eddy_correction: 1.2,
  794. mu0: 4 * Math.PI * 1e-7, // 真空磁导率 H/m
  795. k_ind_geom: 0.45 // PCB绕组几何形状修正系数 (扁平线圈非理想螺线管)
  796. }
  797. };
  798. class PhysicsEngine {
  799. static calcGeometry(inputs) {
  800. // 1. 基础参数准备
  801. const t_base_mm = inputs.oz * 0.035; // 1oz = 0.035mm
  802. const t_plate_mm = inputs.t_plate_um / 1000;
  803. // 2. 复杂叠层厚度计算 (Stack-up Calculation Logic)
  804. let h_s = 0;
  805. let h_copper_total = 0;
  806. let h_mask_total = 2 * inputs.t_mask;
  807. // Resistance Calculation Variables
  808. const R_out = inputs.D_out / 2;
  809. const R_in = inputs.D_in / 2;
  810. const R_avg = (R_out + R_in) / 2;
  811. const tau_p = (Math.PI * 2 * R_avg / 1000) / (2 * inputs.p);
  812. const L_cond = (R_out - R_in) / 1000;
  813. // 假设所有层串联
  814. const N_ph = inputs.layers * inputs.turns;
  815. const L_turn = 2 * L_cond + 2 * (tau_p * inputs.k_end);
  816. const L_total = N_ph * L_turn;
  817. // 单层绕组长度
  818. const L_per_layer_total = inputs.turns * L_turn;
  819. // 电阻计算截面积
  820. // 外层:基铜 + 电镀
  821. const A_outer = inputs.w_tr * (t_base_mm + t_plate_mm);
  822. // 内层:仅基铜
  823. const A_inner = inputs.w_tr * t_base_mm;
  824. let R_20 = 0;
  825. if (inputs.layers <= 2) {
  826. // 双面板结构 (Mask - OutCu - Core - OutCu - Mask)
  827. const h_cu_outer = 2 * (t_base_mm + t_plate_mm);
  828. h_s = h_mask_total + h_cu_outer + inputs.t_core;
  829. h_copper_total = h_cu_outer;
  830. // 电阻计算 (全按外层算)
  831. R_20 = (inputs.rho_cu * L_total) / A_outer;
  832. } else {
  833. // 多层板结构 (N >= 4)
  834. // 结构:[Mask-OuterCu-PP] - [Core-InnerCu]... - [PP-OuterCu-Mask]
  835. const h_cu_outer = 2 * (t_base_mm + t_plate_mm);
  836. const h_cu_inner = (inputs.layers - 2) * t_base_mm;
  837. // 绝缘介质层: Core数 = N/2 - 1, PP数 = N/2
  838. const num_cores = (inputs.layers / 2) - 1;
  839. const num_pp = inputs.layers / 2;
  840. const h_dielectric = (num_cores * inputs.t_core) + (num_pp * inputs.t_pp);
  841. // 总厚度
  842. h_s = h_mask_total + h_cu_outer + h_cu_inner + h_dielectric;
  843. h_copper_total = h_cu_outer + h_cu_inner;
  844. // 精确电阻计算:分别计算外层和内层电阻然后叠加
  845. const R_outer_layer = (inputs.rho_cu * L_per_layer_total) / A_outer;
  846. const R_inner_layer = (inputs.rho_cu * L_per_layer_total) / A_inner;
  847. // 2层外层 + (N-2)层内层
  848. R_20 = (2 * R_outer_layer) + ((inputs.layers - 2) * R_inner_layer);
  849. }
  850. // 用于 IPC 计算的单层截面积 (取最恶劣情况:内层)
  851. const A_cu_worst = inputs.w_tr * t_base_mm;
  852. return {
  853. t_base_mm, t_plate_mm, h_s,
  854. R_out, R_in, R_avg, tau_p, L_cond, N_ph, L_turn, L_total,
  855. A_cu: A_cu_worst, // 导出给 IPC 模块使用
  856. R_20
  857. };
  858. }
  859. static calcMagnetic(inputs, geom) {
  860. // --- 核心定义:有效气隙 (Effective Gap) ---
  861. // 在DRSS结构中,磁通穿过两个机械气隙和定子厚度
  862. const g_eff = geom.h_s + 2 * inputs.g;
  863. const h_mag_tot = 2 * inputs.h_m;
  864. const PC = h_mag_tot / (g_eff * inputs.mu_r);
  865. // Airgap Flux Density
  866. const B_g = (h_mag_tot / (h_mag_tot + g_eff)) * inputs.Br;
  867. const R_out_m = geom.R_out / 1000;
  868. const R_in_m = geom.R_in / 1000;
  869. // Flux Linkage Area
  870. const A_annulus = Math.PI * (Math.pow(R_out_m, 2) - Math.pow(R_in_m, 2));
  871. const A_pole = (A_annulus / (2 * inputs.p)) * inputs.alpha_p;
  872. const A_pole_mm2 = A_pole * 1e6;
  873. // Flux per pole
  874. const Phi = B_g * A_pole * inputs.k_leak;
  875. return { g_eff, h_mag_tot, PC, B_g, A_pole, A_pole_mm2, Phi, A_annulus };
  876. }
  877. static calcPerformance(inputs, geom, mag) {
  878. const omega = inputs.n_nom * 2 * Math.PI / 60;
  879. const f_elec = inputs.n_nom * inputs.p / 60;
  880. // 1. Back-EMF (Standard RMS Calculation)
  881. // Correct Physics: E_rms = (2*PI/sqrt(2)) * f * N * Phi * kw
  882. // sqrt(2)*PI approx 4.44
  883. const E_rms = (Math.SQRT2 * Math.PI) * f_elec * geom.N_ph * mag.Phi * inputs.k_w;
  884. const Ke = E_rms / omega;
  885. const Kv = 9.55 / Ke;
  886. const T_nom = inputs.P_nom / omega;
  887. // 2. 电磁转矩常数 Kt = 3 * p * Ψ / √2,其中 Ψ = N_ph * Φ * k_w / √2
  888. const Psi = geom.N_ph * mag.Phi * inputs.k_w / Math.SQRT2;
  889. const Kt = 3 * inputs.p * Psi / Math.SQRT2;
  890. // 3. 耦合迭代计算电流、损耗和效率
  891. const iterativeResult = this.calcIterativePerformance(inputs, geom, mag, E_rms, T_nom, omega, f_elec);
  892. const I_rms = iterativeResult.I_rms;
  893. const J = I_rms / geom.A_cu;
  894. // --- DETAILED INDUCTANCE CALCULATION ---
  895. // 1. Magnetic Path Length for Inductance (一致性修正)
  896. // 直接引用 Section 3 计算的 mag.g_eff
  897. const g_total_m = mag.g_eff / 1000;
  898. // 2. Phase Area (Approx 1/3 of annulus)
  899. const A_phase_m2 = mag.A_annulus / 3;
  900. const A_phase_mm2 = A_phase_m2 * 1e6;
  901. // 3. Inductance Calculation
  902. const L_ph_H = (Config.physics.k_ind_geom * Config.physics.mu0 * Math.pow(geom.N_ph, 2) * A_phase_m2) / g_total_m;
  903. const L_ph_uH = L_ph_H * 1e6;
  904. // Electrical Time Constant
  905. const Tau_e_s = L_ph_H / geom.R_20;
  906. const Tau_e_us = Tau_e_s * 1e6;
  907. return {
  908. omega, f_elec, E_rms, Ke, Kv, T_nom, Kt,
  909. I_rms, J,
  910. L_ph_uH, Tau_e_us,
  911. A_phase_mm2,
  912. N_ph_sq: Math.pow(geom.N_ph, 2),
  913. // 迭代计算结果
  914. Pin: iterativeResult.Pin,
  915. PF: inputs.PF,
  916. eta: iterativeResult.eta * 100
  917. };
  918. }
  919. static calcIterativePerformance(inputs, geom, mag, E_rms, T_nom, omega, f_elec) {
  920. // 初始假设效率 85%
  921. let eta_guess = 0.85;
  922. let iterCount = 0;
  923. let I_rms, Pin, eta_final;
  924. do {
  925. // 输入电功率 = 输出机械功率 / 效率
  926. Pin = inputs.P_nom / eta_guess;
  927. // 相电流 (考虑功率因数)
  928. const PF = inputs.PF; // PCB轴向电机功率因数估计
  929. I_rms = Pin / (3 * E_rms * PF);
  930. // 计算此电流下的损耗(简化版本,实际应调用完整损耗模型)
  931. const T_coil_guess = inputs.T_amb + 40;
  932. const R_hot = geom.R_20 * (1 + inputs.alpha_cu * (T_coil_guess - 20));
  933. const P_cu = 3 * I_rms * I_rms * R_hot;
  934. // 估算其他损耗(简化处理)
  935. const w_m = inputs.w_tr / 1000;
  936. const Vol_cu_total = (geom.L_total * 3 * inputs.w_tr * geom.t_base_mm) / 1e6;
  937. 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);
  938. // 磁钢涡流损耗
  939. const t_mag_m = inputs.h_m / 1000;
  940. const Vol_mag = 2 * mag.A_pole * (2 * inputs.p) * t_mag_m;
  941. const k_harm = 0.04;
  942. const n_harm = 5;
  943. const B_ac = mag.B_g * k_harm;
  944. const f_eff = f_elec * n_harm;
  945. 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;
  946. const P_mag_eddy = Math.max(0, Math.min(P_mag_calc, inputs.P_nom * 0.02));
  947. // 机械损耗
  948. const R_out_m = geom.R_out / 1000;
  949. const R_in_m = geom.R_in / 1000;
  950. 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));
  951. const P_stray = inputs.P_nom * 0.008;
  952. const P_loss_total = P_cu + P_eddy_tr + P_mag_eddy + P_mech + P_stray;
  953. // 计算实际效率
  954. eta_final = inputs.P_nom / (inputs.P_nom + P_loss_total);
  955. // 更新效率猜测
  956. eta_guess = eta_guess * 0.7 + eta_final * 0.3; // 加权更新
  957. iterCount++;
  958. } while (Math.abs(eta_guess - eta_final) > 0.001 && iterCount < 20);
  959. // 最终电流计算使用最终效率
  960. Pin = inputs.P_nom / eta_final;
  961. I_rms = Pin / (3 * E_rms * inputs.PF);
  962. return { I_rms, Pin, eta: eta_final };
  963. }
  964. static calcLosses(inputs, geom, mag, perf) {
  965. let T_coil = inputs.T_amb + 40;
  966. let R_hot = geom.R_20;
  967. let P_cu_dc = 0, P_cu_ac = 0, P_eddy_tr = 0, P_mag_eddy = 0;
  968. let P_mech = 0, P_stray = 0, P_loss = 0;
  969. for(let iter = 0; iter < 4; iter++) {
  970. R_hot = geom.R_20 * (1 + inputs.alpha_cu * (T_coil - 20));
  971. P_cu_dc = 3 * Math.pow(perf.I_rms, 2) * R_hot;
  972. const k_ac_factor = 1 + Math.pow(perf.f_elec / 1200, 2);
  973. P_cu_ac = P_cu_dc * (k_ac_factor - 1);
  974. // --- PCB Eddy Current Loss ---
  975. const w_m = inputs.w_tr / 1000;
  976. const Vol_cu_total = (geom.L_total * 3 * inputs.w_tr * geom.t_base_mm) / 1e6;
  977. 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);
  978. // --- Magnet Eddy Current Loss ---
  979. const t_mag_m = inputs.h_m / 1000;
  980. const Vol_mag = 2 * mag.A_pole * (2 * inputs.p) * t_mag_m;
  981. const k_harm = 0.04;
  982. const n_harm = 5;
  983. const B_ac = mag.B_g * k_harm;
  984. const f_eff = perf.f_elec * n_harm;
  985. 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;
  986. P_mag_eddy = Math.max(0, Math.min(P_mag_calc, inputs.P_nom * 0.02));
  987. // --- Mechanical Loss ---
  988. const R_out_m = geom.R_out / 1000;
  989. const R_in_m = geom.R_in / 1000;
  990. 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));
  991. P_stray = inputs.P_nom * 0.008;
  992. P_loss = P_cu_dc + P_cu_ac + P_eddy_tr + P_mag_eddy + P_mech + P_stray;
  993. const A_surf = 2 * Math.PI * Math.pow(geom.R_out/1000, 2);
  994. const dT = P_loss / (inputs.h_conv * A_surf);
  995. T_coil = inputs.T_amb + dT;
  996. }
  997. const Eff = (inputs.P_nom / (inputs.P_nom + P_loss)) * 100;
  998. return { R_hot, P_cu_dc, P_cu_ac, P_eddy_tr, P_mag_eddy, P_mech, P_stray, P_loss, Eff, T_coil };
  999. }
  1000. static calcThermal(inputs, losses, geom) {
  1001. const A_surf = 2 * Math.PI * (Math.pow(geom.R_out/1000, 2) - Math.pow(geom.R_in/1000, 2));
  1002. const dT = losses.P_loss / (inputs.h_conv * A_surf);
  1003. const T_final = inputs.T_amb + dT;
  1004. return { A_surf, dT, T_final };
  1005. }
  1006. static calcCost(inputs, geom) {
  1007. const Area_ring_cm2 = Math.PI * (Math.pow(geom.R_out/10,2) - Math.pow(geom.R_in/10,2));
  1008. const Vol_mag_cm3 = (2 * Area_ring_cm2 * inputs.alpha_p * inputs.h_m) / 10;
  1009. const M_mag = (Vol_mag_cm3 * inputs.rho_mag) / 1000;
  1010. const Cost_Mag = M_mag * inputs.price_mag;
  1011. const Cost_PCB = inputs.price_pcb;
  1012. const Cost_Bear = inputs.price_bearing * 2;
  1013. const Cost_Mech = inputs.price_mech;
  1014. const Cost_Labor = inputs.price_labor;
  1015. const Cost_Total = Cost_Mag + Cost_PCB + Cost_Bear + Cost_Mech + Cost_Labor;
  1016. return { M_mag, Cost_Mag, Cost_PCB, Cost_Bear, Cost_Mech, Cost_Labor, Cost_Total };
  1017. }
  1018. static calcIPC(inputs, geom, perf, thermal) {
  1019. const A_mils = geom.A_cu * 1550.0;
  1020. const k = Config.physics.k_ipc;
  1021. const I_ipc10 = k * Math.pow(10, 0.44) * Math.pow(A_mils, 0.725);
  1022. const I_ipc40 = k * Math.pow(40, 0.44) * Math.pow(A_mils, 0.725);
  1023. let ipcStatus = perf.I_rms < I_ipc40 ? "PASS" : "WARNING";
  1024. let ipcClass = perf.I_rms < I_ipc40 ? "status-ok" : "status-warn";
  1025. let tgStatus = (inputs.Tg - thermal.T_final > 20) ? "OK" : "RISK";
  1026. let tgClass = (inputs.Tg - thermal.T_final > 20) ? "status-ok" : "status-warn";
  1027. return { I_ipc10, I_ipc40, ipcStatus, ipcClass, tgStatus, tgClass };
  1028. }
  1029. }
  1030. class Store {
  1031. static getInputs() {
  1032. const v = (id) => parseFloat(document.getElementById(id).value) || 0;
  1033. return {
  1034. P_nom: v('P_nom'), n_nom: v('n_nom'), V_dc: v('V_dc'), p: v('p'),
  1035. D_out: v('D_out'), D_in: v('D_in'), g: v('g_mech'), h_m: v('h_m'),
  1036. // --- PCB Stackup ---
  1037. layers: v('layers'),
  1038. oz: v('oz'),
  1039. t_plate_um: v('t_plate'),
  1040. t_core: v('t_core'),
  1041. t_pp: v('t_pp'),
  1042. t_mask: v('t_mask'),
  1043. turns: v('turns_layer'),
  1044. w_tr: v('w_trace'),
  1045. k_end: v('k_end'),
  1046. // -----------------------------
  1047. Br: v('Br'), mu_r: v('mu_r'), alpha_p: v('alpha_p'),
  1048. sigma_mag: v('sigma_mag'), rho_cu: v('rho_cu'), alpha_cu: v('alpha_cu'),
  1049. rho_mag: v('rho_mag'), rho_air: v('rho_air'), cf_fric: v('cf_fric'), Tg: v('Tg'),
  1050. k_leak: v('k_leak'), k_w: v('k_w'), PF: v('PF'), // 新增功率因数
  1051. h_conv: v('h_conv'), T_amb: v('T_amb'),
  1052. price_mag: v('price_mag'), price_pcb: v('price_pcb_unit'),
  1053. price_bearing: v('price_bearing'), price_mech: v('price_mech'), price_labor: v('price_labor'),
  1054. mag_grade: document.getElementById('mag_grade').value
  1055. };
  1056. }
  1057. static save(inputs) { localStorage.setItem(Config.storageKey, JSON.stringify(inputs)); }
  1058. static load() {
  1059. try {
  1060. const saved = localStorage.getItem(Config.storageKey);
  1061. if (!saved) return false;
  1062. const data = JSON.parse(saved);
  1063. Object.keys(data).forEach(key => {
  1064. const el = document.getElementById(key);
  1065. if (el) el.value = data[key];
  1066. });
  1067. return true;
  1068. } catch (e) { return false; }
  1069. }
  1070. }
  1071. class UIManager {
  1072. constructor() { this.exportData = []; }
  1073. updateView(data) {
  1074. const { inputs, geom, mag, perf, losses, thermal, cost, ipc } = data;
  1075. const set = (id, val, d=2) => { const el = document.getElementById(id); if(el) el.innerText = val.toFixed(d); };
  1076. const setHTML = (id, html) => { const el = document.getElementById(id); if(el) el.innerHTML = html; };
  1077. // HUD
  1078. set('hud_Pnom', inputs.P_nom, 0); set('hud_T', perf.T_nom, 2); set('hud_Eff', perf.eta, 1);
  1079. set('hud_Loss', losses.P_loss, 1); set('hud_Cost', cost.Cost_Total, 1); set('hud_Temp', thermal.T_final, 0);
  1080. setHTML('hud_IPC', `<span class="${ipc.ipcClass}">${ipc.ipcStatus}</span>`);
  1081. // Main Sections
  1082. set('res_hs', geom.h_s, 2); set('res_Ravg', geom.R_avg, 1); set('res_Nph', geom.N_ph, 0);
  1083. set('res_Ltot', geom.L_total, 2); set('res_R20', geom.R_20, 4); set('res_Rhot', losses.R_hot, 4);
  1084. set('res_geff', mag.g_eff, 2); set('res_PC', mag.PC, 3); set('res_Bg', mag.B_g, 3);
  1085. set('res_Apole', mag.A_pole_mm2, 0); set('res_Phi', mag.Phi, 6);
  1086. set('res_Erms', perf.E_rms, 2); set('res_Ke', perf.Ke, 4); set('res_Kv', perf.Kv, 0);
  1087. set('res_Tnom', perf.T_nom, 2); set('res_Kt', perf.Kt, 3);
  1088. set('res_Pin', perf.Pin, 1); set('res_Irms', perf.I_rms, 2); set('res_J', perf.J, 1);
  1089. set('res_PF', perf.PF, 2); set('res_Eff_perf', perf.eta, 1);
  1090. // 电感相关行
  1091. this.updateOrInsertRow('perf', '<b>相电感', 'L<sub>ph</sub>', perf.L_ph_uH, 'μH',
  1092. `L ≈ k·μ₀·N<sub>ph</sub>²·A<sub>ph</sub> / g<sub>eff</sub>`,
  1093. 'res_Lph',
  1094. `<span>k</span>:0.45(形状修正), <span>μ₀</span>:真空磁导率, <span>N<sub>ph</sub></span>:总匝数, <span>A<sub>ph</sub></span>:相面积`
  1095. );
  1096. this.updateOrInsertRow('perf', '└─ 线圈磁路气隙', 'g<sub>eff</sub>', mag.g_eff, 'mm',
  1097. `g<sub>eff</sub> = h<sub>s</sub> + 2g`,
  1098. 'res_g_coil',
  1099. `<span>h<sub>s</sub></span>:定子厚, <span>g</span>:单侧气隙`
  1100. );
  1101. this.updateOrInsertRow('perf', '└─ 单相有效面积', 'A<sub>ph</sub>', perf.A_phase_mm2, 'mm²',
  1102. `A<sub>ph</sub> ≈ A<sub>ring</sub> / 3`,
  1103. 'res_Aph',
  1104. `<span>A<sub>ring</sub></span>:定子圆环总面积 (假设三相均分)`
  1105. );
  1106. this.updateOrInsertRow('perf', '<b>电气时间常数', 'τ<sub>e</sub>', perf.Tau_e_us, 'μs',
  1107. `τ<sub>e</sub> = L<sub>ph</sub> / R<sub>20</sub>`,
  1108. 'res_Taue',
  1109. `<span>L<sub>ph</sub></span>:相电感, <span>R<sub>20</sub></span>:冷态电阻`
  1110. );
  1111. set('res_Pcu_dc', losses.P_cu_dc, 1); set('res_Pcu_ac', losses.P_cu_ac, 1);
  1112. set('res_Peddy', losses.P_eddy_tr, 1); set('res_Pmag_eddy', losses.P_mag_eddy, 2);
  1113. set('res_Pmech', losses.P_mech, 1); set('res_Pstray', losses.P_stray, 1);
  1114. set('res_Ploss', losses.P_loss, 1); set('res_Eff', losses.Eff, 1);
  1115. set('res_Asurf', thermal.A_surf, 4); set('res_dT', thermal.dT, 1); set('res_Tfinal', thermal.T_final, 1);
  1116. set('res_Mmag', cost.M_mag, 3); set('sub_mag', cost.Cost_Mag, 1); set('sub_pcb', cost.Cost_PCB, 1);
  1117. set('sub_bearing', cost.Cost_Bear, 1); set('sub_mech', cost.Cost_Mech, 1);
  1118. set('sub_labor', cost.Cost_Labor, 1); set('res_CostTotal', cost.Cost_Total, 1);
  1119. set('res_Iipc10', ipc.I_ipc10, 2); set('res_Iipc40', ipc.I_ipc40, 2); set('res_CheckIrms', perf.I_rms, 2);
  1120. setHTML('res_IPCMargin', `<span class="${ipc.ipcClass}">${ipc.ipcStatus}</span>`);
  1121. setHTML('res_TgRisk', `<span class="${ipc.tgClass}">${ipc.tgStatus}</span>`);
  1122. this.exportData = [
  1123. {cat:"Input", name:"额定功率", sym:"P_nom", val:inputs.P_nom, unit:"W"},
  1124. {cat:"Performance", name:"输入电功率", sym:"P_in", val:perf.Pin, unit:"W"},
  1125. {cat:"Performance", name:"电机效率", sym:"eta", val:perf.eta, unit:"%"},
  1126. {cat:"Performance", name:"功率因数", sym:"PF", val:perf.PF, unit:""},
  1127. {cat:"Magnetic", name:"气隙磁密Bg", sym:"B_g", val:mag.B_g, unit:"T"},
  1128. {cat:"Performance", name:"相电动势RMS", sym:"E_rms", val:perf.E_rms, unit:"V"},
  1129. {cat:"Performance", name:"相电流RMS", sym:"I_rms", val:perf.I_rms, unit:"A"},
  1130. {cat:"Performance", name:"转矩常数", sym:"K_t", val:perf.Kt, unit:"Nm/A"},
  1131. {cat:"Dynamics", name:"相电感", sym:"L_ph", val:perf.L_ph_uH, unit:"uH"},
  1132. {cat:"Dynamics", name:"有效气隙", sym:"g_eff", val:mag.g_eff, unit:"mm"},
  1133. {cat:"Dynamics", name:"电气时间常数", sym:"Tau_e", val:perf.Tau_e_us, unit:"us"},
  1134. {cat:"Loss", name:"直流铜损", sym:"P_cu_dc", val:losses.P_cu_dc, unit:"W"},
  1135. {cat:"Loss", name:"总损耗", sym:"P_loss", val:losses.P_loss, unit:"W"},
  1136. {cat:"Cost", name:"总成本", sym:"Total", val:cost.Cost_Total, unit:"RMB"}
  1137. ];
  1138. this.animateSaveStatus();
  1139. }
  1140. // Enhanced helper to inject detailed rows
  1141. updateOrInsertRow(sectionId, name, sym, val, unit, formula, valId, defText) {
  1142. let el = document.getElementById(valId);
  1143. // If row doesn't exist, create it dynamically
  1144. if (!el) {
  1145. const tbody = document.querySelector(`#${sectionId} tbody`);
  1146. const tr = document.createElement('tr');
  1147. // Add subtle background for sub-items
  1148. if(name.includes('└─')) tr.style.backgroundColor = "#f8fafc";
  1149. tr.innerHTML = `
  1150. <td>${name}</td>
  1151. <td class="col-sym">${sym}</td>
  1152. <td><span class="res-val" id="${valId}">0</span></td>
  1153. <td>${unit}</td>
  1154. <td class="col-form" style="font-size:13px;">${formula}</td>
  1155. <td class="col-def" style="font-size:12px; color:#64748b;">${defText || ''}</td>
  1156. `;
  1157. tbody.appendChild(tr);
  1158. el = document.getElementById(valId);
  1159. }
  1160. // Update value
  1161. el.innerText = val.toFixed(1);
  1162. }
  1163. animateSaveStatus() {
  1164. const statusEl = document.getElementById('saveStatus');
  1165. statusEl.innerText = "保存中...";
  1166. statusEl.className = "save-status show saving";
  1167. setTimeout(() => {
  1168. statusEl.innerText = "已自动保存";
  1169. statusEl.className = "save-status show";
  1170. setTimeout(() => { statusEl.classList.remove('show'); }, 2000);
  1171. }, 300);
  1172. }
  1173. updateMagGrade() {
  1174. const sel = document.getElementById("mag_grade");
  1175. const val = sel.value;
  1176. const brInput = document.getElementById("Br");
  1177. if (val === "custom") {
  1178. brInput.readOnly = false;
  1179. brInput.style.backgroundColor = "#fffbf0";
  1180. } else {
  1181. if (Config.magnets[val]) { brInput.value = Config.magnets[val]; app.calculate(); }
  1182. brInput.readOnly = true; brInput.style.backgroundColor = "#f1f5f9";
  1183. }
  1184. }
  1185. nav(pageId) {
  1186. document.querySelectorAll('.page-section').forEach(el => el.classList.remove('active'));
  1187. document.getElementById(pageId).classList.add('active');
  1188. document.querySelectorAll('.nav-btn').forEach(el => el.classList.remove('active'));
  1189. const buttons = document.querySelectorAll('.nav-btn');
  1190. for (let btn of buttons) { if(btn.getAttribute('onclick').includes(pageId)) btn.classList.add('active'); }
  1191. }
  1192. exportExcel() {
  1193. let csvContent = "data:text/csv;charset=utf-8,\uFEFF";
  1194. csvContent += "Category,Parameter,Symbol,Value,Unit\n";
  1195. this.exportData.forEach(row => {
  1196. const v = (typeof row.val === 'number') ? row.val.toFixed(4) : row.val;
  1197. csvContent += `${row.cat},${row.name},${row.sym},${v},${row.unit}\n`;
  1198. });
  1199. const link = document.createElement("a");
  1200. link.setAttribute("href", encodeURI(csvContent));
  1201. link.setAttribute("download", "Motor_Design_Report.csv");
  1202. document.body.appendChild(link); link.click(); document.body.removeChild(link);
  1203. }
  1204. }
  1205. class Application {
  1206. constructor() { this.ui = new UIManager(); }
  1207. init() { Store.load(); this.ui.updateMagGrade(); this.calculate(); }
  1208. calculate() {
  1209. const inputs = Store.getInputs();
  1210. const geom = PhysicsEngine.calcGeometry(inputs);
  1211. const mag = PhysicsEngine.calcMagnetic(inputs, geom);
  1212. const perf = PhysicsEngine.calcPerformance(inputs, geom, mag);
  1213. const losses = PhysicsEngine.calcLosses(inputs, geom, mag, perf);
  1214. const thermal = PhysicsEngine.calcThermal(inputs, losses, geom);
  1215. const cost = PhysicsEngine.calcCost(inputs, geom);
  1216. const ipc = PhysicsEngine.calcIPC(inputs, geom, perf, thermal);
  1217. this.ui.updateView({ inputs, geom, mag, perf, losses, thermal, cost, ipc });
  1218. Store.save(inputs);
  1219. }
  1220. }
  1221. return new Application();
  1222. })();
  1223. window.onload = () => App.init();
  1224. window.app = App;
  1225. </script>
  1226. </body>
  1227. </html>