Sections de la documentation
Journal des modifications de l'API
Chaque modification de l'API publique qu'un appelant pourrait remarquer, de la plus récente à la plus ancienne. Chaque entrée est datée du jour de son annonce ici ; une modification qui rompt la compatibilité avec les appelants existants est annoncée au plus tard avec la version qui l'introduit, et marquée Incompatible. 29 des 81 entrées ci-dessous sont incompatibles.
rf-link-budget prend 0,5 dB de pertes atmosphériques quand atmosphericLoss est omis
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batch
Un appel qui omettait
atmosphericLossétait calculé avec 0 dB alors que sesprovenance.inputsindiquaient la valeur par défaut documentée, 0,5 dB. Il est désormais calculé avec 0,5 dB, comme l'indiquent la page du calculateur et la provenance :rxPower,linkMarginetmaxRangeKmse décalent donc de ce demi-décibel pour un tel appel. Un appel qui envoie l'entrée est inchangé.Toutes les autres entrées de tous les calculateurs ont été vérifiées de la même façon : omise, une entrée est soit refusée (400, rien de facturé), soit calculée avec sa valeur par défaut documentée.
GET /v1/usage peut renvoyer les appels par jour
GET /api/py/v1/usage
Passez
?days=N, de 1 à 90, et la réponse contientdaily: une entrée{date, calls}pour chacun des N derniers jours en UTC, du plus ancien jusqu'à aujourd'hui. Lescallsd'un jour sont additionnés sur toutes les clés du compte, déduction faite des appels restitués, et un jour sans appel affiche 0. Les jours antérieurs au 2026-09-24, date de début du comptage horaire, affichent 0.Sans
days, la réponse est inchangée. La consultation de l'usage n'est toujours jamais décomptée.Le nombre de ports d'un fichier Touchstone envoyé se lit dans ses lignes avant son nom
rf_cascadesparam_pipelineimpedance_matcheye_diagram
Lorsque le nombre de valeurs d'un fichier admet plus d'un nombre de ports, ses lignes décident avant son extension : trois points à un port dans un fichier nommé
.s2pfont un port, et non un point à deux ports, et un nom que les données contredisent est signalé (port_count_mismatchdans rf_cascade). Un mot-clé[Number of Ports]décide toujours en premier.Le diagramme de l'œil n'échoue plus sur un fichier dont l'extension annonce plus de ports que ses données n'en contiennent.
Le Monte Carlo de filtre exécute jusqu'à 1 000 essais gratuitement et 100 000 avec Pro et API, dans un budget de travail
POST /api/py/v1/jobs (filter_monte_carlo)POST /api/py/v1/jobs/estimateGET /api/py/v1/jobs/typesMCP simulate_filter_monte_carlorftools-io SDK
monteCarloIterationsva jusqu'à 1 000 avec l'offre Free (500 auparavant) et 100 000 avec Pro et API (10 000 auparavant). La durée maximale de la tâche est de 180 s (120 s auparavant).Le coût d'une exécution est le nombre de ses essais multiplié par les évaluations du réseau en échelle que chacun demande, fixées par ses composants et
passCriteria. Une exécution dont la prévision dépasse le budget de son environnement (120 s dans l'environnement payant, 60 s dans le gratuit) est refusée à la soumission et par l'estimation avecerrorKind: "too_large", avant toute facturation. Le détail nommemonteCarloIterationset donne le coût, la limite et, dansallowed.max, le nombre maximal d'essais qui tiennent. 100 000 essais d'une échelle à 5 composants sur trois critères tiennent ; une échelle à 20 composants sur huit critères tient jusqu'à 53 304.L'estimation indique
withinBudget, unbudgetde typeladderEvaluationsetworksous forme detrialsetladderEvaluationsPerTrial, quecomputeCost.workd'une tâche enregistre aussi.La liste des étages d'une cascade RF est vérifiée à la soumission
POST /api/py/v1/jobsPOST /api/py/v1/jobs/estimaterf_cascade
Un
stagesmal formé (pas du JSON, vide, un étage qui n'est pas un objet, une valeur qui n'est pas un nombre fini) est refusé par un 400 qui nomme l'étage et la clé, avant toute facturation. Il était auparavant accepté, puis échouait en erreur interne (fault).Les valeurs des étages sont bornées :
gain_db±1000 dB,nf_dbde 0 à 1000 dB,iip3_dbmetp1db_dbm±1000 dBm, et le gain de la chaîne après chaque étage dans ±1000 dB.NaN,Infinityettrue/falsesont refusés ; les nombres écrits sous forme de texte sont toujours lus.Une clé d'étage qui ne diffère d'une clé connue que par la casse (
gain_dB,IIP3_dbm,Name) est refusée, avec l'étage et la clé attendue ; elle était auparavant ignorée et l'étage tournait avec la valeur par défaut. Toute autre clé qu'un étage n'accepte pas (notes,part) est ignorée avec un avertissementunknown_stage_key.Un étage dont le
sparamFilen'a pas été envoyé avec la tâche est refusé, au lieu d'être calculé avec son gain saisi.Sans point d'interception, la valeur est null, et non 99 dBm
POST /api/py/v1/jobsrf_cascade
L'IIP3 d'un étage passif, ainsi que l'IIP3, l'OIP3, le P1dB et le SFDR d'une chaîne lorsqu'aucun étage ne les limite, valent
null(ils valaient 99 dBm et 99 + gain). Les percentiles et l'histogramme Monte Carlo de l'IIP3 valent alorsnull, et le rendement de l'IIP3 est de 100 %.Un étage passif n'ajoute plus de point d'interception à 99 dBm : un atténuateur de 150 dB devant un amplificateur à IIP3 de 0 dBm donne désormais 150 dBm, et non 99.
Cascade RF : bruit passif depuis les fichiers, signe du Monte Carlo, points d'interception exacts, avertissements
rf_cascade
Un étage passif dont le gain vient d'un fichier tire son facteur de bruit de ce gain.
Le Monte Carlo fait varier le facteur de bruit d'un étage passif avec ses pertes ; le signe était inversé.
L'IIP3 et le P1dB d'entrée sont calculés exactement, si bas soient-ils (trois amplificateurs de 300 dB : −600 dBm et −610 dBm, qui donnaient −270 dBm auparavant) ; un plancher de −270 dBm ne subsiste que comme garde-fou là où la somme derrière un point n'est pas un nombre positif et fini, ce que les bornes des étages rendent inatteignable : un P1dB ne fait donc plus échouer la tâche.
Avertissements
unknown_stage_type,unknown_stage_keyetfile_not_uploaded.L'adaptation d'impédance arrondit sur une échelle logarithmique et utilise la réflexion en ondes de puissance sur tout le balayage
POST /api/py/v1/jobsimpedance_match
Les composants E12, E24 et E96 prennent la valeur normalisée la plus proche sur une échelle logarithmique, selon l'espacement des séries ; exactement à mi-chemin, la plus petite. 2,099 nH donne désormais 2,2 nH, et non 2,0 nH. Là où les deux règles diffèrent, les composants, l'affaiblissement de réflexion et la branche que choisit
autopeuvent changer.|S11|, la trajectoire sur l'abaque de Smith, l'affaiblissement de réflexion dans le pire cas et la bande passante utilisent la réflexion en ondes de puissance (Z − Zs*)/(Z + Zs), comme les valeurs à f0. Une source réelle est inchangée ; une source complexe, saisie ou lue dans un fichier, donne un |S11| différent.
L'adaptation d'impédance indique sa fréquence de conception, le modèle en fréquence de sa charge et ses valeurs à f0
POST /api/py/v1/jobsPOST /api/py/v1/jobs/estimateimpedance_match
Chaque nouveau paramètre est facultatif ; une requête qui ne les contient pas obtient la même réponse qu'avant.
designFreq(Hz) : f0, indiquée séparément defreqStart–freqStopet à l'intérieur de cet intervalle ; à défaut, le centre de la bande.loadModel:constant(à défaut),series_rcouseries_rl(ajustés à f0 ; une réactance de mauvais signe est refusée) oufile(les propres points de fréquence de la charge envoyée).branchPreference:any,lowpassouhighpass, avec un avertissementbranch_preference_unmetlorsqu'aucune branche de ce type n'existe. Un fichier de charge.s1pest accepté.Nouveaux résultats :
designFreqHz,loadModel,unmatchedLoad,performance.idealet.standard(affaiblissement de réflexion, VSWR, pertes de désadaptation supprimées et la bande passante à RL ≥ 10 dB avec ses bornes et sa part de f0, résolue par dichotomie),branchetqDefinitions.Le diagramme de l'œil accepte une excursion d'émission, un CTLE et un masque
POST /api/py/v1/jobs (eye_diagram)MCP simulate_eye_diagram
Chaque nouveau paramètre est facultatif, et une requête qui ne les contient pas obtient la même réponse qu'avant.
launchSwing(mV crête à crête, valeur par défaut 2000, les ±1 V que supposait tout résultat antérieur) met à l'échelle chaque tension ;eyeHeightPctOfSwingdonne la hauteur de l'œil en proportion de celle-ci.equalization: ctleapplique le filtre à temps continu de l'annexe 93A de l'IEEE 802.3.ctleDcGain(de −12 à 0 dB) fixe son gain ; vide, le meilleur entre −12 et 0 dB par pas de 1 dB est retenu.ctleindique le gain, l'accentuation à Nyquist, le balayage et l'œil avant le filtre.maskType(hexagon ou rectangle),maskHalfHeight(mV) etmaskWidth(UI) donnentmask.pass,margin_mVet les violations.samplingPhase(UI après le passage par zéro) etlossFrequency(Hz) ajoutentsamplingetlossAtFrequency.Chaque résultat porte
channelFile,uiMeasuredettraceCount.La détection radar accepte une graine aléatoire
POST /api/py/v1/jobs (radar_detection)provenance.seed
randomSeed(un entier, 0 ou plus) remplace la graine Monte Carlo fixe 42 et est enregistrée dansprovenance.seed: une exécution peut ainsi être répétée, et une variante resoumise sur les mêmes tirages. Sans elle, chaque résultat est inchangé.Le Monte Carlo de filtre exécute une échelle telle que construite, selon les critères que vous fixez, et indique quoi resserrer
POST /api/py/v1/jobs (filter_monte_carlo)MCP simulate_filter_monte_carlorftools-io SDK
Chaque nouveau paramètre est facultatif, et une requête qui ne les contient pas obtient la même réponse qu'avant, avec de nouveaux champs de résultat à côté.
parts(de 1 à 20, de la source à la charge :ref,kindL ou C,positionseries ou shunt,valueen H ou F,tolerancefacultative en %) simule l'échelle telle que donnée, sans arrondi E24.passCriteria(de 1 à 8 :insertionLosssurfStart–fStopau plusmaxDb,cutoff3dBdansfMin–fMax,attenuationàfreqou surfStart–fStopau moinsminDb) remplacerippleSpec_dbetrejectionSpec_db.yieldTarget(%, 95 si vide).Nouveaux résultats :
circuit,yieldTargetavec un verdict par rapport à l'intervalle à 95 %,criteriaavec statistiques, histogrammes et levarianceShare(r²) de chaque composant,failingTrials(les 200 premiers),sampleTrialset, si des critères sont saisis,whatIfs: les composants qui pèsent le plus sur le critère le plus souvent manqué, avec une tolérance d'un cran plus serrée, recalculés sur les mêmes essais. Resoumettre avec larandomSeedde l'exécution et ces tolérances donne le même rendement.La boucle de régulation de l'alimentation à découpage accepte son compensateur par composants, résout une fréquence de croisement et rend un verdict
POST /api/py/v1/jobsPOST /api/py/v1/jobs/estimatesmps_control_loop result
Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant.
compensatorType: type2_otaaveccompRc,compCc,compChf,compGmetcompVrefdécrit un compensateur de type II à transconductance par ses composants, transposé exactement en K, f_z et f_p. UncompVrefsupérieur àVoutest refusé.solveFor: crossoveravectargetCrossover(Hz, valeur par défaut Fsw/10),resistorSeries(E96) etcapacitorSeries(E12) place R_c, C_c et C_hf en mode courant crête et indique ce qu'ils obtiennent.minPhaseMargin(45°) etminGainMargin(10 dB) fixent le verdict et le rendement du Monte Carlo.Nouveaux résultats :
verdict,polesZeros,nominal.phaseCrossoverHz,nominal.loopGainAt100HzDb,compensatorParts,solve,runSummaryetbodeAboveHalfFsw, les réponses jusqu'à 2·Fsw, où aucune marge n'est lue.Seize calculateurs de timing comparent leurs temps à un budget
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.
uart-baud-rate:oversampling(16 ou 8),divisorFraction(0 un diviseur entier, 1 une fraction par pas de 1/oversampling) eterrorBudget(%, 2, que suit l'avertissement d'erreur de débit) ;divisorSet,baudError_pct(signé) etstopSampleOffset_bits.can-bus-timing:sjw(tq, 1) ;bitRateActual,bitRateError_pct,samplePointActualetoscTolerance_pct, la tolérance d'horloge que l'ISO 11898-1 accorde à chaque nœud.lin-bus-timing:slotTime(ms, 10) ;frameTimeMax, 1,4 × la trame nominale (LIN 2.x).modbus-frame-timing:charGap(ms, 0), que le temps de trame compte désormais ;t15,charGapCharsett15Chars.spi-timing:riseTime(2,2τ) etedgeShare_pct.i2s-timing:mclk(MHz, 16,9344) etrateBudget(%, 0,1) ;mclkDivider,bclkActual,sampleRateActualetsampleRateError_pct.pwm-duty-cycle:timerClock(MHz, 16) etrequiredBits(8) ;periodCounts,onCounts,dutyActual,frequencyActualetdutyResolution_bits.555-timer:targetTime(ms, 2),errorBudget(%, 5),rToleranceetcTolerance(%, 0) ;timeMin,timeMaxettimingError_pct.rc-time-constant:rTolerance(%, 1),cTolerance(%, 5) ettauBudget(%, 10), avec un avertissement au-delà ;tauMinUs,tauMaxUsettauErrorPct.inductor-energy:requiredTime(µs, 20).battery-charge-time:requiredTime(h, 3).supercapacitor-backup:holdUpTime(s, 60).motor-inrush-current:dipLimit(%, 10).via-step-response:slowdownBudget(%, 10), que suit désormais l'avertissement de ralentissement. Chacune est refusée à 0 ou en dessous.inrush-current-limiter:ntcR25(Ω, 0 pour la valeur requise) etntcTolerance(%, 20) ;peakInrushMax. AvecntcR25renseigné,peakInrush,timeConstantetlimitingResistorsuivent la thermistance ajustée.pid-tuning:overshootBudget(%, 25) ;overshootPctetsettlingTimetirés d'une réponse indicielle simulée en boucle fermée.Quatorze calculateurs de fréquence comptent leurs produits dans une bande
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.
mixer-spur-calculator:rfBandLow/rfBandHigh(MHz, 902/928),ifBandwidth(MHz, 10) etnearMargin(MHz, 50) ;spursInBand,spursNearBand,nearestSpur,imageFreq,imageToBandetloToBand, à partir de chaque entrée RF convertie vers la FI, f_RF = (m·f_LO ± f_IF)/n (m l'harmonique de l'OL, n l'harmonique RF, comme dans l'ancien décompte), m + n jusqu'àmaxOrder.intermodulation-distortion:bandLow/bandHigh(MHz, 88/108) ;productsInBand.vibration-phase-noise:offsetBandLow/offsetBandHigh(Hz, 1000/10000) ;sidebandsInBand.phase-noise-to-jitter:pointsIntegrated.ism-coexistence:channelWidth1_MHz/channelWidth2_MHz(20/2) ;overlappingChannels, avec les canaux répartis uniformément sur la bande.channels1etchannels2sont limités à 100.via-stub-resonance:dataRate(Gb/s, 10) ;nyquistFreq,resonancesInBandetresonancesNearBand.chassis-resonance:bandLow/bandHigh(MHz, 30/1000) ;f011MHzetmodesInBand.room-modes:bandLow/bandHigh(Hz, 20/200) ;modesInBand,modesNearBandetmodalBandwidth.sampling-nyquist:harmonicOrder(5) ;aliasesInBand(le ton lui-même replié dans la bande du signal),harmonicAliasesInBand(ses harmoniques repliées dans celle-ci, qui comptent jusqu'au SFDR du convertisseur) etlowestAliasingInput.fft-bin-resolution:toneFreq(Hz, 1000) etsidebandSpacing(Hz, 100) ;toneBin,toneLevelError,resolutionBandwidthetsidebandsUnresolved(null pour un ton au-dessus de f_s/2).am-modulation-index:channelWidth(kHz, 10) ;powerInChannel,sidebandsInChanneletsidebandsOutside.fm-modulation-index:channelLow/channelHigh(kHz, 98000/98200) ;occupiedBandwidth,powerInChannel,sidebandsInChanneletsidebandsOutside(null au-delà de β = 1000, avec un avertissement).oversampling-snr:signalBandwidth(Hz, 24000) ;modulatorRate,outOfBandNoiseetfoldBands.digital-filter-order:toneFreq(Hz, 1000) etmaxHarmonic(5) ;harmonicsInPassband,harmonicsInTransition,nearestHarmonic,butterworthAttenuationetchebyshevAttenuation.can-bus-timing : le prédiviseur et les quanta les plus proches du débit
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Parmi tous les bits de 8 à 25 quanta de temps (CAN 2.0), avec le prédiviseur de part et d'autre de celui qu'il demande, le plus proche du débit ; puis le point d'échantillonnage le plus proche de celui demandé (CiA 601-3) ; puis 16 quanta ; puis le plus petit prédiviseur. Le calculateur prenait le prédiviseur le plus proche de 16 quanta, quel que soit le débit obtenu : 36 MHz à 500 kbps donnait 5 × 14 quanta, 2,86 % trop rapide, et donne désormais 3 × 24, exact.
prescaler,nominalBitTime,tqet les segments changent lorsqu'un réglage exact ou plus proche existe ; toutes les valeurs par défaut et tous les préréglages sont inchangés.Le point d'échantillonnage se situe au plus un quantum avant la fin du bit, de sorte que les segments s'additionnent jusqu'à lui (8 quanta à 95 % donnaient 9).
modbus-frame-timing : temporisations fixes au-delà de 19 200 Bd
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Au-delà de 19 200 Bd,
t35vaut 1,75 ms fixe (Modbus over Serial Line V1.02, section 2.5.1.1), et non plus 3,5 caractères (0,334 ms à 115 200 Bd 8E1), etmaxFrameRatesuit ; le nouveaut15y vaut 750 µs fixe.intermodulation-distortion : im3High est une valeur absolue
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
im3Highvaut |2f₂ − f₁|, commeim3Lowdéjà : en dessous de f₂ = f₁/2, il était négatif (100 et 40 MHz : −20, désormais 20 MHz).chassis-resonance : c exacte et le mode (0,1,1)
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
La vitesse de la lumière est exacte, 29 979 245 800 cm/s, et non 3 × 10¹⁰ :
fLowest,f101MHzetf110MHzbaissent de 0,07 % (901,39 → 900,76 MHz avec les valeurs par défaut).fLowestinclut (0,1,1), le mode le plus bas lorsque la longueur est le plus petit côté (Pozar, Microwave Engineering, 4e éd., section 6.3) : un boîtier de 10 × 30 × 20 cm donnait 1581 MHz et donne 900,76 MHz ;wavelengthAtResonancesuit.phase-noise-to-jitter : le profil intégré par lois de puissance
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Avec
profileMode1, le profil est intégré par lois de puissance entre ses points, des droites sur des axes log-log (Drakhlis, Microwaves & RF, janvier 2001), et la bande se termine au niveau propre du profil à cet endroit. Un trapèze linéaire surestimait un profil décroissant, et L₄ était maintenu jusqu'à la fin de la bande même lorsqu'il se situe au-delà : le profil par défaut à 100 MHz donnait 0,166 ps et donne 0,084 ps.rmsJitter,cycleToCycleJitter,phaseNoisePower,rmsPhaseErroretadcSnrLimitchangent dans ce mode ; le mode à niveau unique est inchangé.sampling-nyquist : l'alias se replie sur le multiple de f_s le plus proche
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
aliasFreq_Hzvaut |f − k·f_s| avec k l'entier le plus proche de f/f_s (Kester, MT-002). Il valait |f_s − f|, correct seulement jusqu'à 1,5·f_s : 10 kHz à 4 kSa/s donnait 6000 Hz et donne 2000 Hz.fm-modulation-index : la largeur de bande de Bessel tirée des fonctions de Bessel
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
besselBandwidthcouvre les bandes latérales au-dessus de 1 % de la porteuse non modulée, 2·n·f_m (Haykin, Communication Systems) : elle valait 2(β + 1)·f_m, de nouveau la règle de Carson. À β = 5, elle valait 180 kHz et vaut 240 kHz. Au-delà de β = 1000, elle vaut null, avec un avertissement.digital-filter-order : l'ordre elliptique exact
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
ellipticOrderrésout l'équation de degré K(k)·K′(k₁)/(K′(k)·K(k₁)), avec k = f_p/f_s et k₁ = ε_p/ε_s. C'était l'ordre de Tchebychev divisé par 1,5, trop élevé dans la plupart des conceptions et trop bas dans certaines : les valeurs par défaut demandent 3, et non 4 ; une transition 2:1 à 1 et 20 dB demande 3, et non 2.via-stub-resonance : pas de stub, pas de résonance
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Avec la sortie sur la dernière couche, il n'y a pas de stub :
resonantFreqetbackdrillBenefitvalent null (une résonance non bornée), et non plus 0.room-modes et inductor-energy : des refus qui nomment ce qui ne va pas
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
room-modesrefuse une vitesse du son ou un temps de réverbération inférieurs ou égaux à 0 avec un message propre, et ne renvoie aucune valeur à côté d'un refus ; il renvoyait des zéros et nommait les dimensions de la pièce.inductor-energyrefuse une résistance série inférieure ou égale à 0, comme le site l'a toujours fait ; l'API échouait dessus.Huit autres calculateurs de convertisseurs et de circuits de commande acceptent une plage de fonctionnement, choisissent leurs composants et ajoutent un modèle de pertes
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Comme
buck-converter: chaque entrée qui varie en service est une paire<input>Minet<input>Max, où 0 (la valeur par défaut) signifie l'entrée nominale. Chaque pire cas est une sortie, avec les valeurs d'entrée auxquelles il se produit comme sorties propres (rippleWorstAàrippleWorstVin). Les composants sont dimensionnés au moins pour ce qu'exige le cas le plus défavorable : une inductance de la série E12 et une tension nominale égale à la valeur normalisée suivante à partir de 1,5 fois la pire tension (l'interrupteur du flyback, à partir de son pic de drain écrêté). Les entrées du modèle de pertes ont des valeurs par défaut typiques ; ses pertes sont données au point nominal, en W, et s'ajoutent àlossTotal. Une requête sans les nouvelles entrées obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.boost-converter:inputVoltageMin/inputVoltageMax;coutEach, ainsi querdsOn,tSwitch,qg,vGate,vDiode,qrr,dcr,coreLoss,esrOutdu modèle de pertes. Parmi les nouvelles sorties figurentdutyMin/dutyMax,inductorMinWorstUHetinductorChosenUH,ilPeakWorst,inputCurrentWorst,q1RmsA,coutRmsA,outputRippleMV,vdsRating, huit pertes etefficiencyLossModel; l'entréeefficiencyfixe toujours les courants.flyback-converter:vinMin/vinMax, calculés à chaque coin avec le transformateur nominal ;rdsOn,tFall,qg,vGate,vDiode,rPri,rSec,coreLoss,leakageInductance(µH, valeur par défaut 2,6) etclampRatio(valeur par défaut 2, à partir de 1,1) du modèle de pertes, avec la perte de l'écrêteur RCD ½·L_lk·I_pk²·f·k/(k − 1). Parmi les nouvelles sorties figurent les courants crête et efficaces des deux enroulements,reflectedVoltage,clampVoltage,vdsPeakWorst,vdsRating,diodeVrWorst,diodeVrRating, sept pertes etefficiencyLossModel.charge-pump-voltage:inputVoltageMin/inputVoltageMaxetpumpCurrentMin/pumpCurrentMax;switchResistance(Ω, valeur par défaut 1) etesr(mΩ, valeur par défaut 10), ajoutées à la résistance de partage de charge comme l'est la R_O de la fiche technique de l'ICL7660. Parmi les nouvelles sorties figurentloadedVoltageMin/loadedVoltageMax,outputResistance,loadedVoltageWithLosses, les valeurs nominales des condensateurs et des interrupteurs, trois pertes etefficiencyLossModel(égal àefficiencyavec des composants idéaux).switching-regulator-ripple:outputCurrent(A, valeur par défaut 2),inputVoltageMin/inputVoltageMax, et le modèle de pertes du convertisseur abaisseur sur ses propres composants (sonesrest celle du condensateur de sortie). Parmi les nouvelles sorties figurent les ondulations et les courants efficaces dans le pire cas,vdsRating, huit pertes etefficiency.mosfet-power-dissipation:drainCurrentMin/drainCurrentMaxettAmbientMin/tAmbientMax(toute valeur sauf 0, qui désigne la valeur nominale) ;rdsonTempco(%/°C, valeur par défaut 0), résolu jusqu'à la jonction sous forme fermée,coss(pF, valeur par défaut 0),qgetvGate. Parmi les nouvelles sorties figurentjunctionTempWorstavec son courant et sa température ambiante,totalLossWorst,efficiencyWorst,vdsRating, quatre pertes etefficiencyLossModel.h-bridge-selectionetmotor-driver-power:motorCurrentMin/motorCurrentMaxet la plage de l'alimentation (motorVoltageMin/motorVoltageMax,supplyVoltageMin/supplyVoltageMax) ; le temps morttDeadet lavBodyde la diode de structure (TI SLVA504A) et, sur le pont en H,dutyCycle(%, valeur par défaut 75),tSwitch,qgetvGate. Parmi les nouvelles sorties figurent la pire perte du pont, le FET le plus chaud,vdsRating, les pertes etefficiencyLossModel.class-d-efficiency:outputPowerMin/outputPowerMaxetsupplyVoltageMin/supplyVoltageMax;switchingFreq(kHz, valeur par défaut 400),filterCutoff(kHz, valeur par défaut 40),tSwitch,coss,qg,vGate, ainsi que ladcret lacoreLossde l'inductance du filtre. Parmi les nouvelles sorties figurent le filtre de sortie (TI SLAA701B) tel que calculé et tel que choisi, cinq pertes,loadPower,efficiencyLossModel, le pire rendement et la pire perte avec leurs coins,headroomWorst(négatif là où le pont ne peut pas fournir l'excursion de sortie), les courants d'ondulation et de crête du filtre, et les valeurs nominales.boost-converter : le rapport cyclique est celui de TI SLVA372D
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Le rapport cyclique valait 1 − V_in/(V_out·η), si bien que les pertes le raccourcissaient, en contradiction avec le propre courant d'entrée du calculateur. C'est désormais l'équation 1 de TI SLVA372D, D = 1 − V_in·η/V_out. Avec les valeurs par défaut (5 V vers 12 V, 0,5 A, 100 kHz, 88 %),
dutyCyclepasse de 52,65 % à 63,33 %,inductorValuede 64,35 µH à 77,41 µH etoutputCapacitorde 4,388 µF à 5,278 µF.Le refus et l'avertissement se déplacent avec lui : une entrée entre η·V_out et V_out, refusée auparavant, est désormais calculée (seul V_out ≤ V_in est refusé), et l'avertissement de rapport cyclique à 95 % intervient à V_in·η/V_out ≤ 0,05.
switching-regulator-ripple : une sortie égale ou supérieure à l'entrée est refusée
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Le calculateur est un abaisseur. Avec
outputVoltageégal ou supérieur àinputVoltage, il renvoyait un rapport cyclique de 99 % et une ondulation négative ; il refuse désormais avec « Output voltage must be less than input voltage » et ne renvoie aucune valeur.buck-converter : une plage d'entrée, les composants choisis et leurs contraintes, et un modèle de pertes avec le rendement
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
vinMinetvinMaxdonnent l'entrée sous forme de plage (0, la valeur par défaut, est lavinnominale). L'inductance est dimensionnée là où son ondulation est la plus forte et choisie au moins à cette valeur dans la série E12 (inductorMinWorstUH,inductorChosenUH) ; chaque contrainte est donnée là où elle est la plus forte, avec la tension d'entrée à laquelle elle se produit :rippleWorstA/rippleWorstVin,ilPeakWorst/ilPeakWorstVin,outputRippleMV/outputRippleVin,cinMinWorstUF,cinRmsA,q1RmsA,q2RmsA(chacune avec son…Vin), ainsi quedutyMin,dutyMax. Le banc de sortie comptecoutCountcondensateurs decoutEachµF ; les tensions nominales des composants sontvdsRating,cinVoltageRating,coutVoltageRating(la valeur commercialisée à partir de 1,5 fois la tension).Un modèle de pertes, toutes les entrées facultatives :
rdsOnHigh,rdsOnLow,tSwitch,qg,vGate,tDead,vBody,dcr,coreLoss,esrOut,esrIn. À l'entrée et à la charge nominales, les pertes sontlossDcr,lossCore,lossHsConduction,lossLsConduction,lossHsSwitching,lossGateDrive,lossDeadTime,lossCapEsretlossTotal(W), avecoutputPoweretefficiency(%). Une requête sans les nouvelles entrées obtient les cinq sorties qu'elle obtenait avant, saufcinUF(voir buck-converter-input-capacitance).buck-converter : le condensateur d'entrée est dimensionné pour l'ondulation de l'entrée
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
cinUFdivisait par la tension d'ondulation de la sortie (deltaVoutdevout). Il prend désormais l'ondulation propre de l'entrée, la nouvelle entréedeltaVin(% devin, valeur par défaut 1), comme dans l'équation 12 de TI SLVA477B : C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). Avec les valeurs par défaut (12 V vers 5 V, 1 A, 500 kHz), 9,72 µF devient 4,05 µF.Vingt-trois autres calculateurs acceptent une série de composants et donnent la conception telle que construite
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
eSeries(0 pour des valeurs idéales, ou 12, 24, 48, 96) arrondit chaque résistance, condensateur ou inductance que le calculateur conçoit ou lit à la valeur la plus proche de cette série, et chaque sortie est alors celle de la conception arrondie. Sa valeur par défaut laisse à une requête qui ne le contient pas la réponse qu'elle obtenait avant : 24 pourattenuator-designer,led-resistoretzener-diode, dont les sorties E24 (piR1NearestàtR2Nearest,rNearest,iActual,pNearest,e24Resistor) le suivent désormais, et 0 pourvoltage-divider,opamp-gain,comparator-hysteresis,schmitt-trigger,transistor-switch,current-mirror,crystal-load-capacitance,photodiode-transimpedance,lm317-resistors,rs485-termination,pll-loop-filter,wilkinson-power-divider,rc-snubber,rcd-clamp-snubber,emi-filter-lc,power-supply-ripple-filter,conducted-emissions-filter,differential-mode-filter,speaker-crossoverettweeter-capacitor. Les composants dedirectional-couplersont des lignes et n'en prennent pas.De nouvelles sorties décrivent la conception arrondie :
attenuator-designerpiAttenuationBuilt(dB) etpiInputImpedanceBuilt(Ω) ;wilkinson-power-dividerisolationBuilt(dB à f₀, null avec la résistance exacte, où elle n'est pas bornée) ;rcd-clamp-snubberclampVoltageBuilt,rippleVoltageBuilt,clampPowerBuiltetpeakDrainVoltageBuilt;pll-loop-filtercrossoverBuilt(kHz, le passage à 0 dB de la boucle ;pmActualest la marge à cet endroit) ;rs485-terminationfailsafeVoltage(mV, la tension A–B du bus au repos) ;emi-filter-lcinsertionLossBuilt(dB à 10·f_c) ;conducted-emissions-filtercornerBuilt,attenuationBuiltetoutputLevelBuilt;speaker-crossoverwooferCutoffBuiltettweeterCutoffBuilt;tweeter-capacitorcrossoverBuilt;zener-diodezenerCurrentBuilt(mA) etzenerPowerBuilt(mW) à pleine charge à travers la résistance retenue, le courant étant négatif là où la résistance ne peut pas supporter la charge.Libellés, clés inchangées : les résistances arrondies de l'atténuateur s'intitulent « (rounded) » au lieu de « (E24) » ;
rNearest« Nearest Series Value »,pNearest« Power (series R) »,e24Resistor« Nearest Series Resistor » ; l'errordecurrent-mirror« Output Current Error », le déficit par rapport à N·I_ref (avec une série, il inclut l'arrondi, et une sortie Widlar est résolue à partir de V_T·ln(I_ref/I) = I·R_E avec la R_E arrondie).Pour qu'un composant puisse être résolu pour une sortie cible, ces entrées indiquent désormais un maximum (une valeur supérieure est tout de même calculée, avec l'avertissement de la provenance) :
comparator-hysteresisr1etr210 000 kΩ ;photodiode-transimpedancefeedbackResistance1e7 kΩ etfeedbackCapacitance100 000 pF ;differential-mode-filterinductance100 000 µH etcapacitance1 000 µF ;power-supply-ripple-filterinductance100 000 µH etcapacitance100 000 µF.schmitt-trigger : seuils par superposition sur l'entrée +
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
La bande valait V_cc·R2/(R2 + R3), qui néglige R1, placée symétriquement autour de la tension du diviseur. Les seuils sont désormais obtenus par superposition au nœud + (TI SNOA997A) : V_TH+ = V_cc·R1/(R1 + R2∥R3) et V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3) ;
centerVoltageest le milieu de la bande. Avec les valeurs par défaut (5 V, 10, 10 et 100 kΩ),vth_high,vth_lowethysteresispassent de 2,727, 2,273 et 0,4545 V à 2,6190, 2,3810 et 0,2381 V. Le circuit est un trigger inverseur ; la description le disait non inverseur.conducted-emissions-filter : L et C s'adaptent à la charge
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
L et C étaient répartis en √(LC·Z) et √(LC/Z), ce qui fixait √(L/C) à √Z (7,07 Ω sur 50 Ω ; le filtre présentait un pic de 17 dB à 47 kHz depuis une source de tension). Ils valent désormais L = Z/ω₀ et C = 1/(ω₀·Z). Avec les valeurs par défaut (80 dBµV à 150 kHz, 20 dB, 50 Ω),
lValuepasse de 23,7 µH à 167,8 µH etcValuede 0,475 µF à 0,0671 µF. La fréquence de coupure, et donc l'atténuation de 40 dB/décade, est inchangée.attenuator-designer, led-resistor, zener-diode : valeurs E24 inférieures à 10 Ω
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Leurs recherches E24 commençaient à 10 Ω, si bien qu'un composant inférieur à 10 Ω était ramené à 10 Ω : les résistances série de 2,875 Ω d'un atténuateur en T de 1 dB sous 50 Ω sortaient à 10 Ω (l'atténuateur construit donnait 1,336 dB et 54 Ω), et une résistance de LED de 5 Ω à 10 Ω. Les recherches commencent désormais à 0,10 Ω (3,0 Ω et 5,1 Ω). Au-dessus de 10 Ω, rien ne change.
pll-loop-filter et class-d-efficiency : un refus ne renvoie aucune valeur
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
pll-loop-filter(à chaque refus) etclass-d-efficiency(dans l'API) renvoyaient des zéros à côté de l'erreur. Ils ne renvoient plus aucune valeur, comme les autres calculateurs.filter-designer : la réponse de l'échelle telle que construite, un décalage exact de la coupure et des coupures jusqu'à 1 GHz
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Six nouvelles sorties décrivent l'échelle que forment les valeurs des composants, résolue comme une cascade de matrices ABCD entre Z₀ et sa charge :
loadImpedance(Z₀, ou Z₀/g_{N+1} pour un Tchebychev d'ordre pair, g_{N+1}·Z₀ en passe-haut),cutoffBuilt_Hz(la fréquence à −3 dB, passe-bas et passe-haut),fLowBuilt_HzetfHighBuilt_Hz(les bords à −3 dB d'un passe-bande),passbandLoss_dB(la pire perte jusqu'à 0,8·f_c, au-dessus de 1,25·f_c, ou sur les 80 % centraux d'une bande) etstopbandBuilt_dB(la perte là où le prototype atteint le double de sa coupure). AveceSeriesrenseigné, ce sont celles de la conception arrondie ; avec des composants idéaux, la bande coupée est égale àattenuation_at_2fc.fcShiftPercentvalait la moitié de la plus grande erreur de composant. Il indique désormais de combien l'arrondi a déplacé la fréquence à −3 dB de l'échelle construite (pour un passe-bande, le centre de sa bande à −3 dB) par rapport à celle de l'échelle idéale : le Butterworth d'ordre 5 à 100 MHz avec des composants E24 donne +0,997 %, là où l'estimation donnait +1,31 %. AveceSeriesà 0, il vaut 0, comme avant.fcaccepte jusqu'à 1 GHz (il s'arrêtait à 10 MHz).voltage-drop : toutes les jauges sont calculées, et l'aluminium est celui de l'IEC 60889
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Un
wireGaugeabsent du tableau (une jauge impaire ou fractionnaire) était calculé avec la résistance du 12 AWG. Il suit désormais la même formule que le tableau, cuivre selon l'IEC 60028 (1/58 Ω·mm²/m) sur la section de la jauge selon l'ASTM B258 ; les jauges du tableau sont inchangées.conductorType1 (aluminium) prenait 1,61 fois la résistance du cuivre. Il prend désormais les 0,028264 Ω·mm²/m de l'IEC 60889, soit 1,6393 fois le cuivre, si bien que chaque chute de tension en aluminium est supérieure de 1,8 % : 10 AWG à 15 A sur 30 m sous 120 V chute de 4,03 %, là où il indiquait 3,96 %.coax-loss : atténuation tirée des données des fabricants ; huit autres câbles, puissance d'entrée et puissance de sortie
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Le tableau des câbles donnait environ 1,7 fois les dB/100 ft des fiches techniques, si bien que la perte de chaque câble était trop faible. L'atténuation pour 100 m vaut désormais k₁√f + k₂f avec f en MHz : les coefficients publiés par Times Microwave (25 °C) pour les câbles LMR, et un ajustement par moindres carrés sur les tableaux de Belden et de CommScope (20 °C) pour les autres.
lossPer100mancien → nouveau à 100, 435 et 2400 MHz : LMR-400 2,15 → 4,10, 4,62 → 8,74, 11,50 → 21,70 ; LMR-240 3,60 → 8,05, 7,69 → 17,04, 19,40 → 41,51 ; LMR-200 4,80 → 10,64, 10,35 → 22,43, 26,00 → 54,18 ; LMR-100A 10,80 → 23,84, 23,45 → 51,01, 61,00 → 127,68 ; RG-58/U 10,00 → 12,45, 22,65 → 28,77, 64,00 → 84,61 ; RG-8X 6,10 → 10,10, 13,50 → 22,74, 38,00 → 63,62 ; RG-213/U 4,70 → 6,30, 10,35 → 15,21, 28,50 → 48,34 ; RG-174/U 19,00 → 28,12, 43,33 → 65,75, 120,00 → 197,64 ; Belden 9913 2,50 → 4,34, 5,42 → 9,23, 13,70 → 22,75 ; Andrew LDF4-50A 0,70 → 2,17, 1,53 → 4,66, 3,95 → 11,81.attenuation_dBet les parts de puissance et de tension suivent. L'Andrew LDF4-50A est le câble de 1/2 in ; il était étiqueté 7/8 in.cableIndex0–9 conservent leurs câbles et va désormais jusqu'à 17 : LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL (plenum), RG-316, RG-6 (75 Ω), Andrew LDF5-50A (7/8 in) et LMR-900. Nouvelle entrée facultativeinputPower(dBm, valeur par défaut 30) ; nouvelles sortiespowerOut_dBm,powerOut_WetlossPerMeter. Une fréquence supérieure au maximum nominal d'un câble, au-delà du dernier point d'un tableau ajusté, ou inférieure à la fréquence à partir de laquelle un ajustement est valable à 10 % près, reçoit un avertissement, pas un refus.Dix-huit calculateurs acceptent des listes : étages, pertes, termes, couches, charges, composants et surfaces
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Chaque liste est un nombre d'éléments et des entrées indexées (
numLoadsavecload1Current,load2Current, …), de sorte qu'une requête reste un objet plat. Chaque nombre a pour valeur par défaut la liste que le calculateur avait auparavant : une requête sans les nouvelles entrées obtient donc la même réponse qu'avant (vérifié sur 201 requêtes par calculateur, refus compris). Une entrée indexée au-delà du nombre est ignorée.noise-figure-cascade:numStagesva désormais jusqu'à 10 (il allait jusqu'à 4), avecstage5Gain,stage5NF,stage5IIP3jusqu'àstage10IIP3, et unebandwidthfacultative (MHz, valeur par défaut 1) ; nouvelles sortiescascadedGain,noiseTemperature(290 K × (F − 1)) etnoiseFloor(kT₀B plus le facteur de bruit en cascade).lora-link-budget,ble-link-budget,5g-nr-link-budget:extraLossCount(0–6) parmiextraLoss1àextraLoss6(dB), ettotalLoss.clock-jitter:jitterTerms(0–6) parmiterm{n}Jitter_ps, additionnés en quadrature.emi-margin-budget:marginTerms(0–6) parmiterm{n}Allowance, ettotalAllowance.sensor-accuracy-budget:errorTerms(0–6) parmiterm{n}Error, en quadrature.4-20ma-transmitter:loopElements(0–6) parmielement{n}Resistance, ettotalLoopResistance.heatsink-calculator,heatsink-selection,thermal-resistance-network,junction-temperature:numLayers(0–6) parmilayer{n}Theta(°C/W), en série entre le boîtier et le dissipateur ; les deux calculateurs de dissipateur renvoient aussithetaJSetheatsinkTemp.battery-life:numLoads(0–7) parmiload{n}Currentetload{n}Duty, etselfDischargeCurrent.battery-runtime-motor:motorDuty(%, valeur par défaut 100) etnumLoads(0–5) parmiload{n}Current,load{n}Dutyetload{n}Efficiency, etbatteryCurrent.solar-panel-sizing:loadHours(h par jour, valeur par défaut 24) etnumLoads(0–9) parmiload{n}Poweretload{n}Hours.gear-ratio:extraStages(0–5) parmistage{n}Driver,stage{n}Drivenetstage{n}Efficiency, ettotalEfficiency.series-parallel-resistor:numParts(1–8, valeur par défaut 4) avecr5àr8, etsumOfValues;r1peut valoir 0, un composant non monté, comme les autres positions le pouvaient déjà.rt60-reverberation:numSurfaces(0–8) parmisurface{n}Areaetsurface{n}Alpha, etotherAreaetmeanAbsorption.Les bilans de liaison répondent à une distance de 0 sans perte de trajet
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
lora-link-budget,ble-link-budgetet5g-nr-link-budgetrefusaient une distance de 0. Ils y répondent désormais avec 0 dB de perte de trajet : la liaison sans trajet, que les pages utilisent pour montrer le bilan avant le trajet. Une distance négative est toujours refusée.clock-jitter : sans budget temporel restant, la part n'est pas bornée, elle ne vaut pas 0 %
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Lorsque les temps de setup et de hold occupent toute la période d'horloge,
budgetUsed_pctvalait 0, ce qui se lit comme une absence totale de gigue. Il vaut désormais null (une part non bornée), avec un avertissement indiquant qu'il ne reste aucun budget temporel lorsqu'aucune violation de setup n'est à signaler.series-parallel-resistor : le rapport du diviseur porte sur les deux composants montés
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Avec exactement deux composants montés,
voltDividerRatiovalait R2/(R1 + R2) quels qu'ils soient, donc 0 avec R1 et R3 montés. Il vaut désormais le second composant monté divisé par la somme des deux, ce qui ne change rien lorsqu'il s'agit de R1 et R2.optical-sensor-range : un refus ne renvoie aucune valeur
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Un facteur de sécurité inférieur ou égal à 0 était refusé avec
maxRangeetnormalizedRangeà 0 à côté de l'erreur. Le refus ne renvoie désormais aucune valeur, comme tous les autres refus.broadside-coupled-pair : sans plans, ni impédance de mode commun, ni impédance découplée, ni hauteur par rapport au plan
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Une paire non blindée (
shielded0) n'a pas de plans de référence, si bien quecommonImpedance,uncoupledImpedanceetheightToPlanene sont pas définis, comme le disait déjà l'avertissement. Ils valaient 0 et valent désormais null.rise-time-bandwidth : sans horloge, pas de rang d'harmonique
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Avec
clockFrequencyà 0, que l'entrée autorise pour se passer d'horloge,harmonicNumbervalait 0, une valeur qu'aucune horloge ne donne. Il vaut désormais null, comme d'autres sorties là où une valeur n'existe pas.Treize calculateurs évaluent leur résultat par rapport à une norme publiée
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Chacun accepte la norme (et, le cas échéant, la classe) comme entrée facultative, et renvoie la limite, le résultat en pourcentage de celle-ci (au-delà de 100, c'est un échec) et la valeur d'une entrée qui permettrait la conformité. Les limites sont calculées dans le calcul lui-même : l'API rend donc le verdict de la page. Chaque nouvelle entrée est facultative et, à sa valeur par défaut, aucune sortie existante ne change, sauf indication contraire dans une entrée ci-dessous.
power-density:standard(0 FCC 47 CFR §1.1310, 1 ICNIRP 2020),exposureClass,groundReflection; renvoielimitDensity,limitPercent,minDistance,maxEirp.trace-width-current:standard(il lit latraceWidthdessinée que l'API accepte déjà) ;limitCurrent,limitPercent,minTraceWidth.microvia-current-capacity:standard,conductorClass;limitCurrent,limitPercent,minVias,minViaDiameter.pcb-trace-temp:standard,laminate;chartRise,limitRise,limitPercent,minTraceWidth,maxCurrent.minimum-conductor-spacing:conductorSpacing;spacingPercent,maxVoltage(la limite estspacing).padstack-annular-ring:standard,padDiameter,producibilityLevel;minLandDiameter,landPercent,maxDrillDiameter.solder-paste-volume:releaseCriterion;maxStencilThickness,stencilPercent,maxApertureReduction.bga-land-pad:ballType,landDiameter;ipcLand,landDeviation,landTolerance,landPercent,compliantLand.i2c-pullup:pullup;riseTime,riseTimePercent,maxBusCap(la limite estriseTimeTarget_ns, le mode estspeedMode).usb-termination:impedanceError,impedanceTolerance,impedancePercent,compliantImpedance(la norme estusbVersion).esd-tvs-diode:standard,testLevel,esdRating;testVoltage,limitPercent.esd-clamp-selection:standard,testLevel;testVoltage,limitPercent.radiated-emission-estimate:standard,emissionClass;eFieldUvm,limitField,limitPercent,maxCurrent,maxLoopArea.Là où une norme ne fixe aucune limite (ICNIRP sous 30 MHz, CISPR 32 hors de 30 MHz–6 GHz, couronnes de la classe 2 de l'IPC-6012, un espacement A6 au-dessus de 3 050 m), les nouvelles sorties valent NaN, renvoyées comme null, avec un avertissement qui en donne la raison.
Onze calculateurs de lignes de transmission renvoient la longueur d'onde guidée
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
microstrip-impedance,controlled-impedance,asymmetric-stripline,dual-stripline,differential-pair,edge-coupled-internal-symmetric,edge-coupled-internal-asymmetric,edge-coupled-embedded,broadside-coupled-pair,coplanar-waveguideetcoax-impedanceacceptent unefrequencyfacultative (GHz, valeur par défaut 2,4) et renvoientguidedWavelengthetquarterWavelength(mm), λg = c/(f·√εeff), les lignes couplées à partir de leur εeff en mode impair. Une requête sansfrequencyrenvoie toutes les sorties existantes inchangées, plus les deux nouvelles à 2,4 GHz.radiated-emission-estimate : la marge suit la norme et la classe choisies
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
marginest la limite de la norme et de la classe choisies à la fréquence et à la distance de la requête, moins le champ :standard0 désigne la CISPR 32 et 1 la FCC Part 15, section 15.109,emissionClass0 la classe B et 1 la classe A. Une requête sans eux obtient la CISPR 32 classe B, comme avant : sa marge est donc inchangée. Les limites FCC s'appliquent de 30 MHz à 40 GHz, et la marge vaut null hors de la plage de sa norme. Le libellé de la sortie est désormais « Margin to Limit ».minimum-conductor-spacing ajoute les colonnes A6 et A7 des sorties de composants, et une sortie B4
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
condition4 correspond à A6 (sortie ou terminaison de composant externe, non revêtue, du niveau de la mer à 3 050 m) et 5 à A7 (sortie ou terminaison de composant externe, avec vernis de tropicalisation), toutes deux du tableau 6-1 de l'IPC-2221B. Au-dessus de 3 050 m, une requête A6 renvoie un espacement null avec un avertissement, car le tableau ne donne A6 que jusqu'à 3 050 m. La nouvelle sortiespacingB4est la colonne B4 (conducteurs externes, revêtement polymère permanent), à côté despacingB1,spacingB2etspacingB3. Les conditions 0 à 3 et les sorties existantes sont inchangées.bga-land-pad dimensionne la pastille selon le diamètre de la bille, comme l'IPC-7351B
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
La pastille valait le diamètre de la bille × 1,0, 0,9 ou 0,8 selon le niveau de densité, ce qu'aucun tableau IPC ne donne. Elle suit désormais l'IPC-7351B : pour une bille qui s'affaisse, 25, 20 ou 15 % de moins que la bille selon la taille de celle-ci. Avec les valeurs par défaut,
padDiapasse de 0,55 à 0,45 mm, et les sorties qui en dérivent suivent. L'entréedensityLevelest retirée, car l'IPC-7351B n'applique pas de niveaux de densité à une pastille de BGA : une requête qui l'envoie reçoit une réponse, avec un avertissement indiquant que la valeur n'a pas été lue.bldc-winding : une bobine s'étend sur au moins une encoche
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batch
Là où le nombre d'encoches divisé par le nombre de pôles s'arrondissait à 0 (6 encoches pour 14 pôles, par exemple), le pas de bobine valait 0, le facteur de bobinage 0, et
actualKvetdeltaEquivKvvalaient null. Une bobine concentrée est enroulée autour d'une dent : le pas vaut donc désormais au moins une encoche, et ces sorties sont des nombres.Les tâches emi_radiated appliquent la limite la plus stricte en bord de bande
POST /api/py/v1/jobs
À exactement 88, 216 et 960 MHz (FCC Part 15) et 230 MHz (CISPR 32), la plus souple des deux limites adjacentes était utilisée. Le 47 CFR 15.109(c) dispose que la limite la plus stricte s'applique aux bords de bande, et la CISPR 32 applique la limite la plus basse à une fréquence de transition ; les deux règles sont désormais appliquées.
Plages d'entrée sur 31 calculateurs
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}POST /api/py/v1/calculate/batchprovenance.validRange
Les entrées de 30 calculateurs ont reçu un maximum, pour la plupart des calculateurs de géométrie (lignes, pastilles, antennes, guides d'ondes), pour que la page puisse les obtenir par résolution, et la capacité de bus d'
i2c-pullupva désormais jusqu'à 550 pF, la limite du Fast-mode Plus. L'API ne refuse pas une valeur au-delà de la plage d'une entrée ;provenance.validRangela signale comme hors plage.Douze calculateurs de capteurs gagnent un étage d'entrée : sa tension, le code du CAN et la résolution
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}
ntc-thermistor,rtd-temperature,pt100-resistance,thermocouple-voltage,wheatstone-bridge,strain-gauge-bridge,pressure-bridge-output,load-cell-amplifier,hall-effect-sensor,current-shunt,accelerometer-sensitivityetlvdt-sensitivityacceptent des entrées facultatives d'étage d'entrée et renvoient trois nouvelles sorties. Les entrées sont un diviseur (fixedResistor,sensorPositionountcPosition) ou un amplificateur (frontGain), et un CAN (adcRef,adcBits), en réutilisant une entrée que le calculateur avait déjà (gain,amplifierGain,adcVoltage,supplyVoltage). Les sorties sont la tension de l'étage d'entrée (dividerVoltageouamplifiedVoltage),adcCode(un code unipolaire sur N bits, maintenu entre 0 et 2^N − 1) etresolution(la grandeur physique par pas du CAN en ce point).load-cell-amplifieraccepte la charge appliquée à la cellule (appliedLoad) et renvoie sa sortie (bridgeOutputMv) ;accelerometer-sensitivityaccepteaccelerationet renvoieoutputVoltage.Chaque nouvelle entrée est facultative et, à sa valeur par défaut, aucune sortie existante ne change : une requête écrite avant cette modification renvoie les mêmes valeurs qu'avant, plus les nouvelles sorties.
current-shunt : le gain de l'amplificateur vaut 20 par défaut
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}
Lorsqu'une requête omet
amplifierGain,current-shuntutilise désormais 20 là où il utilisait 50. Avec les autres valeurs par défaut (10 A dans 10 mΩ, un CAN de 3,3 V), un gain de 50 portait le CAN à 5 V, au-delà de sa référence. Un gain de 20 donne 2 V.amplifiedVoltageetadcResolutionCurrentchangent pour ces requêtes ; une requête qui préciseamplifierGainn'est pas concernée.hall-effect-sensor : un champ nul ou négatif est refusé
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}
hall-effect-sensorrenvoie désormais une erreur pour unBfieldinférieur ou égal à 0 mT, comme le faisait déjà le site, là où l'API renvoyait des valeurs calculées à partir de celui-ci.frequency-ppm-tolerance : les avertissements citent les tolérances d'horloge applicables
POST /api/py/v1/calculatePOST /api/py/v1/calculate/{slug}
Les avertissements de
frequency-ppm-tolerancecitaient un budget UART de ±50 ppm (un UART tolère environ 2 %) et jugeaient ±100 ppm trop lâche pour l'USB, qui autorise ±2500 ppm en pleine vitesse. Au-delà de ±50 ppm, l'avertissement cite désormais l'Ethernet 100BASE-TX et l'horloge radio du Bluetooth LE. Au-delà de ±100 ppm, il cite toutes les horloges Ethernet, et au-delà de ±500 ppm l'USB 2.0 haute vitesse. Les seuils de 50 et 100 ppm sont inchangés ; celui de 500 ppm est nouveau.Largeur de piste et échauffement propres à la carte, tirés du modèle thermique de rftools
POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)POST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
trace-width-currentgagnewidthBoardMm, la largeur minimale pour cette carte, etpcb-trace-tempgagnetempRiseBoardetmaxTempBoard, l'échauffement et la température maximale sur celle-ci ; les deux gagnentinModelRange. Ces valeurs viennent du modèle thermique propre à rftools, jamais présenté comme IPC-2152 : un réseau thermique sous forme fermée ajusté sur un solveur 2D en volumes finis, réservé aux tests, de la piste, du stratifié, du plan et de l'air immobile (convection et rayonnement), lui-même vérifié par rapport à des mesures publiées (conditions de l'IPC-TM-650 2.5.4.1A, ajustements de Brooks & Adam sur les abaques de l'IPC-2152, et d'autres) et assorti d'une marge de 15 % sur l'échauffement, tirée du pire d'entre eux. Dans sa plage validée (largeur de piste 0,25–5,1 mm, carte 1,4–3,2 mm, une piste interne à partir de 1,27 mm de large, un échauffement de 5–100 °C, un plan à 0,1 mm ou plus), l'ajustement reste à 2,81 % du solveur.Nouvelles entrées, ajoutées avec des valeurs par défaut pour qu'une requête existante calcule à l'identique :
boardThickness(mm, valeur par défaut 1,6),planeDistance(mm jusqu'à un plan de cuivre, 0 s'il n'y en a pas) etplaneCopperWeight(oz, valeur par défaut 0,5) sur les deux calculateurs, etisExternalsurpcb-trace-temp. Toutes les sorties existantes sont inchangées. Avec les valeurs par défaut,widthBoardMmvaut 0,30212 mm, à côté des 0,78144 mm de Figure 5-1, ettempRiseBoard10,2818 °C.Hors de la plage validée, le résultat est toujours donné, avec
inModelRangeà 0 et un avertissement qui nomme la borne ; une carte de moins de 1,4 mm renvoie à Figure 5-1, où le modèle et les données d'épaisseur publiées de l'IPC-2152 divergent. Un emballement thermique renvoie null pour l'échauffement propre à la carte.provenance.validRangegagnemodelssur ces deux calculateurs, chaque modèle ajusté avec son propreinside: d'abord l'ajustement de l'IPC-2152 Figure 5-1, puis le modèle thermique, etstatusvautoutsidesi l'un ou l'autre l'est. Une requête à ces calculateurs avec un courant, un échauffement, un poids de cuivre ou une longueur nuls ou négatifs est refusée dans le navigateur comme par l'API, et un courant négatif est refusé au lieu de recevoir une réponse 500.Sept sorties que les calculateurs ne pouvaient pas calculer sont supprimées
POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)POST /api/py/v1/calculate/batchMCP run_calculationrftools-io SDK
differential-viane renvoie plusdiffImpedance,commonImpedance,oddImpedance,evenImpedancenisingleEndedImpedance. Une résolution de champ (un solveur quasi statique 3D validé sur quatre formes fermées et recoupé en pleine onde avec openEMS à 0,4 % près) a montré que l'impédance d'une paire de vias dépend de l'espacement des plans qu'elle traverse, qui n'est pas une entrée : avec les valeurs par défaut, elle vaut 85,6 Ω pour un espacement de plans de 0,1 mm et 96,0 Ω pour 1,0 mm, là où le calculateur indiquait 44,10 Ω. Aucune relation entre les entrées du calculateur n'approche chaque cas à 10 % près, et l'impédance de mode commun dépend en outre du chemin du courant de retour. La résonance du stub et les pertes sont toujours renvoyées ; voir l'entrée sur les corrections.usb-terminationne renvoie pluseyeOpening, une heuristique qu'aucune spécification USB ne définit.parabolic-dish-antennane renvoie plusnoiseTemperature, qui valait 290·(1 − η) : la température de bruit d'une antenne dépend de son élévation, de son débordement et du ciel, dont aucun n'est une entrée du calculateur.Un appelant qui lit l'une de ces clés doit cesser de le faire : la clé est absente, et non null. Toutes les autres sorties des trois calculateurs sont toujours renvoyées.
Les valeurs qui n'existent pas sont absentes ou null, et non égales à zéro ou à une valeur sentinelle
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
Ces sorties valent désormais null là où la grandeur n'est pas définie, là où elles étaient auparavant un nombre : la
signalRiseTimedeusb-terminationpour l'USB 3.0, qui ne spécifie aucun temps de montée de l'émetteur (l'USB 2.0 donne son minimum de 500 ps, T_HSR) ; les sorties de couplage depcb-crosstalk-emcau-delà de la limite du couplage faible, (x_C + x_L)/2 = 0,1, où le modèle à constantes localisées ne s'applique plus ;vbSealedetf3Sealeddesubwoofer-boxpour Qts ≥ 0,707, où aucun alignement en enceinte close n'existe (ils donnaient 2·Vas) ; leqFactordeplanar-spiral-inductorà la résonance propre ou au-delà ; le foret et la fraise de recouvrement d'aperture-diagonallorsqu'aucun outil disponible ne convient (ils donnaient 0) ; leqFactordelc-resonancesans résistance, le Q non borné d'un circuit sans pertes (il donnait 9999, et la bande passante f₀/9999 ; la bande passante vaut désormais 0) ; et lastubResonancededifferential-viaen l'absence de stub (elle donnait 0 GHz). Chaque null s'accompagne d'un avertissement qui en donne la raison.Une entrée refusée ne renvoie désormais aucune valeur, seulement son erreur, là où ces calculateurs renvoyaient des zéros ou des valeurs partielles :
power-density,thermal-via-array,bga-breakout-widthsans canal,dual-striplineavec h₂ ≤ 0,fresnel-zone, et chaque refus dedoppler-shift,reactance-calculator,broadside-coupled-pair,fusing-current,rise-time-bandwidth,current-divider,delta-wye-conversion,voltage-drop,rt60-reverberationetvfd-motor-speed. Un zéro à côté d'une erreur se lisait comme un résultat.Un appelant qui traitait ces valeurs comme des nombres doit vérifier si elles valent null, ou si la clé est absente à côté d'une erreur.
/calculate/solveignore déjà les points sans la sortie.Calculateurs corrigés d'après leurs références, avec trois nouvelles entrées et de nouvelles sorties
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solvePOST /api/py/v1/jobs (emi_radiated)MCP run_calculationMCP simulate_emi_radiatedrftools-io SDK
Constantes. La résistivité du cuivre est partout celle de l'IEC 60028, 1/58 Ω·mm²/m (trace-resistance 100,217 → 100,458 mΩ avec ses valeurs par défaut ; les autres calculateurs sur le cuivre bougent de 0,008 %, l'épaisseur de peau de 0,004 %). Le moteur microstrip utilise η₀/2π là où il utilisait 60, ainsi que la vitesse exacte de la lumière : toute impédance basée sur la microstrip bouge donc de −0,069 % (microstrip-impedance 80,954 → 80,898 Ω, differential-pair 99,983 → 99,914 Ω, et avec elles les largeurs résolues). Tous les calculateurs partagent désormais un même η₀ = µ₀·c (CODATA 2018). L'impédance d'onde de
power-densityvaut µ₀·c, 376,730 Ω (elle valait 120π). Le retard decontrolled-impedancevaut √εeff/0,299792458 ps/mm (6,52995 → 6,53447). La tâcheemi_radiatedutilise π·µ₀/c et µ₀ pour ses champs : elle concorde donc désormais avecradiated-emission-estimate(elle donnait 0,021 dB et 0,023 dB de trop).Modèles.
planar-spiral-inductorreprend les éléments parasites de Jow & Ghovanloo et la longueur de piste de sa forme : résonance propre 68,0 → 601,7 MHz et Q à 100 MHz 814,5 → 116,8 avec les valeurs par défaut, avec la nouvelle entrée facultativefrequency(MHz, valeur par défaut 100) pour Q.pcb-crosstalk-emcest le modèle à deux extrémités de Paul : les clés existantes sont par extrémité (la moitié des anciennes valeurs),farEndCrosstalkest nouvelle, et les valeurs par défaut sont une horloge de 3,3 V à 25 MHz.subwoofer-boxaccorde l'évent selon Margolis & Small (20,246 → 40,273 Hz) et ajoutef3Vented.pcb-crosstalkrepose sur le moteur de microstrips couplées, avec la nouvelle entréedielectricConst(valeur par défaut 4,5 ; couplage 6,77 → 5,72 %). La résistance de bord depatch-antennasuit le modèle à fentes rayonnantes de Balanis avec le η₀ exact, sans écrêtage (306,80 → 321,22 Ω ; la résistance d'alimentation et l'encoche à 50 Ω suivent).lc-resonancetraite sa résistance série comme une perte série dans les deux topologies, Q = Z₀/R (le mode parallèle calculait R/Z₀), et ajouteimpedanceAtResonance_ohm: R en série, L/(C·R) en parallèle. La résonance du stub dedifferential-viaest présentée comme la borne supérieure à vide, et sa perte dans les conducteurs comme la borne supérieure pour des plans denses (0,030 → 0,011 dB).Règles. Un réseau de microvias est dimensionné d'après sa section totale, note 5 de l'IPC-2221 (dix vias 2,762 → 1,466 A). L'auto-échauffement d'un via est le maximum du fût, P·L/(8kAN), dans
via-voltage-drop(0,2506 → 0,0313 °C) etmicrovia-current-capacity.bga-breakout-widthcompte la rangée extérieure (escapeRows1 → 2).padstack-annular-ringévalue le rapport d'aspect selon le tableau 9-4 de l'IPC-2222, 8:1 pour chaque classe, avec un contrôle du perçage minimal selon le tableau 9-6, et la couronne interne de la classe 3 vaut 0,025 mm.thermal-via-arraycompte des vias entiers.i2c-pullupetrs485-terminationrenvoient leurs résistances non arrondies (l'affichage arrondit toujours).aperture-diagonalaccepte la nouvelle entréerouterBit.Une requête qui omet l'une des nouvelles entrées obtient sa valeur par défaut.
Quatre sorties qui gardaient la même valeur pour toute entrée sont supprimées
POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)POST /api/py/v1/calculate/batchMCP run_calculationrftools-io SDK
Chacune de ces sorties renvoyait la même valeur quelles que soient les entrées, et aucune n'était un résultat :
vswr(1,0, « VSWR (ideal) ») etinsertionLoss(0,3 dB, « Typical Insertion Loss ») debalun-transformer;slewLimitedd'opamp-bandwidth(0, un emplacement réservé pour une vérification qui exige des entrées de vitesse de balayage et d'amplitude dont le calculateur ne dispose pas) ; etvoltageCodedecapacitor-code(0 V, une tension nominale qu'un code à 3 chiffres ne code pas). Elles ne sont plus renvoyées, pas même à côté d'un refus.Un appelant qui lit l'une de ces clés doit cesser de le faire : la clé est absente, et non null. Ce que représentait chaque valeur figure désormais dans
provenance.assumptions:ideal-transformersurbalun-transformer(adapté par construction ; les pertes du noyau et des enroulements ne sont pas modélisées, et un balun à ferrite perd typiquement 0,1 à 1 dB) etcapacitance-onlysurcapacitor-code. Toutes les autres sorties des trois calculateurs sont inchangées.Le gain de loop-antenna inclut son rendement de rayonnement
POST /api/py/v1/calculate (loop-antenna, capacitor-code)POST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
Le
gaindeloop-antennavalait 1,76 dBi pour toute entrée : la directivité d'une petite boucle, 3/2, sans aucune de ses pertes. Il vaut désormais cette directivité multipliée par le rendement de rayonnement e = R_rad/(R_rad + R_loss), tiré des deux résistances que le calculateur renvoie déjà : G = 10·log₁₀(1,5·e) (Balanis, Antenna Theory, 4e éd., chapitre 2 et section 5.2). Avec les valeurs par défaut, une boucle de 1 m en cuivre de 10 mm à 7 MHz, il vaut −9,4043 dBi, 11,2 dB sous l'ancienne valeur ; une boucle dont les pertes sont faibles devant sa résistance de rayonnement donne toujours près de 1,76 dBi. Le rendement est la nouvelle sortieradiationEfficiency(%), 7,6467 % avec les valeurs par défaut.capacitor-codearrondissait dans l'API un code fractionnaire au pair le plus proche là où la page arrondit à la valeur supérieure : 104,5 était décodé en 100 nF par l'API et en 1 µF par la page. Les deux donnent désormais 1 µF.Huit entrées qui ne changeaient aucun résultat en fixent désormais un ; onze nouvelles sorties
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
Chacune des entrées ci-dessous était déclarée mais n'était lue par aucune sortie. Elle fixe désormais une nouvelle sortie, ajoutée après les sorties existantes et calculée à partir d'une relation que le calculateur établit déjà ; aucune sortie existante ne change, pour aucune entrée.
patch-antenna:feedOffsetfixefeedResistance_ohm, R_edge·cos²(π·y₀/L) (Balanis, Antenna Theory, 4e éd., section 14.2.1, éq. 14-20a), 306,795 Ω avec l'alimentation au bord par défaut et 65,501 Ω à 10 mm, etinsetFeedPosition_mmest l'encoche qui donne 50 Ω, 10,594 mm.flyback-converter:fswfixeprimaryInductance(µH), Vin·D/(fsw·Ipk) pour le propre courant crête en conduction critique du calculateur, 130,56 µH.solar-panel-sizing:batteryCapacityfixebatteryAutonomyDays, C·V·0,5/(P·24 h) à la profondeur de décharge de 50 % que suppose la capacité requise, 0,25 jour.rs485-termination:baudRatefixebaudRateUtilisation(%), le débit en proportion du maximum de 10⁸ bit·m, 11,52 %.adc-snr:samplingFreqfixenyquistZone, ⌊f_in/(f_s/2)⌋ + 1, etaliasFrequency(MHz), |f_in − f_s·round(f_in/f_s)| (Kester, Analog Devices MT-002) : zone 1 et 1 MHz avec les valeurs par défaut, zone 2 et 30 MHz pour 70 MHz à 100 MSPS.bldc-thermal:continuousCurrentfixeratedCurrentShare(%), le courant de fonctionnement rapporté au courant nominal, 75 %.bldc-winding:supplyVoltagefixenoLoadSpeed(tr/min), Kv·V, 11 406,44 tr/min. Les valeurs sont données aux valeurs par défaut de chaque calculateur.Deux autres nouvelles sorties :
assumedBoomLength(m) suryagi-antenna, la longueur de boom qu'implique son espacement d'éléments de 0,2λ, (N − 1)·0,2λ, 1,6655 m avec les valeurs par défaut, qui remplace son entrée de longueur de boom retirée (voir cette entrée) ; etradiationEfficiency(%) surloop-antenna(voir l'entrée sur son gain). Sur le site uniquement, le widget réglementaire en direct d'ism-coexistenceaffiche désormais la bande que choisit sonbandIndex; son résultat est inchangé.Une requête qui omet l'une de ces entrées obtient sa valeur par défaut.
patch-antennasansfeedOffsetetsolar-panel-sizingsansbatteryCapacityrecevaient jusqu'ici une réponse 400 ; les deux reçoivent désormais une réponse.Douze entrées qui n'ont jamais changé un résultat sont retirées ; une requête qui en envoie une reçoit un avertissement
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationMCP get_calculator_schemarftools-io SDK
Ces entrées étaient déclarées, mais aucune de leurs valeurs ne changeait une sortie, un avertissement ou un refus :
smith-chartfrequency,via-calculatorsignalLayer,stackup-builderlayerCount(le modèle est un empilage fixe à quatre couches, ce que dit désormais son titre),i2c-pullupnumDevices,fm-modulation-indexcarrierFreq,quantization-noisefrequency,555-timervcc,bldc-efficiencypolePairs,opamp-bandwidthphase_margin,battery-internal-resistancetemperature,rs485-terminationnumNodesetyagi-antennaboomLength. Elles quittent le catalogue, les bornes de la provenance et le schéma MCP ; chaque calculateur les liste sousretiredInputs, avec la date.Une requête qui en envoie encore une reçoit les mêmes valeurs qu'avant et l'avertissement existant « Input '<key>' is not read by this calculator and was ignored. ». Elle n'est jamais refusée.
POST /calculate/solverefuse de résoudre pour l'une d'elles, comme pour toute entrée non déclarée ; aucune grille sur elle n'aurait pu faire bouger une sortie. Une requête àyagi-antennasansboomLength, qui recevait jusqu'ici une réponse 400, reçoit désormais une réponse.La prochaine version de
rftools-ioconserve chaque mot-clé retiré : en passer un déclenche unDeprecationWarningqui nomme la clé et sa date de retrait, et la clé n'est pas envoyée.trace-width-current lit sa largeur IPC-2152 sur l'IPC-2152 Figure 5-1 ; pcb-trace-temp indique l'échauffement selon l'IPC-2152
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
La
width2152mmdetrace-width-current, présentée comme IPC-2152, valait la largeur IPC-2221 × 0,75 sur une couche externe et × 0,85 sur une couche interne, un facteur que l'IPC-2152 ne contient pas et plus étroit que toute lecture IPC-2152 à partir de 2 A. Elle suit désormais l'IPC-2152 (2009) Figure 5-1, l'abaque que l'IPC-2152 recommande pour les conducteurs internes et externes dans tous les environnements, via l'ajustement publié I = 0,024·ΔT^0,44·A^0,725, identique sur les deux couches : 0,7814 mm avec les valeurs par défaut, contre 0,2266 mm auparavant ; à 5 A, avec un échauffement de 10 °C et 1 oz sur une couche externe, 7,194 mm, contre 2,086 mm auparavant. Elle reproduit à 5 % près les lectures d'Olson (2010) sur la Figure 5-1 de 300 et 680 sq mil. La clé est inchangée ; son libellé est désormais « Min Width (IPC-2152 Fig. 5-1) ».Les deux calculateurs prennent le cuivre à 35 µm par once, si bien que
width2221mmbouge de −0,58 % (0,3004 mm avec les valeurs par défaut, contre 0,3021 mm).resistance,voltageDropetpowerDissdetrace-width-currentsont calculés pour une nouvelle entrée, la largeur de piste dessinée, là où ils utilisaient le minimum IPC-2221, avec le cuivre selon l'IEC 60028 à 1/58 Ω·mm²/m : 0,10433 Ω avec les valeurs par défaut, contre 0,17326 Ω.Nouvelle entrée facultative, ajoutée ; une requête qui l'omet obtient sa valeur par défaut :
traceWidthsurtrace-width-current(mm, 0,5). Nouvelles sorties :inChartRangesur les deux calculateurs (1 dans la plage que trace l'IPC-2152 Figure 5-1, 0 en dehors, reporté dansprovenance.validRangeavec le pire résidu de l'ajustement), ettempRise2152etmaxTemp2152surpcb-trace-temp, l'échauffement selon la Figure 5-1 (k = 0,024, toute couche) à côté de l'échauffement externe selon l'IPC-2221 : 25,815 °C avec les valeurs par défaut, à côté de 5,342 °C. Les sorties existantes depcb-trace-tempconservent leurs clés et leurs valeurs.Les résultats hors des abaques sont donnés et signalés, jamais refusés : un avertissement nomme la grandeur et la borne de l'abaque, pour les courbes de 10 à 45 °C et 700 sq mil de la Figure 5-1, les 10 à 100 °C et 700 sq mil de l'abaque A de l'IPC-2221 sur une couche externe, et les ½ à 3 oz de l'abaque B ; au-delà de la Figure 5-1,
provenance.validRange.statusvautoutside.Références :
trace-width-current,pcb-trace-temp,microvia-current-capacityetvia-calculatorcitaient l'IPC-2221B pour l'abaque de courant, que cette édition (2012) ne contient pas. Ils citent désormais l'IPC-2221A (2003) Figure 6-4, l'abaque de l'IPC-2221 (1998), et l'IPC-2152 (2009) Figure 5-1 ; aucune valeur des deux derniers ne change.Douze calculateurs appliquent le modèle que décrivent leur page et leur référence
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
Chacun des calculateurs ci-dessous calculait un modèle qui s'arrêtait en deçà de ce que décrivent sa page et sa référence, de la même façon dans le navigateur, l'API et le serveur MCP. Chacun calcule désormais le modèle publié et est testé sur un cas publié, et la vérification de parité maintient le navigateur et l'API sur les mêmes valeurs. Les calculs enregistrés stockent des entrées : ils sont donc recalculés.
bldc-winding, qui relève de la même modification, a sa propre entrée du 2026-10-11.Les valeurs changent pour :
cable-shield-effectiveness(impédance de transfert R_T + jωM_T, et efficacité de blindage rapportée à l'impédance de ligne, Hähner & Mund 1998 : 64,95 dB avec les valeurs par défaut, contre 30,97 dB rapportés à 1 Ω, sans plancher à 0 dB),ferrite-bead(R_DC + (R_AC ∥ L ∥ C) d'Analog Devices AN-1368, calée sur l'impédance saisie à 100 MHz, et la perte d'insertion complexe entre la source et la charge : la perle par défaut de 600 Ω donne 94,9 Ω à 1 GHz, contre 1897 Ω),mosfet-operating-point(le point de fonctionnement sur la droite de charge du drain, Sedra & Smith 7e section 5.3 ; voir l'entrée incompatible ci-dessous),bldc-motor(la poussée à la vitesse où les couples du moteur et de l'hélice s'équilibrent, Drela 2007, avec C_P 0,047 : 140,91 g avec les valeurs par défaut, contre 80,43 g à 75 % fixe de la vitesse à vide),ethernet-cable(perte d'insertion du câble selon l'ANSI/TIA-568-C.2 à la fréquence de signalisation de chaque PHY, 31,25, 62,5 ou 400 MHz : 7,69 dB avec les valeurs par défaut, contre 16,5 dB ; la catégorie 8 est un canal de 30 m à toute vitesse),radar-range-equation(la portée au SNR qu'exige l'équation d'Albersheim pour P_d et P_fa : 35,23 km avec les valeurs par défaut, contre 74,96 km à SNR = 1, etsnrAtMaxRangeindique ce SNR, là où il valait 0),bldc-efficiency(pertes cuivre I²·R avec la résistance entre bornes, Drela 2007 et le maxon Formulae Handbook : 4,500 W avec les valeurs par défaut, contre 6,750 W),bldc-thermal(la résistance de l'enroulement à la température qu'il atteint, maxon Formulae Handbook section 9.2, avec les mêmes pertes cuivre : 207,61 °C avec les valeurs par défaut, contre 184,47 °C ; voir l'entrée incompatible ci-dessous),class-d-efficiency(conduction dans les FET qui portent la charge simultanément, I²·R_DS(on)·N/2 : 0,625 W avec les valeurs par défaut, contre 1,250 W),motor-driver-power(deux FET en conduction et un en commutation dure, TI SLVA504A : un pont de 0,1440 W avec les valeurs par défaut, contre 0,2088 W), etcoax-impedanceetvia-calculator(Z₀ tirée de η₀/2π = 59,9585 Ω avec les constantes CODATA 2018, là où ils utilisaient 60 : 47,990 Ω et 35,2243 Ω avec les valeurs par défaut, contre 48,023 Ω et 35,2487 Ω).Nouvelles entrées facultatives, ajoutées ; une requête qui en omet une obtient sa valeur par défaut :
transferInductance(nH/m, 0,159155, qui reproduit l'impédance de transfert précédente à 10 mΩ/m) etlineImpedance(Ω, 50) surcable-shield-effectiveness;beadInductance(µH, 1,208),parasiticCapacitance(pF, 1,678) etsourceImpedance(Ω, 0) surferrite-bead;biasMode(0 résout la droite de charge, 1 prend V_DS tel que saisi ; valeur par défaut 0) surmosfet-operating-point;pd(0,9),pfa(1×10⁻⁶) etpulses(1, intégrées de façon non cohérente) surradar-range-equation;transitionTime(ns, 50) surmotor-driver-power.Nouvelles sorties :
vdsOperatingsurmosfet-operating-point,loadedRpmetloadedCurrentsurbldc-motor, etgateDriveLoss(2·Q_g·V·f, dissipée dans le pilote de grille) surmotor-driver-power.Clés conservées, avec des significations qui correspondent désormais à leurs libellés : le
conductionLossdemotor-driver-powerest la perte d'une position en conduction (I²·R),switchingLosscelle de l'unique FET en commutation dure,totalLossPerFetle FET le plus chaud, etefficiencyest rapporté à V·I·D et compte la commande de grille. L'entréephaseResistancedebldc-efficiencyetbldc-thermalest présentée comme la résistance entre bornes, mesurée entre deux fils, ce qu'elle a toujours été.La perte d'insertion de la catégorie 8 utilise les coefficients provisoires que le modèle de canal de l'IEEE 802.3bq cite pour la catégorie 8 TIA (projet d0.7 : 1,8·√f + 0,005·f + 0,25/√f dB pour 100 m), et chaque résultat de catégorie 8 le précise, faute de disposer du tableau publié de la TIA-568.2-D.
Nouveaux refus et avertissements :
ferrite-beadrefuse une impédance à 100 MHz que ses L et C ne peuvent pas atteindre, en nommant la plus grande possible ;radar-range-equationrefuse une P_d qu'aucun détecteur n'atteint à cette P_fa et avertit hors de la plage indiquée par Albersheim ;cable-shield-effectivenessavertit quand le câble dépasse un sixième de longueur d'onde ou que le couplage n'est plus faible ;ethernet-cableavertit quand une catégorie est évaluée au-delà de la fréquence pour laquelle elle est spécifiée.mosfet-operating-point résout la droite de charge par défaut ; bldc-thermal renvoie null là où l'enroulement s'emballe
POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)POST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
mosfet-operating-pointrésout désormais par défaut la loi quadratique avec la droite de charge du drain V_DS = V_DD − I_D·R_D (Sedra & Smith, Microelectronic Circuits, 7e éd., section 5.3, exemple 5.5) :vddetrdLoadfixent donc le point de fonctionnement, et unvdssaisi ne le fait plus. Avec les valeurs par défaut, il donne 11,96 mA en régime ohmique à V_DS 0,0401 V, là où il donnait 450 mA, que la charge de 1 kΩ ne peut pas laisser passer sous 12 V. Un appelant qui s'appuie sur levdssaisi doit envoyerbiasMode: 1, qui conserve le calcul précédent et avertit quand V_DS + I_D·R_D s'écarte de plus de 1 % de V_DD. La nouvelle sortievdsOperatingdonne la V_DS du point de fonctionnement dans les deux modes.bldc-thermaltient désormais compte de la hausse de la résistance de l'enroulement avec la température (maxon Formulae Handbook, 2012, section 9.2). Là où α·Rθ·R₂₅·I² ≥ 1, il n'y a pas de régime permanent : les pertes cuivre croissent avec la température plus vite que le chemin thermique ne les évacue.tempRise,steadyStateTemp,thermalMarginethotResistancey valent null, avec un avertissement qui nomme le courant en dessous duquel l'enroulement se stabilise ; c'étaient auparavant des nombres (467,97 °C à 25 A sur le moteur par défaut, qui s'emballe désormais au-delà de 23,21 A). Un appelant qui les lit comme des nombres doit traiter null.deratedCurrentettimeToLimitsont toujours des nombres.Le
timeToLimitdebldc-thermalvaut null, avec un avertissement, lorsque le courant crête stabilise l'enroulement sous sa limite, si bien que la limite n'est jamais atteinte. Il valait auparavant la valeur sentinelle 9999 s, qui se lisait comme une durée réelle.bldc-winding : le taux de remplissage compte les deux côtés de bobine, et le facteur de bobinage de l'étoile des encoches
POST /api/py/v1/calculate (bldc-winding)POST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
fillFactorcompte désormais les deux côtés de bobine de chaque encoche, 2·N·A_wire/A_slot (Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, section 2.9) : une bobine sur chaque dent place deux côtés de bobine dans chaque encoche. Il n'en comptait qu'un, si bien que chaque taux de remplissage double. Il n'est plus plafonné à 100 % : un bobinage qui ne tient pas renvoie sa valeur réelle, avec les avertissements à 75 % et 90 % comme avant.windingFactortire son facteur de distribution de la méthode de l'étoile des encoches, k_d = sin(π/6)/(z·sin(π/(6z))) pour q = S/(3P) = z/n sous forme irréductible (Bianchi & Dai Pré, 2006). Il valait 1 pour tout q arrondi à 1, si bien que les bobinages à nombre fractionnaire d'encoches donnaient trop : 12 encoches et 14 pôles donnent désormais 0,93301 (contre 0,96593), 18 encoches et 16 pôles 0,94521 (contre 0,98481). Les bobinages à nombre entier d'encoches sont inchangés.turnsPerCoil,actualKv,deltaEquivKvetphaseResistancesuivent : le bobinage par défaut de 935 Kv reste à 4 spires et atteint 1027,61 Kv (contre 992,59), et 920 Kv sur un stator de 23 × 10 mm demande 6 spires (contre 5).Le
maxCurrentpar défaut du calculateur vaut 5 A (contre 10 A), si bien que son bobinage EMAX MT2213 par défaut est réalisable : 4 spires d'AWG 18 à 47,24 % de remplissage. À 10 A, il faut de l'AWG 14 et 119,44 %. L'API n'applique aucune valeur par défaut : une requête qui envoiemaxCurrentest calculée avec la valeur envoyée.Trente calculateurs corrigés selon la relation qu'ils citent
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/calculate/solveMCP run_calculationrftools-io SDK
Chacun des calculateurs ci-dessous calculait autre chose que sa référence citée, de la même façon dans le navigateur, l'API et le serveur MCP. Chacun calcule désormais la relation de la référence et est testé sur une valeur publiée. Les calculs enregistrés stockent des entrées : ils sont donc recalculés.
Les valeurs changent pour :
equalizer-q-factor(largeur de bande en octaves à Q constant),capacitor-code(un chiffre multiplicateur 8 signifie ×0,01, 9 signifie ×0,1),opamp-gain(la bande passante est le GBW divisé par le gain de bruit),coax-impedance(coupure TE11 sur la circonférence moyenne),h-bridge-selection(deux FET conduisent à la fois),bldc-winding(le facteur √3 relève de l'étoile ; nouvelles valeurs par défaut tirées d'un vrai moteur 12N14P),speaker-crossover(inductances du 2e ordre √2·R/ω_c, le double de l'ancienne valeur, y compris dans l'export KiCad),esd-tvs-diode(le niveau IEC 61000-4-2 reprend le premier pic de la norme, 3,75 A/kV),common-mode-choke(une impédance série complexe dans un système 50 Ω/50 Ω),uart-baud-rate(les parités mark et space comptent un bit),bldc-motor(poussée statique C_T·ρ·n²·D⁴ avec C_T 0,11),resistor-color-code(orange ±0,05 %, jaune ±0,02 % ; un anneau de tolérance blanc est refusé),pt100-resistance(le C de l'IEC 60751 sous 0 °C, et la pente complète),torque-units,energy-unitsettorque-unit-converter(facteurs exacts de la NIST SP 811),via-thermal-resistance(capacité en courant tirée de l'ajustement IPC-2221),thermal-via-array(le fût métallisé est en cuivre quel que soit le remplissage),stackup-builder(L3 résolue en stripline, L1 avec l'épaisseur de cuivre, le cuivre compté dans le total),coplanar-waveguide(le CPW avec plan de masse reste fini pour les pistes larges),i2c-pullup(V_OL vaut 0,2·V_DD à 2 V ou moins),vibration-phase-noise(le terme aléatoire décroît avec l'écart de fréquence ; la déviation est la valeur crête),inrush-current-limiter(le pic au démarrage à froid vaut V/R_cold),shielding-effectiveness(les pertes par réflexion intègrent η₀ ; réflexions multiples ajoutées),ethernet-cable(la catégorie 5e à 10 Gb/s échoue),ground-plane-impedance(inductance µ₀·h·l/w ; résistance en alternatif sur une seule face) etminimum-conductor-spacing(tableau 6-1 de l'IPC-2221B par plage, avec ses taux par volt au-delà de 500 V).Nouvelles entrées facultatives :
separationsurground-plane-impedance(mm, valeur par défaut 1) ettempRisesurvia-thermal-resistance(°C, valeur par défaut 10). Une requête qui les omet obtient la valeur par défaut, qui reproduit les exemples de calcul publiés.Nouvelles sorties :
hotRestartInrushsurinrush-current-limiteretmultipleReflectionLosssurshielding-effectiveness.Les sorties sans valeur reviennent désormais à null avec un avertissement, là où elles étaient un nombre : la longueur d'onde guidée et les vitesses de phase et de groupe de
waveguide-cutoffsous la coupure, et la largeur destackup-builderpour une impédance cible que la couche ne peut pas atteindre.comparator-hysteresisetpcb-trace-tempne changent que leurs libellés et la formule indiquée : aucun nombre ne change.POST /api/py/v1/calculate/solverefuse unegridplus fine que 1×10⁻¹² de l'ordre de grandeur de la plage par un refusgrid400, avant toute évaluation et sans facturation. Une telle grille pouvait retenir une requête jusqu'à expiration du délai.radiated-emission-estimate : marge par rapport à la CISPR 32 classe B, null là où elle ne fixe pas de limite
POST /api/py/v1/calculate (radiated-emission-estimate)POST /api/py/v1/calculate/batchMCP run_calculationrftools-io SDK
La marge est désormais prise par rapport à la limite CISPR 32 classe B à la distance de mesure : tableaux A.4 et A.5, la ligne à 3 m sous √30 m et la ligne à 10 m au-dessus jusqu'à 1 GHz, les lignes en valeur moyenne à 3 m de 1 à 6 GHz, 20 dB/décade à partir de la distance tabulée, et la limite la plus basse en bord de bande. C'était auparavant 40 dBµV/m fixes, à toute fréquence et toute distance.
En dessous de 30 MHz et au-dessus de 6 GHz, la CISPR 32 ne fixe aucune limite rayonnée :
marginy vaut donc null, avec un avertissement. C'était auparavant un nombre. Un appelant qui litmargincomme un nombre doit traiter null.Le champ est l'estimation d'une petite boucle en espace libre, désormais avec la constante exacte π·µ₀/c. Une mesure au-dessus d'un plan de masse peut donner jusqu'à 6 dB de plus, comme l'indique la page.
filter-designer et six calculateurs RF corrigés
POST /api/py/v1/calculateMCP run_calculationrftools-io SDK
filter-designer: les valeurs du prototype de Tchebychev étaient fausses à partir de l'ordre 4 (g3 1,5733, désormais 2,3661), un Butterworth du premier ordre donnait g1 = 1 (désormais 2), et les valeurs des éléments du passe-bande étaient dix fois trop petites à Q = 10. Les valeurs sont désormais calculées, et non tabulées.waveguide-cutoff,free-space-path-loss,rf-link-budget,fresnel-zone,link-marginetradar-range-equationutilisent la vitesse exacte de la lumière, et non 3×10⁸ : les longueurs bougent d'environ 0,07 % et la perte de trajet de 0,006 dB.radar-range-equationutilise aussi la constante de Boltzmann exacte.planar-spiral-inductorrefuse un diamètre intérieur égal ou supérieur au diamètre extérieur au lieu de renvoyer NaN.Quatorze calculateurs ont été ajoutés les 2026-10-05 et 2026-10-06, dont la nouvelle catégorie
iot; interrogez le catalogue parGEToulist_calculatorspour les voir.Impédance du PDN : un modèle de plans convergent, un port déduit et deux nouveaux paramètres
POST /api/py/v1/jobs (pdn_impedance)POST /api/py/v1/jobs/estimateMCP simulate_pdn_impedancerftools-io SDK
Si
portX_mmetportY_mmsont omis, le port est désormais placé au point au tiers de la carte (a/3, b/3) plutôt qu'en son centre. Le centre est un nœud de tous les modes de cavité d'indice impair : les premières résonances n'apparaissaient donc jamais avec les valeurs par défaut. Une requête qui indique le port obtient le port demandé.Deux paramètres facultatifs :
portSize_mm(valeur par défaut 1 mm, 0,25–20), le côté du carré par lequel le courant du CI entre dans les plans, etboardInductance_nh(valeur par défaut 1 nH, 0–20), l'inductance entre le régulateur et les plans, qui était fixée à 1 nH. Un port qui dépasse d'un bord de la carte est accepté et modélisé avec son image ; un port dont le centre est hors de la carte, ou qui est plus grand que la carte, est refusé.Les résultats changent. La somme modale du plan était tronquée en fonction de
freqMax_hzet, avec un port ponctuel, ne convergeait jamais : les résultats variaient donc avec le balayage. Elle converge désormais et ne dépend pas du balayage en dessous du premier mode. Au port par défaut, l'inductance d'étalement du plan vaut environ 1,5 nH là où elle était donnée à environ 0,2 nH : la résonance série du plan nu descend donc d'environ 550 à environ 210 MHz, et les jeux de condensateurs recommandés changent. Les résultats antérieurs ne sont pas recalculés.Le verdict et
summary.maxZPdnDbcouvrent désormais toute la bande de découplage, qui se termine à 0,8 × le premier mode de cavité de la carte, avec le pire cas affiné entre les points de la grille. Nouveaux champs de résultat :summary.band,summary.worstHz,summary.unreachable,resonances[].portCoupling, ainsi que le port, la taille du port et l'inductance de la carte utilisés, sousparams. Tous les champs existants sont conservés.Un appel de résolution pour une valeur cible : chercher une entrée de calculateur pour une sortie cible
POST /api/py/v1/calculate/solve
POST /api/py/v1/calculate/solvetrouve la valeur d'une entrée d'un calculateur qui amène l'une de ses sorties à une cible — la largeur de piste qui donne 50 Ω, l'écart qui donne une impédance différentielle cible — et la renvoie avec le résultat direct calculé exactement à cette valeur :values,warnings,errorsetprovenance, exactement ce que/calculaterenvoie pour ces entrées. Un seul appel décompté remplace les nombreux appels directs qu'un client dépenserait autrement à chercher à la main.La recherche parcourt les bornes indiquées de l'entrée, resserrées par une
rangefacultative ; une entrée sans borne indiquée en exige une. Unegridfacultative arrondit la valeur renvoyée à son multiple le plus proche dans la plage, à côté de la solution non arrondie. Une cible que la recherche ne peut pas atteindre reste un succès, avecreached: falseet la valeur la plus proche trouvée, et elle est facturée. Les refus — un calculateur inconnu, un nom d'entrée ou de sortie que le calculateur ne déclare pas, une valeur non finie, une plage manquante sur une entrée non bornée — ne coûtent rien, comme sur toutes les autres routes de calculateur.Le
Client.solve()du SDK Python (rftools-io0.4.0) et l'outilsolve_calculationdu serveur MCP (2.2.0) proposent le même appel.Un quota épuisé sur les routes de calculateur donne 402, et non 401
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batch
Les routes de calculateur répondaient 401 « Invalid or quota-exceeded API key » aussi bien à une clé non valide qu'à un quota épuisé : un script ne pouvait donc pas distinguer une mauvaise clé d'un mois chargé. Un quota épuisé donne désormais 402, comme la route des tâches le faisait déjà, avec
errorKind: "rate_limited",reason,limit,used,resetAt,upgradeUrl,overageUrlet un en-têteRetry-After.401 signifie désormais uniquement que la clé est absente, mal formée, inconnue ou révoquée, et ne mentionne jamais de quota. Une requête sans aucune clé reçoit un 401 avec une
keyUrloù obtenir une clé gratuite.Un appel est vérifié avant d'être décompté : un calculateur inconnu (404) ou une entrée qui n'est pas un nombre fini (400) ne coûtent rien, et un calcul qui échoue est restitué. Dans un lot, seuls les éléments qui passent ces vérifications sont décomptés, et les éléments dont le calcul échoue sont restitués. Basez votre logique sur le statut et
errorKind, jamais sur le texte du message.Le quota mensuel appartient au compte et est partagé par toutes ses clés
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchPOST /api/py/v1/jobs
Chaque clé avait auparavant son propre quota mensuel, si bien qu'un compte disposant de plusieurs clés pouvait consommer son quota une fois par clé. Le quota appartient désormais au compte : les appels de chacune de ses clés, y compris les clés révoquées, sont décomptés d'un seul chiffre mensuel, réinitialisé au début de chaque mois civil en UTC.
Un compte qui n'a qu'une clé ne voit aucune différence. Les appels restent attribués à la clé qui les a faits, et le tableau de bord et
GET /api/py/v1/usageles listent par clé.Un point de terminaison d'usage, et des en-têtes d'usage sur chaque réponse décomptée
GET /api/py/v1/usageX-Usage-AllowanceX-Usage-UsedX-Usage-ResetX-Usage-Overage
GET /api/py/v1/usageindique à une clé (X-API-KeyouAuthorization: Bearer rfc_…) ou à une session connectée l'offre, le quota, ce qui est consommé et ce qui reste, sa date de réinitialisation, l'état du dépassement et les appels attribués à chacune des clés du compte. Sa consultation n'est jamais décomptée.Chaque réponse décomptée porte
X-Usage-Allowance,X-Usage-Used(cet appel compris) etX-Usage-Reset, ainsi queX-Usage-Overagelorsqu'un dépassement a été décompté. Les navigateurs peuvent les lire.Chaque résultat indique comment il a été calculé
POST /api/py/v1/calculatePOST /api/py/v1/calculate/batchGET /api/py/v1/jobs/{jobId}
Les résultats des calculateurs et chaque élément d'un lot portent un objet
provenanceà neuf membres :method,version,formulaRef,assumptions,validRange,computedAt,inputs,seedetelapsedSeconds. Les résultats des tâches portaient déjàprovenance; il gagneformulaRef,assumptions,validRangeetcomputedAtplutôt qu'un second objet, et saversions'écritworker@<revision>au lieu de la révision seule.Une entrée hors de la plage pour laquelle un calculateur est prévu est tout de même calculée :
validRangela nomme et un avertissement est ajouté. Un résultat stocké avant cette modification conserve les membres qu'il avait ; traitez un membre absent comme inconnu.Les programmes peuvent obtenir une clé par l'autorisation d'appareil
POST /api/py/v1/oauth/device/codePOST /api/py/v1/oauth/device/token/device/
Un programme sans navigateur intégré peut obtenir une clé sans que son utilisateur en colle une (autorisation d'appareil OAuth 2.0, RFC 8628). Il demande un code à
/oauth/device/code, montre à son utilisateur le code et l'adresse https://rftools.io/device/, puis interroge/oauth/device/tokenà l'intervalle qui lui a été donné. Une fois que l'utilisateur s'est connecté et a approuvé le code, l'interrogation suivante renvoie une clé d'API ordinaire, une seule fois.La clé est décomptée, listée et révocable comme toute autre, et elle compte dans la limite de clés du compte.
Des liens de clé pour les clients, et des libellés sur les clés
POST /api/py/v1/apikeys/dashboard/?newKey=1
POST /api/py/v1/apikeysaccepte un corps facultatif{"label", "client"}et renvoie les deux ; sans corps, il fonctionne comme avant. Un client peut envoyer son utilisateur vershttps://rftools.io/dashboard/?newKey=1&client=<clientId>pour créer une clé libellée à son nom, affichée une seule fois.Les refus nomment la limite et le moyen de la dépasser
429 responses402 from POST /api/py/v1/jobsAuthorization: Bearer rfc_…
Le 429 par minute porte
errorKind: "rate_limited",limit,windowSecondsetupgradeUrlà côté dedetail, comme chaque autre refus porte sonerrorKind. Le 402 de la route des tâches pour un quota épuisé gagnereason,limit,used,upgradeUrletoverageUrl, et le 402 pour un quota épuisé des modes de résolution defdtd_sparamportereason: "solve_mode". Les champs existants sont inchangés.Les routes de calculateur acceptent une clé sous la forme
Authorization: Bearer rfc_…aussi bien queX-API-Key, comme les routes des tâches le faisaient déjà.
La référence complète est la documentation de l'API ; la description lisible par machine est le playground OpenAPI et le document OpenAPI.