¿Cómo implementan algunos microcontroladores las tasas de baudios a pesar de que utiliza una frecuencia de cristal que no es escalable a las tasas de baudios estándar?

Acabo de darme cuenta de que la familia 8051 usa 11.0592 MHz y sus múltiplos para generar velocidades de transmisión estándar. Pero hay SoC que usan 15 MHz. ¿Cómo hacen esto entonces?

En su mayoría, utilizan divisores que no son potencias de 2 para generar tasas aceptablemente cercanas a las tasas de baudios estándar.
lo que es más, los UART pueden sobremuestrear la señal (por ejemplo, 16 muestras por bit UART), lo que resuelve problemas de tiempo (y ruido): electronicdesign.com/embedded/…
Para cualquier persona interesada, las tablas de error de temporización AVR USART están disponibles para relojes comunes en la hoja de datos (en esta en la página 168 en adelante) .

Respuestas (7)

Al UART no le importa siempre que sea razonablemente exacto.

15000000 230400 sesenta y cinco

sesenta y cinco 230400 = 14976000

Entonces su UART va a ser demasiado rápido por un factor de 15000 14976 1.002204 . Se convierte en un problema en 1 + 1 2 11 1.045 , cuando el cambio de tiempo entre 11 bits es más de medio bit.

Vale la pena señalar que tanto el transmisor como el receptor tienen relojes, por lo que si ambos tienen un error en la dirección equivocada...
Más importante aún, los protocolos seriales relevantes (RS-232, etc.) usan bits de inicio y parada para sincronizar aún más los relojes. Incluso si ambos lados tuvieran relojes perfectos de 230400 Hz, los dos relojes probablemente estarían desfasados. El bit de inicio permite que el lado receptor sincronice su reloj con el emisor. Dado que esto puede suceder en el primer bit de cada byte, los relojes imperfectos solo significan ajustes de fase más frecuentes.
En la práctica, es probable que se desvíe más de lo que indica esta publicación porque es poco probable que el sistema divisor sea 100% flexible.
@PeterGreen: Eso es cierto; la mayoría de los UART reales requieren un reloj de entrada que sea 16 veces mayor que la velocidad en baudios, y el divisor programable debe producir el reloj más rápido. En este ejemplo, el divisor total tendría que ser 64 (= 16 x 4), y el error sería 15 METRO H z / 64 230400 b a tu d = 1.01725 , o +1,7%, que sigue siendo un valor aceptable.
@DaveTweed: Pero los chips que se toman en serio el serial asíncrono tienden a permitir un factor de supermuestreo de 13 en su periférico serial, lo que obtiene el buen error bajo que Simon calculó a partir de cualquier reloj que sea un múltiplo de 3 MHz. Alternativamente, algunos usan un divisor fraccionario donde el tiempo de bit promedia el valor correcto, aunque los bits individuales pueden tener un error de tiempo de > 2%.

Aquí está la descripción de las características de 'letra grande' de una MCU ARM de gama relativamente alta.

ingrese la descripción de la imagen aquí

Hay una serie de PLL y divisores con preescaladores y posescaladores que son capaces de crear casi cualquier frecuencia que pueda necesitar como una relación de números enteros. El PLL multiplica su frecuencia de entrada por algún número entero, y un divisor puede dividir por algún número ( no necesariamente potencias de 2 en cada caso).

Las frecuencias internas relativamente altas (alrededor de medio GHz en este caso) no son un problema (como lo serían si estuvieran fuera del chip): se consume relativamente poca energía.

Los días de la división solo por potencias de 2 terminaron hace bastante tiempo, y ahora que los PLL se aplican comúnmente, no tenemos que preocuparnos tanto por la frecuencia exacta del cristal. Por otro lado, es posible que necesitemos muchas frecuencias de reloj diferentes para múltiples relojes de bus internos, periféricos USB, Ethernet, UART, etc.

Si desea obtener más información sobre cómo funcionan, puede estudiar algunos de los chips de síntesis de reloj dedicados que son relativamente simples (aunque aún lo suficientemente complejos como para que algunos fabricantes proporcionen software para calcular las constantes de configuración).

(its = posesivo, it's = "es" o "tiene". Consulte, por ejemplo, Cómo usar Its y It's ).
@PeterMortensen Gracias, solucionado. Por alguna razón, los errores tipográficos como ese (y la colocación de homónimos incorrectos) son más fáciles de hacer cuando se está en un modo de pensamiento conversacional en lugar de en un modo de redacción de informes.

Esto se puede lograr usando un modulador .

Consulte, por ejemplo, la guía del usuario de MSP430x1xx . En la página 260 dice:

El generador de tasa de baudios USART es capaz de producir tasas de baudios estándar a partir de frecuencias de fuente no estándar. El generador de velocidad en baudios usa un preescalador/divisor y un modulador como se muestra en la Figura 13-7. Esta combinación admite divisores fraccionarios para la generación de velocidad en baudios.

Tiempo de tasa de baudios

(nótese el área gris)

El factor de división N es a menudo un valor no entero cuya parte entera puede ser realizada por el preescalador/divisor. La segunda etapa del generador de velocidad en baudios, el modulador, se usa para cumplir con la parte fraccionaria lo más cerca posible.

[...]

El BITCLK se puede ajustar de bit a bit con el modulador para cumplir con los requisitos de tiempo cuando se necesita un divisor no entero. La temporización de cada bit se expande en un ciclo de reloj BRCLK si se establece el bit mi del modulador. Cada vez que se recibe o transmite un bit, el siguiente bit en el registro de control de modulación determina el tiempo para ese bit. Un bit de modulación establecido aumenta el factor de división en uno, mientras que un bit de modulación borrado mantiene el factor de división proporcionado por UxBR

