Comment certains microcontrôleurs mettent-ils en œuvre des débits en bauds même s'ils utilisent une fréquence cristalline non évolutive aux débits en bauds standard?
16
Je viens de réaliser que la famille 8051 utilise 11.0592 MHz et ses multiples pour générer des vitesses de transmission standard. Mais il existe des SoC qui utilisent 15 MHz. Comment font-ils cela alors?
La plupart du temps, ils utilisent des diviseurs sans puissance de 2 pour générer des débits acceptablement proches des débits en bauds standard.
Brian Drummond
4
de plus, les UART peuvent suréchantillonner le signal (par exemple 16 échantillons par bit UART), ce qui résout les problèmes de synchronisation (et de bruit): electronicdesign.com/embedded/…
L'UART s'en fiche tant qu'il est raisonnablement exact.
15000000230400≈65
65⋅230400=14976000
Votre UART va donc être trop rapide d'un facteur . Cela devient un problème à1+11500014976≈1.002204, lorsque le décalage temporel sur 11 bits est supérieur à un demi-bit.1+12⋅11≈1.045
Il peut être intéressant de noter que l'émetteur et le récepteur ont tous deux des horloges, donc si les deux sont en erreur dans la mauvaise direction.
Spehro Pefhany
7
Plus important encore, les protocoles série pertinents (RS-232, etc.) utilisent des bits de démarrage et d'arrêt pour synchroniser davantage les horloges. Même si les deux côtés avaient des horloges parfaites à 230400 Hz, les deux horloges seraient probablement déphasées. Le bit de départ permet au côté récepteur de synchroniser son horloge avec l'expéditeur. Étant donné que cela peut se produire sur le premier bit de chaque octet, les horloges imparfaites signifient simplement des ajustements de phase plus fréquents.
MSalters
1
Dans la pratique, il est probable qu'il soit supérieur de plus que ce poste ne l'indique, car le système de séparation est peu susceptible d'être 100% flexible.
Peter Green
2
15MHz/64230400 baud=1.01725
2
@DaveTweed: Mais les puces sérieuses sur la série asynchrone ont tendance à autoriser un facteur de suréchantillonnage de 13 dans leur périphérique série, ce qui obtient la belle erreur faible calculée par Simon à partir de n'importe quelle horloge qui est un multiple de 3 MHz. Alternativement, certains utilisent un diviseur fractionnaire où le temps de bit fait la moyenne de la valeur correcte même si les bits individuels peuvent avoir une erreur de synchronisation> 2%.
Ben Voigt
12
Voici la description des caractéristiques en gros caractères d'un MCU ARM haut de gamme.
Il existe un certain nombre de PLL et de diviseurs avec des pré-détartreurs et des post-détartreurs qui sont capables de créer presque toutes les fréquences dont vous pourriez avoir besoin en tant que rapport entier. La PLL multiplie sa fréquence d'entrée par un entier, et un diviseur peut diviser par un certain nombre ( pas nécessairement des puissances de 2 dans chaque cas).
Les fréquences internes relativement élevées (environ un demi-GHz dans ce cas) ne sont pas un problème (comme elles le seraient si elles étaient hors de la puce) - relativement peu d'énergie est consommée.
Les jours de division uniquement par des puissances de 2 se sont terminés il y a un certain temps, et maintenant que les PLL sont couramment appliquées, nous n'avons plus à nous soucier de la fréquence cristalline exacte. D'autre part, nous pouvons avoir besoin de nombreuses fréquences d'horloge différentes pour plusieurs horloges de bus internes, périphériques USB, Ethernet, UART, etc.
Si vous souhaitez en savoir plus sur leur fonctionnement, vous pouvez étudier certaines des puces de synthèse d'horloge dédiées qui sont relativement simples (bien que suffisamment complexes pour que certains fabricants fournissent des logiciels pour calculer les constantes de configuration).
@PeterMortensen Merci, corrigé. Pour une raison quelconque, les fautes de frappe comme celle-ci (et le placement d'homonymes incorrects) sont plus faciles à faire en mode de pensée conversationnelle plutôt qu'en mode d'écriture de rapport.
Spehro Pefhany
10
Ceci peut être réalisé en utilisant un modulateur .
Le générateur de vitesse de transmission USART est capable de produire des vitesses de transmission standard à partir de fréquences sources non standard. Le générateur de débit en bauds utilise un pré-diviseur / diviseur et un modulateur comme illustré à la figure 13−7. Cette combinaison prend en charge les diviseurs fractionnaires pour la génération du débit en bauds.
(notez la zone grise)
Le facteur de division N est souvent une valeur non entière dont la partie entière peut être réalisée par le diviseur / diviseur. Le deuxième étage du générateur de vitesse de transmission, le modulateur, est utilisé pour rencontrer la partie fractionnaire aussi près que possible.
[...]
Le BITCLK peut être ajusté d'un bit à l'autre avec le modulateur pour répondre aux exigences de synchronisation lorsqu'un diviseur non entier est nécessaire. La synchronisation de chaque bit est étendue d'un cycle d'horloge BRCLK si le bit modulateur mi est défini. Chaque fois qu'un bit est reçu ou transmis, le bit suivant dans le registre de commande de modulation détermine la synchronisation pour ce bit. Un bit de modulation réglé augmente le facteur de division de un tandis qu'un bit de modulation effacé maintient le facteur de division donné par UxBR
Beaucoup de gens supposent que l’UART fonctionne sur une horloge fixe, c’est-à-dire que vous prenez un échantillon tous les Tsecondes. Ce n'est pas nécessairement vrai. Du moins pas dans tous les modules UART que j'ai conçus.
La façon dont cela fonctionne est que vous avez une horloge d'échantillonnage interne. Disons que vous pouvez échantillonner toutes les 100 ns. Vous savez où se trouve le milieu de chaque bit. Vous choisissez donc un point d'échantillonnage le plus proche du milieu. Cela vous donnera au maximum une erreur de 50ns.
Ce qui se passe, c'est que vous recevez le bit de départ. Vous déterminez ensuite où se trouve le milieu du bit, c'est-à-dire votre point de référence. Vous savez alors combien de temps vous devez attendre pour échantillonner le bit suivant. Ainsi, vous chargez un compteur et lorsqu'il se réinitialise, vous échantillonnez. Maintenant, vous serez interrompu par au plus 1 cycle d'horloge de votre horloge interne rapide, mais c'est nano secondes dans la plupart des cas. De plus, vous savez de combien vous vous absentez. Pour le bit suivant, vous chargez votre compteur avec une valeur différente, vous êtes donc le plus près possible du milieu, etc.
Dans les systèmes réels, beaucoup d'autres choses se produisent également. Par exemple, vous ne prenez pas un échantillon, vous pouvez en prendre quelques-uns et faire un traitement sur eux, etc. En fait, c'est un ADC 1 bit, avec toutes les implications comme le bruit de quantification. Mais vous devriez avoir une idée générale.
Les SoC modernes utilisent ce qu'on appelle PLL pour générer (presque) n'importe quelle horloge qui pourrait être nécessaire pour les interfaces. En termes simplifiés, le circuit PLL utilise un VCO (oscillateur commandé en tension) à haute fréquence, puis utilise des diviseurs de fréquence difitaux sur le VCO et l'horloge d'entrée, et génère une rétroaction de tension basée sur le rapport de fréquence. Cette rétroaction contrôle le VCO, de sorte que toute la boucle est verrouillée à la fréquence souhaitée.
En supposant un octet de 8 bits précédé d'un seul bit de démarrage et suivi d'un seul bit d'arrêt et en supposant un échantillonnage parfait par le récepteur, cela signifie qu'après 9,5 périodes de bits, l'horloge doit être éteinte de moins d'une demi-période de bits.
Cela signifie que la différence d'horloge maximale tolérable entre l'émetteur et le récepteur est d'environ 5%. Cependant, il peut y avoir une erreur aux deux extrémités de la liaison et la synchronisation des récepteurs peut ne pas être parfaite. Dans la pratique, je recommanderais donc généralement que le débit en bauds réel soit maintenu à 1% du débit en bauds nominal.
Les microcontrôleurs que je connais le mieux sont les appareils PIC18. Les anciens modèles utilisent un compteur flexible à 8 bits pour mettre à l'échelle le débit en bauds tandis que les plus récents ont un compteur flexible à 16 bits. Il existe également des modes de vitesse "haute" et "basse" en option qui modifient la vitesse de transmission par un facteur de quatre.
Avec une horloge d'entrée de 20 MHz, la version 8 bits de ce schéma de génération est suffisante pour atteindre 0,25% du débit en bauds nominal pour tous les débits de 1800 à 19200. La version 16 bits vous permet de descendre à des vitesses encore plus faibles.
Pour échanger des données série, un contrôleur doit sortir ou échantillonner des données dans une certaine fenêtre du temps "idéal". Bien qu'il soit plus simple d'avoir un contrôleur qui divise une horloge par un facteur programmable, puis à nouveau par un facteur codé en dur supplémentaire, il n'est pas nécessaire que les bits soient lus ou écrits à intervalles égaux. Si l'extrémité distante d'une connexion produit des bits à des intervalles précis et uniformes correspondant au débit en bauds, un récepteur peut se débrouiller avec un taux d'échantillonnage supérieur à deux fois le débit en bauds à condition qu'il échantillonne les choses au bon moment. Par exemple, supposons que les données soient émises à 19 200 et que l'on échantillonne à 48 000 Hz précisément (2,5x).
Quand on voit un front descendant, on saura que le bit d'arrêt a commencé il y a entre 0 et 1 fois d'échantillonnage. Si l'on nomme le premier échantillon où le bit de départ a été observé comme temps 0, le bit 0 commencera quelque part entre le temps 1,5 et 2,5; le bit 1 démarrera quelque part entre le temps 4.0 et 5.0, le bit 2 commencera quelque part entre le temps 6.5 et 7.5 et le bit 3 démarrera quelque part entre le temps 9.0 et 10.0. Un échantillon prélevé au temps 3 sera ainsi garanti pour capturer le bit 0 [qui commence entre le temps 1,5 et 2,5 et se termine entre le temps 4,0 et 5,0]. De même, un échantillon prélevé à l'instant 6 capturera le bit 1, et un échantillon prélevé aux instants 8, 11, 13, 16, 18 et 20 capturera les bits 2-7.
L'utilisation d'un taux d'échantillonnage plus rapide rendrait le récepteur plus tolérant aux imperfections de la source, mais même avec un taux d'échantillonnage de seulement 2,5 fois le débit binaire, les marges ne sont pas terribles [environ 1/5 du temps binaire].
Réponses:
L'UART s'en fiche tant qu'il est raisonnablement exact.
Votre UART va donc être trop rapide d'un facteur . Cela devient un problème à1+11500014976≈1.002204 , lorsque le décalage temporel sur 11 bits est supérieur à un demi-bit.1+12⋅11≈1.045
la source
Voici la description des caractéristiques en gros caractères d'un MCU ARM haut de gamme.
Il existe un certain nombre de PLL et de diviseurs avec des pré-détartreurs et des post-détartreurs qui sont capables de créer presque toutes les fréquences dont vous pourriez avoir besoin en tant que rapport entier. La PLL multiplie sa fréquence d'entrée par un entier, et un diviseur peut diviser par un certain nombre ( pas nécessairement des puissances de 2 dans chaque cas).
Les fréquences internes relativement élevées (environ un demi-GHz dans ce cas) ne sont pas un problème (comme elles le seraient si elles étaient hors de la puce) - relativement peu d'énergie est consommée.
Les jours de division uniquement par des puissances de 2 se sont terminés il y a un certain temps, et maintenant que les PLL sont couramment appliquées, nous n'avons plus à nous soucier de la fréquence cristalline exacte. D'autre part, nous pouvons avoir besoin de nombreuses fréquences d'horloge différentes pour plusieurs horloges de bus internes, périphériques USB, Ethernet, UART, etc.
Si vous souhaitez en savoir plus sur leur fonctionnement, vous pouvez étudier certaines des puces de synthèse d'horloge dédiées qui sont relativement simples (bien que suffisamment complexes pour que certains fabricants fournissent des logiciels pour calculer les constantes de configuration).
la source
Ceci peut être réalisé en utilisant un modulateur .
Voir par exemple le guide d'utilisation du MSP430x1xx . À la page 260, il est écrit:
(notez la zone grise)
la source
Beaucoup de gens supposent que l’UART fonctionne sur une horloge fixe, c’est-à-dire que vous prenez un échantillon tous lesT secondes. Ce n'est pas nécessairement vrai. Du moins pas dans tous les modules UART que j'ai conçus.
La façon dont cela fonctionne est que vous avez une horloge d'échantillonnage interne. Disons que vous pouvez échantillonner toutes les 100 ns. Vous savez où se trouve le milieu de chaque bit. Vous choisissez donc un point d'échantillonnage le plus proche du milieu. Cela vous donnera au maximum une erreur de 50ns.
Ce qui se passe, c'est que vous recevez le bit de départ. Vous déterminez ensuite où se trouve le milieu du bit, c'est-à-dire votre point de référence. Vous savez alors combien de temps vous devez attendre pour échantillonner le bit suivant. Ainsi, vous chargez un compteur et lorsqu'il se réinitialise, vous échantillonnez. Maintenant, vous serez interrompu par au plus 1 cycle d'horloge de votre horloge interne rapide, mais c'est nano secondes dans la plupart des cas. De plus, vous savez de combien vous vous absentez. Pour le bit suivant, vous chargez votre compteur avec une valeur différente, vous êtes donc le plus près possible du milieu, etc.
Dans les systèmes réels, beaucoup d'autres choses se produisent également. Par exemple, vous ne prenez pas un échantillon, vous pouvez en prendre quelques-uns et faire un traitement sur eux, etc. En fait, c'est un ADC 1 bit, avec toutes les implications comme le bruit de quantification. Mais vous devriez avoir une idée générale.
la source
Les SoC modernes utilisent ce qu'on appelle PLL pour générer (presque) n'importe quelle horloge qui pourrait être nécessaire pour les interfaces. En termes simplifiés, le circuit PLL utilise un VCO (oscillateur commandé en tension) à haute fréquence, puis utilise des diviseurs de fréquence difitaux sur le VCO et l'horloge d'entrée, et génère une rétroaction de tension basée sur le rapport de fréquence. Cette rétroaction contrôle le VCO, de sorte que toute la boucle est verrouillée à la fréquence souhaitée.
la source
En supposant un octet de 8 bits précédé d'un seul bit de démarrage et suivi d'un seul bit d'arrêt et en supposant un échantillonnage parfait par le récepteur, cela signifie qu'après 9,5 périodes de bits, l'horloge doit être éteinte de moins d'une demi-période de bits.
Cela signifie que la différence d'horloge maximale tolérable entre l'émetteur et le récepteur est d'environ 5%. Cependant, il peut y avoir une erreur aux deux extrémités de la liaison et la synchronisation des récepteurs peut ne pas être parfaite. Dans la pratique, je recommanderais donc généralement que le débit en bauds réel soit maintenu à 1% du débit en bauds nominal.
Les microcontrôleurs que je connais le mieux sont les appareils PIC18. Les anciens modèles utilisent un compteur flexible à 8 bits pour mettre à l'échelle le débit en bauds tandis que les plus récents ont un compteur flexible à 16 bits. Il existe également des modes de vitesse "haute" et "basse" en option qui modifient la vitesse de transmission par un facteur de quatre.
Avec une horloge d'entrée de 20 MHz, la version 8 bits de ce schéma de génération est suffisante pour atteindre 0,25% du débit en bauds nominal pour tous les débits de 1800 à 19200. La version 16 bits vous permet de descendre à des vitesses encore plus faibles.
http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1 (ignorer les colonnes sync = 1, ils servent à exécuter l'USART dans mode synchrone)
Les PLL, les diviseurs fractionnaires, etc. ne sont pas vraiment nécessaires pour la série UART.
la source
Pour échanger des données série, un contrôleur doit sortir ou échantillonner des données dans une certaine fenêtre du temps "idéal". Bien qu'il soit plus simple d'avoir un contrôleur qui divise une horloge par un facteur programmable, puis à nouveau par un facteur codé en dur supplémentaire, il n'est pas nécessaire que les bits soient lus ou écrits à intervalles égaux. Si l'extrémité distante d'une connexion produit des bits à des intervalles précis et uniformes correspondant au débit en bauds, un récepteur peut se débrouiller avec un taux d'échantillonnage supérieur à deux fois le débit en bauds à condition qu'il échantillonne les choses au bon moment. Par exemple, supposons que les données soient émises à 19 200 et que l'on échantillonne à 48 000 Hz précisément (2,5x).
Quand on voit un front descendant, on saura que le bit d'arrêt a commencé il y a entre 0 et 1 fois d'échantillonnage. Si l'on nomme le premier échantillon où le bit de départ a été observé comme temps 0, le bit 0 commencera quelque part entre le temps 1,5 et 2,5; le bit 1 démarrera quelque part entre le temps 4.0 et 5.0, le bit 2 commencera quelque part entre le temps 6.5 et 7.5 et le bit 3 démarrera quelque part entre le temps 9.0 et 10.0. Un échantillon prélevé au temps 3 sera ainsi garanti pour capturer le bit 0 [qui commence entre le temps 1,5 et 2,5 et se termine entre le temps 4,0 et 5,0]. De même, un échantillon prélevé à l'instant 6 capturera le bit 1, et un échantillon prélevé aux instants 8, 11, 13, 16, 18 et 20 capturera les bits 2-7.
L'utilisation d'un taux d'échantillonnage plus rapide rendrait le récepteur plus tolérant aux imperfections de la source, mais même avec un taux d'échantillonnage de seulement 2,5 fois le débit binaire, les marges ne sont pas terribles [environ 1/5 du temps binaire].
la source