¿Cómo implementan algunos microcontroladores la velocidad de transmisión a pesar de que utiliza una frecuencia de cristal no escalable a la velocidad de transmisión estándar?
16
Me acabo de dar cuenta de que la familia 8051 usa 11.0592 MHz y sus múltiples para generar velocidades de transmisión estándar. Pero hay SoC que usan 15 MHz. ¿Cómo hacen esto entonces?
En su mayoría, usan divisores sin potencia de 2 para generar tasas aceptablemente cercanas a las tasas de baudios estándar.
Brian Drummond el
44
Además, los UART pueden sobremuestrear la señal (por ejemplo, 16 muestras por bit UART), lo que resuelve problemas de sincronización (y ruido): electronicdesign.com/embedded/…
Al UART no le importa mientras sea razonablemente exacto.
15000000230400≈ 65
65 ⋅ 230400 = 14976000
Entonces, su UART será demasiado rápido por un factor de . Se convierte en un problema en1+11500014976≈ 1.002204, cuando el cambio de tiempo en 11 bits es más de medio bit.1 + 12 ⋅ 11≈ 1.045
Vale la pena señalar que tanto el transmisor como el receptor tienen relojes, por lo que si ambos están en un error en la dirección incorrecta ...
Spehro Pefhany
77
Más importante aún, los protocolos seriales relevantes (RS-232, etc.) utilizan 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 remitente. Como esto puede suceder en el primer bit de cada byte, los relojes imperfectos solo significan ajustes de fase más frecuentes.
MSalters
1
En la práctica, es probable que se apague más de lo que indica esta publicación porque es poco probable que el sistema divisor sea 100% flexible.
Peter Green
2
@PeterGreen: Eso es cierto; La mayoría de los UART reales requieren un reloj de entrada que sea 16 veces la velocidad en baudios, y el divisor programable debe producir el reloj más rápido. En este ejemplo, el divisor general debería ser 64 (= 16 x 4), y el error sería , o + 1.7%, que sigue siendo un valor aceptable. 15 millonesHz/ 64230400 b a u d= 1.01725
Dave Tweed
2
@DaveTweed: Pero los chips que toman en serio la serie asíncrona tienden a permitir un factor de supermuestreo de 13 en su periférico en serie, que obtiene el agradable error bajo que Simon calculó a partir de cualquier reloj que sea múltiplo de 3 MHz. Alternativamente, algunos usan un divisor fraccionario donde el tiempo de bits promedia el valor correcto aunque los bits individuales puedan tener un error de temporización> 2%.
Ben Voigt
12
Aquí está la descripción de las características de 'letra grande' de un MCU ARM de gama relativamente alta.
Hay una serie de PLL y divisores con escaladores previos y posteriores que son capaces de crear casi cualquier frecuencia que pueda necesitar como una relación de enteros. El PLL multiplica su frecuencia de entrada por algún número entero, y un divisor puede dividirse 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 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, podemos necesitar muchas frecuencias de reloj diferentes para múltiples relojes de bus internos, 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 suministren software para calcular las constantes de configuración).
(es = posesivo, es = "es" o "tiene". Vea, por ejemplo, cómo usar su y es .)
Peter Mortensen
44
@PeterMortensen Gracias, arreglado. 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 un modo de escritura de informes.
El generador de velocidad en baudios USART es capaz de producir velocidades en 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 de transmisión.
(tenga en cuenta el área gris)
El factor de división N es a menudo un valor no entero del cual la porción entera puede ser realizada por el preescalador / divisor. La segunda etapa del generador de velocidad en baudios, el modulador, se utiliza 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 temporización cuando se necesita un divisor no entero. El tiempo de cada bit se expande en un ciclo de reloj BRCLK si el bit modulador mi está configurado. 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 dado por UxBR
La forma en que funciona es que tiene un reloj de muestra interno. Digamos que puedes probar cada 100ns. Sabes dónde está el medio de cada bit. Por lo tanto, elige un punto de muestreo que sea el más cercano al medio. Esto le dará un error de 50ns como máximo.
Lo que sucede es que recibes el bit de inicio. Luego determina dónde está la mitad del bit, ese es su punto de referencia. Entonces sabrá cuánto tiempo necesita esperar para probar el siguiente bit. Entonces, carga un contador y, cuando se reinicia, muestra. Ahora, estará apagado como máximo 1 ciclo de reloj de su reloj interno rápido, pero eso es nano segundos en la mayoría de los casos. Además, sabes cuánto estás fuera. 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 hay muchas otras cosas que también suceden. Por ejemplo, no tomas una muestra, puedes tomar un par y procesarlas, etc. De hecho, es un ADC de 1 bit, con todas las implicaciones como el ruido de cuantización. Pero deberías tener la idea general.
Los SoCs 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 de alta frecuencia (oscilador controlado por voltaje), luego usa divisores de frecuencia difital tanto en VCO como en 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 está bloqueado a la frecuencia deseada.
Suponiendo un byte de 8 bits precedido por un único bit de inicio y seguido de 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 en menos de medio período.
Eso significa que la diferencia de reloj tolerable máxima entre el transmisor y el receptor es de aproximadamente el 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 velocidad de transmisión real se mantenga dentro del 1% de la velocidad de transmisión nominal.
Los microcontroladores con los que estoy más familiarizado son los dispositivos PIC18. Los modelos más antiguos usan 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 velocidad de transmisión 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 alcanzar el 0.25% de la velocidad de transmisión nominal para todas las velocidades de 1800 a 19200. La versión de 16 bits te permite bajar a velocidades aún más bajas.
Para intercambiar datos en serie, un controlador debe emitir o muestrear datos dentro de una determinada ventana del tiempo "ideal". Si bien es más simple tener un controlador que divida un reloj por un factor programable y luego nuevamente por un factor codificado adicional, no es necesario que los bits se lean o escriban a intervalos iguales. Si el extremo lejano de una conexión genera bits a intervalos uniformes exactos 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 emiten a 19.200 y uno está muestreando precisamente a 48,000Hz (2.5x).
Cuando se ve un borde descendente, se sabrá que el bit de parada ha comenzado entre 0 y 1 muestras hace un tiempo. Si se etiqueta la primera muestra donde se observó el bit de inicio como tiempo 0, el bit 0 comenzará en algún punto entre el tiempo 1.5 y 2.5; el bit 1 comenzará en algún momento entre el tiempo 4.0 y 5.0, el bit 2 comenzará en algún momento entre el tiempo 6.5 y 7.5, y el bit 3 comenzará en algún momento entre el tiempo 9.0 y 10.0. Por lo tanto, se garantizará que una muestra tomada en el tiempo 3 capturará el bit 0 [que comienza entre el tiempo 1.5 y 2.5, y termina entre el tiempo 4.0 y 5.0]. Del mismo modo, una muestra tomada en el tiempo 6 capturará el bit 1, y una muestra tomada en el tiempo 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 sea más tolerante a las imperfecciones en la fuente, pero incluso con una frecuencia de muestreo de solo 2.5 veces la frecuencia de bits, los márgenes no son terribles [aproximadamente 1/5 de un tiempo de bits].
Respuestas:
Al UART no le importa mientras sea razonablemente exacto.
Entonces, su UART será demasiado rápido por un factor de . Se convierte en un problema en1+11500014976≈ 1.002204 , cuando el cambio de tiempo en 11 bits es más de medio bit.1 + 12 ⋅ 11≈ 1.045
fuente
Aquí está la descripción de las características de 'letra grande' de un MCU ARM de gama relativamente alta.
Hay una serie de PLL y divisores con escaladores previos y posteriores que son capaces de crear casi cualquier frecuencia que pueda necesitar como una relación de enteros. El PLL multiplica su frecuencia de entrada por algún número entero, y un divisor puede dividirse 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 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, podemos necesitar muchas frecuencias de reloj diferentes para múltiples relojes de bus internos, 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 suministren software para calcular las constantes de configuración).
fuente
Esto se puede lograr usando un modulador .
Consulte, por ejemplo, la guía del usuario MSP430x1xx . En la página 260 dice:
(tenga en cuenta el área gris)
fuente
La forma en que funciona es que tiene un reloj de muestra interno. Digamos que puedes probar cada 100ns. Sabes dónde está el medio de cada bit. Por lo tanto, elige un punto de muestreo que sea el más cercano al medio. Esto le dará un error de 50ns como máximo.
Lo que sucede es que recibes el bit de inicio. Luego determina dónde está la mitad del bit, ese es su punto de referencia. Entonces sabrá cuánto tiempo necesita esperar para probar el siguiente bit. Entonces, carga un contador y, cuando se reinicia, muestra. Ahora, estará apagado como máximo 1 ciclo de reloj de su reloj interno rápido, pero eso es nano segundos en la mayoría de los casos. Además, sabes cuánto estás fuera. 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 hay muchas otras cosas que también suceden. Por ejemplo, no tomas una muestra, puedes tomar un par y procesarlas, etc. De hecho, es un ADC de 1 bit, con todas las implicaciones como el ruido de cuantización. Pero deberías tener la idea general.
fuente
Los SoCs 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 de alta frecuencia (oscilador controlado por voltaje), luego usa divisores de frecuencia difital tanto en VCO como en 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 está bloqueado a la frecuencia deseada.
fuente
Suponiendo un byte de 8 bits precedido por un único bit de inicio y seguido de 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 en menos de medio período.
Eso significa que la diferencia de reloj tolerable máxima entre el transmisor y el receptor es de aproximadamente el 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 velocidad de transmisión real se mantenga dentro del 1% de la velocidad de transmisión nominal.
Los microcontroladores con los que estoy más familiarizado son los dispositivos PIC18. Los modelos más antiguos usan 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 velocidad de transmisión 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 alcanzar el 0.25% de la velocidad de transmisión nominal para todas las velocidades de 1800 a 19200. La versión de 16 bits te 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 la sincronización = 1 columnas, están para ejecutar los EE.UU. modo síncrono)
Los PLL, divisores fraccionarios, etc. no son realmente necesarios para la serie UART.
fuente
Para intercambiar datos en serie, un controlador debe emitir o muestrear datos dentro de una determinada ventana del tiempo "ideal". Si bien es más simple tener un controlador que divida un reloj por un factor programable y luego nuevamente por un factor codificado adicional, no es necesario que los bits se lean o escriban a intervalos iguales. Si el extremo lejano de una conexión genera bits a intervalos uniformes exactos 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 emiten a 19.200 y uno está muestreando precisamente a 48,000Hz (2.5x).
Cuando se ve un borde descendente, se sabrá que el bit de parada ha comenzado entre 0 y 1 muestras hace un tiempo. Si se etiqueta la primera muestra donde se observó el bit de inicio como tiempo 0, el bit 0 comenzará en algún punto entre el tiempo 1.5 y 2.5; el bit 1 comenzará en algún momento entre el tiempo 4.0 y 5.0, el bit 2 comenzará en algún momento entre el tiempo 6.5 y 7.5, y el bit 3 comenzará en algún momento entre el tiempo 9.0 y 10.0. Por lo tanto, se garantizará que una muestra tomada en el tiempo 3 capturará el bit 0 [que comienza entre el tiempo 1.5 y 2.5, y termina entre el tiempo 4.0 y 5.0]. Del mismo modo, una muestra tomada en el tiempo 6 capturará el bit 1, y una muestra tomada en el tiempo 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 sea más tolerante a las imperfecciones en la fuente, pero incluso con una frecuencia de muestreo de solo 2.5 veces la frecuencia de bits, los márgenes no son terribles [aproximadamente 1/5 de un tiempo de bits].
fuente