Calculadora de resolución PWM en bits
Esta calculadora de resolución PWM muestra cuántas cuentas de temporizador y cuántos bits completos están disponibles para una frecuencia PWM solicitada.
Ejecutar — gratis
Introduzca el reloj del temporizador en hercios, la frecuencia PWM deseada y un preescalador entero opcional. El resultado incluye la frecuencia de tick, las cuentas ideales y utilizables por periodo, el valor máximo del contador, la resolución teórica y entera, la frecuencia alcanzable y su error. Resulta útil para planificar temporizadores de microcontroladores antes de elegir registros o escribir firmware.
Cómo determinan la resolución el reloj y la frecuencia PWM
Un temporizador de hardware avanza una vez por cada tick y se reinicia al terminar el periodo programado. En PWM alineada al borde, dividir el reloj de entrada por el preescalador y la frecuencia solicitada produce el número ideal de estados del contador por periodo. Cuantos más estados haya, más niveles distintos de ciclo de trabajo puede expresar el registro de comparación. Por ello, la resolución es el logaritmo en base dos del número de estados. La calculadora redondea hacia abajo las cuentas ideales, porque el hardware no ejecuta fracciones de tick, y después redondea hacia abajo el logaritmo para indicar los bits completos disponibles. Por ejemplo, 72 MHz y 20 kHz sin preescalador ofrecen 3,600 cuentas: aproximadamente 11.81 bits teóricos y 11 bits completos. El máximo del contador es una unidad menor, pues normalmente cuenta desde cero hasta ARR o TOP inclusive. Aumentar la frecuencia reduce los ticks por ciclo; reducirla permite pasos de trabajo más finos.
Cómo interpretar los valores calculados
Use como timer_clock_hz el reloj que realmente alimenta el periférico antes de su preescalador. No suponga que coincide con la CPU: algunos microcontroladores lo derivan de un bus y ciertos árboles de reloj lo multiplican. pwm_frequency_hz es la frecuencia de salida deseada en modo alineado al borde. prescaler es un entero positivo y vale uno por defecto. timer_tick_hz es el reloj dividido por el preescalador. ideal_counts_per_period conserva la relación matemática y available_counts_per_period contiene su parte entera. max_counter_value resta uno a esas cuentas. resolution_bits indica bits binarios completos y theoretical_resolution_bits conserva la fracción para comparar diseños. actual_pwm_frequency_hz se obtiene con el periodo entero, por lo que puede superar ligeramente el objetivo. frequency_error_percent mide esa diferencia. La automatización mediante API cuesta $0.002 por elemento correcto. El cálculo es determinista y no consulta redes ni bases de datos de dispositivos.
Cómo aplicar el resultado a un microcontrolador real
Considere el resultado como una comprobación de viabilidad y compárelo con el manual de referencia del microcontrolador. Un registro de periodo de 16 bits no admite un contador máximo superior a 65,535, aunque la relación de frecuencias ofrezca más estados; en ese caso debe aumentar el preescalador o limitar el ancho. Obtener 10 bits completos tampoco obliga a usar exactamente 1,023 como máximo: significa que caben al menos 1,024 posiciones. La PWM centrada suele contar hacia arriba y hacia abajo e introduce un factor cercano a dos, de modo que debe emplear la fórmula específica del dispositivo. También debe considerar tiempo muerto, sincronización, contadores de repetición y cambios de reloj en modos de bajo consumo. Si importa más la frecuencia exacta que la granularidad, pruebe combinaciones cercanas de preescalador y periodo. Para obtener pasos más finos, reduzca la frecuencia PWM o aumente el reloj. La resolución matemática no garantiza precisión analógica: retardos, jitter, drivers y carga pueden degradar el resultado efectivo.
Qué puede hacer con ella
Dimensionar un temporizador para LED
Compruebe si una frecuencia sin parpadeo conserva suficientes pasos de trabajo para variar el brillo con suavidad.
Planificar firmware de control de motores
Compare la frecuencia de conmutación con la resolución entera disponible en el temporizador del motor.
Elegir el preescalador del temporizador
Evalúe cómo cambia los ticks, el rango del contador, la frecuencia alcanzable y la granularidad.
Preguntas frecuentes
¿Qué fórmula utiliza la calculadora?
Para PWM alineada al borde: cuentas = floor(reloj / preescalador / frecuencia PWM) y bits = floor(log2(cuentas)).
¿Por qué la resolución teórica tiene decimales?
El logaritmo puede quedar entre potencias de dos; los bits completos indican el mayor rango binario que cabe.
¿Por qué difiere la frecuencia real del objetivo?
El periodo ideal puede contener una fracción de tick. Al convertirlo en cuentas enteras, la frecuencia alcanzable puede aumentar.
¿Sirve para PWM centrada?
El resultado directo supone alineación al borde. Los modos centrados suelen incluir un factor de conteo ascendente y descendente.
¿Se aplica el ancho del registro del temporizador?
No. Compare max_counter_value con el límite físico, por ejemplo 65,535 para un registro de periodo de 16 bits.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/elec/pwm-resolution \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"timer_clock_hz":72000000,"pwm_frequency_hz":20000}'const res = await fetch("https://api.kit.forhosting.com/elec/pwm-resolution", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"timer_clock_hz": 72000000,
"pwm_frequency_hz": 20000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/elec/pwm-resolution",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"timer_clock_hz": 72000000,
"pwm_frequency_hz": 20000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/elec/pwm-resolution", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"timer_clock_hz":72000000,"pwm_frequency_hz":20000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"timer_clock_hz":72000000,"pwm_frequency_hz":20000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/elec/pwm-resolution", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"timer_clock_hz": 72000000,
"pwm_frequency_hz": 20000
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "elec.pwm_resolution",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |