Skip to content
Seções da documentação

Registro de alterações da API

Cada alteração da API pública que um chamador poderia notar, da mais recente para a mais antiga. Cada entrada tem a data em que foi anunciada aqui; uma alteração que quebra os chamadores existentes é anunciada no máximo junto com a versão que a introduz, e é marcada como Incompatível. 29 das 81 entradas abaixo são incompatíveis.

  1. rf-link-budget usa 0,5 dB de perda atmosférica quando atmosphericLoss é omitido

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Uma chamada que omitia atmosphericLoss era calculada com 0 dB, enquanto o seu provenance.inputs informava o padrão documentado, 0,5 dB. Agora ela é calculada com 0,5 dB, como dizem a página da calculadora e a procedência, então rxPower, linkMargin e maxRangeKm mudam esse meio decibel em uma chamada assim. Uma chamada que envia a entrada não muda.

    Todas as outras entradas de todas as calculadoras foram verificadas da mesma forma: quando omitida, uma entrada é recusada (400, nada cobrado) ou calculada com o seu padrão documentado.

  2. GET /v1/usage pode devolver as chamadas por dia

    • GET /api/py/v1/usage

    Passe ?days=N, de 1 a 90, e a resposta ganha daily: uma entrada {date, calls} para cada um dos últimos N dias em UTC, do mais antigo ao mais recente, terminando hoje. As calls de um dia são somadas sobre todas as chaves da conta, descontadas as chamadas devolvidas, e um dia sem nenhuma mostra 0. Os dias anteriores a 2026-09-24, quando começou a contabilização por hora, mostram 0.

    Sem days, a resposta não muda. Consultar o uso continua sem ser contabilizado.

  3. O número de portas de um upload Touchstone é lido das linhas antes do nome

    • rf_cascade
    • sparam_pipeline
    • impedance_match
    • eye_diagram

    Quando a quantidade de valores de um arquivo admite mais de um número de portas, as linhas decidem antes da extensão: três pontos de uma porta em um arquivo chamado .s2p são uma porta, não um ponto de duas portas, e um nome que os dados contradizem é informado (port_count_mismatch no rf_cascade). Uma palavra-chave [Number of Ports] continua decidindo primeiro.

    O diagrama de olho não falha mais com um arquivo cuja extensão indica mais portas do que os dados contêm.

  4. O Monte Carlo de filtro roda até 1.000 iterações no plano gratuito e 100.000 no Pro e no API, dentro de um orçamento de trabalho

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • POST /api/py/v1/jobs/estimate
    • GET /api/py/v1/jobs/types
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    monteCarloIterations vai até 1.000 no plano gratuito (era 500) e até 100.000 no Pro e no API (era 10.000). O tempo máximo do trabalho é 180 s (era 120 s).

    O custo de uma execução é o número de iterações vezes as avaliações da escada que cada uma exige, definidas pelos componentes e por passCriteria. Uma execução prevista acima do orçamento do seu ambiente (120 s no ambiente pago, 60 s no gratuito) é recusada no envio e pela estimativa com errorKind: "too_large", antes de qualquer cobrança. O detalhe nomeia monteCarloIterations e dá o custo, o limite e, em allowed.max, o máximo de iterações que cabem. Cabem 100.000 iterações de uma escada de 5 componentes com três critérios; uma escada de 20 componentes com oito critérios cabe até 53.304.

    A estimativa informa withinBudget, um budget do tipo ladderEvaluations e work como trials e ladderEvaluationsPerTrial, que o computeCost.work de um trabalho também registra.

  5. A lista de estágios de uma cascata de RF é verificada no envio

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • rf_cascade

    Um stages malformado (não é JSON, está vazio, tem um estágio que não é um objeto, um valor que não é um número finito) é recusado com um 400 que nomeia o estágio e a chave, antes de qualquer cobrança. Antes ele era aceito e depois falhava como erro interno (fault).

    Os valores dos estágios têm limites: gain_db ±1000 dB, nf_db de 0 a 1000 dB, iip3_dbm e p1db_dbm ±1000 dBm, e o ganho da cadeia depois de cada estágio dentro de ±1000 dB. NaN, Infinity e true/false são recusados; números escritos como texto continuam sendo lidos.

    Uma chave de estágio que difere de uma conhecida apenas em maiúsculas e minúsculas (gain_dB, IIP3_dbm, Name) é recusada, nomeando o estágio e a chave correta; antes ela era ignorada e o estágio rodava com o padrão. Qualquer outra chave que um estágio não aceita (notes, part) é ignorada com um aviso unknown_stage_key.

    Um estágio cujo sparamFile não foi enviado com o trabalho é recusado, não calculado com o ganho digitado.

  6. Sem ponto de interceptação, o valor é null, não 99 dBm

    • POST /api/py/v1/jobs
    • rf_cascade

    O IIP3 de um estágio passivo e o IIP3, o OIP3, o P1dB e o SFDR de uma cadeia em que nenhum estágio os limita são null (eram 99 dBm e 99 + ganho). Nesse caso, os percentis e o histograma de IIP3 do Monte Carlo são null e o rendimento de IIP3 é 100%.

    Um estágio passivo não adiciona mais um ponto de interceptação de 99 dBm: um atenuador de 150 dB antes de um amplificador com IIP3 de 0 dBm agora mostra 150 dBm, não 99.

  7. Cascata de RF: ruído passivo a partir de arquivos, sinal do Monte Carlo, interceptações exatas, avisos

    • rf_cascade

    Um estágio passivo cujo ganho vem de um arquivo tira a figura de ruído desse ganho.

    O Monte Carlo varia a figura de ruído de um estágio passivo junto com a sua perda; o sinal estava invertido.

    O IIP3 e o P1dB de entrada são calculados exatamente, por mais baixos que fiquem (três amplificadores de 300 dB: −600 dBm e −610 dBm, que antes mostravam −270 dBm); um piso de −270 dBm permanece apenas como proteção para quando a soma por trás de um ponto não é um número positivo e finito, o que os limites dos estágios mantêm fora de alcance, então um P1dB não faz mais o trabalho falhar.

    Avisos unknown_stage_type, unknown_stage_key e file_not_uploaded.

  8. O casamento de impedância ajusta os valores em escala logarítmica e varre a reflexão de onda de potência

    • POST /api/py/v1/jobs
    • impedance_match

    Os componentes E12, E24 e E96 são o valor padronizado mais próximo em escala logarítmica, do jeito que as séries são espaçadas; exatamente no meio, o menor. 2,099 nH agora é 2,2 nH, não 2,0 nH. Onde as duas regras diferem, os componentes, a perda de retorno e o ramo que auto escolhe podem mudar.

    |S11|, a trajetória na carta de Smith, a perda de retorno no pior caso e a largura de banda usam a reflexão de onda de potência (Z − Zs*)/(Z + Zs), como os valores em f0. Uma fonte real não muda; uma fonte complexa, digitada ou lida de um arquivo, mostra um |S11| diferente.

  9. O casamento de impedância informa a frequência de projeto, o modelo de frequência da carga e os valores em f0

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • impedance_match

    Cada novo parâmetro é opcional; uma requisição sem eles recebe a mesma resposta de antes.

    designFreq (Hz): f0, informada separadamente de freqStart–freqStop e dentro dessa faixa; se ausente, o centro da banda.

    loadModel: constant (se ausente), series_rc ou series_rl (ajustados em f0; uma reatância com o sinal errado é recusada) ou file (os próprios pontos de frequência da carga enviada). branchPreference: any, lowpass ou highpass, com um aviso branch_preference_unmet quando não existe esse ramo. Um arquivo de carga .s1p é aceito.

    Novos resultados: designFreqHz, loadModel, unmatchedLoad, performance.ideal e .standard (perda de retorno, VSWR, perda por descasamento eliminada e a largura de banda com RL ≥ 10 dB, com os seus extremos e a sua fração de f0, resolvida por bissecção), branch e qDefinitions.

  10. O diagrama de olho aceita uma excursão de saída, um CTLE e uma máscara

    • POST /api/py/v1/jobs (eye_diagram)
    • MCP simulate_eye_diagram

    Cada novo parâmetro é opcional, e uma requisição sem eles recebe a mesma resposta de antes.

    launchSwing (mV pico a pico, padrão 2000, o ±1 V que todo resultado anterior supunha) escala todas as tensões; eyeHeightPctOfSwing dá a altura do olho como fração dessa excursão.

    equalization: ctle aplica o filtro de tempo contínuo do IEEE 802.3 Annex 93A. ctleDcGain (−12 a 0 dB) fixa o seu ganho; em branco, usa o melhor entre −12 e 0 dB em passos de 1 dB. ctle informa o ganho, o pico na frequência de Nyquist, a varredura e o olho antes dele.

    maskType (hexagon ou rectangle), maskHalfHeight (mV) e maskWidth (UI) dão mask.pass, margin_mV e as violações. samplingPhase (UI depois do cruzamento) e lossFrequency (Hz) adicionam sampling e lossAtFrequency.

    Todo resultado traz channelFile, uiMeasured e traceCount.

  11. A detecção de radar aceita uma semente aleatória

    • POST /api/py/v1/jobs (radar_detection)
    • provenance.seed

    randomSeed (um número inteiro, 0 ou mais) substitui a semente fixa 42 do Monte Carlo e é registrado como provenance.seed, então uma execução pode ser repetida e uma hipótese pode ser reenviada com os mesmos sorteios. Sem ele, todo resultado continua igual.

  12. O Monte Carlo de filtro roda uma escada como montada, contra critérios que você define, e diz o que apertar

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    Cada novo parâmetro é opcional, e uma requisição sem eles recebe a mesma resposta de antes, com novos campos de resultado ao lado.

    parts (de 1 a 20, da fonte à carga: ref, kind L ou C, position series ou shunt, value em H ou F, tolerance opcional em %) simula a escada como foi dada, sem arredondamento E24. passCriteria (de 1 a 8: insertionLoss em fStart–fStop de no máximo maxDb, cutoff3dB dentro de fMin–fMax, attenuation em freq ou em fStart–fStop de pelo menos minDb) substitui rippleSpec_db e rejectionSpec_db. yieldTarget (%, 95 quando em branco).

    Novos resultados: circuit, yieldTarget com um veredito contra o intervalo de 95 %, criteria com estatísticas, histogramas e a varianceShare (r²) de cada componente, failingTrials (as 200 primeiras), sampleTrials e, com critérios informados, whatIfs: os componentes que mais pesam no critério com mais reprovações, com a tolerância um passo mais apertada, rodados de novo nas mesmas iterações. Reenviar com o randomSeed da execução e essas tolerâncias dá o mesmo rendimento.

  13. A malha de controle SMPS aceita o compensador por componentes, resolve para uma frequência de cruzamento e dá um veredito

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • smps_control_loop result

    Cada nova entrada é opcional, e uma requisição sem ela recebe a mesma resposta de antes.

    compensatorType: type2_ota com compRc, compCc, compChf, compGm e compVref descreve um Type II de transcondutância pelos seus componentes, mapeado exatamente para K, f_z e f_p. Um compVref acima de Vout é recusado.

    solveFor: crossover com targetCrossover (Hz, padrão Fsw/10), resistorSeries (E96) e capacitorSeries (E12) define R_c, C_c e C_hf no modo de corrente de pico e informa o que eles alcançam.

    minPhaseMargin (45°) e minGainMargin (10 dB) definem o veredito e o rendimento do Monte Carlo.

    Novos resultados: verdict, polesZeros, nominal.phaseCrossoverHz, nominal.loopGainAt100HzDb, compensatorParts, solve, runSummary e bodeAboveHalfFsw, as respostas até 2·Fsw, onde nenhuma margem é lida.

  14. Dezesseis calculadoras de temporização avaliam a temporização contra um orçamento

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada nova entrada é opcional, e uma requisição sem ela recebe a mesma resposta de antes, exceto onde os itens abaixo dizem o contrário.

    uart-baud-rate: oversampling (16 ou 8), divisorFraction (0 um divisor inteiro, 1 uma fração em passos de 1/oversampling) e errorBudget (%, 2, que o aviso de erro de baud segue); divisorSet, baudError_pct (com sinal) e stopSampleOffset_bits.

    can-bus-timing: sjw (tq, 1); bitRateActual, bitRateError_pct, samplePointActual e oscTolerance_pct, a tolerância de clock que a ISO 11898-1 permite a cada nó.

    lin-bus-timing: slotTime (ms, 10); frameTimeMax, 1,4 × o quadro nominal (LIN 2.x). modbus-frame-timing: charGap (ms, 0), que o tempo de quadro agora conta; t15, charGapChars e t15Chars.

    spi-timing: riseTime (2,2τ) e edgeShare_pct. i2s-timing: mclk (MHz, 16,9344) e rateBudget (%, 0,1); mclkDivider, bclkActual, sampleRateActual e sampleRateError_pct. pwm-duty-cycle: timerClock (MHz, 16) e requiredBits (8); periodCounts, onCounts, dutyActual, frequencyActual e dutyResolution_bits.

    555-timer: targetTime (ms, 2), errorBudget (%, 5), rTolerance e cTolerance (%, 0); timeMin, timeMax e timingError_pct. rc-time-constant: rTolerance (%, 1), cTolerance (%, 5) e tauBudget (%, 10), com um aviso acima dele; tauMinUs, tauMaxUs e tauErrorPct.

    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 o aviso de atraso agora segue. Cada um é recusado em 0 ou abaixo.

    inrush-current-limiter: ntcR25 (Ω, 0 para o valor necessário) e ntcTolerance (%, 20); peakInrushMax. Com ntcR25 definido, peakInrush, timeConstant e limitingResistor seguem o termistor ajustado. pid-tuning: overshootBudget (%, 25); overshootPct e settlingTime a partir de um degrau simulado em malha fechada.

  15. Catorze calculadoras de frequência contam os seus produtos contra uma banda

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada nova entrada é opcional, e uma requisição sem ela recebe a mesma resposta de antes, exceto onde os itens abaixo dizem o contrário.

    mixer-spur-calculator: rfBandLow/rfBandHigh (MHz, 902/928), ifBandwidth (MHz, 10) e nearMargin (MHz, 50); spursInBand, spursNearBand, nearestSpur, imageFreq, imageToBand e loToBand, a partir de toda entrada de RF que converte para a FI, f_RF = (m·f_LO ± f_IF)/n (m o harmônico do LO, n o harmônico de RF, como na contagem anterior), com m + n até 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, com os canais distribuídos uniformemente pela banda. channels1 e channels2 são limitados a 100.

    via-stub-resonance: dataRate (Gb/s, 10); nyquistFreq, resonancesInBand e resonancesNearBand. chassis-resonance: bandLow/bandHigh (MHz, 30/1000); f011MHz e modesInBand. room-modes: bandLow/bandHigh (Hz, 20/200); modesInBand, modesNearBand e modalBandwidth.

    sampling-nyquist: harmonicOrder (5); aliasesInBand (o próprio tom rebatido na banda do sinal), harmonicAliasesInBand (os seus harmônicos rebatidos nela, que importam até o SFDR do conversor) e lowestAliasingInput. fft-bin-resolution: toneFreq (Hz, 1000) e sidebandSpacing (Hz, 100); toneBin, toneLevelError, resolutionBandwidth e sidebandsUnresolved (null para um tom acima de f_s/2).

    am-modulation-index: channelWidth (kHz, 10); powerInChannel, sidebandsInChannel e sidebandsOutside. fm-modulation-index: channelLow/channelHigh (kHz, 98000/98200); occupiedBandwidth, powerInChannel, sidebandsInChannel e sidebandsOutside (null acima de β = 1000, com um aviso).

    oversampling-snr: signalBandwidth (Hz, 24000); modulatorRate, outOfBandNoise e foldBands. digital-filter-order: toneFreq (Hz, 1000) e maxHarmonic (5); harmonicsInPassband, harmonicsInTransition, nearestHarmonic, butterworthAttenuation e chebyshevAttenuation.

  16. can-bus-timing: o prescaler e os quanta mais próximos da taxa de bits

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    De todo bit de 8 a 25 time quanta (CAN 2.0), com o prescaler de cada lado daquele que a taxa pede, o mais próximo da taxa de bits; depois o ponto de amostragem mais próximo do pedido (CiA 601-3); depois 16 quanta; depois o menor prescaler. Antes ele escolhia o prescaler mais próximo de 16 quanta, qualquer que fosse a taxa resultante: 36 MHz a 500 kbps dava 5 × 14 quanta, 2,86 % rápido demais, e agora dá 3 × 24, exato. prescaler, nominalBitTime, tq e os segmentos mudam onde existe uma configuração exata ou mais próxima; todos os padrões e predefinições continuam iguais.

    O ponto de amostragem fica no máximo um quantum antes do fim do bit, então os segmentos somam até ele (8 quanta a 95 % eram 9).

  17. modbus-frame-timing: temporizadores fixos acima de 19 200 Bd

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Acima de 19 200 Bd, t35 é fixo em 1,75 ms (Modbus over Serial Line V1.02, seção 2.5.1.1), não mais 3,5 caracteres (0,334 ms a 115 200 Bd 8E1), e maxFrameRate acompanha; o novo t15 é fixo em 750 µs nessa faixa.

  18. intermodulation-distortion: im3High é um módulo

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    im3High é |2f₂ − f₁|, como im3Low já era: abaixo de f₂ = f₁/2 ele era negativo (100 e 40 MHz: −20, agora 20 MHz).

  19. chassis-resonance: c exato e o modo (0,1,1)

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    A velocidade da luz é exata, 29 979 245 800 cm/s, não 3 × 10¹⁰: fLowest, f101MHz e f110MHz caem 0,07 % (901,39 → 900,76 MHz nos padrões).

    fLowest inclui (0,1,1), o modo mais baixo quando o comprimento é o lado mais curto (Pozar, Microwave Engineering, 4ª ed., seção 6.3): uma caixa de 10 × 30 × 20 cm dava 1581 MHz e agora dá 900,76 MHz; wavelengthAtResonance acompanha.

  20. phase-noise-to-jitter: o perfil integrado como leis de potência

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Com profileMode 1, o perfil é integrado como leis de potência entre os seus pontos, retas em eixos log-log (Drakhlis, Microwaves & RF, janeiro de 2001), e a banda termina no próprio nível do perfil nesse ponto. Um trapézio linear superestimava um perfil decrescente, e L₄ era mantido até o fim da banda mesmo quando estava além dele: o perfil padrão a 100 MHz dava 0,166 ps e agora dá 0,084 ps. rmsJitter, cycleToCycleJitter, phaseNoisePower, rmsPhaseError e adcSnrLimit mudam nesse modo; o modo de nível único não muda.

  21. sampling-nyquist: o alias é rebatido para o múltiplo mais próximo de f_s

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    aliasFreq_Hz é |f − k·f_s|, com k o inteiro mais próximo de f/f_s (Kester, MT-002). Antes era |f_s − f|, correto só até 1,5·f_s: 10 kHz a 4 kSa/s dava 6000 Hz e agora dá 2000 Hz.

  22. fm-modulation-index: a largura de banda de Bessel a partir das funções de Bessel

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    besselBandwidth cobre as bandas laterais acima de 1 % da portadora não modulada, 2·n·f_m (Haykin, Communication Systems): antes era 2(β + 1)·f_m, de novo a regra de Carson. Com β = 5 dava 180 kHz e agora dá 240 kHz. Acima de β = 1000 é null, com um aviso.

  23. digital-filter-order: a ordem elíptica exata

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    ellipticOrder resolve a equação de grau K(k)·K′(k₁)/(K′(k)·K(k₁)), com k = f_p/f_s e k₁ = ε_p/ε_s. Antes era a ordem Chebyshev dividida por 1,5, alta demais na maioria dos projetos e baixa demais em alguns: os padrões precisam de 3, não 4; uma transição de 2:1 com 1 e 20 dB precisa de 3, não 2.

  24. via-stub-resonance: sem stub, sem ressonância

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Com a saída na última camada não há stub: resonantFreq e backdrillBenefit são null (uma ressonância ilimitada), não mais 0.

  25. room-modes e inductor-energy: recusas que dizem o que está errado

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    room-modes recusa uma velocidade do som ou um tempo de reverberação igual ou menor que 0 com uma mensagem própria e não devolve valores junto com a recusa; antes devolvia zeros e apontava as dimensões da sala.

    inductor-energy recusa uma resistência série igual ou menor que 0, como o site sempre fez; a API falhava com ela.

  26. Mais oito calculadoras de conversores e drivers aceitam uma faixa de operação, escolhem os componentes e adicionam um modelo de perdas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Como faz buck-converter: cada entrada que varia em operação é um par <input>Min e <input>Max, em que 0 (o padrão) significa a entrada nominal. Todo pior caso é uma saída, e os valores de entrada em que ele ocorre são saídas próprias (rippleWorstA em rippleWorstVin). Os componentes são escolhidos no que o pior canto exige ou acima, um indutor na série E12 e uma tensão nominal igual à próxima padronizada igual ou acima de 1,5 vez a pior tensão (a chave do flyback igual ou acima do pico de dreno grampeado). As entradas do modelo de perdas têm padrões típicos; as perdas são no ponto nominal, em W, e somam em lossTotal. Uma requisição sem as novas entradas recebe a mesma resposta de antes, exceto onde os itens abaixo dizem o contrário.

    boost-converter: inputVoltageMin/inputVoltageMax; coutEach e, do modelo de perdas, rdsOn, tSwitch, qg, vGate, vDiode, qrr, dcr, coreLoss, esrOut. As novas saídas incluem dutyMin/dutyMax, inductorMinWorstUH e inductorChosenUH, ilPeakWorst, inputCurrentWorst, q1RmsA, coutRmsA, outputRippleMV, vdsRating, oito perdas e efficiencyLossModel; a entrada efficiency continua definindo as correntes.

    flyback-converter: vinMin/vinMax, calculados com o transformador nominal em cada canto; do modelo de perdas, rdsOn, tFall, qg, vGate, vDiode, rPri, rSec, coreLoss, leakageInductance (µH, padrão 2,6) e clampRatio (padrão 2, a partir de 1,1), com a perda do grampeador RCD ½·L_lk·I_pk²·f·k/(k − 1). As novas saídas incluem as correntes de pico e RMS dos dois enrolamentos, reflectedVoltage, clampVoltage, vdsPeakWorst, vdsRating, diodeVrWorst, diodeVrRating, sete perdas e efficiencyLossModel.

    charge-pump-voltage: inputVoltageMin/inputVoltageMax e pumpCurrentMin/pumpCurrentMax; switchResistance (Ω, padrão 1) e esr (mΩ, padrão 10), somados à resistência de compartilhamento de carga como é o R_O da folha de dados do ICL7660. As novas saídas incluem loadedVoltageMin/loadedVoltageMax, outputResistance, loadedVoltageWithLosses, as especificações nominais dos capacitores e das chaves, três perdas e efficiencyLossModel (igual a efficiency com componentes ideais).

    switching-regulator-ripple: outputCurrent (A, padrão 2), inputVoltageMin/inputVoltageMax e o modelo de perdas do conversor buck aplicado aos seus próprios componentes (o seu esr é o do capacitor de saída). As novas saídas incluem os ripples e as correntes RMS de pior caso, vdsRating, oito perdas e efficiency.

    mosfet-power-dissipation: drainCurrentMin/drainCurrentMax e tAmbientMin/tAmbientMax (qualquer valor exceto 0, que é o nominal); rdsonTempco (%/°C, padrão 0), resolvido até a junção em forma fechada, coss (pF, padrão 0), qg e vGate. As novas saídas incluem junctionTempWorst com a sua corrente e temperatura ambiente, totalLossWorst, efficiencyWorst, vdsRating, quatro perdas e efficiencyLossModel.

    h-bridge-selection e motor-driver-power: motorCurrentMin/motorCurrentMax e a faixa da alimentação (motorVoltageMin/motorVoltageMax, supplyVoltageMin/supplyVoltageMax); o tempo morto tDead e o vBody do diodo de corpo (TI SLVA504A) e, na ponte H, dutyCycle (%, padrão 75), tSwitch, qg e vGate. As novas saídas incluem a pior perda da ponte, o FET mais quente, vdsRating, as perdas e efficiencyLossModel.

    class-d-efficiency: outputPowerMin/outputPowerMax e supplyVoltageMin/supplyVoltageMax; switchingFreq (kHz, padrão 400), filterCutoff (kHz, padrão 40), tSwitch, coss, qg, vGate e o dcr e o coreLoss do indutor do filtro. As novas saídas incluem o filtro de saída (TI SLAA701B) como calculado e como escolhido, cinco perdas, loadPower, efficiencyLossModel, a pior eficiência e a pior perda com os seus cantos, headroomWorst (negativo onde a ponte não consegue excursionar a saída), as correntes de ripple e de pico do filtro e as especificações nominais.

  27. boost-converter: o ciclo de trabalho é o do TI SLVA372D

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    O ciclo de trabalho era 1 − V_in/(V_out·η), então as perdas o encurtavam, em desacordo com a corrente de entrada da própria calculadora. Agora é a eq. 1 do TI SLVA372D, D = 1 − V_in·η/V_out. Nos padrões (5 V para 12 V, 0,5 A, 100 kHz, 88 %), dutyCycle passa de 52,65 % para 63,33 %, inductorValue de 64,35 µH para 77,41 µH e outputCapacitor de 4,388 µF para 5,278 µF.

    A recusa e o aviso mudam junto: uma entrada entre η·V_out e V_out, antes recusada, agora é calculada (só V_out ≤ V_in é recusado), e o aviso de ciclo de trabalho de 95 % aparece em V_in·η/V_out ≤ 0,05.

  28. switching-regulator-ripple: uma saída igual ou acima da entrada é recusada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    A calculadora é um buck. Com outputVoltage igual ou acima de inputVoltage, ela devolvia um ciclo de trabalho de 99 % e um ripple negativo; agora recusa com "Output voltage must be less than input voltage" e não devolve valores.

  29. buck-converter: uma faixa de entrada, os componentes escolhidos e os seus esforços, e um modelo de perdas com a eficiência

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    vinMin e vinMax dão a entrada como uma faixa (0, o padrão, é o vin nominal). O indutor é dimensionado onde o seu ripple é maior e escolhido nesse valor ou acima na série E12 (inductorMinWorstUH, inductorChosenUH); cada esforço é informado onde é maior, com a tensão de entrada em que ocorre: rippleWorstA/rippleWorstVin, ilPeakWorst/ilPeakWorstVin, outputRippleMV/outputRippleVin, cinMinWorstUF, cinRmsA, q1RmsA, q2RmsA (cada um com o seu …Vin), e dutyMin, dutyMax. O banco de saída é de coutCount capacitores de coutEach µF; as tensões nominais dos componentes são vdsRating, cinVoltageRating, coutVoltageRating (a tensão nominal vendida igual ou acima de 1,5 vez a tensão).

    Um modelo de perdas, com todas as entradas opcionais: rdsOnHigh, rdsOnLow, tSwitch, qg, vGate, tDead, vBody, dcr, coreLoss, esrOut, esrIn. Na entrada e na carga nominais, as perdas são lossDcr, lossCore, lossHsConduction, lossLsConduction, lossHsSwitching, lossGateDrive, lossDeadTime, lossCapEsr e lossTotal (W), com outputPower e efficiency (%). Uma requisição sem as novas entradas recebe as cinco saídas que recebia antes, exceto cinUF (veja buck-converter-input-capacitance).

  30. buck-converter: o capacitor de entrada segura o ripple da entrada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    cinUF dividia pela tensão de ripple da saída (deltaVout de vout). Agora ele usa o próprio ripple da entrada, a nova entrada deltaVin (% de vin, padrão 1), como na eq. 12 do TI SLVA477B: C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). Nos padrões (12 V para 5 V, 1 A, 500 kHz), 9,72 µF passa a 4,05 µF.

  31. Mais vinte e três calculadoras aceitam uma série de componentes e informam o projeto como montado

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    eSeries (0 para valores ideais, ou 12, 24, 48, 96) arredonda cada resistor, capacitor ou indutor que a calculadora projeta ou lê para o valor mais próximo dessa série, e toda saída passa a ser a do projeto arredondado. O seu padrão deixa uma requisição sem ele com a mesma resposta de antes: 24 em attenuator-designer, led-resistor e zener-diode, cujas saídas E24 (piR1Nearest a tR2Nearest, rNearest, iActual, pNearest, e24Resistor) agora o seguem, e 0 em voltage-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-crossover e tweeter-capacitor. Os componentes de directional-coupler são linhas e não aceitam série.

    Novas saídas descrevem o projeto arredondado: attenuator-designer piAttenuationBuilt (dB) e piInputImpedanceBuilt (Ω); wilkinson-power-divider isolationBuilt (dB em f₀, null com o resistor exato, em que é ilimitado); rcd-clamp-snubber clampVoltageBuilt, rippleVoltageBuilt, clampPowerBuilt e peakDrainVoltageBuilt; pll-loop-filter crossoverBuilt (kHz, o cruzamento de 0 dB da malha; pmActual é a margem ali); rs485-termination failsafeVoltage (mV, a tensão A–B do barramento ocioso); emi-filter-lc insertionLossBuilt (dB em 10·f_c); conducted-emissions-filter cornerBuilt, attenuationBuilt e outputLevelBuilt; speaker-crossover wooferCutoffBuilt e tweeterCutoffBuilt; tweeter-capacitor crossoverBuilt; zener-diode zenerCurrentBuilt (mA) e zenerPowerBuilt (mW) com carga total através do resistor escolhido, a corrente negativa onde o resistor não consegue alimentar a carga.

    Rótulos, com as chaves inalteradas: os resistores arredondados do atenuador mostram "(rounded)" no lugar de "(E24)"; rNearest "Nearest Series Value", pNearest "Power (series R)", e24Resistor "Nearest Series Resistor"; o error de current-mirror "Output Current Error", o déficit em relação a N·I_ref (com uma série, ele inclui o arredondamento, e uma saída Widlar é resolvida a partir de V_T·ln(I_ref/I) = I·R_E com o R_E arredondado).

    Para que um componente possa ser resolvido para uma saída alvo, estas entradas agora declaram um máximo (um valor acima dele continua sendo calculado, com o aviso de procedência): comparator-hysteresis r1 e r2 10 000 kΩ; photodiode-transimpedance feedbackResistance 1e7 kΩ e feedbackCapacitance 100 000 pF; differential-mode-filter inductance 100 000 µH e capacitance 1 000 µF; power-supply-ripple-filter inductance 100 000 µH e capacitance 100 000 µF.

  32. schmitt-trigger: limiares por superposição na entrada +

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    A faixa era V_cc·R2/(R2 + R3), que deixa R1 de fora, colocada simetricamente em torno da tensão do divisor. Os limiares agora são a superposição no nó + (TI SNOA997A): V_TH+ = V_cc·R1/(R1 + R2∥R3) e V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3); centerVoltage é o meio da faixa. Nos padrões (5 V, 10, 10 e 100 kΩ), vth_high, vth_low e hysteresis passam de 2,727, 2,273 e 0,4545 V para 2,6190, 2,3810 e 0,2381 V. O circuito é um gatilho inversor; a descrição o chamava de não inversor.

  33. conducted-emissions-filter: L e C casam com a carga

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    L e C eram divididos como √(LC·Z) e √(LC/Z), o que fazia √(L/C) igual a √Z (7,07 Ω em 50 Ω; o filtro tinha um pico de 17 dB em 47 kHz a partir de uma fonte de tensão). Agora são L = Z/ω₀ e C = 1/(ω₀·Z). Nos padrões (80 dBµV em 150 kHz, 20 dB, 50 Ω), lValue passa de 23,7 µH para 167,8 µH e cValue de 0,475 µF para 0,0671 µF. O canto, e portanto a atenuação de 40 dB/década, não muda.

  34. attenuator-designer, led-resistor, zener-diode: valores E24 abaixo de 10 Ω

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    As suas buscas E24 começavam em 10 Ω, então um componente abaixo de 10 Ω era ajustado como 10 Ω: os resistores série de 2,875 Ω de um atenuador T de 1 dB e 50 Ω saíam como 10 Ω (o atenuador montado dava 1,336 dB e 54 Ω), e um resistor de LED de 5 Ω como 10 Ω. As buscas agora começam em 0,10 Ω (3,0 Ω e 5,1 Ω). Acima de 10 Ω nada muda.

  35. pll-loop-filter e class-d-efficiency: uma recusa não devolve valores

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    pll-loop-filter (em toda recusa) e class-d-efficiency (na API) devolviam zeros junto com o erro. Agora não devolvem valores, como as outras calculadoras.

  36. filter-designer: a resposta da escada como montada, um deslocamento de corte exato e cortes até 1 GHz

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Seis novas saídas descrevem a escada que os valores dos componentes montam, resolvida como uma cascata de matrizes ABCD entre Z₀ e a sua carga: loadImpedance (Z₀, ou Z₀/g_{N+1} de um Chebyshev de ordem par, g_{N+1}·Z₀ para passa-altas), cutoffBuilt_Hz (a frequência de −3 dB, passa-baixas e passa-altas), fLowBuilt_Hz e fHighBuilt_Hz (os extremos de −3 dB de um passa-faixa), passbandLoss_dB (a pior perda até 0,8·f_c, acima de 1,25·f_c, ou nos 80 % centrais de uma faixa) e stopbandBuilt_dB (a perda onde o protótipo chega ao dobro do seu corte). Com eSeries definido, são os valores do projeto arredondado; com componentes ideais, a banda de rejeição é igual a attenuation_at_2fc.

    fcShiftPercent era a metade do maior erro de componente. Agora é quanto o arredondamento moveu a frequência de −3 dB da escada montada (num passa-faixa: o centro da sua faixa de −3 dB) em relação à da escada ideal: o Butterworth de 5ª ordem de 100 MHz com componentes E24 dá +0,997 %, onde a estimativa dava +1,31 %. Com eSeries 0 é 0, como antes.

    fc aceita até 1 GHz (parava em 10 MHz).

  37. voltage-drop: toda bitola é calculada, e o alumínio é o da IEC 60889

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Um wireGauge que a tabela não lista (uma bitola ímpar ou fracionária) era calculado com a resistência de 12 AWG. Agora ele usa a mesma fórmula da tabela, cobre IEC 60028 (1/58 Ω·mm²/m) sobre a área ASTM B258 da bitola; as bitolas listadas não mudam.

    conductorType 1 (alumínio) usava 1,61 vez a resistência do cobre. Agora usa os 0,028264 Ω·mm²/m da IEC 60889, 1,6393 vez o cobre, então toda queda no alumínio fica 1,8 % maior: 10 AWG com 15 A em 30 m a 120 V cai 4,03 %, onde mostrava 3,96 %.

  38. coax-loss: atenuação a partir dos dados dos fabricantes; mais oito cabos, potência de entrada e potência de saída

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    A tabela de cabos usava cerca de 1,7 vez o dB/100 ft das folhas de dados, então a perda de todo cabo era baixa demais. A atenuação por 100 m agora é k₁√f + k₂f, com f em MHz: os coeficientes publicados pela Times Microwave (25 °C) para os cabos LMR e um ajuste por mínimos quadrados às tabelas da Belden e da CommScope (20 °C) para os demais. lossPer100m antigo → novo a 100, 435 e 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_dB e as frações de potência e de tensão acompanham. O Andrew LDF4-50A é o cabo de 1/2 in; estava identificado como 7/8 in.

    cableIndex 0–9 mantêm os seus cabos, e agora vai até 17: LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL (plenum), RG-316, RG-6 (75 Ω), Andrew LDF5-50A (7/8 in) e LMR-900. Nova entrada opcional inputPower (dBm, padrão 30); novas saídas powerOut_dBm, powerOut_W e lossPerMeter. Uma frequência acima do máximo nominal de um cabo, além do último ponto de uma tabela ajustada, ou abaixo da frequência a partir da qual um ajuste vale dentro de 10 % recebe um aviso, não uma recusa.

  39. Dezoito calculadoras aceitam listas: estágios, perdas, termos, camadas, cargas, componentes e superfícies

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Cada lista é uma contagem e entradas indexadas (numLoads com load1Current, load2Current, …), para que a requisição continue sendo um objeto plano. Toda contagem tem como padrão a lista que a calculadora tinha antes, então uma requisição sem as novas entradas recebe a mesma resposta de antes (verificado em 201 requisições por calculadora, recusas incluídas). Uma entrada indexada além da contagem é ignorada.

    noise-figure-cascade: numStages agora vai até 10 (ia até 4), com stage5Gain, stage5NF, stage5IIP3 até stage10IIP3, e um bandwidth opcional (MHz, padrão 1); novas saídas cascadedGain, noiseTemperature (290 K × (F − 1)) e noiseFloor (kT₀B mais a figura de ruído em cascata).

    lora-link-budget, ble-link-budget, 5g-nr-link-budget: extraLossCount (0–6) de extraLoss1 a extraLoss6 (dB), e totalLoss. clock-jitter: jitterTerms (0–6) de term{n}Jitter_ps, somados em quadratura. emi-margin-budget: marginTerms (0–6) de term{n}Allowance, e totalAllowance. sensor-accuracy-budget: errorTerms (0–6) de term{n}Error, em quadratura. 4-20ma-transmitter: loopElements (0–6) de element{n}Resistance, e totalLoopResistance.

    heatsink-calculator, heatsink-selection, thermal-resistance-network, junction-temperature: numLayers (0–6) de layer{n}Theta (°C/W), em série entre o encapsulamento e o dissipador; as duas calculadoras de dissipador também devolvem thetaJS e heatsinkTemp.

    battery-life: numLoads (0–7) de load{n}Current e load{n}Duty, e selfDischargeCurrent. battery-runtime-motor: motorDuty (%, padrão 100) e numLoads (0–5) de load{n}Current, load{n}Duty e load{n}Efficiency, e batteryCurrent. solar-panel-sizing: loadHours (h por dia, padrão 24) e numLoads (0–9) de load{n}Power e load{n}Hours.

    gear-ratio: extraStages (0–5) de stage{n}Driver, stage{n}Driven e stage{n}Efficiency, e totalEfficiency. series-parallel-resistor: numParts (1–8, padrão 4) com r5 a r8, e sumOfValues; r1 pode ser 0, um componente não montado, como as outras posições já podiam. rt60-reverberation: numSurfaces (0–8) de surface{n}Area e surface{n}Alpha, e otherArea e meanAbsorption.

  40. Os orçamentos de enlace respondem a uma distância de 0 sem perda de percurso

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    lora-link-budget, ble-link-budget e 5g-nr-link-budget recusavam uma distância de 0. Agora respondem com 0 dB de perda de percurso: o enlace sem percurso, que as páginas usam para mostrar o orçamento antes do percurso. Uma distância negativa continua sendo recusada.

  41. clock-jitter: sem orçamento de temporização restante, a fração é ilimitada, não 0 %

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Quando os tempos de setup e hold ocupam todo o período do clock, budgetUsed_pct era 0, o que se lê como nenhum jitter. Agora é null (uma fração ilimitada), com um aviso de que não resta orçamento de temporização quando não há violação de setup a informar.

  42. series-parallel-resistor: a razão do divisor usa os dois componentes montados

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Com exatamente dois componentes montados, voltDividerRatio era R2/(R1 + R2), fossem quais fossem os dois, então dava 0 com R1 e R3 montados. Agora é o segundo componente montado sobre a soma dos dois, o que não muda quando eles são R1 e R2.

  43. optical-sensor-range: uma recusa não devolve valores

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Um fator de segurança de 0 ou menos era recusado com maxRange e normalizedRange iguais a 0 junto com o erro. A recusa agora não devolve valores, como todas as outras.

  44. broadside-coupled-pair: sem modo comum, impedância desacoplada ou altura até o plano quando não há planos

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Um par sem blindagem (shielded 0) não tem planos de referência, então commonImpedance, uncoupledImpedance e heightToPlane são indefinidos, como o aviso já dizia. Eram 0 e agora são null.

  45. rise-time-bandwidth: sem clock, sem número de harmônico

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Com clockFrequency 0, que a entrada aceita para omitir o clock, harmonicNumber era 0, um valor que nenhum clock dá. Agora é null, como as outras saídas onde um valor não existe.

  46. Treze calculadoras avaliam o resultado contra uma norma publicada

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Cada uma aceita a norma (e, quando se aplica, a classe) como entrada opcional e devolve o limite, o resultado como porcentagem dele (acima de 100 reprova) e o valor de uma entrada que atenderia à norma. Os limites são calculados no próprio cálculo, então a API dá o mesmo veredito da página. Toda nova entrada é opcional e, no seu padrão, todas as saídas existentes continuam iguais, exceto onde um item abaixo diz o contrário.

    power-density: standard (0 FCC 47 CFR §1.1310, 1 ICNIRP 2020), exposureClass, groundReflection; devolve limitDensity, limitPercent, minDistance, maxEirp. trace-width-current: standard (lê o traceWidth desenhado que a API já aceita); 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 (o limite é spacing). 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 (o limite é riseTimeTarget_ns, o modo é speedMode). usb-termination: impedanceError, impedanceTolerance, impedancePercent, compliantImpedance (a norma é usbVersion). 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.

    Onde uma norma não define limite (ICNIRP abaixo de 30 MHz, CISPR 32 fora de 30 MHz–6 GHz, anéis anulares da IPC-6012 Class 2, um espaçamento A6 acima de 3.050 m), as novas saídas são NaN, devolvidas como null, com um aviso que diz por quê.

  47. Onze calculadoras de linha de transmissão devolvem o comprimento de onda guiado

    • POST /api/py/v1/calculate
    • POST /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-waveguide e coax-impedance aceitam um frequency opcional (GHz, padrão 2,4) e devolvem guidedWavelength e quarterWavelength (mm), λg = c/(f·√εeff), as linhas acopladas a partir do εeff de modo ímpar. Uma requisição sem frequency devolve todas as saídas existentes sem mudança, mais as duas novas a 2,4 GHz.

  48. radiated-emission-estimate: a margem segue a norma e a classe escolhidas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    margin é o limite da norma e da classe escolhidas na frequência e na distância da requisição, menos o campo: standard 0 é a CISPR 32 e 1 é a FCC Part 15, seção 15.109, emissionClass 0 é Class B e 1 é Class A. Uma requisição sem eles recebe CISPR 32 Class B, como antes, então a sua margem não muda. Os limites da FCC valem de 30 MHz a 40 GHz, e a margem é null fora da faixa da sua norma. O rótulo da saída agora é "Margin to Limit".

  49. minimum-conductor-spacing adiciona as colunas de terminais de componentes A6 e A7, e uma saída B4

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    condition 4 é A6 (terminal ou terminação externa de componente, sem revestimento, do nível do mar a 3.050 m) e 5 é A7 (terminal ou terminação externa de componente, com revestimento conformal), ambas da IPC-2221B Table 6-1. Acima de 3.050 m, uma requisição A6 devolve espaçamento null com um aviso, já que a tabela só dá A6 até 3.050 m. A nova saída spacingB4 é a coluna B4 (condutores externos, revestimento polimérico permanente), ao lado de spacingB1, spacingB2 e spacingB3. As condições 0 a 3 e as saídas existentes não mudam.

  50. bga-land-pad dimensiona a ilha pelo diâmetro da esfera, como faz a IPC-7351B

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    A ilha era o diâmetro da esfera × 1,0, 0,9 ou 0,8 conforme o nível de densidade, o que nenhuma tabela IPC dá. Agora ele segue a IPC-7351B: para uma esfera que colapsa, 25, 20 ou 15 % menor que a esfera conforme o tamanho da esfera. Nos padrões, padDia vai de 0,55 a 0,45 mm, e as saídas derivadas dele acompanham. A entrada densityLevel foi descontinuada, já que a IPC-7351B não aplica níveis de densidade a uma ilha de BGA: uma requisição que a envia é respondida, com um aviso de que o valor não foi lido.

  51. bldc-winding: uma bobina abrange pelo menos uma ranhura

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Onde o número de ranhuras dividido pelo de polos arredonda para 0 (6 ranhuras sob 14 polos, por exemplo), o passo da bobina era 0, o fator de enrolamento 0, e actualKv e deltaEquivKv eram null. Uma bobina concentrada é enrolada em volta de um dente, então o passo agora é de pelo menos uma ranhura e essas saídas são números.

  52. Os trabalhos emi_radiated aplicam o limite mais rigoroso numa borda de faixa

    • POST /api/py/v1/jobs

    Exatamente em 88, 216 e 960 MHz (FCC Part 15) e 230 MHz (CISPR 32), era usado o mais folgado dos dois limites adjacentes. O 47 CFR 15.109(c) diz que o limite mais rigoroso se aplica nas bordas das faixas, e a CISPR 32 aplica o limite mais baixo numa frequência de transição; os dois agora são aplicados.

  53. Faixas de entrada em 31 calculadoras

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    As entradas de 30 calculadoras ganharam um máximo, a maioria de geometria (linhas, pads, antenas, guias de onda), para que a página possa resolver para elas, e a capacitância de barramento de i2c-pullup agora vai até 550 pF, o limite do Fast-mode Plus. A API não recusa um valor além da faixa de uma entrada; provenance.validRange o informa como fora.

  54. Doze calculadoras de sensores ganham um front-end: a sua tensão, o código do ADC e a resolução

    • POST /api/py/v1/calculate
    • POST /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-sensitivity e lvdt-sensitivity aceitam entradas opcionais de front-end e devolvem três novas saídas. As entradas são um divisor (fixedResistor, sensorPosition ou ntcPosition) ou um amplificador (frontGain), e um ADC (adcRef, adcBits), reaproveitando uma entrada que a calculadora já tinha (gain, amplifierGain, adcVoltage, supplyVoltage). As saídas são a tensão do front-end (dividerVoltage ou amplifiedVoltage), adcCode (um código unipolar de N bits, mantido entre 0 e 2^N − 1) e resolution (a grandeza física por passo do ADC nesse ponto).

    load-cell-amplifier aceita a carga na célula (appliedLoad) e devolve a sua saída (bridgeOutputMv); accelerometer-sensitivity aceita acceleration e devolve outputVoltage.

    Toda nova entrada é opcional e, no seu padrão, todas as saídas existentes continuam iguais: uma requisição escrita antes desta mudança devolve os valores que devolvia, mais as novas saídas.

  55. current-shunt: o ganho do amplificador tem padrão 20

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Quando uma requisição omite amplifierGain, current-shunt agora usa 20 onde usava 50. Nos outros padrões (10 A através de 10 mΩ, um ADC de 3,3 V), o ganho 50 colocava 5 V no ADC, acima da sua referência. O ganho 20 dá 2 V. amplifiedVoltage e adcResolutionCurrent mudam para essas requisições; uma requisição que informa amplifierGain não é afetada.

  56. hall-effect-sensor: um campo igual ou menor que zero é recusado

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    hall-effect-sensor agora devolve um erro para Bfield igual ou menor que 0 mT, como o site já fazia, onde a API devolvia valores calculados a partir dele.

  57. frequency-ppm-tolerance: os avisos citam as tolerâncias de clock que se aplicam

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Os avisos de frequency-ppm-tolerance citavam um orçamento de UART de ±50 ppm (uma UART tolera cerca de 2 %) e diziam que ±100 ppm era folgado demais para USB, que permite ±2500 ppm em full speed. Acima de ±50 ppm, o aviso agora cita o Ethernet 100BASE-TX e o clock de rádio do Bluetooth LE. Acima de ±100 ppm, cita todo clock Ethernet, e acima de ±500 ppm o USB 2.0 high speed. Os limiares de 50 e 100 ppm não mudam; o de 500 ppm é novo.

  58. Largura de trilha e elevação de temperatura específicas da placa, a partir do modelo térmico próprio do rftools

    • POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    trace-width-current ganha widthBoardMm, a largura mínima para esta placa, e pcb-trace-temp ganha tempRiseBoard e maxTempBoard, a elevação e a temperatura máxima nela; ambas ganham inModelRange. Elas vêm do modelo térmico próprio do rftools, nunca rotulado como IPC-2152: uma rede térmica de forma fechada ajustada a um solver 2-D de volumes finitos, usado só em testes, da trilha, do laminado, do plano e do ar parado (convecção e radiação), que é conferido contra medições publicadas (as condições da IPC-TM-650 2.5.4.1A, os ajustes de Brooks & Adam aos gráficos da IPC-2152 e outras) e traz uma margem de 15 % na elevação a partir da pior delas. Dentro da sua faixa validada (largura de trilha 0,25–5,1 mm, placa 1,4–3,2 mm, uma trilha interna a partir de 1,27 mm de largura, uma elevação de 5–100 °C, um plano a 0,1 mm ou mais), o ajuste fica a até 2,81 % do solver.

    Novas entradas, adicionadas ao fim com padrões para que uma requisição existente calcule sem mudanças: boardThickness (mm, padrão 1,6), planeDistance (mm até um plano de cobre, 0 para nenhum) e planeCopperWeight (oz, padrão 0,5) nas duas calculadoras, e isExternal em pcb-trace-temp. Todas as saídas existentes continuam iguais. Nos padrões, widthBoardMm é 0,30212 mm, ao lado dos 0,78144 mm da Figure 5-1, e tempRiseBoard 10,2818 °C.

    Fora da faixa validada, o resultado continua sendo informado, com inModelRange 0 e um aviso que nomeia o limite; uma placa abaixo de 1,4 mm remete à Figure 5-1, onde o modelo e os dados de espessura publicados pela IPC-2152 divergem. Uma fuga térmica devolve null para a elevação específica da placa. provenance.validRange ganha models nessas duas calculadoras, cada modelo ajustado com o seu próprio inside: primeiro o ajuste da IPC-2152 Figure 5-1, depois o modelo térmico, e status é outside se qualquer um deles for. Uma requisição a essas calculadoras com corrente, elevação, peso de cobre ou comprimento zero ou negativo é recusada no navegador como na API, e uma corrente negativa é recusada em vez de respondida com 500.

  59. Sete saídas que as calculadoras não conseguiam calcular foram removidas

    • POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    differential-via não devolve mais diffImpedance, commonImpedance, oddImpedance, evenImpedance nem singleEndedImpedance. Uma solução de campo (um solver quase estático 3-D validado em quatro formas fechadas, conferido em onda completa com o openEMS a 0,4 %) mostrou que a impedância de um par de vias depende do passo dos planos que ele atravessa, que não é uma entrada: nos padrões, é 85,6 Ω com um passo de planos de 0,1 mm e 96,0 Ω com 1,0 mm, onde a calculadora mostrava 44,10 Ω. Nenhuma relação nas entradas da calculadora fica a até 10 % de todos os casos, e a impedância de modo comum também depende de por onde a corrente de retorno passa. A ressonância do stub e as perdas continuam sendo devolvidas; veja o item de correções.

    usb-termination não devolve mais eyeOpening, uma heurística que nenhuma especificação USB define. parabolic-dish-antenna não devolve mais noiseTemperature, que era 290·(1 − η): a temperatura de ruído de uma antena depende da sua elevação, do seu transbordamento e do céu, e a calculadora não recebe nada disso.

    Quem lê uma dessas chaves precisa parar: a chave está ausente, não é null. Todas as outras saídas das três calculadoras continuam sendo devolvidas.

  60. Valores que não existem ficam ausentes ou null, não zero nem um valor sentinela

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Estas saídas agora são null onde a grandeza é indefinida, em vez de um número: o signalRiseTime de usb-termination para USB 3.0, que não especifica tempo de subida do transmissor (o USB 2.0 mostra o seu mínimo de 500 ps, T_HSR); as saídas de acoplamento de pcb-crosstalk-emc acima do limite de acoplamento fraco, (x_C + x_L)/2 = 0,1, onde o modelo concentrado não vale; vbSealed e f3Sealed de subwoofer-box para Qts ≥ 0,707, onde não existe alinhamento selado (mostravam 2·Vas); o qFactor de planar-spiral-inductor na autorressonância ou acima dela; a broca e a fresa de cobertura de aperture-diagonal quando nenhuma ferramenta em estoque serve (mostravam 0); o qFactor de lc-resonance sem resistência, o Q ilimitado de um circuito sem perdas (mostrava 9999, e a largura de banda f₀/9999; a largura de banda agora é 0); e o stubResonance de differential-via quando não há stub (mostrava 0 GHz). Cada null vem com um aviso que diz por quê.

    Uma entrada recusada agora não devolve valores, com o seu erro, onde estas calculadoras devolviam zeros ou valores parciais: power-density, thermal-via-array, bga-breakout-width sem canal, dual-stripline com h₂ ≤ 0, fresnel-zone, e toda recusa de doppler-shift, reactance-calculator, broadside-coupled-pair, fusing-current, rise-time-bandwidth, current-divider, delta-wye-conversion, voltage-drop, rt60-reverberation e vfd-motor-speed. Um zero ao lado de um erro era lido como resultado.

    Quem tratava esses valores como números precisa verificar null, ou uma chave ausente ao lado de um erro. /calculate/solve já ignora os pontos sem a saída.

  61. Calculadoras corrigidas de acordo com as suas referências, com três novas entradas e novas saídas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • POST /api/py/v1/jobs (emi_radiated)
    • MCP run_calculation
    • MCP simulate_emi_radiated
    • rftools-io SDK

    Constantes. A resistividade do cobre é a da IEC 60028, 1/58 Ω·mm²/m, em todo lugar (trace-resistance 100,217 → 100,458 mΩ nos seus padrões; as outras calculadoras de cobre mudam 0,008 %, a profundidade pelicular 0,004 %). O motor de microfita usa η₀/2π onde usava 60 e a velocidade da luz exata, então toda impedância baseada em microfita muda −0,069 % (microstrip-impedance 80,954 → 80,898 Ω, differential-pair 99,983 → 99,914 Ω, e as larguras resolvidas junto). Todas as calculadoras agora compartilham um único η₀ = µ₀·c (CODATA 2018). A impedância de onda de power-density é µ₀·c, 376,730 Ω (era 120π). O atraso de controlled-impedance é √εeff/0,299792458 ps/mm (6,52995 → 6,53447). O trabalho emi_radiated usa π·µ₀/c e µ₀ nos seus campos, então agora concorda com radiated-emission-estimate (mostrava 0,021 dB e 0,023 dB a mais).

    Modelos. planar-spiral-inductor usa os parasitas de Jow & Ghovanloo e o comprimento de trilha da sua forma: autorressonância 68,0 → 601,7 MHz e Q a 100 MHz 814,5 → 116,8 nos padrões, com a nova entrada opcional frequency (MHz, padrão 100) para o Q. pcb-crosstalk-emc é o modelo de duas extremidades de Paul: as chaves existentes são por extremidade (metade dos valores antigos), farEndCrosstalk é nova, e os padrões são um clock de 3,3 V e 25 MHz. subwoofer-box sintoniza o duto por Margolis & Small (20,246 → 40,273 Hz) e adiciona f3Vented. pcb-crosstalk roda no motor de microfita acoplada com a nova entrada dielectricConst (padrão 4,5; acoplamento 6,77 → 5,72 %). A resistência de borda de patch-antenna é o modelo de fenda radiante de Balanis com o η₀ exato, sem limitação (306,80 → 321,22 Ω; a resistência de alimentação e o recuo de 50 Ω acompanham). lc-resonance trata a sua resistência série como uma perda série em qualquer topologia, Q = Z₀/R (o modo paralelo calculava R/Z₀), e adiciona impedanceAtResonance_ohm: R em série, L/(C·R) em paralelo. A ressonância de stub de differential-via é rotulada como o limite superior sem carga, e a sua perda no condutor é o limite superior com planos densos (0,030 → 0,011 dB).

    Regras. Uma matriz de microvias é dimensionada pela soma das seções transversais, nota 5 da IPC-2221 (dez vias 2,762 → 1,466 A). O autoaquecimento de uma via é o pico do barril, P·L/(8kAN), em via-voltage-drop (0,2506 → 0,0313 °C) e em microvia-current-capacity. bga-breakout-width conta a fileira externa (escapeRows 1 → 2). padstack-annular-ring avalia a razão de aspecto pela IPC-2222 Table 9-4, 8:1 em todas as classes, com uma verificação de broca mínima pela Table 9-6, e o anel interno da Class 3 é 0,025 mm. thermal-via-array conta vias inteiras. i2c-pullup e rs485-termination devolvem as resistências sem arredondamento (a exibição continua arredondando). aperture-diagonal aceita a nova entrada routerBit.

    Uma requisição que omite uma das novas entradas recebe o seu padrão.

  62. Quatro saídas que tinham um único valor em qualquer entrada foram removidas

    • POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    Cada uma destas saídas devolvia o mesmo valor quaisquer que fossem as entradas, e nenhuma era um resultado: vswr (1,0, "VSWR (ideal)") e insertionLoss (0,3 dB, "Typical Insertion Loss") de balun-transformer; slewLimited de opamp-bandwidth (0, um marcador para uma verificação que precisa de entradas de slew rate e amplitude que a calculadora não tem); e voltageCode de capacitor-code (0 V, uma especificação que um código de 3 dígitos não codifica). Elas não são mais devolvidas, nem mesmo ao lado de uma recusa.

    Quem lê uma dessas chaves precisa parar: a chave está ausente, não é null. O que cada valor representava agora está declarado em provenance.assumptions: ideal-transformer em balun-transformer (casado por construção; as perdas no núcleo e no enrolamento não são modeladas, e um balun de ferrite costuma perder 0,1-1 dB) e capacitance-only em capacitor-code. Todas as outras saídas das três calculadoras continuam iguais.

  63. O ganho de loop-antenna inclui a sua eficiência de radiação

    • POST /api/py/v1/calculate (loop-antenna, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    O gain de loop-antenna era 1,76 dBi em qualquer entrada: a diretividade de um loop pequeno, 3/2, sem nenhuma perda. Agora é essa diretividade vezes a eficiência de radiação e = R_rad/(R_rad + R_loss), a partir das duas resistências que a calculadora já devolve: G = 10·log₁₀(1,5·e) (Balanis, Antenna Theory, 4ª ed., capítulo 2 e seção 5.2). Nos padrões, um loop de 1 m de cobre de 10 mm a 7 MHz, ele mostra −9,4043 dBi, 11,2 dB abaixo do valor antigo; um loop cuja perda é pequena em relação à sua resistência de radiação continua mostrando perto de 1,76 dBi. A eficiência é a nova saída radiationEfficiency (%), 7,6467 % nos padrões.

    capacitor-code na API arredondava um código fracionário metade para o par, enquanto a página arredonda metade para cima, então 104,5 era decodificado como 100 nF na API e 1 µF na página. Os dois agora dão 1 µF.

  64. Oito entradas que não mudavam nenhum resultado agora definem um; onze novas saídas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada entrada abaixo era declarada e não era lida por nenhuma saída. Agora ela define uma nova saída, adicionada depois das existentes e calculada a partir de uma relação que a calculadora já faz; nenhuma saída existente muda em nenhuma entrada. patch-antenna: feedOffset define feedResistance_ohm, R_edge·cos²(π·y₀/L) (Balanis, Antenna Theory, 4ª ed., seção 14.2.1, Eq. 14-20a), 306,795 Ω com a alimentação padrão na borda e 65,501 Ω a 10 mm, e insetFeedPosition_mm é o recuo que dá 50 Ω, 10,594 mm. flyback-converter: fsw define primaryInductance (µH), Vin·D/(fsw·Ipk) para a própria corrente de pico em condução crítica da calculadora, 130,56 µH. solar-panel-sizing: batteryCapacity define batteryAutonomyDays, C·V·0,5/(P·24 h) na profundidade de descarga de 50 % que a capacidade necessária supõe, 0,25 dia. rs485-termination: baudRate define baudRateUtilisation (%), a taxa como fração do máximo de 10⁸ bit·m, 11,52 %. adc-snr: samplingFreq define nyquistZone, ⌊f_in/(f_s/2)⌋ + 1, e aliasFrequency (MHz), |f_in − f_s·round(f_in/f_s)| (Kester, Analog Devices MT-002): zona 1 e 1 MHz nos padrões, zona 2 e 30 MHz para 70 MHz a 100 MSPS. bldc-thermal: continuousCurrent define ratedCurrentShare (%), a corrente de operação em relação à nominal, 75 %. bldc-winding: supplyVoltage define noLoadSpeed (rpm), Kv·V, 11.406,44 rpm. Os valores são os dos padrões de cada calculadora.

    Mais duas novas saídas: assumedBoomLength (m) em yagi-antenna, o boom que o seu espaçamento de elementos de 0,2λ implica, (N − 1)·0,2λ, 1,6655 m nos padrões, que substitui a sua entrada descontinuada de comprimento do boom (veja esse item); e radiationEfficiency (%) em loop-antenna (veja o item do ganho). Só no site, o widget regulatório ao vivo de ism-coexistence agora mostra a banda que o seu bandIndex seleciona; o resultado não muda.

    Uma requisição que omite uma dessas entradas recebe o seu padrão. patch-antenna sem feedOffset e solar-panel-sizing sem batteryCapacity eram respondidas com 400 até agora; as duas passam a ser respondidas.

  65. Doze entradas que nunca mudaram um resultado foram descontinuadas; uma requisição que envia uma delas é respondida com um aviso

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • MCP get_calculator_schema
    • rftools-io SDK

    Estas entradas eram declaradas, mas nenhum valor delas mudava qualquer saída, aviso ou recusa: smith-chart frequency, via-calculator signalLayer, stackup-builder layerCount (o modelo é um empilhamento fixo de quatro camadas, o que o seu título agora diz), i2c-pullup numDevices, fm-modulation-index carrierFreq, quantization-noise frequency, 555-timer vcc, bldc-efficiency polePairs, opamp-bandwidth phase_margin, battery-internal-resistance temperature, rs485-termination numNodes e yagi-antenna boomLength. Elas saem do catálogo, dos limites de procedência e do esquema MCP; cada calculadora as lista em retiredInputs, com a data.

    Uma requisição que ainda envia uma delas é respondida com os mesmos valores de antes e o aviso existente "Input '<key>' is not read by this calculator and was ignored." Ela nunca é recusada. POST /calculate/solve se recusa a resolver para uma delas, como para qualquer entrada não declarada; nenhuma grade dela poderia ter movido uma saída. Uma requisição a yagi-antenna sem boomLength, respondida com 400 até agora, passa a ser respondida.

    A próxima versão do rftools-io mantém cada palavra-chave descontinuada: passar uma delas gera um DeprecationWarning que nomeia a chave e a data de descontinuação, e a chave não é enviada.

  66. trace-width-current lê a sua largura IPC-2152 na IPC-2152 Figure 5-1; pcb-trace-temp informa a elevação IPC-2152

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    O width2152mm de trace-width-current, rotulado como IPC-2152, era a largura IPC-2221 × 0,75 numa camada externa e × 0,85 numa interna, um fator que a IPC-2152 não contém e mais estreito que todas as leituras da IPC-2152 a partir de 2 A. Agora é a IPC-2152 (2009) Figure 5-1, o gráfico que a IPC-2152 recomenda para condutores internos e externos em todos os ambientes, pelo ajuste publicado I = 0,024·ΔT^0,44·A^0,725, o mesmo em qualquer camada: 0,7814 mm nos padrões, era 0,2266 mm; com 5 A, elevação de 10 °C e 1 oz numa camada externa, 7,194 mm, era 2,086 mm. Ele reproduz as leituras de Olson (2010) da Figure 5-1 de 300 e 680 sq mil a até 5 %. A chave não muda; o seu rótulo agora é "Min Width (IPC-2152 Fig. 5-1)".

    As duas calculadoras consideram o cobre como 35 µm por onça, então width2221mm muda −0,58 % (0,3004 mm nos padrões, era 0,3021 mm). resistance, voltageDrop e powerDiss de trace-width-current são calculados para uma nova entrada, a largura de trilha desenhada, onde usavam o mínimo da IPC-2221, com o cobre a 1/58 Ω·mm²/m da IEC 60028: 0,10433 Ω nos padrões, era 0,17326 Ω.

    Nova entrada opcional, adicionada ao fim; uma requisição que a omite recebe o seu padrão: traceWidth em trace-width-current (mm, 0,5). Novas saídas: inChartRange nas duas calculadoras (1 dentro da faixa que a IPC-2152 Figure 5-1 desenha, 0 fora, levado para provenance.validRange com o pior resíduo do ajuste), e tempRise2152 e maxTemp2152 em pcb-trace-temp, a elevação na Figure 5-1 (k = 0,024, qualquer camada) ao lado da elevação externa da IPC-2221: 25,815 °C nos padrões, ao lado de 5,342 °C. As saídas existentes de pcb-trace-temp mantêm as suas chaves e valores.

    Resultados fora dos gráficos são informados e sinalizados, nunca recusados: um aviso nomeia a grandeza e o limite do gráfico, para as curvas de 10 a 45 °C e os 700 sq mil da Figure 5-1, os 10 a 100 °C e 700 sq mil do gráfico A da IPC-2221 numa camada externa, e o ½ a 3 oz do gráfico B; além da Figure 5-1, provenance.validRange.status é outside.

    Citações: trace-width-current, pcb-trace-temp, microvia-current-capacity e via-calculator citavam a IPC-2221B para o gráfico de corrente, que essa edição (2012) não contém. Agora citam a IPC-2221A (2003) Figure 6-4, o gráfico da IPC-2221 (1998), e a IPC-2152 (2009) Figure 5-1; nenhum valor das duas últimas muda.

  67. Doze calculadoras usam o modelo que a sua página e a sua referência descrevem

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada calculadora abaixo calculava um modelo que ficava aquém do que a sua página e a sua referência descrevem, da mesma forma no navegador, na API e no servidor MCP. Cada uma agora calcula o modelo publicado e é testada contra um caso publicado, e a varredura de paridade mantém o navegador e a API nos mesmos números. Os cálculos salvos guardam as entradas, então são recalculados. bldc-winding, parte da mesma mudança, tem o seu próprio item de 2026-10-11.

    Os valores mudam para: cable-shield-effectiveness (impedância de transferência R_T + jωM_T, e eficácia de blindagem contra a impedância da linha, Hähner & Mund 1998: 64,95 dB nos padrões, era 30,97 dB contra 1 Ω, sem piso de 0 dB), ferrite-bead (o R_DC + (R_AC ∥ L ∥ C) da Analog Devices AN-1368, ancorado na impedância de 100 MHz informada, e a perda de inserção complexa entre fonte e carga: a ferrite padrão de 600 Ω mostra 94,9 Ω a 1 GHz, era 1897 Ω), mosfet-operating-point (o ponto de operação na reta de carga do dreno, Sedra & Smith 7e seção 5.3; veja o item incompatível abaixo), bldc-motor (empuxo na rotação em que os torques do motor e da hélice se equilibram, Drela 2007, com C_P 0,047: 140,91 g nos padrões, era 80,43 g a 75 % fixos da rotação sem carga), ethernet-cable (perda de inserção do cabo pela ANSI/TIA-568-C.2 na frequência de sinalização de cada PHY, 31,25, 62,5 ou 400 MHz: 7,69 dB nos padrões, era 16,5 dB; a Category 8 é um canal de 30 m em todas as velocidades), radar-range-equation (o alcance na SNR que a equação de Albersheim exige para P_d e P_fa: 35,23 km nos padrões, era 74,96 km com SNR = 1, e snrAtMaxRange informa essa SNR, onde era 0), bldc-efficiency (perda no cobre I²·R com a resistência entre terminais, Drela 2007 e o maxon Formulae Handbook: 4,500 W nos padrões, era 6,750 W), bldc-thermal (a resistência do enrolamento na temperatura que ele atinge, maxon Formulae Handbook seção 9.2, com a mesma perda no cobre: 207,61 °C nos padrões, era 184,47 °C; veja o item incompatível abaixo), class-d-efficiency (condução pelos FETs que conduzem a carga ao mesmo tempo, I²·R_DS(on)·N/2: 0,625 W nos padrões, era 1,250 W), motor-driver-power (dois FETs em condução e um em comutação forçada, TI SLVA504A: uma ponte de 0,1440 W nos padrões, era 0,2088 W), e coax-impedance e via-calculator (Z₀ a partir de η₀/2π = 59,9585 Ω com as constantes CODATA 2018, onde usavam 60: 47,990 Ω e 35,2243 Ω nos padrões, eram 48,023 Ω e 35,2487 Ω).

    Novas entradas opcionais, adicionadas ao fim; uma requisição que omite uma delas recebe o seu padrão: transferInductance (nH/m, 0,159155, que reproduz a impedância de transferência anterior a 10 mΩ/m) e lineImpedance (Ω, 50) em cable-shield-effectiveness; beadInductance (µH, 1,208), parasiticCapacitance (pF, 1,678) e sourceImpedance (Ω, 0) em ferrite-bead; biasMode (0 resolve a reta de carga, 1 usa V_DS como informado; padrão 0) em mosfet-operating-point; pd (0,9), pfa (1×10⁻⁶) e pulses (1, integrados de forma não coerente) em radar-range-equation; transitionTime (ns, 50) em motor-driver-power.

    Novas saídas: vdsOperating em mosfet-operating-point, loadedRpm e loadedCurrent em bldc-motor, e gateDriveLoss (2·Q_g·V·f, dissipada no driver de gate) em motor-driver-power.

    Chaves mantidas, com significados agora de acordo com os rótulos: conductionLoss de motor-driver-power é a perda de uma posição em condução (I²·R), switchingLoss a do único FET em comutação forçada, totalLossPerFet o FET mais quente, e efficiency é calculada em relação a V·I·D e inclui o acionamento de gate. A entrada phaseResistance de bldc-efficiency e bldc-thermal é rotulada como a resistência entre terminais, medida entre dois fios, que ela sempre foi.

    A perda de inserção da Category 8 usa os coeficientes preliminares que o modelo de canal IEEE 802.3bq cita para a TIA Category 8 (draft d0.7: 1,8·√f + 0,005·f + 0,25/√f dB por 100 m), e todo resultado de Category 8 diz isso, já que a tabela publicada da TIA-568.2-D não está disponível.

    Novas recusas e avisos: ferrite-bead recusa uma impedância de 100 MHz que o seu L e C não conseguem atingir, nomeando a maior que conseguem; radar-range-equation recusa um P_d que nenhum detector atinge com aquele P_fa e avisa fora da faixa declarada de Albersheim; cable-shield-effectiveness avisa quando o cabo é mais longo que um sexto de comprimento de onda ou o acoplamento deixa de ser fraco; ethernet-cable avisa quando uma categoria é avaliada além da frequência para a qual é especificada.

  68. mosfet-operating-point resolve a reta de carga por padrão; bldc-thermal devolve null onde o enrolamento entra em fuga térmica

    • POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    mosfet-operating-point agora resolve, por padrão, a lei quadrática junto com a reta de carga do dreno V_DS = V_DD − I_D·R_D (Sedra & Smith, Microelectronic Circuits, 7ª ed., seção 5.3, Exemplo 5.5), então vdd e rdLoad definem o ponto de operação e um vds informado não o define mais. Nos padrões, ele mostra 11,96 mA na região de triodo com V_DS de 0,0401 V, onde mostrava 450 mA, que a carga de 1 kΩ não consegue conduzir a partir de 12 V. Quem depende do vds informado precisa enviar biasMode: 1, que mantém o cálculo anterior e avisa quando V_DS + I_D·R_D se afasta mais de 1 % de V_DD. A nova saída vdsOperating dá o V_DS do ponto de operação em qualquer um dos modos.

    bldc-thermal agora inclui o aumento da resistência do enrolamento com a temperatura (maxon Formulae Handbook, 2012, seção 9.2). Onde α·Rθ·R₂₅·I² ≥ 1 não há regime permanente: a perda no cobre cresce com a temperatura mais depressa do que o caminho térmico a remove. Nesse caso tempRise, steadyStateTemp, thermalMargin e hotResistance são null, com um aviso que nomeia a corrente abaixo da qual o enrolamento se estabiliza; antes eram números (467,97 °C a 25 A no motor padrão, que agora entra em fuga térmica acima de 23,21 A). Quem os lê como números precisa tratar null. deratedCurrent e timeToLimit são sempre números.

    O timeToLimit de bldc-thermal é null, com um aviso, quando a corrente de pico estabiliza o enrolamento abaixo do seu limite, de modo que o limite nunca é atingido. Antes era o valor sentinela 9999 s, que se lia como um tempo real.

  69. bldc-winding: o preenchimento conta os dois lados da bobina, e o fator de enrolamento vem da estrela de ranhuras

    • POST /api/py/v1/calculate (bldc-winding)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    fillFactor agora conta os dois lados de bobina em cada ranhura, 2·N·A_wire/A_slot (Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, seção 2.9): uma bobina em cada dente coloca dois lados de bobina em cada ranhura. Antes contava um, então todo preenchimento dobra. Ele não é mais limitado a 100 %: um enrolamento que não cabe devolve o seu valor real, com os avisos de 75 % e 90 % como antes.

    windingFactor tira o seu fator de distribuição do método da estrela de ranhuras, k_d = sin(π/6)/(z·sin(π/(6z))) para q = S/(3P) = z/n em termos irredutíveis (Bianchi & Dai Pré, 2006). Era 1 para todo q que arredondava para 1, então os enrolamentos de ranhura fracionária mostravam valores altos: 12 ranhuras e 14 polos agora dão 0,93301 (era 0,96593), 18 ranhuras e 16 polos 0,94521 (era 0,98481). Os enrolamentos de ranhura inteira não mudam. turnsPerCoil, actualKv, deltaEquivKv e phaseResistance acompanham: o enrolamento padrão de 935 Kv continua com 4 espiras e chega a 1027,61 Kv (era 992,59), e 920 Kv num estator de 23 × 10 mm precisa de 6 espiras (eram 5).

    O maxCurrent padrão da calculadora é 5 A (era 10 A), para que o seu enrolamento padrão do EMAX MT2213 possa ser montado: 4 espiras de AWG 18 com 47,24 % de preenchimento. A 10 A ele precisa de AWG 14 e 119,44 %. A API não aplica padrões, então uma requisição que envia maxCurrent é calculada com o valor que envia.

  70. Trinta calculadoras corrigidas para a relação que citam

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Cada calculadora abaixo calculava algo diferente da referência que cita, da mesma forma no navegador, na API e no servidor MCP. Cada uma agora calcula a relação da referência e é testada contra um valor publicado. Os cálculos salvos guardam as entradas, então são recalculados.

    Os valores mudam para: equalizer-q-factor (largura de banda em oitavas com Q constante), capacitor-code (um dígito multiplicador 8 significa ×0,01, 9 significa ×0,1), opamp-gain (a largura de banda é o GBW sobre o ganho de ruído), coax-impedance (corte do TE11 na circunferência média), h-bridge-selection (dois FETs conduzem ao mesmo tempo), bldc-winding (o fator √3 é da ligação em estrela; novos padrões a partir de um motor 12N14P real), speaker-crossover (indutores de 2ª ordem √2·R/ω_c, o dobro do valor antigo, também na exportação KiCad), esd-tvs-diode (o nível da IEC 61000-4-2 usa o primeiro pico de 3,75 A/kV da norma), common-mode-choke (uma impedância série complexa num sistema de 50 Ω/50 Ω), uart-baud-rate (as paridades mark e space contam um bit), bldc-motor (empuxo estático C_T·ρ·n²·D⁴ com C_T 0,11), resistor-color-code (laranja ±0,05 %, amarelo ±0,02 %; uma faixa de tolerância branca é recusada), pt100-resistance (o C da IEC 60751 abaixo de 0 °C, e a inclinação completa), torque-units, energy-units e torque-unit-converter (fatores exatos da NIST SP 811), via-thermal-resistance (capacidade de corrente pelo ajuste da IPC-2221), thermal-via-array (o barril metalizado é de cobre qualquer que seja o preenchimento), stackup-builder (L3 resolvida como stripline, L1 com a espessura do cobre, cobre contado no total), coplanar-waveguide (o CPW aterrado continua finito para trilhas largas), i2c-pullup (V_OL é 0,2·V_DD em 2 V ou menos), vibration-phase-noise (o termo aleatório cai com o offset; o desvio é o de pico), inrush-current-limiter (o pico na partida a frio é V/R_cold), shielding-effectiveness (a perda por reflexão inclui η₀; reflexões múltiplas adicionadas), ethernet-cable (Category 5e a 10 Gb/s é reprovado), ground-plane-impedance (indutância µ₀·h·l/w; resistência AC de um lado) e minimum-conductor-spacing (IPC-2221B Table 6-1 por faixa, com as suas taxas por volt acima de 500 V).

    Novas entradas opcionais: separation em ground-plane-impedance (mm, padrão 1) e tempRise em via-thermal-resistance (°C, padrão 10). Uma requisição que as omite recebe o padrão, que reproduz os exemplos resolvidos publicados.

    Novas saídas: hotRestartInrush em inrush-current-limiter e multipleReflectionLoss em shielding-effectiveness.

    Saídas que não têm valor agora voltam null com um aviso, onde antes eram um número: o comprimento de onda guiado e as velocidades de fase e de grupo de waveguide-cutoff abaixo do corte, e a largura de stackup-builder para uma impedância alvo que a camada não consegue atingir.

    comparator-hysteresis e pcb-trace-temp mudam apenas os rótulos e a fórmula declarada: nenhum número muda.

    POST /api/py/v1/calculate/solve recusa um grid mais fino que 1×10⁻¹² da magnitude da faixa com uma recusa 400 de grid, antes de qualquer avaliação e sem cobrança. Uma grade assim podia prender uma requisição até ela expirar.

  71. radiated-emission-estimate: margem contra a CISPR 32 Class B, null onde ela não define limite

    • POST /api/py/v1/calculate (radiated-emission-estimate)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    A margem agora é calculada contra o limite da CISPR 32 Class B na distância de medição: Tables A.4 e A.5, a linha de 3 m abaixo de √30 m e a de 10 m acima disso até 1 GHz, as linhas de média de 3 m de 1 a 6 GHz, 20 dB/década a partir da distância tabelada, e o limite mais baixo numa borda de faixa. Antes era um valor fixo de 40 dBµV/m em toda frequência e distância.

    Abaixo de 30 MHz e acima de 6 GHz a CISPR 32 não define limite de emissão radiada, então margin é null ali, com um aviso. Antes era um número. Quem lê margin como número precisa tratar null.

    O campo é a estimativa de loop pequeno no espaço livre, agora com a constante exata π·µ₀/c. Uma medição sobre um plano de terra pode mostrar até 6 dB a mais, como a página diz.

  72. filter-designer e seis calculadoras de RF corrigidas

    • POST /api/py/v1/calculate
    • MCP run_calculation
    • rftools-io SDK

    filter-designer: os valores do protótipo Chebyshev estavam errados a partir da ordem 4 (g3 1,5733, agora 2,3661), um Butterworth de primeira ordem dava g1 = 1 (agora 2), e os valores dos elementos passa-faixa eram dez vezes menores com Q = 10. Os valores agora são calculados, não tabelados.

    waveguide-cutoff, free-space-path-loss, rf-link-budget, fresnel-zone, link-margin e radar-range-equation usam a velocidade da luz exata, não 3×10⁸: os comprimentos mudam cerca de 0,07 % e a perda de percurso 0,006 dB. radar-range-equation também usa a constante de Boltzmann exata.

    planar-spiral-inductor recusa um diâmetro interno igual ou maior que o externo em vez de devolver NaN.

    Catorze calculadoras foram adicionadas em 2026-10-05 e 2026-10-06, incluindo a nova categoria iot; faça GET do catálogo ou use list_calculators para vê-las.

  73. Impedância de PDN: um modelo de plano convergente, uma porta derivada e dois novos parâmetros

    • POST /api/py/v1/jobs (pdn_impedance)
    • POST /api/py/v1/jobs/estimate
    • MCP simulate_pdn_impedance
    • rftools-io SDK

    portX_mm e portY_mm omitidos agora colocam a porta no ponto a um terço da placa (a/3, b/3), e não no seu centro. O centro é um nulo de todo modo de cavidade com índice ímpar, então as primeiras ressonâncias nunca apareciam numa execução padrão. Uma requisição que informa a porta recebe a porta que pediu.

    Dois parâmetros opcionais: portSize_mm (padrão 1 mm, 0,25–20), o lado do quadrado pelo qual a corrente do CI entra nos planos, e boardInductance_nh (padrão 1 nH, 0–20), a indutância entre o regulador e os planos, que era fixa em 1 nH. Uma porta que ultrapassa uma borda da placa é aceita e modelada com a sua imagem; uma porta cujo centro está fora da placa, ou que é maior que a placa, é recusada.

    Os resultados mudam. A soma modal do plano era truncada em relação a freqMax_hz e, com uma porta pontual, nunca convergia, então os resultados mudavam com a varredura. Agora ela converge e não depende da varredura abaixo do primeiro modo. Na porta padrão, a indutância de espalhamento do plano é de cerca de 1,5 nH onde mostrava cerca de 0,2 nH, então a ressonância série do plano sozinho cai de cerca de 550 para cerca de 210 MHz, e os conjuntos de capacitores recomendados mudam. Resultados anteriores não são recalculados.

    O veredito e summary.maxZPdnDb agora cobrem toda a faixa de desacoplamento, que termina em 0,8 × o primeiro modo de cavidade da placa, com o pior caso refinado entre os pontos da grade. Novos campos de resultado: summary.band, summary.worstHz, summary.unreachable, resonances[].portCoupling e, em params, a porta, o tamanho da porta e a indutância da placa usados. Todos os campos existentes são mantidos.

  74. Uma chamada de resolução por alvo: buscar uma entrada de calculadora para uma saída alvo

    • POST /api/py/v1/calculate/solve

    POST /api/py/v1/calculate/solve encontra o valor de uma entrada de calculadora que leva uma das suas saídas a um alvo — a largura de trilha que dá 50 Ω, o espaçamento que dá uma impedância diferencial alvo — e o devolve com o resultado direto exatamente nesse valor: values, warnings, errors e provenance, exatamente o que /calculate devolve para essas entradas. Uma chamada contabilizada substitui as várias chamadas diretas que um cliente gastaria buscando à mão.

    A busca percorre os limites declarados da entrada, estreitados por um range opcional; uma entrada sem limite declarado precisa de um. Um grid opcional arredonda o valor devolvido para o seu múltiplo mais próximo dentro da faixa, ao lado da solução sem arredondamento. Um alvo que a busca não consegue atingir ainda é um sucesso, com reached: false e o valor mais próximo encontrado, e ainda é cobrado. As recusas — uma calculadora desconhecida, um nome de entrada ou de saída que a calculadora não declara, um valor não finito, uma faixa ausente numa entrada sem limites — não custam nada, como em todas as outras rotas de calculadora.

    O Client.solve() do SDK Python (rftools-io 0.4.0) e a ferramenta solve_calculation do servidor MCP (2.2.0) expõem a mesma chamada.

  75. Uma cota esgotada nas rotas de calculadora é 402, não 401

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    As rotas de calculadora respondiam 401 "Invalid or quota-exceeded API key" tanto para uma chave inválida quanto para uma cota esgotada, então um script não conseguia distinguir uma chave ruim de um mês movimentado. Uma cota esgotada agora é 402, como a rota de trabalhos já respondia, com errorKind: "rate_limited", reason, limit, used, resetAt, upgradeUrl, overageUrl e um cabeçalho Retry-After.

    401 agora significa apenas que a chave está ausente, malformada, é desconhecida ou foi revogada, e nunca menciona uma cota. Uma requisição sem nenhuma chave é 401 com um keyUrl onde se pode obter uma chave gratuita.

    Uma chamada é verificada antes de ser contabilizada: uma calculadora desconhecida (404) ou uma entrada que não é um número finito (400) não custa nada, e um cálculo que falha é devolvido. Num lote, só os itens que passam nessas verificações são contabilizados, e os itens cujo cálculo falha são devolvidos. Decida pelo status e pelo errorKind, nunca pelo texto da mensagem.

  76. A cota mensal pertence à conta e é compartilhada por todas as suas chaves

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/jobs

    Antes, cada chave tinha a sua própria cota mensal, então uma conta com várias chaves podia gastar a cota uma vez por chave. Agora a cota é da conta: as chamadas de todas as chaves que ela tem, incluindo as revogadas, contam para um único total mensal, que é zerado no início de cada mês do calendário em UTC.

    Uma conta com uma chave não vê diferença. As chamadas continuam atribuídas à chave que as fez, e o painel e GET /api/py/v1/usage as listam por chave.

  77. Um endpoint de uso, e cabeçalhos de uso em toda resposta contabilizada

    • GET /api/py/v1/usage
    • X-Usage-Allowance
    • X-Usage-Used
    • X-Usage-Reset
    • X-Usage-Overage

    GET /api/py/v1/usage responde a uma chave (X-API-Key ou Authorization: Bearer rfc_…) ou a uma sessão conectada com o plano, a cota, o que foi usado e o que resta, quando ela é zerada, o estado do excedente e as chamadas atribuídas a cada uma das chaves da conta. Consultá-lo nunca é contabilizado.

    Toda resposta contabilizada traz X-Usage-Allowance, X-Usage-Used (incluindo aquela chamada) e X-Usage-Reset, e X-Usage-Overage quando houve excedente contabilizado. Os navegadores conseguem lê-los.

  78. Todo resultado diz como foi calculado

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • GET /api/py/v1/jobs/{jobId}

    Os resultados de calculadora e cada item de lote trazem um objeto provenance com nove membros: method, version, formulaRef, assumptions, validRange, computedAt, inputs, seed e elapsedSeconds. Os resultados de trabalhos já traziam provenance; ele ganha formulaRef, assumptions, validRange e computedAt em vez de um segundo objeto, e a sua version é escrita worker@<revision> em vez da revisão sozinha.

    Uma entrada fora da faixa para a qual a calculadora é declarada continua sendo calculada: validRange a nomeia e um aviso é adicionado. Um resultado guardado antes desta mudança mantém os membros que tinha; trate um membro ausente como desconhecido.

  79. Programas podem obter uma chave pela autorização de dispositivo

    • POST /api/py/v1/oauth/device/code
    • POST /api/py/v1/oauth/device/token
    • /device/

    Um programa sem navegador pode obter uma chave sem que o seu usuário cole uma (concessão de autorização de dispositivo do OAuth 2.0, RFC 8628). Ele pede um código a /oauth/device/code, mostra ao usuário o código e o endereço https://rftools.io/device/, e consulta /oauth/device/token no intervalo que recebeu. Assim que o usuário entra e aprova o código, a consulta seguinte devolve uma chave de API comum, uma única vez.

    A chave é contabilizada, listada e revogável como qualquer outra, e conta para o limite de chaves da conta.

  80. Links de chave para clientes, e rótulos nas chaves

    • POST /api/py/v1/apikeys
    • /dashboard/?newKey=1

    POST /api/py/v1/apikeys aceita um corpo opcional {"label", "client"} e devolve os dois; omitir o corpo funciona como antes. Um cliente pode mandar o seu usuário para https://rftools.io/dashboard/?newKey=1&client=<clientId> para criar uma chave rotulada para ele, mostrada uma única vez.

  81. As recusas nomeiam o limite e o caminho para superá-lo

    • 429 responses
    • 402 from POST /api/py/v1/jobs
    • Authorization: Bearer rfc_…

    O 429 por minuto traz errorKind: "rate_limited", limit, windowSeconds e upgradeUrl ao lado de detail, assim como toda outra recusa traz o seu errorKind. O 402 da rota de trabalhos para uma cota esgotada ganha reason, limit, used, upgradeUrl e overageUrl, e o 402 para uma cota de modo de resolução de fdtd_sparam esgotada traz reason: "solve_mode". Os campos existentes não mudam.

    As rotas de calculadora aceitam uma chave como Authorization: Bearer rfc_… além de X-API-Key, como as rotas de trabalhos já faziam.

A referência completa é a documentação da API; a descrição legível por máquina é o playground do OpenAPI e o documento OpenAPI.