[...]

Mucha gente asume que el UART en realidad se está ejecutando en un reloj fijo, es decir, se toma una muestra cada T segundos. Esto no necesariamente es cierto. Al menos no en todos los módulos UART que he diseñado.

La forma en que funciona es que tiene un reloj de muestra interno. Digamos que puede probar cada 100 ns. Sabes dónde está el medio de cada bit. Entonces, elige un punto de muestreo que sea el más cercano al medio. Esto le dará un error de 50 ns como máximo.

Lo que sucede es que recibes el bit de inicio. Luego determina dónde está el medio del bit, ese es su punto de referencia. Entonces sabrá cuánto tiempo debe esperar para probar el siguiente bit. Entonces, carga un contador, y cuando se reinicia, toma una muestra. Ahora, estará fuera de como máximo 1 ciclo de reloj de su reloj interno rápido, pero eso es nanosegundos en la mayoría de los casos. Además, sabes cuánto te falta. Para el siguiente bit, carga su contador con un valor diferente, de modo que esté lo más cerca posible del medio, y así sucesivamente.

En los sistemas reales también suceden muchas otras cosas. Por ejemplo, no toma una muestra, puede tomar un par y procesarlas, etc. En efecto, es un ADC de 1 bit, con todas las implicaciones, como el ruido de cuantificación. Pero usted debe obtener la idea general.

Los SoC modernos usan el llamado PLL para generar (casi) cualquier reloj que pueda ser necesario para las interfaces. En términos simplificados, el circuito PLL emplea un VCO (oscilador controlado por voltaje) de alta frecuencia, luego usa divisores de frecuencia digitales tanto en el VCO como en el reloj de entrada, y genera una retroalimentación de voltaje basada en la relación de frecuencia. Esta retroalimentación controla el VCO, de modo que todo el bucle se bloquea en la frecuencia deseada.

Suponiendo un byte de 8 bits precedido por un solo bit de inicio y seguido por un solo bit de parada y suponiendo un muestreo perfecto por parte del receptor, eso significa que después de períodos de 9.5 bits, el reloj debe estar apagado por menos de medio período de bits.

Eso significa que la máxima diferencia de reloj tolerable entre el transmisor y el receptor es de alrededor del 5%. Sin embargo, puede haber un error en ambos extremos del enlace y la sincronización de los receptores puede no ser perfecta. En la práctica, por lo tanto, generalmente recomendaría que la tasa de baudios real se mantenga dentro del 1% de la tasa de baudios nominal.

Los microcontroladores con los que estoy más familiarizado son los dispositivos PIC18. Los modelos más antiguos de estos utilizan un contador flexible de 8 bits para escalar la velocidad en baudios, mientras que los más nuevos tienen un contador flexible de 16 bits. También hay modos opcionales de velocidad "alta" y "baja" que cambian la tasa de baudios en un factor de cuatro.

Con un reloj de entrada de 20 MHz, la versión de 8 bits de este esquema de generación es suficiente para estar dentro del 0,25% de la tasa de baudios nominal para todas las tasas de 1800 a 19200. La versión de 16 bits le permite bajar a velocidades aún más bajas.

http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1 (ignore las columnas sync=1, son para ejecutar el USART en modo síncrono)

Los PLL, los divisores fraccionarios, etc. no son realmente necesarios para la serie UART.

Para intercambiar datos en serie, un controlador debe emitir o muestrear datos dentro de una cierta ventana del tiempo "ideal". Aunque lo más sencillo es tener un controlador que divida un reloj por un factor programable y luego otra vez por un factor adicional codificado, no es necesario que los bits se lean o escriban a intervalos iguales. Si el otro extremo de una conexión emite bits a intervalos exactamente uniformes que coinciden con la velocidad en baudios, un receptor puede funcionar con cualquier velocidad de muestreo que sea mayor que el doble de la velocidad en baudios, siempre que muestree las cosas en los momentos correctos. Por ejemplo, suponga que los datos se envían a 19 200 y uno está muestreando exactamente a 48 000 Hz (2,5x).

Cuando uno ve un flanco descendente, sabrá que el bit de parada ha comenzado hace entre 0 y 1 veces de muestreo. Si uno etiqueta la primera muestra en la que se observó el bit de inicio como tiempo 0, el bit 0 comenzará en algún lugar entre el tiempo 1,5 y 2,5; el bit 1 comenzará entre los tiempos 4.0 y 5.0, el bit 2 comenzará entre los tiempos 6.5 y 7.5, y el bit 3 comenzará entre los tiempos 9.0 y 10.0. Por lo tanto, se garantizará que una muestra tomada en el tiempo 3 capture el bit 0 [que comienza entre los tiempos 1,5 y 2,5, y finaliza entre los tiempos 4,0 y 5,0]. Asimismo, una muestra tomada en el tiempo 6 capturará el bit 1, y una muestra tomada en los tiempos 8, 11, 13, 16, 18 y 20 capturará los bits 2-7.

El uso de una frecuencia de muestreo más rápida haría que el receptor fuera más tolerante con las imperfecciones de la fuente, pero incluso con una frecuencia de muestreo de solo 2,5 veces la frecuencia de bits, los márgenes no son terribles [alrededor de 1/5 de un bit de tiempo].