@jjlmoya/utils-hardware 1.26.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/usbPowerBudgetCalculator/bibliography.astro +14 -0
- package/src/tool/usbPowerBudgetCalculator/bibliography.ts +16 -0
- package/src/tool/usbPowerBudgetCalculator/component.astro +266 -0
- package/src/tool/usbPowerBudgetCalculator/entry.ts +29 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/de.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/en.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/es.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/fr.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/id.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/it.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/ja.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/ko.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/nl.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/pl.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/pt.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/ru.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/sv.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/tr.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/i18n/zh.ts +169 -0
- package/src/tool/usbPowerBudgetCalculator/index.ts +11 -0
- package/src/tool/usbPowerBudgetCalculator/logic.ts +81 -0
- package/src/tool/usbPowerBudgetCalculator/seo.astro +15 -0
- package/src/tool/usbPowerBudgetCalculator/ui.ts +32 -0
- package/src/tool/usbPowerBudgetCalculator/usb-power-budget-calculator.css +484 -0
- package/src/tools.ts +2 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { UsbPowerBudgetCalculatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'usb-guc-butcesi-hesaplayici';
|
|
7
|
+
const title = 'USB Güç Bütçesi Hesaplayıcı';
|
|
8
|
+
const description = 'Bir USB portunun, şarj cihazının, hub\'ın, kablonun veya USB-C PD profilinin, rezerv payı ve kablo voltaj düşümü sonrası cihazlarınıza güvenle güç sağlayıp sağlayamayacağını kontrol edin.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Bir USB portunun cihazımı çalıştırabileceğini nasıl anlarım?',
|
|
13
|
+
answer: 'Toplam cihaz watt değerini USB kaynak watt değeriyle karşılaştırın, ardından rezerv payı ayırın ve kablo voltaj düşümünü tahmin edin. Kablo uzun, ince veya 5 voltta yüksek akım taşıyorsa, nominal watt yüksek görünse bile bir kurulum başarısız olabilir.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'USB gücü için kablo uzunluğu neden önemlidir?',
|
|
17
|
+
answer: 'Bakırdan akan akım voltaj düşümü oluşturur. Uzun kablolar ve ince iletkenler daha fazla dirence sahiptir, bu nedenle cihaz şarj cihazının sağladığından daha az voltaj alabilir. Bu özellikle Raspberry Pi kartları, sabit diskler, LED şeritler, dock\'lar ve veri yolundan beslenen hub\'lar için önemlidir.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Hangi rezerv payını kullanmalıyım?',
|
|
21
|
+
answer: 'Normal elektronik için en az yüzde 20, motorlar, sürücüler, radyolar veya ani yüklü kartlar için yüzde 30 ve adaptör kalitesi bilinmiyorsa veya cihaz sürekli çalışması gerekiyorsa daha fazlasını kullanın.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Bu, USB-C PD görüşme testlerinin yerini alabilir mi?',
|
|
25
|
+
answer: 'Hayır. Hesaplayıcı elektriksel bütçeyi kontrol eder. Bir şarj cihazının, kablo e-işaretleyicisinin, cihazın veya hub\'ın belirli bir Power Delivery profilini gerçekten görüşüp görüşmediğini doğrulamaz.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const howToData = [
|
|
30
|
+
{ name: 'Bir kaynak profili seçin', text: 'Yaygın bir USB veya USB-C PD profili seçin veya voltaj ve akımı manuel olarak düzenleyin.' },
|
|
31
|
+
{ name: 'Kabloyu tanımlayın', text: 'Kablo uzunluğunu ve iletken kalınlığını girin. Yüksek AWG numaralı ince teller daha fazla voltaj düşümüne neden olur.' },
|
|
32
|
+
{ name: 'Yükü ekleyin', text: 'Watt cinsinden bir cihaz yükü ve aynı kaynağı paylaşan cihaz sayısını girin.' },
|
|
33
|
+
{ name: 'Durumu okuyun', text: 'Kurulumun güvenli olup olmadığına karar vermek için durum, kablo düşümü, son voltaj, kullanım ve rezerv payını kullanın.' },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
37
|
+
'@context': 'https://schema.org',
|
|
38
|
+
'@type': 'FAQPage',
|
|
39
|
+
mainEntity: faqData.map((item) => ({
|
|
40
|
+
'@type': 'Question',
|
|
41
|
+
name: item.question,
|
|
42
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const howToSchema: WithContext<HowTo> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'HowTo',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
step: howToData.map((step, i) => ({
|
|
52
|
+
'@type': 'HowToStep',
|
|
53
|
+
position: i + 1,
|
|
54
|
+
name: step.name,
|
|
55
|
+
text: step.text,
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
60
|
+
'@context': 'https://schema.org',
|
|
61
|
+
'@type': 'SoftwareApplication',
|
|
62
|
+
name: title,
|
|
63
|
+
description,
|
|
64
|
+
applicationCategory: 'UtilityApplication',
|
|
65
|
+
operatingSystem: 'All',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
67
|
+
inLanguage: 'tr',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const content: ToolLocaleContent<UsbPowerBudgetCalculatorUI> = {
|
|
71
|
+
slug,
|
|
72
|
+
title,
|
|
73
|
+
description,
|
|
74
|
+
faq: faqData,
|
|
75
|
+
howTo: howToData,
|
|
76
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
77
|
+
bibliography,
|
|
78
|
+
seo: [
|
|
79
|
+
{ type: 'title', text: 'USB gücü bir bütçedir, etiket değil', level: 2 },
|
|
80
|
+
{
|
|
81
|
+
type: 'paragraph',
|
|
82
|
+
html: '15 W, 45 W veya 100 W olarak işaretlenmiş bir USB şarj cihazı, kaynağın doğru koşullar altında neler sunabileceğini açıklar. Cihazınız yalnızca protokol görüşmesi, akım sınırları, kablo direnci, konnektör kalitesi, hub kayıpları ve yük ani yükselmelerinden sonraki sonucu görür. Bu hesaplayıcı pratik elektrik sorusuna odaklanır: kablo düşümü ve rezerv marjı sonrası, çalıştırmak istediğiniz donanım için yeterli güç kaldı mı?',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: 'stats',
|
|
86
|
+
items: [
|
|
87
|
+
{ label: 'USB 2.0 varsayılan akım', value: '0,5 A' },
|
|
88
|
+
{ label: '5 V\'ta USB-C varsayılan maksimum', value: '3 A' },
|
|
89
|
+
{ label: 'Önerilen rezerv', value: '%20+' },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
{ type: 'title', text: 'Sonuç nasıl yorumlanır', level: 3 },
|
|
93
|
+
{
|
|
94
|
+
type: 'table',
|
|
95
|
+
headers: ['Durum', 'Anlamı', 'En iyi sonraki adım'],
|
|
96
|
+
rows: [
|
|
97
|
+
['Güvenli', 'Yük, seçilen rezervden sonra kaynak değerinin içine sığar ve tahmini cihaz voltajı sağlıklı kalır.', 'Kurulumu kullanın, ancak adaptör küçük veya kapalıysa ısıya dikkat edin.'],
|
|
98
|
+
['Sıkışık', 'Yük, ayrılmış limite yakın veya kablo düşümü anlamlı hale geliyor.', 'Kabloyu kısaltın, daha kalın iletkenler seçin, yükü azaltın veya daha yüksek bir güç profiline geçin.'],
|
|
99
|
+
['Bütçe aşımı', 'Yük, kullanılabilir kaynak gücünü aşıyor veya cihaz tarafı voltajı muhtemelen çok düşük.', 'Daha güçlü bir şarj cihazı, güçlü hub, daha kısa kablo veya daha yüksek bir USB-C PD voltajı görüşen bir cihaz kullanın.'],
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'diagnostic',
|
|
104
|
+
variant: 'warning',
|
|
105
|
+
title: 'Watt yeterli olduğunda ancak cihaz hâlâ sıfırlanıyorsa',
|
|
106
|
+
html: '<p>Başlangıç akımı, bir cihaz etiketinde yazılı ortalama watt değerinden çok daha yüksek olabilir. Bir 5 V kaynağı, aynı watt değeri için bir 20 V PD profilinden daha hızlı voltaj kaybeder çünkü daha fazla akım taşıması gerekir. Birçok düşük maliyetli kablo, dış kılıfı kalın görünse bile ince güç iletkenleri kullanır ve veri yolundan beslenen hub\'lar bir üst akım bütçesini her alt akım cihazı arasında paylaştırır.</p>',
|
|
107
|
+
},
|
|
108
|
+
{ type: 'title', text: 'Kablo voltaj düşümü basit terimlerle', level: 3 },
|
|
109
|
+
{
|
|
110
|
+
type: 'paragraph',
|
|
111
|
+
html: 'Voltaj düşümü, akım kablo direncinden aktığında oluşan kayıptır. USB gücünde güç yolunda iki iletken bulunur, bu nedenle hesaplayıcı gidiş-dönüş uzunluğunu kullanır. Bir metre kablo, güç döngüsü için elektriksel olarak iki metre bakırdır. Daha düşük AWG numaraları daha kalındır ve genellikle yüksek akım yükleri için daha iyidir.',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'comparative',
|
|
115
|
+
items: [
|
|
116
|
+
{ title: 'Kısa kalın kablo', description: 'Raspberry Pi kartları, SSD muhafazaları, geliştirme kitleri ve ani akım çeken USB-C dock\'lar için en iyisidir.' },
|
|
117
|
+
{ title: 'Uzun ince kablo', description: 'Düşük güç sensörleri veya yavaş şarj için kabul edilebilir, ancak sürücüler, LED yükleri ve hesaplama kartları için risklidir.' },
|
|
118
|
+
{ title: 'Daha yüksek voltaj PD', description: 'Aynı watt değeri için akımı azaltır, bu da kablo kaybını düşürür, ancak yalnızca kaynak, kablo ve cihaz bunu görüşürse.' },
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'tip',
|
|
123
|
+
title: 'Pratik kural',
|
|
124
|
+
html: 'Hesaplayıcı kurulumun sıkışık olduğunu söylüyorsa, bunu bir saha uyarısı olarak kabul edin. USB arızaları genellikle net bir güç sorunu gibi görünmeden önce rastgele bağlantı kopmaları, voltaj düşmeleri, yavaş şarj, parazitli ses veya depolama hataları olarak ortaya çıkar.',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'summary',
|
|
128
|
+
title: 'Bu hesaplayıcı en çok ne için uygundur',
|
|
129
|
+
items: [
|
|
130
|
+
'USB hub\'ları, tek kartlı bilgisayarları, harici sürücüleri, geliştirme kartlarını, ışıkları, fanları ve küçük laboratuvar kurulumlarını planlama.',
|
|
131
|
+
'USB 2.0, USB 3.x, USB-C ve USB Power Delivery kaynak profillerini karşılaştırma.',
|
|
132
|
+
'Bir kablonun bir yük için çok uzun veya çok ince olup olmadığını tahmin etme.',
|
|
133
|
+
'Bir şarj cihazı veya güçlü hub satın almadan önce makul bir rezerv seçme.',
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
ui: {
|
|
138
|
+
profileLabel: 'USB kaynak profili',
|
|
139
|
+
metricUnits: 'Metrik',
|
|
140
|
+
imperialUnits: 'ABD',
|
|
141
|
+
voltageLabel: 'Kaynak voltajı (V)',
|
|
142
|
+
currentLabel: 'Kaynak akımı (A)',
|
|
143
|
+
cableLengthLabel: 'Kablo uzunluğu',
|
|
144
|
+
wireGaugeLabel: 'Güç teli kalınlığı',
|
|
145
|
+
deviceLoadLabel: 'Cihaz başına yük (W)',
|
|
146
|
+
devicesLabel: 'Cihazlar',
|
|
147
|
+
headroomLabel: 'Rezerv payı (%)',
|
|
148
|
+
sourcePower: 'Kaynak gücü',
|
|
149
|
+
requiredPower: 'Gereken güç',
|
|
150
|
+
cableDrop: 'Kablo düşümü',
|
|
151
|
+
deviceVoltage: 'Cihaz voltajı',
|
|
152
|
+
headroom: 'Rezerv',
|
|
153
|
+
utilization: 'Kullanım',
|
|
154
|
+
safeStatus: 'Güç bütçesi güvenli görünüyor',
|
|
155
|
+
tightStatus: 'Güç bütçesi sıkışık',
|
|
156
|
+
overStatus: 'Bütçe aşımı veya voltaj düşümü riski',
|
|
157
|
+
safeAdvice: 'Yük seçilen rezervle uyumludur. Kaliteli bir kablo kullanın ve uzun çalışmalarda ısıyı kontrol edin.',
|
|
158
|
+
tightAdvice: 'Limite yakınsınız. Kablo uzunluğunu azaltın, daha kalın iletkenler kullanın, yükü düşürün veya daha güçlü bir profil seçin.',
|
|
159
|
+
overAdvice: 'Bu kurulumun voltaj düşmesi veya kısıtlama yaşaması muhtemeldir. Güçlü bir hub, daha güçlü adaptör veya daha yüksek voltajlı bir USB-C PD profili kullanın.',
|
|
160
|
+
busLane: 'USB kaynağı',
|
|
161
|
+
loadLane: 'Cihaz yükü',
|
|
162
|
+
cableLane: 'düşüm',
|
|
163
|
+
boardEyebrow: 'Canlı USB güç yolu',
|
|
164
|
+
sourceSocket: 'Besleme soketi',
|
|
165
|
+
deviceSocket: 'Donanım yükü',
|
|
166
|
+
energyFlow: 'enerji akışı',
|
|
167
|
+
reservedLabel: 'rezerv sonrası kullanılabilir',
|
|
168
|
+
},
|
|
169
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { UsbPowerBudgetCalculatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'usb-power-budget-calculator';
|
|
7
|
+
const title = 'USB 功率预算计算器';
|
|
8
|
+
const description = '检查USB端口、充电器、集线器、线缆或USB-C PD协议是否能在预留余量和线缆压降之后安全地为您的设备供电。';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '如何知道USB端口能否为我的设备供电?',
|
|
13
|
+
answer: '将设备总功率与USB电源功率进行比较,预留余量并估算线缆压降。当线缆较长、较细或在5伏电压下传输较大电流时,即便标称功率看起来很高,配置也可能失败。',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: '为什么线缆长度对USB供电很重要?',
|
|
17
|
+
answer: '电流流经铜线会产生压降。长线缆和细导体的电阻更大,因此设备接收到的电压可能低于充电器提供的电压。这对树莓派开发板、硬盘、LED灯带、扩展坞和总线供电集线器尤为重要。',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: '应该使用多大的余量?',
|
|
21
|
+
answer: '普通电子设备至少使用20%,电机、驱动器、无线电或具有突发负载的开发板使用30%,如果适配器质量未知或设备需要连续运行,则需要更多的余量。',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: '这能替代USB-C PD协商测试吗?',
|
|
25
|
+
answer: '不能。计算器检查电气预算,不验证充电器、线缆e-marker、设备或集线器是否实际协商了特定的Power Delivery协议。',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const howToData = [
|
|
30
|
+
{ name: '选择电源协议', text: '选择常见的USB或USB-C PD协议,或手动编辑电压和电流。' },
|
|
31
|
+
{ name: '描述线缆', text: '输入线缆长度和导体线规。高AWG号的细线会导致更大的压降。' },
|
|
32
|
+
{ name: '添加负载', text: '输入单个设备负载(瓦特)和共享同一电源的设备数量。' },
|
|
33
|
+
{ name: '读取状态', text: '使用状态、线缆压降、最终电压、利用率和余量来决定配置是否安全。' },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
37
|
+
'@context': 'https://schema.org',
|
|
38
|
+
'@type': 'FAQPage',
|
|
39
|
+
mainEntity: faqData.map((item) => ({
|
|
40
|
+
'@type': 'Question',
|
|
41
|
+
name: item.question,
|
|
42
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const howToSchema: WithContext<HowTo> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'HowTo',
|
|
49
|
+
name: title,
|
|
50
|
+
description,
|
|
51
|
+
step: howToData.map((step, i) => ({
|
|
52
|
+
'@type': 'HowToStep',
|
|
53
|
+
position: i + 1,
|
|
54
|
+
name: step.name,
|
|
55
|
+
text: step.text,
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
60
|
+
'@context': 'https://schema.org',
|
|
61
|
+
'@type': 'SoftwareApplication',
|
|
62
|
+
name: title,
|
|
63
|
+
description,
|
|
64
|
+
applicationCategory: 'UtilityApplication',
|
|
65
|
+
operatingSystem: 'All',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
67
|
+
inLanguage: 'zh',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const content: ToolLocaleContent<UsbPowerBudgetCalculatorUI> = {
|
|
71
|
+
slug,
|
|
72
|
+
title,
|
|
73
|
+
description,
|
|
74
|
+
faq: faqData,
|
|
75
|
+
howTo: howToData,
|
|
76
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
77
|
+
bibliography,
|
|
78
|
+
seo: [
|
|
79
|
+
{ type: 'title', text: 'USB供电是预算,不是标签', level: 2 },
|
|
80
|
+
{
|
|
81
|
+
type: 'paragraph',
|
|
82
|
+
html: '标有15W、45W或100W的USB充电器描述的是电源在合适条件下能够提供的功率。您的设备只能看到经过协议协商、电流限制、线缆电阻、连接器质量、集线器损耗和负载峰值之后的结果。此计算器关注实际的电气问题:在线缆压降和预留余量之后,是否还有足够的功率来运行您想要的硬件?',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: 'stats',
|
|
86
|
+
items: [
|
|
87
|
+
{ label: 'USB 2.0 默认电流', value: '0.5 A' },
|
|
88
|
+
{ label: 'USB-C 5V 默认最大值', value: '3 A' },
|
|
89
|
+
{ label: '建议预留', value: '20%+' },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
{ type: 'title', text: '如何解读结果', level: 3 },
|
|
93
|
+
{
|
|
94
|
+
type: 'table',
|
|
95
|
+
headers: ['状态', '含义', '最佳下一步'],
|
|
96
|
+
rows: [
|
|
97
|
+
['安全', '负载在选定的预留余量后符合电源额定值,且估算的设备电压保持正常。', '使用此配置,但如果适配器较小或封闭,请注意散热。'],
|
|
98
|
+
['紧张', '负载接近预留限制,或线缆压降开始变得显著。', '缩短线缆、选择更粗的导体、降低负载,或切换到更高的功率协议。'],
|
|
99
|
+
['超出预算', '负载超出可用电源功率,或设备端电压可能过低。', '使用更强的充电器、带供电的集线器、更短的线缆,或使用能协商更高USB-C PD电压的设备。'],
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'diagnostic',
|
|
104
|
+
variant: 'warning',
|
|
105
|
+
title: '瓦数足够但设备仍然重启时',
|
|
106
|
+
html: '<p>启动电流可能远高于设备标签上印的平均瓦数。在相同瓦数下,5V电源比20V PD协议更快损失电压,因为它必须承载更大的电流。许多低成本线缆即使外皮看起来很厚,也使用细的电源导体,而总线供电集线器在所有下游设备之间共享一个上游预算。</p>',
|
|
107
|
+
},
|
|
108
|
+
{ type: 'title', text: '线缆压降简明解释', level: 3 },
|
|
109
|
+
{
|
|
110
|
+
type: 'paragraph',
|
|
111
|
+
html: '压降是电流流经线缆电阻时产生的损耗。USB供电在电源路径中有两个导体,因此计算器使用往返长度。一米长的线缆在电源回路中电气上相当于两米的铜。AWG号越小越粗,通常更适合大电流负载。',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'comparative',
|
|
115
|
+
items: [
|
|
116
|
+
{ title: '短粗线缆', description: '最适合树莓派开发板、SSD外壳、开发套件和具有突发电流需求的USB-C扩展坞。' },
|
|
117
|
+
{ title: '长细线缆', description: '可接受用于低功耗传感器或慢速充电,但对驱动器、LED负载和计算开发板有风险。' },
|
|
118
|
+
{ title: '更高电压PD', description: '在相同瓦数下降低电流,从而降低线缆损耗,但前提是电源、线缆和设备能协商。' },
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'tip',
|
|
123
|
+
title: '实用规则',
|
|
124
|
+
html: '如果计算器显示配置紧张,请将其视为现场警告。USB故障通常在表现为明显的电源问题之前,以随机断开、欠压、慢速充电、音频噪声或存储错误的形式出现。',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'summary',
|
|
128
|
+
title: '此计算器最适合',
|
|
129
|
+
items: [
|
|
130
|
+
'规划USB集线器、单板计算机、外置硬盘、开发板、灯具、风扇和小型实验室设置。',
|
|
131
|
+
'比较USB 2.0、USB 3.x、USB-C和USB Power Delivery电源协议。',
|
|
132
|
+
'估算线缆对于负载是否太长或太细。',
|
|
133
|
+
'在购买充电器或带供电的集线器之前选择合理的预留余量。',
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
ui: {
|
|
138
|
+
profileLabel: 'USB电源协议',
|
|
139
|
+
metricUnits: '公制',
|
|
140
|
+
imperialUnits: '美制',
|
|
141
|
+
voltageLabel: '电源电压 (V)',
|
|
142
|
+
currentLabel: '电源电流 (A)',
|
|
143
|
+
cableLengthLabel: '线缆长度',
|
|
144
|
+
wireGaugeLabel: '电源线规格',
|
|
145
|
+
deviceLoadLabel: '每设备负载 (W)',
|
|
146
|
+
devicesLabel: '设备数',
|
|
147
|
+
headroomLabel: '预留余量 (%)',
|
|
148
|
+
sourcePower: '电源功率',
|
|
149
|
+
requiredPower: '所需功率',
|
|
150
|
+
cableDrop: '线缆压降',
|
|
151
|
+
deviceVoltage: '设备电压',
|
|
152
|
+
headroom: '余量',
|
|
153
|
+
utilization: '利用率',
|
|
154
|
+
safeStatus: '功率预算看起来安全',
|
|
155
|
+
tightStatus: '功率预算紧张',
|
|
156
|
+
overStatus: '超出预算或存在压降风险',
|
|
157
|
+
safeAdvice: '负载在选定余量内合适。使用优质线缆,长时间运行时检查热量。',
|
|
158
|
+
tightAdvice: '您接近极限。减少线缆长度、使用更粗的导体、降低负载或选择更强的协议。',
|
|
159
|
+
overAdvice: '此配置可能发生欠压或降频。使用带供电的集线器、更强的适配器或更高电压的USB-C PD协议。',
|
|
160
|
+
busLane: 'USB电源',
|
|
161
|
+
loadLane: '设备负载',
|
|
162
|
+
cableLane: '压降',
|
|
163
|
+
boardEyebrow: '实时USB电源路径',
|
|
164
|
+
sourceSocket: '电源插座',
|
|
165
|
+
deviceSocket: '硬件负载',
|
|
166
|
+
energyFlow: '能量流',
|
|
167
|
+
reservedLabel: '预留后可用',
|
|
168
|
+
},
|
|
169
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { usbPowerBudgetCalculator } from './entry';
|
|
2
|
+
import type { ToolDefinition } from '../../types';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const USB_POWER_BUDGET_CALCULATOR_TOOL: ToolDefinition = {
|
|
7
|
+
entry: usbPowerBudgetCalculator,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type UsbPowerProfile = 'usb2' | 'usb3' | 'bc12' | 'usbC15' | 'usbC27' | 'pd45' | 'pd65' | 'pd100';
|
|
2
|
+
|
|
3
|
+
export interface UsbPowerInput {
|
|
4
|
+
sourceVoltage: number;
|
|
5
|
+
sourceCurrent: number;
|
|
6
|
+
cableLengthMeters: number;
|
|
7
|
+
wireGaugeAwg: number;
|
|
8
|
+
deviceLoadWatts: number;
|
|
9
|
+
devices: number;
|
|
10
|
+
headroomPercent: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UsbPowerResult {
|
|
14
|
+
sourceWatts: number;
|
|
15
|
+
requiredWatts: number;
|
|
16
|
+
availableWatts: number;
|
|
17
|
+
headroomWatts: number;
|
|
18
|
+
cableDropVolts: number;
|
|
19
|
+
deviceEndVoltage: number;
|
|
20
|
+
utilizationPercent: number;
|
|
21
|
+
status: 'safe' | 'tight' | 'over';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const usbPowerProfiles: Record<UsbPowerProfile, { label: string; voltage: number; current: number }> = {
|
|
25
|
+
usb2: { label: 'USB 2.0 500 mA', voltage: 5, current: 0.5 },
|
|
26
|
+
usb3: { label: 'USB 3.x 900 mA', voltage: 5, current: 0.9 },
|
|
27
|
+
bc12: { label: 'BC 1.2 1.5 A', voltage: 5, current: 1.5 },
|
|
28
|
+
usbC15: { label: 'USB-C 15 W', voltage: 5, current: 3 },
|
|
29
|
+
usbC27: { label: 'USB-C 27 W', voltage: 9, current: 3 },
|
|
30
|
+
pd45: { label: 'USB PD 45 W', voltage: 15, current: 3 },
|
|
31
|
+
pd65: { label: 'USB PD 65 W', voltage: 20, current: 3.25 },
|
|
32
|
+
pd100: { label: 'USB PD 100 W', voltage: 20, current: 5 },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const copperOhmsPerMeterByAwg: Record<number, number> = {
|
|
36
|
+
20: 0.0333,
|
|
37
|
+
22: 0.053,
|
|
38
|
+
24: 0.0842,
|
|
39
|
+
26: 0.134,
|
|
40
|
+
28: 0.213,
|
|
41
|
+
30: 0.339,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export function metersToFeet(meters: number): number {
|
|
45
|
+
return meters * 3.28084;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function feetToMeters(feet: number): number {
|
|
49
|
+
return feet / 3.28084;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function calculateUsbPowerBudget(input: UsbPowerInput): UsbPowerResult {
|
|
53
|
+
const sourceWatts = input.sourceVoltage * input.sourceCurrent;
|
|
54
|
+
const requiredWatts = input.deviceLoadWatts * input.devices;
|
|
55
|
+
const availableWatts = sourceWatts * (1 - input.headroomPercent / 100);
|
|
56
|
+
const headroomWatts = availableWatts - requiredWatts;
|
|
57
|
+
const loadCurrent = input.sourceVoltage > 0 ? requiredWatts / input.sourceVoltage : 0;
|
|
58
|
+
const conductorOhms = copperOhmsPerMeterByAwg[input.wireGaugeAwg] ?? copperOhmsPerMeterByAwg[28];
|
|
59
|
+
const roundTripOhms = conductorOhms * input.cableLengthMeters * 2;
|
|
60
|
+
const cableDropVolts = loadCurrent * roundTripOhms;
|
|
61
|
+
const deviceEndVoltage = Math.max(0, input.sourceVoltage - cableDropVolts);
|
|
62
|
+
const utilizationPercent = sourceWatts > 0 ? (requiredWatts / sourceWatts) * 100 : 0;
|
|
63
|
+
let status: UsbPowerResult['status'] = 'safe';
|
|
64
|
+
|
|
65
|
+
if (requiredWatts > availableWatts || deviceEndVoltage < input.sourceVoltage * 0.9) {
|
|
66
|
+
status = 'over';
|
|
67
|
+
} else if (requiredWatts > availableWatts * 0.85 || deviceEndVoltage < input.sourceVoltage * 0.94) {
|
|
68
|
+
status = 'tight';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
sourceWatts,
|
|
73
|
+
requiredWatts,
|
|
74
|
+
availableWatts,
|
|
75
|
+
headroomWatts,
|
|
76
|
+
cableDropVolts,
|
|
77
|
+
deviceEndVoltage,
|
|
78
|
+
utilizationPercent,
|
|
79
|
+
status,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { usbPowerBudgetCalculator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await usbPowerBudgetCalculator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface UsbPowerBudgetCalculatorUI extends Record<string, string> {
|
|
2
|
+
profileLabel: string;
|
|
3
|
+
metricUnits: string;
|
|
4
|
+
imperialUnits: string;
|
|
5
|
+
voltageLabel: string;
|
|
6
|
+
currentLabel: string;
|
|
7
|
+
cableLengthLabel: string;
|
|
8
|
+
wireGaugeLabel: string;
|
|
9
|
+
deviceLoadLabel: string;
|
|
10
|
+
devicesLabel: string;
|
|
11
|
+
headroomLabel: string;
|
|
12
|
+
sourcePower: string;
|
|
13
|
+
requiredPower: string;
|
|
14
|
+
cableDrop: string;
|
|
15
|
+
deviceVoltage: string;
|
|
16
|
+
headroom: string;
|
|
17
|
+
utilization: string;
|
|
18
|
+
safeStatus: string;
|
|
19
|
+
tightStatus: string;
|
|
20
|
+
overStatus: string;
|
|
21
|
+
safeAdvice: string;
|
|
22
|
+
tightAdvice: string;
|
|
23
|
+
overAdvice: string;
|
|
24
|
+
busLane: string;
|
|
25
|
+
loadLane: string;
|
|
26
|
+
cableLane: string;
|
|
27
|
+
boardEyebrow: string;
|
|
28
|
+
sourceSocket: string;
|
|
29
|
+
deviceSocket: string;
|
|
30
|
+
energyFlow: string;
|
|
31
|
+
reservedLabel: string;
|
|
32
|
+
}
|